From 5f6fbf98952cf06ebf22220bc3c71c73dbb1b3f0 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Mon, 25 Nov 2019 12:36:28 -0800 Subject: [PATCH 01/49] add esm artifacts to build outputs --- package.json | 1 + packages/react-is/package.json | 3 +- scripts/rollup/build.js | 18 ++++- scripts/rollup/bundles.js | 100 ++++++++++++++++++++------- scripts/rollup/packaging.js | 5 ++ scripts/rollup/wrappers.js | 24 +++++++ yarn.lock | 119 ++++++++++++++++++++++++++++++++- 7 files changed, 239 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 3b615ba29d06..76fafc74323f 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "packages/*" ], "devDependencies": { + "@ampproject/rollup-plugin-closure-compiler": "^0.13.0", "@babel/cli": "^7.0.0", "@babel/code-frame": "^7.0.0", "@babel/core": "^7.0.0", diff --git a/packages/react-is/package.json b/packages/react-is/package.json index 16177d8e8b1f..06afaceffa9c 100644 --- a/packages/react-is/package.json +++ b/packages/react-is/package.json @@ -22,6 +22,7 @@ "build-info.json", "index.js", "cjs/", - "umd/" + "umd/", + "esm/" ] } diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index ff0f9760bde1..5bb86f04a7ec 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -2,7 +2,7 @@ const rollup = require('rollup'); const babel = require('rollup-plugin-babel'); -const closure = require('./plugins/closure-plugin'); +const closure = require('@ampproject/rollup-plugin-closure-compiler'); const commonjs = require('rollup-plugin-commonjs'); const prettier = require('rollup-plugin-prettier'); const replace = require('rollup-plugin-replace'); @@ -48,6 +48,8 @@ const { UMD_DEV, UMD_PROD, UMD_PROFILING, + ESM_DEV, + ESM_PROD, NODE_DEV, NODE_PROD, NODE_PROFILING, @@ -97,7 +99,6 @@ const errorCodeOpts = { const closureOptions = { compilation_level: 'SIMPLE', - language_in: 'ECMASCRIPT5_STRICT', language_out: 'ECMASCRIPT5_STRICT', env: 'CUSTOM', warning_level: 'QUIET', @@ -195,6 +196,9 @@ function getFormat(bundleType) { case UMD_PROD: case UMD_PROFILING: return `umd`; + case ESM_DEV: + case ESM_PROD: + return 'es'; case NODE_DEV: case NODE_PROD: case NODE_PROFILING: @@ -221,6 +225,10 @@ function getFilename(name, globalName, bundleType) { return `${name}.production.min.js`; case UMD_PROFILING: return `${name}.profiling.min.js`; + case ESM_DEV: + return `${name}.development.mjs`; + case ESM_PROD: + return `${name}.production.min.mjs`; case NODE_DEV: return `${name}.development.js`; case NODE_PROD: @@ -246,6 +254,7 @@ function isProductionBundleType(bundleType) { switch (bundleType) { case UMD_DEV: case NODE_DEV: + case ESM_DEV: case FB_WWW_DEV: case RN_OSS_DEV: case RN_FB_DEV: @@ -254,6 +263,7 @@ function isProductionBundleType(bundleType) { case NODE_PROD: case UMD_PROFILING: case NODE_PROFILING: + case ESM_PROD: case FB_WWW_PROD: case FB_WWW_PROFILING: case RN_OSS_PROD: @@ -278,6 +288,8 @@ function isProfilingBundleType(bundleType) { case RN_OSS_PROD: case UMD_DEV: case UMD_PROD: + case ESM_DEV: + case ESM_PROD: return false; case FB_WWW_PROFILING: case NODE_PROFILING: @@ -663,6 +675,8 @@ async function buildEverything() { [bundle, NODE_DEV], [bundle, NODE_PROD], [bundle, NODE_PROFILING], + [bundle, ESM_DEV], + [bundle, ESM_PROD], [bundle, RN_OSS_DEV], [bundle, RN_OSS_PROD], [bundle, RN_OSS_PROFILING], diff --git a/scripts/rollup/bundles.js b/scripts/rollup/bundles.js index 956e67065326..0cada8468469 100644 --- a/scripts/rollup/bundles.js +++ b/scripts/rollup/bundles.js @@ -4,6 +4,8 @@ const bundleTypes = { UMD_DEV: 'UMD_DEV', UMD_PROD: 'UMD_PROD', UMD_PROFILING: 'UMD_PROFILING', + ESM_DEV: 'ESM_DEV', + ESM_PROD: 'ESM_PROD', NODE_DEV: 'NODE_DEV', NODE_PROD: 'NODE_PROD', NODE_PROFILING: 'NODE_PROFILING', @@ -24,6 +26,8 @@ const { UMD_PROFILING, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, NODE_PROFILING, FB_WWW_DEV, FB_WWW_PROD, @@ -64,6 +68,8 @@ const bundles = [ UMD_DEV, UMD_PROD, UMD_PROFILING, + ESM_DEV, + ESM_PROD, NODE_DEV, NODE_PROD, FB_WWW_DEV, @@ -82,6 +88,8 @@ const bundles = [ UMD_DEV, UMD_PROD, UMD_PROFILING, + ESM_DEV, + ESM_PROD, NODE_DEV, NODE_PROD, NODE_PROFILING, @@ -98,7 +106,7 @@ const bundles = [ /******* Test Utils *******/ { moduleType: RENDERER_UTILS, - bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD], + bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD, ESM_DEV, ESM_PROD], entry: 'react-dom/test-utils', global: 'ReactTestUtils', externals: ['react', 'react-dom'], @@ -111,6 +119,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -127,6 +137,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -142,7 +154,7 @@ const bundles = [ }), }, { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: NON_FIBER_RENDERER, entry: 'react-dom/server.node', externals: ['react', 'stream'], @@ -156,14 +168,14 @@ const bundles = [ /******* React DOM Fizz Server *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-dom/unstable-fizz.browser', global: 'ReactDOMFizzServer', externals: ['react', 'react-dom/server'], }, { - bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV, FB_WWW_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV, FB_WWW_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-dom/unstable-fizz.node', global: 'ReactDOMFizzServer', @@ -172,14 +184,14 @@ const bundles = [ /******* React DOM Flight Server Webpack *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-flight-dom-webpack/server.browser', global: 'ReactFlightDOMServer', externals: ['react', 'react-dom/server'], }, { - bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV, FB_WWW_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV, FB_WWW_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-flight-dom-webpack/server.node', global: 'ReactFlightDOMServer', @@ -193,6 +205,8 @@ const bundles = [ NODE_PROD, UMD_DEV, UMD_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -209,6 +223,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -287,7 +303,7 @@ const bundles = [ /******* React Test Renderer *******/ { - bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD], + bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD, UMD_DEV, UMD_PROD], moduleType: RENDERER, entry: 'react-test-renderer', global: 'ReactTestRenderer', @@ -300,7 +316,7 @@ const bundles = [ }), }, { - bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD], + bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD, UMD_DEV, UMD_PROD], moduleType: NON_FIBER_RENDERER, entry: 'react-test-renderer/shallow', global: 'ReactShallowRenderer', @@ -315,7 +331,7 @@ const bundles = [ /******* React Noop Renderer (used for tests) *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-noop-renderer', global: 'ReactNoopRenderer', @@ -324,7 +340,7 @@ const bundles = [ /******* React Noop Persistent Renderer (used for tests) *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-noop-renderer/persistent', global: 'ReactNoopRendererPersistent', @@ -333,7 +349,7 @@ const bundles = [ /******* React Noop Server Renderer (used for tests) *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-noop-renderer/server', global: 'ReactNoopRendererServer', @@ -342,7 +358,7 @@ const bundles = [ /******* React Noop Flight Server (used for tests) *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-noop-renderer/flight-server', global: 'ReactNoopFlightServer', @@ -351,7 +367,7 @@ const bundles = [ /******* React Noop Flight Client (used for tests) *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RENDERER, entry: 'react-noop-renderer/flight-client', global: 'ReactNoopFlightClient', @@ -360,7 +376,7 @@ const bundles = [ /******* React Reconciler *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RECONCILER, entry: 'react-reconciler', global: 'ReactReconciler', @@ -369,7 +385,7 @@ const bundles = [ /******* React Persistent Reconciler *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RECONCILER, entry: 'react-reconciler/persistent', global: 'ReactPersistentReconciler', @@ -378,7 +394,7 @@ const bundles = [ /******* React Server *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RECONCILER, entry: 'react-server', global: 'ReactServer', @@ -387,7 +403,7 @@ const bundles = [ /******* React Flight Server *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RECONCILER, entry: 'react-server/flight', global: 'ReactFlightServer', @@ -396,7 +412,7 @@ const bundles = [ /******* React Flight Client *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: RECONCILER, entry: 'react-flight', global: 'ReactFlightClient', @@ -406,7 +422,7 @@ const bundles = [ /******* Reflection *******/ { moduleType: RENDERER_UTILS, - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], entry: 'react-reconciler/reflection', global: 'ReactFiberTreeReflection', externals: [], @@ -417,6 +433,8 @@ const bundles = [ bundleTypes: [ NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, UMD_DEV, @@ -430,7 +448,7 @@ const bundles = [ /******* React Debug Tools *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: ISOMORPHIC, entry: 'react-debug-tools', global: 'ReactDebugTools', @@ -444,6 +462,8 @@ const bundles = [ FB_WWW_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, UMD_DEV, UMD_PROD, ], @@ -455,7 +475,7 @@ const bundles = [ /******* createComponentWithSubscriptions *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: ISOMORPHIC, entry: 'create-subscription', global: 'createSubscription', @@ -470,7 +490,7 @@ const bundles = [ /******* Hook for managing subscriptions safely *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: ISOMORPHIC, entry: 'use-subscription', global: 'useSubscription', @@ -482,6 +502,8 @@ const bundles = [ bundleTypes: [ NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, FB_WWW_PROFILING, @@ -499,6 +521,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -510,7 +534,7 @@ const bundles = [ /******* Jest React (experimental) *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV, FB_WWW_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD, FB_WWW_DEV, FB_WWW_PROD], moduleType: ISOMORPHIC, entry: 'jest-react', global: 'JestReact', @@ -523,7 +547,7 @@ const bundles = [ // won't get copied. We also can't create just DEV bundle because it contains a // NODE_ENV check inside. We should probably tweak our build process to allow // "raw" packages that don't get bundled. - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: ISOMORPHIC, entry: 'eslint-plugin-react-hooks', global: 'ESLintPluginReactHooks', @@ -532,14 +556,14 @@ const bundles = [ /******* React Fresh *******/ { - bundleTypes: [NODE_DEV, NODE_PROD], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], moduleType: ISOMORPHIC, entry: 'react-refresh/babel', global: 'ReactFreshBabelPlugin', externals: [], }, { - bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV], + bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD, FB_WWW_DEV], moduleType: ISOMORPHIC, entry: 'react-refresh/runtime', global: 'ReactFreshRuntime', @@ -554,6 +578,8 @@ const bundles = [ NODE_DEV, NODE_PROD, NODE_PROFILING, + ESM_DEV, + ESM_PROD, ], moduleType: ISOMORPHIC, entry: 'scheduler/tracing', @@ -569,6 +595,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -584,6 +612,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -599,6 +629,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -614,6 +646,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -629,6 +663,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -644,6 +680,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -659,6 +697,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -678,6 +718,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -693,6 +735,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -708,6 +752,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], @@ -723,6 +769,8 @@ const bundles = [ UMD_PROD, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, FB_WWW_DEV, FB_WWW_PROD, ], diff --git a/scripts/rollup/packaging.js b/scripts/rollup/packaging.js index 840e290f23c1..4c184b5c719b 100644 --- a/scripts/rollup/packaging.js +++ b/scripts/rollup/packaging.js @@ -15,6 +15,8 @@ const { UMD_PROFILING, NODE_DEV, NODE_PROD, + ESM_DEV, + ESM_PROD, NODE_PROFILING, FB_WWW_DEV, FB_WWW_PROD, @@ -40,6 +42,9 @@ function getBundleOutputPaths(bundleType, filename, packageName) { case NODE_PROD: case NODE_PROFILING: return [`build/node_modules/${packageName}/cjs/${filename}`]; + case ESM_DEV: + case ESM_PROD: + return [`build/node_modules/${packageName}/esm/${filename}`]; case UMD_DEV: case UMD_PROD: case UMD_PROFILING: diff --git a/scripts/rollup/wrappers.js b/scripts/rollup/wrappers.js index b80e77121fb8..b1dfe6842391 100644 --- a/scripts/rollup/wrappers.js +++ b/scripts/rollup/wrappers.js @@ -9,6 +9,8 @@ const UMD_PROFILING = Bundles.bundleTypes.UMD_PROFILING; const NODE_DEV = Bundles.bundleTypes.NODE_DEV; const NODE_PROD = Bundles.bundleTypes.NODE_PROD; const NODE_PROFILING = Bundles.bundleTypes.NODE_PROFILING; +const ESM_DEV = Bundles.bundleTypes.ESM_DEV; +const ESM_PROD = Bundles.bundleTypes.ESM_PROD; const FB_WWW_DEV = Bundles.bundleTypes.FB_WWW_DEV; const FB_WWW_PROD = Bundles.bundleTypes.FB_WWW_PROD; const FB_WWW_PROFILING = Bundles.bundleTypes.FB_WWW_PROFILING; @@ -125,6 +127,28 @@ ${ ${source}`; }, + /***************** ESM_DEV *****************/ + [ESM_DEV](source, globalName, filename, moduleType) { + return `/** @license React v${reactVersion} + * ${filename} + * +${license} + */ + +'use strict'; +${source} +`; + }, + /***************** ESM_PROD *****************/ + [ESM_PROD](source, globalName, filename, moduleType) { + return `/** @license React v${reactVersion} + * ${filename} + * +${license} + */ +${source}`; + }, + /****************** FB_WWW_DEV ******************/ [FB_WWW_DEV](source, globalName, filename, moduleType) { return `/** diff --git a/yarn.lock b/yarn.lock index e235f8485770..02cbbd26b5b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,18 @@ # yarn lockfile v1 +"@ampproject/rollup-plugin-closure-compiler@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@ampproject/rollup-plugin-closure-compiler/-/rollup-plugin-closure-compiler-0.13.0.tgz#23083ada1e5f899280c38acbf22454616ccc78a8" + integrity sha512-uvbNj/ngTZxHZM7y1RLC+hQ1qUZ9JH0BVdVmcAWRH6U/25ek18V/r+ks9VKmkzRfn8Oe9nY4XmXHJozfQGVOIQ== + dependencies: + acorn "7.1.0" + acorn-dynamic-import "4.0.0" + acorn-walk "7.0.0" + google-closure-compiler "20191111.0.0" + magic-string "0.25.4" + temp-write "4.0.0" + "@babel/cli@^7.0.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.5.5.tgz#bdb6d9169e93e241a08f5f7b0265195bf38ef5ec" @@ -1514,6 +1526,11 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +acorn-dynamic-import@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + acorn-globals@^4.1.0: version "4.3.3" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e" @@ -1534,11 +1551,21 @@ acorn-jsx@^5.0.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== +acorn-walk@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" + integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -3236,7 +3263,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@2.x, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -6170,21 +6197,46 @@ google-closure-compiler-java@^20190301.0.0: resolved "https://registry.yarnpkg.com/google-closure-compiler-java/-/google-closure-compiler-java-20190301.0.0.tgz#89d1d6ab04b7625daf38d63b28b557f92103e3e1" integrity sha512-IMv77Mu1chPjSaJC1PWyKSNIvm19nSjx4oXvf67ZBLRkuPKHb3S1ECD3l71pfxNZ2+2tAXnxkEcWcREJ8ph4Tg== +google-closure-compiler-java@^20191111.0.0: + version "20191111.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-java/-/google-closure-compiler-java-20191111.0.0.tgz#3fb9c464f49a73b5de3fa8ac3c2ef9c2b747266d" + integrity sha512-JgsQtJVVgDuj50VPQV1OgHxMy78daTL3d607V6zF/qETl3rEEiazEGfXDGUX/1V1SUOW+Y03Ct9bcO3LMxNlxg== + google-closure-compiler-js@^20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20190301.0.0.tgz#2b1035a13e42118386dbdf264195976d42240870" integrity sha512-J0HVHwpGf3o5MwyifrYhfhNpD7Zznn+fktcKKmwhguKqaNbgCr1AfnaGEarej3Lx1W9CouJEm5OTRTZRJgvRHQ== +google-closure-compiler-js@^20191111.0.0: + version "20191111.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20191111.0.0.tgz#94112796826d50d0b3717c80ab633a60d2617ff7" + integrity sha512-W3Oy5NF5CMgUv31CMbgLN7zhdCTVMTnNI//iEPYMotzXfX8viyOnTMipDDwJNeMnY7lfXbQrYOo+QkWP6WzZtg== + google-closure-compiler-linux@^20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler-linux/-/google-closure-compiler-linux-20190301.0.0.tgz#dfc0f564642fdfad19ba59e1ced7957fcf3ecbc4" integrity sha512-r+47izRha1ZOHP8E5wq7YsjatzJVD0yn/7dnZA/jSJmTxoFDfEaV78PYGAgCpL8kslHHApPDFEn9Ozx2eSH2gg== +google-closure-compiler-linux@^20191111.0.0: + version "20191111.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-linux/-/google-closure-compiler-linux-20191111.0.0.tgz#f66eb017b24c474565a903f966472e7a4c05efd9" + integrity sha512-pxxB83Ae7G9OHFSOEzOYlp844YyqQgU1RXBpCGBKeDAQrs3dykHqRhNGZdI7N1tsby/pT+hKL1US2l/CslPqag== + google-closure-compiler-osx@^20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler-osx/-/google-closure-compiler-osx-20190301.0.0.tgz#006c4c4eb8f5a7078b208a107ec5f204f151ead1" integrity sha512-W/Mub4k7oKcd1XYIae0NrJysNvpiAjXhq0DCoTJaTZzkc8dGVqcvrQ/YqYNwLkUULqL1dsrYyt3jv1X6l9OqZw== +google-closure-compiler-osx@^20191111.0.0: + version "20191111.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-osx/-/google-closure-compiler-osx-20191111.0.0.tgz#4b841fca5857dd05fbcf4ae312781e52e37c732e" + integrity sha512-sviL1DLN+dDfYBLzmU6+2Yk19P1uzUHQuKaXrHxEYZkU4jTJNq/TC4xi6t0ZgvLQEm2Vf7xhOrt80TYKnoQaVg== + +google-closure-compiler-windows@^20191111.0.0: + version "20191111.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-windows/-/google-closure-compiler-windows-20191111.0.0.tgz#da49d1814261fffbbe7bde1efc49c35eb533e89e" + integrity sha512-iKdz2bWrrM4zLv3USCRtWX4kLWzZhbj/afh/W6giLxg5XQzbNg+UpVF+2G6f/LEYK9UNBgS2TdyNTuw8mod+Mg== + google-closure-compiler@20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20190301.0.0.tgz#332e5b940601047a580bcf182e782f089b2c7cf2" @@ -6200,6 +6252,22 @@ google-closure-compiler@20190301.0.0: google-closure-compiler-linux "^20190301.0.0" google-closure-compiler-osx "^20190301.0.0" +google-closure-compiler@20191111.0.0: + version "20191111.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20191111.0.0.tgz#c2584b87d855cc4e23d5805e8f7269eb9a9166f2" + integrity sha512-Ji+FaqYKXNbJ78N5Do6hu61mPrB9D+8xSnmRO59u2CrIbmNCtoFnqkCAAL4Ye8LR8foRqtkDdiKJSblpe+5ttg== + dependencies: + chalk "2.x" + google-closure-compiler-java "^20191111.0.0" + google-closure-compiler-js "^20191111.0.0" + minimist "1.x" + vinyl "2.x" + vinyl-sourcemaps-apply "^0.2.0" + optionalDependencies: + google-closure-compiler-linux "^20191111.0.0" + google-closure-compiler-osx "^20191111.0.0" + google-closure-compiler-windows "^20191111.0.0" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -7221,6 +7289,11 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -8415,6 +8488,13 @@ magic-string@0.22.4, magic-string@^0.22.4: dependencies: vlq "^0.2.1" +magic-string@0.25.4: + version "0.25.4" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.4.tgz#325b8a0a79fc423db109b77fd5a19183b7ba5143" + integrity sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -8430,6 +8510,13 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.0" + make-fetch-happen@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz#a8e3fe41d3415dd656fe7b8e8172e1fb4458b38d" @@ -8674,7 +8761,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@1.x, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -11851,6 +11938,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sourcemap-codec@^1.4.4: + version "1.4.6" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" + integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== + spawn-sync@1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" @@ -12345,6 +12437,17 @@ temp-dir@^1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= +temp-write@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" + integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== + dependencies: + graceful-fs "^4.1.15" + is-stream "^2.0.0" + make-dir "^3.0.0" + temp-dir "^1.0.0" + uuid "^3.3.2" + tempfile@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" @@ -13037,6 +13140,18 @@ vinyl-sourcemaps-apply@^0.2.0: dependencies: source-map "^0.5.1" +vinyl@2.x: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + vinyl@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" From 0561663a9da712434c99fc97b783b4e8ec50cd1c Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Mon, 25 Nov 2019 13:01:58 -0800 Subject: [PATCH 02/49] remove esm from reconciler libraries for now --- scripts/rollup/bundles.js | 48 ++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/scripts/rollup/bundles.js b/scripts/rollup/bundles.js index 0cada8468469..5cb3dea8bb47 100644 --- a/scripts/rollup/bundles.js +++ b/scripts/rollup/bundles.js @@ -376,7 +376,13 @@ const bundles = [ /******* React Reconciler *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + // TODO: update reconcilers to be usable with esm + // ESM_DEV, + // ESM_PROD, + ], moduleType: RECONCILER, entry: 'react-reconciler', global: 'ReactReconciler', @@ -385,7 +391,13 @@ const bundles = [ /******* React Persistent Reconciler *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + // TODO: update reconcilers to be usable with esm + // ESM_DEV, + // ESM_PROD, + ], moduleType: RECONCILER, entry: 'react-reconciler/persistent', global: 'ReactPersistentReconciler', @@ -394,7 +406,13 @@ const bundles = [ /******* React Server *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + // TODO: update reconcilers to be usable with esm + // ESM_DEV, + // ESM_PROD, + ], moduleType: RECONCILER, entry: 'react-server', global: 'ReactServer', @@ -403,7 +421,13 @@ const bundles = [ /******* React Flight Server *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + // TODO: update reconcilers to be usable with esm + // ESM_DEV, + // ESM_PROD, + ], moduleType: RECONCILER, entry: 'react-server/flight', global: 'ReactFlightServer', @@ -412,7 +436,13 @@ const bundles = [ /******* React Flight Client *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + // TODO: update reconcilers to be usable with esm + // ESM_DEV, + // ESM_PROD, + ], moduleType: RECONCILER, entry: 'react-flight', global: 'ReactFlightClient', @@ -422,7 +452,13 @@ const bundles = [ /******* Reflection *******/ { moduleType: RENDERER_UTILS, - bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + // TODO: update reconcilers to be usable with esm + // ESM_DEV, + // ESM_PROD, + ], entry: 'react-reconciler/reflection', global: 'ReactFiberTreeReflection', externals: [], From fe8021e33e04ee667741588c0310bf6d07c42985 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Mon, 25 Nov 2019 13:07:58 -0800 Subject: [PATCH 03/49] run prettier --- scripts/rollup/build.js | 2 +- scripts/rollup/bundles.js | 57 ++++++++++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index 5bb86f04a7ec..7336e44af3a7 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -226,7 +226,7 @@ function getFilename(name, globalName, bundleType) { case UMD_PROFILING: return `${name}.profiling.min.js`; case ESM_DEV: - return `${name}.development.mjs`; + return `${name}.development.mjs`; case ESM_PROD: return `${name}.production.min.mjs`; case NODE_DEV: diff --git a/scripts/rollup/bundles.js b/scripts/rollup/bundles.js index 5cb3dea8bb47..1b7706c2d07a 100644 --- a/scripts/rollup/bundles.js +++ b/scripts/rollup/bundles.js @@ -106,7 +106,15 @@ const bundles = [ /******* Test Utils *******/ { moduleType: RENDERER_UTILS, - bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + FB_WWW_DEV, + NODE_DEV, + NODE_PROD, + UMD_DEV, + UMD_PROD, + ESM_DEV, + ESM_PROD, + ], entry: 'react-dom/test-utils', global: 'ReactTestUtils', externals: ['react', 'react-dom'], @@ -175,7 +183,14 @@ const bundles = [ externals: ['react', 'react-dom/server'], }, { - bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV, FB_WWW_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + FB_WWW_DEV, + FB_WWW_PROD, + ESM_DEV, + ESM_PROD, + ], moduleType: RENDERER, entry: 'react-dom/unstable-fizz.node', global: 'ReactDOMFizzServer', @@ -191,7 +206,14 @@ const bundles = [ externals: ['react', 'react-dom/server'], }, { - bundleTypes: [NODE_DEV, NODE_PROD, FB_WWW_DEV, FB_WWW_PROD, ESM_DEV, ESM_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + FB_WWW_DEV, + FB_WWW_PROD, + ESM_DEV, + ESM_PROD, + ], moduleType: RENDERER, entry: 'react-flight-dom-webpack/server.node', global: 'ReactFlightDOMServer', @@ -303,7 +325,15 @@ const bundles = [ /******* React Test Renderer *******/ { - bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD, UMD_DEV, UMD_PROD], + bundleTypes: [ + FB_WWW_DEV, + NODE_DEV, + NODE_PROD, + ESM_DEV, + ESM_PROD, + UMD_DEV, + UMD_PROD, + ], moduleType: RENDERER, entry: 'react-test-renderer', global: 'ReactTestRenderer', @@ -316,7 +346,15 @@ const bundles = [ }), }, { - bundleTypes: [FB_WWW_DEV, NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD, UMD_DEV, UMD_PROD], + bundleTypes: [ + FB_WWW_DEV, + NODE_DEV, + NODE_PROD, + ESM_DEV, + ESM_PROD, + UMD_DEV, + UMD_PROD, + ], moduleType: NON_FIBER_RENDERER, entry: 'react-test-renderer/shallow', global: 'ReactShallowRenderer', @@ -570,7 +608,14 @@ const bundles = [ /******* Jest React (experimental) *******/ { - bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD, FB_WWW_DEV, FB_WWW_PROD], + bundleTypes: [ + NODE_DEV, + NODE_PROD, + ESM_DEV, + ESM_PROD, + FB_WWW_DEV, + FB_WWW_PROD, + ], moduleType: ISOMORPHIC, entry: 'jest-react', global: 'JestReact', From 094113b081407a028c1c06194c5bae1e586b816b Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Mon, 25 Nov 2019 13:23:49 -0800 Subject: [PATCH 04/49] add esm folders to pkg.files --- packages/babel-plugin-react-jsx/package.json | 5 +++-- packages/create-subscription/package.json | 3 ++- packages/eslint-plugin-react-hooks/package.json | 3 ++- packages/jest-mock-scheduler/package.json | 3 ++- packages/jest-react/package.json | 3 ++- packages/react-art/package.json | 1 + packages/react-cache/package.json | 3 ++- packages/react-debug-tools/package.json | 3 ++- packages/react-dom/package.json | 3 ++- packages/react-flight-dom-webpack/package.json | 3 ++- packages/react-flight/package.json | 3 ++- packages/react-interactions/package.json | 3 ++- packages/react-is/package.json | 1 + packages/react-noop-renderer/package.json | 3 ++- packages/react-refresh/package.json | 3 ++- packages/react-server/package.json | 3 ++- packages/react-test-renderer/package.json | 3 ++- packages/react/package.json | 3 ++- packages/scheduler/package.json | 3 ++- packages/use-subscription/package.json | 3 ++- 20 files changed, 39 insertions(+), 19 deletions(-) diff --git a/packages/babel-plugin-react-jsx/package.json b/packages/babel-plugin-react-jsx/package.json index 41243452d4f1..6ce575476f3f 100644 --- a/packages/babel-plugin-react-jsx/package.json +++ b/packages/babel-plugin-react-jsx/package.json @@ -6,13 +6,14 @@ "main": "index.js", "dependencies": { "esutils": "^2.0.0" - + }, "files": [ "README.md", "index.js", "build-info.json", "cjs/", - "umd/" + "umd/", + "esm/" ] } diff --git a/packages/create-subscription/package.json b/packages/create-subscription/package.json index 34b87144a92b..436137abe1c5 100644 --- a/packages/create-subscription/package.json +++ b/packages/create-subscription/package.json @@ -12,7 +12,8 @@ "README.md", "build-info.json", "index.js", - "cjs/" + "cjs/", + "esm/" ], "peerDependencies": { "react": "^16.3.0" diff --git a/packages/eslint-plugin-react-hooks/package.json b/packages/eslint-plugin-react-hooks/package.json index 6f523bcd5b6f..eb1b985b2dcf 100644 --- a/packages/eslint-plugin-react-hooks/package.json +++ b/packages/eslint-plugin-react-hooks/package.json @@ -12,7 +12,8 @@ "README.md", "build-info.json", "index.js", - "cjs" + "cjs/", + "esm/" ], "keywords": [ "eslint", diff --git a/packages/jest-mock-scheduler/package.json b/packages/jest-mock-scheduler/package.json index d53fe97f2513..d336580f9b4b 100644 --- a/packages/jest-mock-scheduler/package.json +++ b/packages/jest-mock-scheduler/package.json @@ -27,6 +27,7 @@ "README.md", "build-info.json", "index.js", - "cjs/" + "cjs/", + "esm/" ] } diff --git a/packages/jest-react/package.json b/packages/jest-react/package.json index f79d8c48ab49..b4bcb25cb5d9 100644 --- a/packages/jest-react/package.json +++ b/packages/jest-react/package.json @@ -28,6 +28,7 @@ "README.md", "build-info.json", "index.js", - "cjs/" + "cjs/", + "esm/" ] } diff --git a/packages/react-art/package.json b/packages/react-art/package.json index 863bb025dd96..2b739f3861bb 100644 --- a/packages/react-art/package.json +++ b/packages/react-art/package.json @@ -38,6 +38,7 @@ "build-info.json", "index.js", "cjs/", + "esm/", "umd/", "Circle.js", "Rectangle.js", diff --git a/packages/react-cache/package.json b/packages/react-cache/package.json index b593f6d5811e..53e2c65bc581 100644 --- a/packages/react-cache/package.json +++ b/packages/react-cache/package.json @@ -14,7 +14,8 @@ "build-info.json", "index.js", "cjs/", - "umd/" + "umd/", + "esm/" ], "peerDependencies": { "react": "^16.3.0-alpha.1" diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index 1a2e787d12bc..09ea83d5f6b0 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -14,7 +14,8 @@ "README.md", "build-info.json", "index.js", - "cjs/" + "cjs/", + "esm/" ], "main": "index.js", "repository": { diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 7e6cf5e5c0ee..98c465667a52 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -41,7 +41,8 @@ "unstable-fizz.node.js", "unstable-native-dependencies.js", "cjs/", - "umd/" + "umd/", + "esm/" ], "browser": { "./server.js": "./server.browser.js", diff --git a/packages/react-flight-dom-webpack/package.json b/packages/react-flight-dom-webpack/package.json index 8f48fae57f51..9304005b848f 100644 --- a/packages/react-flight-dom-webpack/package.json +++ b/packages/react-flight-dom-webpack/package.json @@ -17,7 +17,8 @@ "server.browser.js", "server.node.js", "cjs/", - "umd/" + "umd/", + "esm/" ], "browser": { "./server.js": "./server.browser.js" diff --git a/packages/react-flight/package.json b/packages/react-flight/package.json index e6eabd3c4b02..443c7c2fcecc 100644 --- a/packages/react-flight/package.json +++ b/packages/react-flight/package.json @@ -13,7 +13,8 @@ "LICENSE", "README.md", "index.js", - "cjs/" + "cjs/", + "esm/" ], "main": "index.js", "repository": { diff --git a/packages/react-interactions/package.json b/packages/react-interactions/package.json index fe926f849c1e..aa12a40e35b8 100644 --- a/packages/react-interactions/package.json +++ b/packages/react-interactions/package.json @@ -26,7 +26,8 @@ "events/tap.js", "build-info.json", "cjs/", - "umd/" + "umd/", + "esm/" ], "main": "index.js", "repository": { diff --git a/packages/react-is/package.json b/packages/react-is/package.json index 06afaceffa9c..784ccc22396c 100644 --- a/packages/react-is/package.json +++ b/packages/react-is/package.json @@ -3,6 +3,7 @@ "version": "16.12.0", "description": "Brand checking of React Elements.", "main": "index.js", + "module": "esm/react-is.production.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-noop-renderer/package.json b/packages/react-noop-renderer/package.json index 0f95472ae41e..d5192b566a79 100644 --- a/packages/react-noop-renderer/package.json +++ b/packages/react-noop-renderer/package.json @@ -30,6 +30,7 @@ "server.js", "flight-client.js", "flight-server.js", - "cjs/" + "cjs/", + "esm/" ] } diff --git a/packages/react-refresh/package.json b/packages/react-refresh/package.json index 3951e27734f9..6ac8cfa856e2 100644 --- a/packages/react-refresh/package.json +++ b/packages/react-refresh/package.json @@ -15,7 +15,8 @@ "runtime.js", "build-info.json", "cjs/", - "umd/" + "umd/", + "esm/" ], "main": "index.js", "repository": { diff --git a/packages/react-server/package.json b/packages/react-server/package.json index 77ff922fcd53..ce532182b926 100644 --- a/packages/react-server/package.json +++ b/packages/react-server/package.json @@ -14,7 +14,8 @@ "README.md", "index.js", "flight.js", - "cjs/" + "cjs/", + "esm/" ], "main": "index.js", "repository": { diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index 85e8653c0bd6..d5b6718d1e5b 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -34,6 +34,7 @@ "index.js", "shallow.js", "cjs/", - "umd/" + "umd/", + "esm/" ] } diff --git a/packages/react/package.json b/packages/react/package.json index a1d1a21e0d93..938019a98520 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -14,7 +14,8 @@ "build-info.json", "index.js", "cjs/", - "umd/" + "umd/", + "esm/" ], "main": "index.js", "repository": { diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index 81315b6d5e0b..899fe33269c6 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -29,7 +29,8 @@ "tracing-profiling.js", "unstable_mock.js", "cjs/", - "umd/" + "umd/", + "esm/" ], "browserify": { "transform": [ diff --git a/packages/use-subscription/package.json b/packages/use-subscription/package.json index 3e6138921d75..88d81647f8ab 100644 --- a/packages/use-subscription/package.json +++ b/packages/use-subscription/package.json @@ -12,7 +12,8 @@ "README.md", "build-info.json", "index.js", - "cjs/" + "cjs/", + "esm/" ], "dependencies": { "object-assign": "^4.1.1" From 6a82a9acba60a00e68e29debb7c54683b9eb88f1 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Mon, 25 Nov 2019 14:27:07 -0800 Subject: [PATCH 05/49] remove the ampproject closure-compiler plugin, skip minifying of ESM production bundle for now The amp-project closure compiler plugin was not doing much --- package.json | 1 - scripts/rollup/build.js | 12 +++- yarn.lock | 119 +--------------------------------------- 3 files changed, 11 insertions(+), 121 deletions(-) diff --git a/package.json b/package.json index 76fafc74323f..3b615ba29d06 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "packages/*" ], "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "^0.13.0", "@babel/cli": "^7.0.0", "@babel/code-frame": "^7.0.0", "@babel/core": "^7.0.0", diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index 7336e44af3a7..21aa5c6346c5 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -2,7 +2,7 @@ const rollup = require('rollup'); const babel = require('rollup-plugin-babel'); -const closure = require('@ampproject/rollup-plugin-closure-compiler'); +const closure = require('./plugins/closure-plugin'); const commonjs = require('rollup-plugin-commonjs'); const prettier = require('rollup-plugin-prettier'); const replace = require('rollup-plugin-replace'); @@ -99,6 +99,7 @@ const errorCodeOpts = { const closureOptions = { compilation_level: 'SIMPLE', + language_in: 'ECMASCRIPT5_STRICT', language_out: 'ECMASCRIPT5_STRICT', env: 'CUSTOM', warning_level: 'QUIET', @@ -228,7 +229,7 @@ function getFilename(name, globalName, bundleType) { case ESM_DEV: return `${name}.development.mjs`; case ESM_PROD: - return `${name}.production.min.mjs`; + return `${name}.production.mjs`; case NODE_DEV: return `${name}.development.js`; case NODE_PROD: @@ -276,6 +277,10 @@ function isProductionBundleType(bundleType) { } } +function isMinifiable(bundleType) { + return isProductionBundleType(bundleType) && bundleType !== ESM_PROD; +} + function isProfilingBundleType(bundleType) { switch (bundleType) { case FB_WWW_DEV: @@ -330,6 +335,7 @@ function getPlugins( const findAndRecordErrorCodes = extractErrorCodes(errorCodeOpts); const forks = Modules.getForks(bundleType, entry, moduleType); const isProduction = isProductionBundleType(bundleType); + const isMinified = isMinifiable(bundleType); const isProfiling = isProfilingBundleType(bundleType); const isUMDBundle = bundleType === UMD_DEV || @@ -388,7 +394,7 @@ function getPlugins( // We still need CommonJS for external deps like object-assign. commonjs(), // Apply dead code elimination and/or minification. - isProduction && + isMinified && closure( Object.assign({}, closureOptions, { // Don't let it create global variables in the browser. diff --git a/yarn.lock b/yarn.lock index 02cbbd26b5b6..e235f8485770 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,18 +2,6 @@ # yarn lockfile v1 -"@ampproject/rollup-plugin-closure-compiler@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@ampproject/rollup-plugin-closure-compiler/-/rollup-plugin-closure-compiler-0.13.0.tgz#23083ada1e5f899280c38acbf22454616ccc78a8" - integrity sha512-uvbNj/ngTZxHZM7y1RLC+hQ1qUZ9JH0BVdVmcAWRH6U/25ek18V/r+ks9VKmkzRfn8Oe9nY4XmXHJozfQGVOIQ== - dependencies: - acorn "7.1.0" - acorn-dynamic-import "4.0.0" - acorn-walk "7.0.0" - google-closure-compiler "20191111.0.0" - magic-string "0.25.4" - temp-write "4.0.0" - "@babel/cli@^7.0.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.5.5.tgz#bdb6d9169e93e241a08f5f7b0265195bf38ef5ec" @@ -1526,11 +1514,6 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-dynamic-import@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - acorn-globals@^4.1.0: version "4.3.3" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e" @@ -1551,21 +1534,11 @@ acorn-jsx@^5.0.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -acorn-walk@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" - integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== - acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -acorn@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== - acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -3263,7 +3236,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@2.x, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -6197,46 +6170,21 @@ google-closure-compiler-java@^20190301.0.0: resolved "https://registry.yarnpkg.com/google-closure-compiler-java/-/google-closure-compiler-java-20190301.0.0.tgz#89d1d6ab04b7625daf38d63b28b557f92103e3e1" integrity sha512-IMv77Mu1chPjSaJC1PWyKSNIvm19nSjx4oXvf67ZBLRkuPKHb3S1ECD3l71pfxNZ2+2tAXnxkEcWcREJ8ph4Tg== -google-closure-compiler-java@^20191111.0.0: - version "20191111.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-java/-/google-closure-compiler-java-20191111.0.0.tgz#3fb9c464f49a73b5de3fa8ac3c2ef9c2b747266d" - integrity sha512-JgsQtJVVgDuj50VPQV1OgHxMy78daTL3d607V6zF/qETl3rEEiazEGfXDGUX/1V1SUOW+Y03Ct9bcO3LMxNlxg== - google-closure-compiler-js@^20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20190301.0.0.tgz#2b1035a13e42118386dbdf264195976d42240870" integrity sha512-J0HVHwpGf3o5MwyifrYhfhNpD7Zznn+fktcKKmwhguKqaNbgCr1AfnaGEarej3Lx1W9CouJEm5OTRTZRJgvRHQ== -google-closure-compiler-js@^20191111.0.0: - version "20191111.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20191111.0.0.tgz#94112796826d50d0b3717c80ab633a60d2617ff7" - integrity sha512-W3Oy5NF5CMgUv31CMbgLN7zhdCTVMTnNI//iEPYMotzXfX8viyOnTMipDDwJNeMnY7lfXbQrYOo+QkWP6WzZtg== - google-closure-compiler-linux@^20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler-linux/-/google-closure-compiler-linux-20190301.0.0.tgz#dfc0f564642fdfad19ba59e1ced7957fcf3ecbc4" integrity sha512-r+47izRha1ZOHP8E5wq7YsjatzJVD0yn/7dnZA/jSJmTxoFDfEaV78PYGAgCpL8kslHHApPDFEn9Ozx2eSH2gg== -google-closure-compiler-linux@^20191111.0.0: - version "20191111.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-linux/-/google-closure-compiler-linux-20191111.0.0.tgz#f66eb017b24c474565a903f966472e7a4c05efd9" - integrity sha512-pxxB83Ae7G9OHFSOEzOYlp844YyqQgU1RXBpCGBKeDAQrs3dykHqRhNGZdI7N1tsby/pT+hKL1US2l/CslPqag== - google-closure-compiler-osx@^20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler-osx/-/google-closure-compiler-osx-20190301.0.0.tgz#006c4c4eb8f5a7078b208a107ec5f204f151ead1" integrity sha512-W/Mub4k7oKcd1XYIae0NrJysNvpiAjXhq0DCoTJaTZzkc8dGVqcvrQ/YqYNwLkUULqL1dsrYyt3jv1X6l9OqZw== -google-closure-compiler-osx@^20191111.0.0: - version "20191111.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-osx/-/google-closure-compiler-osx-20191111.0.0.tgz#4b841fca5857dd05fbcf4ae312781e52e37c732e" - integrity sha512-sviL1DLN+dDfYBLzmU6+2Yk19P1uzUHQuKaXrHxEYZkU4jTJNq/TC4xi6t0ZgvLQEm2Vf7xhOrt80TYKnoQaVg== - -google-closure-compiler-windows@^20191111.0.0: - version "20191111.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-windows/-/google-closure-compiler-windows-20191111.0.0.tgz#da49d1814261fffbbe7bde1efc49c35eb533e89e" - integrity sha512-iKdz2bWrrM4zLv3USCRtWX4kLWzZhbj/afh/W6giLxg5XQzbNg+UpVF+2G6f/LEYK9UNBgS2TdyNTuw8mod+Mg== - google-closure-compiler@20190301.0.0: version "20190301.0.0" resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20190301.0.0.tgz#332e5b940601047a580bcf182e782f089b2c7cf2" @@ -6252,22 +6200,6 @@ google-closure-compiler@20190301.0.0: google-closure-compiler-linux "^20190301.0.0" google-closure-compiler-osx "^20190301.0.0" -google-closure-compiler@20191111.0.0: - version "20191111.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20191111.0.0.tgz#c2584b87d855cc4e23d5805e8f7269eb9a9166f2" - integrity sha512-Ji+FaqYKXNbJ78N5Do6hu61mPrB9D+8xSnmRO59u2CrIbmNCtoFnqkCAAL4Ye8LR8foRqtkDdiKJSblpe+5ttg== - dependencies: - chalk "2.x" - google-closure-compiler-java "^20191111.0.0" - google-closure-compiler-js "^20191111.0.0" - minimist "1.x" - vinyl "2.x" - vinyl-sourcemaps-apply "^0.2.0" - optionalDependencies: - google-closure-compiler-linux "^20191111.0.0" - google-closure-compiler-osx "^20191111.0.0" - google-closure-compiler-windows "^20191111.0.0" - got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -7289,11 +7221,6 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -8488,13 +8415,6 @@ magic-string@0.22.4, magic-string@^0.22.4: dependencies: vlq "^0.2.1" -magic-string@0.25.4: - version "0.25.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.4.tgz#325b8a0a79fc423db109b77fd5a19183b7ba5143" - integrity sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw== - dependencies: - sourcemap-codec "^1.4.4" - make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -8510,13 +8430,6 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" - integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== - dependencies: - semver "^6.0.0" - make-fetch-happen@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz#a8e3fe41d3415dd656fe7b8e8172e1fb4458b38d" @@ -8761,7 +8674,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@1.x, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -11938,11 +11851,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sourcemap-codec@^1.4.4: - version "1.4.6" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" - integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== - spawn-sync@1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" @@ -12437,17 +12345,6 @@ temp-dir@^1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= -temp-write@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" - integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== - dependencies: - graceful-fs "^4.1.15" - is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.3.2" - tempfile@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" @@ -13140,18 +13037,6 @@ vinyl-sourcemaps-apply@^0.2.0: dependencies: source-map "^0.5.1" -vinyl@2.x: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - vinyl@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" From 00684f448fa54f3efe8e1598222b1ca259f4d154 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Mon, 25 Nov 2019 16:06:48 -0800 Subject: [PATCH 06/49] move forbid-fbjs plugin to plugins folder --- scripts/rollup/build.js | 36 ++++++++++++++------------- scripts/rollup/plugins/forbid-fbjs.js | 15 +++++++++++ 2 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 scripts/rollup/plugins/forbid-fbjs.js diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index 21aa5c6346c5..963d1aa1b191 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -18,6 +18,7 @@ const Stats = require('./stats'); const Sync = require('./sync'); const sizes = require('./plugins/sizes-plugin'); const useForks = require('./plugins/use-forks-plugin'); +const forbidFBJSImports = require('./plugins/forbid-fbjs'); const stripUnusedImports = require('./plugins/strip-unused-imports'); const extractErrorCodes = require('../error-codes/extract-errors'); const Packaging = require('./packaging'); @@ -99,10 +100,9 @@ const errorCodeOpts = { const closureOptions = { compilation_level: 'SIMPLE', - language_in: 'ECMASCRIPT5_STRICT', - language_out: 'ECMASCRIPT5_STRICT', env: 'CUSTOM', warning_level: 'QUIET', + module_resolution: 'NODE', apply_input_source_maps: false, use_types_for_optimization: false, process_common_js_modules: false, @@ -150,6 +150,8 @@ function getBabelConfig(updateBabelOptions, bundleType, filename) { case UMD_DEV: case UMD_PROD: case UMD_PROFILING: + case ESM_DEV: + case ESM_PROD: case NODE_DEV: case NODE_PROD: case NODE_PROFILING: @@ -278,7 +280,20 @@ function isProductionBundleType(bundleType) { } function isMinifiable(bundleType) { - return isProductionBundleType(bundleType) && bundleType !== ESM_PROD; + // esm minification is TODO + return isProductionBundleType(bundleType) && !isEsmBundle(bundleType); +} + +function isEsmBundle(bundleType) { + return bundleType === ESM_DEV || bundleType === ESM_PROD; +} + +function getOutputType(bundleType) { + if (isEsmBundle) { + return 'ECMASCRIPT6_STRICT'; + } else { + return 'ECMASCRIPT5_STRICT'; + } } function isProfilingBundleType(bundleType) { @@ -307,20 +322,6 @@ function isProfilingBundleType(bundleType) { } } -function forbidFBJSImports() { - return { - name: 'forbidFBJSImports', - resolveId(importee, importer) { - if (/^fbjs\//.test(importee)) { - throw new Error( - `Don't import ${importee} (found in ${importer}). ` + - `Use the utilities in packages/shared/ instead.` - ); - } - }, - }; -} - function getPlugins( entry, externals, @@ -401,6 +402,7 @@ function getPlugins( // https://github.com/facebook/react/issues/10909 assume_function_wrapper: !isUMDBundle, renaming: !shouldStayReadable, + language_out: getOutputType(bundleType), }) ), // HACK to work around the fact that Rollup isn't removing unused, pure-module imports. diff --git a/scripts/rollup/plugins/forbid-fbjs.js b/scripts/rollup/plugins/forbid-fbjs.js new file mode 100644 index 000000000000..646e79fa21f4 --- /dev/null +++ b/scripts/rollup/plugins/forbid-fbjs.js @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = function forbidFBJSImports() { + return { + name: 'forbidFBJSImports', + resolveId(importee, importer) { + if (/^fbjs\//.test(importee)) { + throw new Error( + `Don't import ${importee} (found in ${importer}). ` + + `Use the utilities in packages/shared/ instead.` + ); + } + }, + }; +}; From 1f6c0f8e8b3c43ddf9bec5be9813b268b7685f50 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 10:25:06 -0800 Subject: [PATCH 07/49] build: refactor build.js into a set of packages --- .gitignore | 5 +- package.json | 2 +- packages/create-subscription/package.json | 2 + scripts/rollup/build.js | 741 -------------------- scripts/rollup/build/createBundle.js | 163 +++++ scripts/rollup/build/getBabelConfig.js | 85 +++ scripts/rollup/build/getBundlesToBuild.js | 56 ++ scripts/rollup/build/getFilename.js | 59 ++ scripts/rollup/build/getFormat.js | 50 ++ scripts/rollup/build/getRollupPlugins.js | 193 +++++ scripts/rollup/build/handlePromiseErrors.js | 12 + scripts/rollup/build/handleRollupIssues.js | 78 +++ scripts/rollup/build/index.js | 64 ++ scripts/rollup/build/messages.js | 21 + scripts/rollup/build/predicates.js | 170 +++++ 15 files changed, 957 insertions(+), 744 deletions(-) delete mode 100644 scripts/rollup/build.js create mode 100644 scripts/rollup/build/createBundle.js create mode 100644 scripts/rollup/build/getBabelConfig.js create mode 100644 scripts/rollup/build/getBundlesToBuild.js create mode 100644 scripts/rollup/build/getFilename.js create mode 100644 scripts/rollup/build/getFormat.js create mode 100644 scripts/rollup/build/getRollupPlugins.js create mode 100644 scripts/rollup/build/handlePromiseErrors.js create mode 100644 scripts/rollup/build/handleRollupIssues.js create mode 100644 scripts/rollup/build/index.js create mode 100644 scripts/rollup/build/messages.js create mode 100644 scripts/rollup/build/predicates.js diff --git a/.gitignore b/.gitignore index 902e6c9c8838..9e53f84eb5b7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,8 @@ scripts/flow/*/.flowconfig .grunt _SpecRunner.html __benchmarks__ -build/ +build/* +!rollup/scripts/build/ remote-repo/ coverage/ .module-cache @@ -32,4 +33,4 @@ packages/react-devtools-extensions/firefox/*.xpi packages/react-devtools-extensions/firefox/*.pem packages/react-devtools-extensions/shared/build packages/react-devtools-inline/dist -packages/react-devtools-shell/dist \ No newline at end of file +packages/react-devtools-shell/dist diff --git a/package.json b/package.json index 3b615ba29d06..747e804c7cdd 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "testRegex": "/scripts/jest/dont-run-jest-directly\\.js$" }, "scripts": { - "build": "node ./scripts/rollup/build.js", + "build": "node ./scripts/rollup/build", "linc": "node ./scripts/tasks/linc.js", "lint": "node ./scripts/tasks/eslint.js", "lint-build": "node ./scripts/rollup/validate/index.js", diff --git a/packages/create-subscription/package.json b/packages/create-subscription/package.json index 436137abe1c5..b4a5fec1aab0 100644 --- a/packages/create-subscription/package.json +++ b/packages/create-subscription/package.json @@ -2,6 +2,8 @@ "name": "create-subscription", "description": "utility for subscribing to external data sources inside React components", "version": "16.12.0", + "main": "index.js", + "module": "esm/create-subscription.production.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js deleted file mode 100644 index 963d1aa1b191..000000000000 --- a/scripts/rollup/build.js +++ /dev/null @@ -1,741 +0,0 @@ -'use strict'; - -const rollup = require('rollup'); -const babel = require('rollup-plugin-babel'); -const closure = require('./plugins/closure-plugin'); -const commonjs = require('rollup-plugin-commonjs'); -const prettier = require('rollup-plugin-prettier'); -const replace = require('rollup-plugin-replace'); -const stripBanner = require('rollup-plugin-strip-banner'); -const chalk = require('chalk'); -const path = require('path'); -const resolve = require('rollup-plugin-node-resolve'); -const fs = require('fs'); -const argv = require('minimist')(process.argv.slice(2)); -const Modules = require('./modules'); -const Bundles = require('./bundles'); -const Stats = require('./stats'); -const Sync = require('./sync'); -const sizes = require('./plugins/sizes-plugin'); -const useForks = require('./plugins/use-forks-plugin'); -const forbidFBJSImports = require('./plugins/forbid-fbjs'); -const stripUnusedImports = require('./plugins/strip-unused-imports'); -const extractErrorCodes = require('../error-codes/extract-errors'); -const Packaging = require('./packaging'); -const {asyncCopyTo, asyncRimRaf} = require('./utils'); -const codeFrame = require('babel-code-frame'); -const Wrappers = require('./wrappers'); - -const RELEASE_CHANNEL = process.env.RELEASE_CHANNEL; - -// Default to building in experimental mode. If the release channel is set via -// an environment variable, then check if it's "experimental". -const __EXPERIMENTAL__ = - typeof RELEASE_CHANNEL === 'string' - ? RELEASE_CHANNEL === 'experimental' - : true; - -// Errors in promises should be fatal. -let loggedErrors = new Set(); -process.on('unhandledRejection', err => { - if (loggedErrors.has(err)) { - // No need to print it twice. - process.exit(1); - } - throw err; -}); - -const { - UMD_DEV, - UMD_PROD, - UMD_PROFILING, - ESM_DEV, - ESM_PROD, - NODE_DEV, - NODE_PROD, - NODE_PROFILING, - FB_WWW_DEV, - FB_WWW_PROD, - FB_WWW_PROFILING, - RN_OSS_DEV, - RN_OSS_PROD, - RN_OSS_PROFILING, - RN_FB_DEV, - RN_FB_PROD, - RN_FB_PROFILING, -} = Bundles.bundleTypes; - -function parseRequestedNames(names, toCase) { - let result = []; - for (let i = 0; i < names.length; i++) { - let splitNames = names[i].split(','); - for (let j = 0; j < splitNames.length; j++) { - let name = splitNames[j].trim(); - if (!name) { - continue; - } - if (toCase === 'uppercase') { - name = name.toUpperCase(); - } else if (toCase === 'lowercase') { - name = name.toLowerCase(); - } - result.push(name); - } - } - return result; -} - -const requestedBundleTypes = argv.type - ? parseRequestedNames([argv.type], 'uppercase') - : []; -const requestedBundleNames = parseRequestedNames(argv._, 'lowercase'); -const forcePrettyOutput = argv.pretty; -const isWatchMode = argv.watch; -const syncFBSourcePath = argv['sync-fbsource']; -const syncWWWPath = argv['sync-www']; -const shouldExtractErrors = argv['extract-errors']; -const errorCodeOpts = { - errorMapFilePath: 'scripts/error-codes/codes.json', -}; - -const closureOptions = { - compilation_level: 'SIMPLE', - env: 'CUSTOM', - warning_level: 'QUIET', - module_resolution: 'NODE', - apply_input_source_maps: false, - use_types_for_optimization: false, - process_common_js_modules: false, - rewrite_polyfills: false, -}; - -function getBabelConfig(updateBabelOptions, bundleType, filename) { - let options = { - exclude: '/**/node_modules/**', - presets: [], - plugins: [], - }; - if (updateBabelOptions) { - options = updateBabelOptions(options); - } - switch (bundleType) { - case FB_WWW_DEV: - case FB_WWW_PROD: - case FB_WWW_PROFILING: - return Object.assign({}, options, { - plugins: options.plugins.concat([ - // Minify invariant messages - require('../error-codes/transform-error-messages'), - // Wrap warning() calls in a __DEV__ check so they are stripped from production. - require('../babel/wrap-warning-with-env-check'), - ]), - }); - case RN_OSS_DEV: - case RN_OSS_PROD: - case RN_OSS_PROFILING: - case RN_FB_DEV: - case RN_FB_PROD: - case RN_FB_PROFILING: - return Object.assign({}, options, { - plugins: options.plugins.concat([ - [ - require('../error-codes/transform-error-messages'), - // Preserve full error messages in React Native build - {noMinify: true}, - ], - // Wrap warning() calls in a __DEV__ check so they are stripped from production. - require('../babel/wrap-warning-with-env-check'), - ]), - }); - case UMD_DEV: - case UMD_PROD: - case UMD_PROFILING: - case ESM_DEV: - case ESM_PROD: - case NODE_DEV: - case NODE_PROD: - case NODE_PROFILING: - return Object.assign({}, options, { - plugins: options.plugins.concat([ - // Use object-assign polyfill in open source - path.resolve('./scripts/babel/transform-object-assign-require'), - // Minify invariant messages - require('../error-codes/transform-error-messages'), - // Wrap warning() calls in a __DEV__ check so they are stripped from production. - require('../babel/wrap-warning-with-env-check'), - ]), - }); - default: - return options; - } -} - -function getRollupOutputOptions( - outputPath, - format, - globals, - globalName, - bundleType -) { - const isProduction = isProductionBundleType(bundleType); - - return Object.assign( - {}, - { - file: outputPath, - format, - globals, - freeze: !isProduction, - interop: false, - name: globalName, - sourcemap: false, - } - ); -} - -function getFormat(bundleType) { - switch (bundleType) { - case UMD_DEV: - case UMD_PROD: - case UMD_PROFILING: - return `umd`; - case ESM_DEV: - case ESM_PROD: - return 'es'; - case NODE_DEV: - case NODE_PROD: - case NODE_PROFILING: - case FB_WWW_DEV: - case FB_WWW_PROD: - case FB_WWW_PROFILING: - case RN_OSS_DEV: - case RN_OSS_PROD: - case RN_OSS_PROFILING: - case RN_FB_DEV: - case RN_FB_PROD: - case RN_FB_PROFILING: - return `cjs`; - } -} - -function getFilename(name, globalName, bundleType) { - // we do this to replace / to -, for react-dom/server - name = name.replace('/', '-'); - switch (bundleType) { - case UMD_DEV: - return `${name}.development.js`; - case UMD_PROD: - return `${name}.production.min.js`; - case UMD_PROFILING: - return `${name}.profiling.min.js`; - case ESM_DEV: - return `${name}.development.mjs`; - case ESM_PROD: - return `${name}.production.mjs`; - case NODE_DEV: - return `${name}.development.js`; - case NODE_PROD: - return `${name}.production.min.js`; - case NODE_PROFILING: - return `${name}.profiling.min.js`; - case FB_WWW_DEV: - case RN_OSS_DEV: - case RN_FB_DEV: - return `${globalName}-dev.js`; - case FB_WWW_PROD: - case RN_OSS_PROD: - case RN_FB_PROD: - return `${globalName}-prod.js`; - case FB_WWW_PROFILING: - case RN_FB_PROFILING: - case RN_OSS_PROFILING: - return `${globalName}-profiling.js`; - } -} - -function isProductionBundleType(bundleType) { - switch (bundleType) { - case UMD_DEV: - case NODE_DEV: - case ESM_DEV: - case FB_WWW_DEV: - case RN_OSS_DEV: - case RN_FB_DEV: - return false; - case UMD_PROD: - case NODE_PROD: - case UMD_PROFILING: - case NODE_PROFILING: - case ESM_PROD: - case FB_WWW_PROD: - case FB_WWW_PROFILING: - case RN_OSS_PROD: - case RN_OSS_PROFILING: - case RN_FB_PROD: - case RN_FB_PROFILING: - return true; - default: - throw new Error(`Unknown type: ${bundleType}`); - } -} - -function isMinifiable(bundleType) { - // esm minification is TODO - return isProductionBundleType(bundleType) && !isEsmBundle(bundleType); -} - -function isEsmBundle(bundleType) { - return bundleType === ESM_DEV || bundleType === ESM_PROD; -} - -function getOutputType(bundleType) { - if (isEsmBundle) { - return 'ECMASCRIPT6_STRICT'; - } else { - return 'ECMASCRIPT5_STRICT'; - } -} - -function isProfilingBundleType(bundleType) { - switch (bundleType) { - case FB_WWW_DEV: - case FB_WWW_PROD: - case NODE_DEV: - case NODE_PROD: - case RN_FB_DEV: - case RN_FB_PROD: - case RN_OSS_DEV: - case RN_OSS_PROD: - case UMD_DEV: - case UMD_PROD: - case ESM_DEV: - case ESM_PROD: - return false; - case FB_WWW_PROFILING: - case NODE_PROFILING: - case RN_FB_PROFILING: - case RN_OSS_PROFILING: - case UMD_PROFILING: - return true; - default: - throw new Error(`Unknown type: ${bundleType}`); - } -} - -function getPlugins( - entry, - externals, - updateBabelOptions, - filename, - packageName, - bundleType, - globalName, - moduleType, - pureExternalModules -) { - const findAndRecordErrorCodes = extractErrorCodes(errorCodeOpts); - const forks = Modules.getForks(bundleType, entry, moduleType); - const isProduction = isProductionBundleType(bundleType); - const isMinified = isMinifiable(bundleType); - const isProfiling = isProfilingBundleType(bundleType); - const isUMDBundle = - bundleType === UMD_DEV || - bundleType === UMD_PROD || - bundleType === UMD_PROFILING; - const isFBBundle = - bundleType === FB_WWW_DEV || - bundleType === FB_WWW_PROD || - bundleType === FB_WWW_PROFILING; - const isRNBundle = - bundleType === RN_OSS_DEV || - bundleType === RN_OSS_PROD || - bundleType === RN_OSS_PROFILING || - bundleType === RN_FB_DEV || - bundleType === RN_FB_PROD || - bundleType === RN_FB_PROFILING; - const shouldStayReadable = isFBBundle || isRNBundle || forcePrettyOutput; - return [ - // Extract error codes from invariant() messages into a file. - shouldExtractErrors && { - transform(source) { - findAndRecordErrorCodes(source); - return source; - }, - }, - // Shim any modules that need forking in this environment. - useForks(forks), - // Ensure we don't try to bundle any fbjs modules. - forbidFBJSImports(), - // Replace any externals with their valid internal FB mappings - isFBBundle && replace(Bundles.fbBundleExternalsMap), - // Use Node resolution mechanism. - resolve({ - skip: externals, - }), - // Remove license headers from individual modules - stripBanner({ - exclude: 'node_modules/**/*', - }), - // Compile to ES5. - babel(getBabelConfig(updateBabelOptions, bundleType)), - // Remove 'use strict' from individual source files. - { - transform(source) { - return source.replace(/['"]use strict["']/g, ''); - }, - }, - // Turn __DEV__ and process.env checks into constants. - replace({ - __DEV__: isProduction ? 'false' : 'true', - __PROFILE__: isProfiling || !isProduction ? 'true' : 'false', - __UMD__: isUMDBundle ? 'true' : 'false', - 'process.env.NODE_ENV': isProduction ? "'production'" : "'development'", - __EXPERIMENTAL__, - }), - // We still need CommonJS for external deps like object-assign. - commonjs(), - // Apply dead code elimination and/or minification. - isMinified && - closure( - Object.assign({}, closureOptions, { - // Don't let it create global variables in the browser. - // https://github.com/facebook/react/issues/10909 - assume_function_wrapper: !isUMDBundle, - renaming: !shouldStayReadable, - language_out: getOutputType(bundleType), - }) - ), - // HACK to work around the fact that Rollup isn't removing unused, pure-module imports. - // Note that this plugin must be called after closure applies DCE. - isProduction && stripUnusedImports(pureExternalModules), - // Add the whitespace back if necessary. - shouldStayReadable && prettier({parser: 'babylon'}), - // License and haste headers, top-level `if` blocks. - { - transformBundle(source) { - return Wrappers.wrapBundle( - source, - bundleType, - globalName, - filename, - moduleType - ); - }, - }, - // Record bundle size. - sizes({ - getSize: (size, gzip) => { - const currentSizes = Stats.currentBuildResults.bundleSizes; - const recordIndex = currentSizes.findIndex( - record => - record.filename === filename && record.bundleType === bundleType - ); - const index = recordIndex !== -1 ? recordIndex : currentSizes.length; - currentSizes[index] = { - filename, - bundleType, - packageName, - size, - gzip, - }; - }, - }), - ].filter(Boolean); -} - -function shouldSkipBundle(bundle, bundleType) { - const shouldSkipBundleType = bundle.bundleTypes.indexOf(bundleType) === -1; - if (shouldSkipBundleType) { - return true; - } - if (requestedBundleTypes.length > 0) { - const isAskingForDifferentType = requestedBundleTypes.every( - requestedType => bundleType.indexOf(requestedType) === -1 - ); - if (isAskingForDifferentType) { - return true; - } - } - if (requestedBundleNames.length > 0) { - const isAskingForDifferentNames = requestedBundleNames.every( - // If the name ends with `something/index` we only match if the - // entry ends in something. Such as `react-dom/index` only matches - // `react-dom` but not `react-dom/server`. Everything else is fuzzy - // search. - requestedName => - (bundle.entry + '/index.js').indexOf(requestedName) === -1 - ); - if (isAskingForDifferentNames) { - return true; - } - } - return false; -} - -async function createBundle(bundle, bundleType) { - if (shouldSkipBundle(bundle, bundleType)) { - return; - } - - const filename = getFilename(bundle.entry, bundle.global, bundleType); - const logKey = - chalk.white.bold(filename) + chalk.dim(` (${bundleType.toLowerCase()})`); - const format = getFormat(bundleType); - const packageName = Packaging.getPackageName(bundle.entry); - - let resolvedEntry = require.resolve(bundle.entry); - const isFBBundle = - bundleType === FB_WWW_DEV || - bundleType === FB_WWW_PROD || - bundleType === FB_WWW_PROFILING; - if (isFBBundle) { - const resolvedFBEntry = resolvedEntry.replace('.js', '.fb.js'); - if (fs.existsSync(resolvedFBEntry)) { - resolvedEntry = resolvedFBEntry; - } - } - - const shouldBundleDependencies = - bundleType === UMD_DEV || - bundleType === UMD_PROD || - bundleType === UMD_PROFILING; - const peerGlobals = Modules.getPeerGlobals(bundle.externals, bundleType); - let externals = Object.keys(peerGlobals); - if (!shouldBundleDependencies) { - const deps = Modules.getDependencies(bundleType, bundle.entry); - externals = externals.concat(deps); - } - if (isFBBundle) { - // Add any mapped fb bundle externals - externals = externals.concat(Object.values(Bundles.fbBundleExternalsMap)); - } - - const importSideEffects = Modules.getImportSideEffects(); - const pureExternalModules = Object.keys(importSideEffects).filter( - module => !importSideEffects[module] - ); - - const rollupConfig = { - input: resolvedEntry, - treeshake: { - pureExternalModules, - }, - external(id) { - const containsThisModule = pkg => id === pkg || id.startsWith(pkg + '/'); - const isProvidedByDependency = externals.some(containsThisModule); - if (!shouldBundleDependencies && isProvidedByDependency) { - return true; - } - return !!peerGlobals[id]; - }, - onwarn: handleRollupWarning, - plugins: getPlugins( - bundle.entry, - externals, - bundle.babel, - filename, - packageName, - bundleType, - bundle.global, - bundle.moduleType, - pureExternalModules - ), - // We can't use getters in www. - legacy: - bundleType === FB_WWW_DEV || - bundleType === FB_WWW_PROD || - bundleType === FB_WWW_PROFILING, - }; - const [mainOutputPath, ...otherOutputPaths] = Packaging.getBundleOutputPaths( - bundleType, - filename, - packageName - ); - const rollupOutputOptions = getRollupOutputOptions( - mainOutputPath, - format, - peerGlobals, - bundle.global, - bundleType - ); - - if (isWatchMode) { - rollupConfig.output = [rollupOutputOptions]; - const watcher = rollup.watch(rollupConfig); - watcher.on('event', async event => { - switch (event.code) { - case 'BUNDLE_START': - console.log(`${chalk.bgYellow.black(' BUILDING ')} ${logKey}`); - break; - case 'BUNDLE_END': - for (let i = 0; i < otherOutputPaths.length; i++) { - await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); - } - console.log(`${chalk.bgGreen.black(' COMPLETE ')} ${logKey}\n`); - break; - case 'ERROR': - case 'FATAL': - console.log(`${chalk.bgRed.black(' OH NOES! ')} ${logKey}\n`); - handleRollupError(event.error); - break; - } - }); - } else { - console.log(`${chalk.bgYellow.black(' BUILDING ')} ${logKey}`); - try { - const result = await rollup.rollup(rollupConfig); - await result.write(rollupOutputOptions); - } catch (error) { - console.log(`${chalk.bgRed.black(' OH NOES! ')} ${logKey}\n`); - handleRollupError(error); - throw error; - } - for (let i = 0; i < otherOutputPaths.length; i++) { - await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); - } - console.log(`${chalk.bgGreen.black(' COMPLETE ')} ${logKey}\n`); - } -} - -function handleRollupWarning(warning) { - if (warning.code === 'UNUSED_EXTERNAL_IMPORT') { - const match = warning.message.match(/external module '([^']+)'/); - if (!match || typeof match[1] !== 'string') { - throw new Error( - 'Could not parse a Rollup warning. ' + 'Fix this method.' - ); - } - const importSideEffects = Modules.getImportSideEffects(); - const externalModule = match[1]; - if (typeof importSideEffects[externalModule] !== 'boolean') { - throw new Error( - 'An external module "' + - externalModule + - '" is used in a DEV-only code path ' + - 'but we do not know if it is safe to omit an unused require() to it in production. ' + - 'Please add it to the `importSideEffects` list in `scripts/rollup/modules.js`.' - ); - } - // Don't warn. We will remove side effectless require() in a later pass. - return; - } - - if (typeof warning.code === 'string') { - // This is a warning coming from Rollup itself. - // These tend to be important (e.g. clashes in namespaced exports) - // so we'll fail the build on any of them. - console.error(); - console.error(warning.message || warning); - console.error(); - process.exit(1); - } else { - // The warning is from one of the plugins. - // Maybe it's not important, so just print it. - console.warn(warning.message || warning); - } -} - -function handleRollupError(error) { - loggedErrors.add(error); - if (!error.code) { - console.error(error); - return; - } - console.error( - `\x1b[31m-- ${error.code}${error.plugin ? ` (${error.plugin})` : ''} --` - ); - console.error(error.stack); - if (error.loc && error.loc.file) { - const {file, line, column} = error.loc; - // This looks like an error from Rollup, e.g. missing export. - // We'll use the accurate line numbers provided by Rollup but - // use Babel code frame because it looks nicer. - const rawLines = fs.readFileSync(file, 'utf-8'); - // column + 1 is required due to rollup counting column start position from 0 - // whereas babel-code-frame counts from 1 - const frame = codeFrame(rawLines, line, column + 1, { - highlightCode: true, - }); - console.error(frame); - } else if (error.codeFrame) { - // This looks like an error from a plugin (e.g. Babel). - // In this case we'll resort to displaying the provided code frame - // because we can't be sure the reported location is accurate. - console.error(error.codeFrame); - } -} - -async function buildEverything() { - if (!argv['unsafe-partial']) { - await asyncRimRaf('build'); - } - - // Run them serially for better console output - // and to avoid any potential race conditions. - - let bundles = []; - // eslint-disable-next-line no-for-of-loops/no-for-of-loops - for (const bundle of Bundles.bundles) { - bundles.push( - [bundle, UMD_DEV], - [bundle, UMD_PROD], - [bundle, UMD_PROFILING], - [bundle, NODE_DEV], - [bundle, NODE_PROD], - [bundle, NODE_PROFILING], - [bundle, ESM_DEV], - [bundle, ESM_PROD], - [bundle, RN_OSS_DEV], - [bundle, RN_OSS_PROD], - [bundle, RN_OSS_PROFILING], - [bundle, RN_FB_DEV], - [bundle, RN_FB_PROD], - [bundle, RN_FB_PROFILING] - ); - - if (__EXPERIMENTAL__) { - // www uses experimental builds only. - bundles.push( - [bundle, FB_WWW_DEV], - [bundle, FB_WWW_PROD], - [bundle, FB_WWW_PROFILING] - ); - } - } - - if (!shouldExtractErrors && process.env.CIRCLE_NODE_TOTAL) { - // In CI, parallelize bundles across multiple tasks. - const nodeTotal = parseInt(process.env.CIRCLE_NODE_TOTAL, 10); - const nodeIndex = parseInt(process.env.CIRCLE_NODE_INDEX, 10); - bundles = bundles.filter((_, i) => i % nodeTotal === nodeIndex); - } - - // eslint-disable-next-line no-for-of-loops/no-for-of-loops - for (const [bundle, bundleType] of bundles) { - await createBundle(bundle, bundleType); - } - - await Packaging.copyAllShims(); - await Packaging.prepareNpmPackages(); - - if (syncFBSourcePath) { - await Sync.syncReactNative(syncFBSourcePath); - } else if (syncWWWPath) { - await Sync.syncReactDom('build/facebook-www', syncWWWPath); - } - - console.log(Stats.printResults()); - if (!forcePrettyOutput) { - Stats.saveResults(); - } - - if (shouldExtractErrors) { - console.warn( - '\nWarning: this build was created with --extract-errors enabled.\n' + - 'this will result in extremely slow builds and should only be\n' + - 'used when the error map needs to be rebuilt.\n' - ); - } -} - -buildEverything(); diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js new file mode 100644 index 000000000000..33969c3d4c9a --- /dev/null +++ b/scripts/rollup/build/createBundle.js @@ -0,0 +1,163 @@ +'use strict'; + +const rollup = require('rollup'); +const chalk = require('chalk'); +const fs = require('fs'); +const argv = require('minimist')(process.argv.slice(2)); +const Modules = require('../modules'); +const Bundles = require('../bundles'); +const Packaging = require('../packaging'); +const {asyncCopyTo} = require('../utils'); +const { + isProductionBundleType, + isSkippableBundle, + isFatBundle, + isFacebookBundle +} = require('./predicates') +const getFilename = require('./getFilename') +const getFormat = require('./getFormat') +const { handleRollupWarning, handleRollupError } = require('./handleRollupIssues'); +const getRollupPlugins = require('./getRollupPlugins'); +const { building, complete, fatal } = require('./messages') + +const isWatchMode = argv.watch; + +function getRollupOutputOptions( + outputPath, + format, + globals, + globalName, + bundleType +) { + const isProduction = isProductionBundleType(bundleType); + + return Object.assign( + {}, + { + file: outputPath, + format, + globals, + freeze: !isProduction, + interop: false, + name: globalName, + sourcemap: false, + } + ); +} + +module.exports = async function createBundle(bundle, bundleType) { + if (isSkippableBundle(bundle, bundleType)) { + return; + } + + const filename = getFilename(bundle.entry, bundle.global, bundleType); + const logKey = + chalk.white.bold(filename) + chalk.dim(` (${bundleType.toLowerCase()})`); + const format = getFormat(bundleType); + const packageName = Packaging.getPackageName(bundle.entry); + + let resolvedEntry = require.resolve(bundle.entry); + const isFBBundle = isFacebookBundle(); + if (isFBBundle) { + const resolvedFBEntry = resolvedEntry.replace('.js', '.fb.js'); + if (fs.existsSync(resolvedFBEntry)) { + resolvedEntry = resolvedFBEntry; + } + } + + const shouldBundleDependencies = isFatBundle(bundleType); + const peerGlobals = Modules.getPeerGlobals(bundle.externals, bundleType); + let externals = Object.keys(peerGlobals); + if (!shouldBundleDependencies) { + const deps = Modules.getDependencies(bundleType, bundle.entry); + externals = externals.concat(deps); + } + if (isFBBundle) { + // Add any mapped fb bundle externals + externals = externals.concat(Object.values(Bundles.fbBundleExternalsMap)); + } + + const importSideEffects = Modules.getImportSideEffects(); + const pureExternalModules = Object.keys(importSideEffects).filter( + module => !importSideEffects[module] + ); + + const rollupConfig = { + input: resolvedEntry, + treeshake: { + pureExternalModules, + }, + external(id) { + const containsThisModule = pkg => id === pkg || id.startsWith(pkg + '/'); + const isProvidedByDependency = externals.some(containsThisModule); + if (!shouldBundleDependencies && isProvidedByDependency) { + return true; + } + return !!peerGlobals[id]; + }, + onwarn: handleRollupWarning, + plugins: getRollupPlugins( + bundle.entry, + externals, + bundle.babel, + filename, + packageName, + bundleType, + bundle.global, + bundle.moduleType, + pureExternalModules + ), + // We can't use getters in www. + legacy: isFacebookBundle(bundleType) + }; + + const [mainOutputPath, ...otherOutputPaths] = Packaging.getBundleOutputPaths( + bundleType, + filename, + packageName + ); + const rollupOutputOptions = getRollupOutputOptions( + mainOutputPath, + format, + peerGlobals, + bundle.global, + bundleType + ); + + if (isWatchMode) { + rollupConfig.output = [rollupOutputOptions]; + const watcher = rollup.watch(rollupConfig); + watcher.on('event', async event => { + switch (event.code) { + case 'BUNDLE_START': + console.log(building(logKey)); + break; + case 'BUNDLE_END': + for (let i = 0; i < otherOutputPaths.length; i++) { + await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); + } + console.log(complete(logKey)); + break; + case 'ERROR': + case 'FATAL': + console.log(fatal(logKey)); + handleRollupError(event.error); + break; + } + }); + } else { + console.log(building(logKey)); + try { + const result = await rollup.rollup(rollupConfig); + await result.write(rollupOutputOptions); + } catch (error) { + console.log(fatal(logKey)); + handleRollupError(error); + throw error; + } + for (let i = 0; i < otherOutputPaths.length; i++) { + await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); + } + console.log(complete(logKey)); + } +}; diff --git a/scripts/rollup/build/getBabelConfig.js b/scripts/rollup/build/getBabelConfig.js new file mode 100644 index 000000000000..7aa13bc6ed99 --- /dev/null +++ b/scripts/rollup/build/getBabelConfig.js @@ -0,0 +1,85 @@ +'use strict'; + +const path = require('path'); +const Bundles = require('../bundles'); + +const { + UMD_DEV, + UMD_PROD, + UMD_PROFILING, + ESM_DEV, + ESM_PROD, + NODE_DEV, + NODE_PROD, + NODE_PROFILING, + FB_WWW_DEV, + FB_WWW_PROD, + FB_WWW_PROFILING, + RN_OSS_DEV, + RN_OSS_PROD, + RN_OSS_PROFILING, + RN_FB_DEV, + RN_FB_PROD, + RN_FB_PROFILING, +} = Bundles.bundleTypes; + +module.exports = function getBabelConfig(updateBabelOptions, bundleType, filename) { + let options = { + exclude: '/**/node_modules/**', + presets: [], + plugins: [], + }; + if (updateBabelOptions) { + options = updateBabelOptions(options); + } + switch (bundleType) { + case FB_WWW_DEV: + case FB_WWW_PROD: + case FB_WWW_PROFILING: + return Object.assign({}, options, { + plugins: options.plugins.concat([ + // Minify invariant messages + require('../../error-codes/transform-error-messages'), + // Wrap warning() calls in a __DEV__ check so they are stripped from production. + require('../../babel/wrap-warning-with-env-check'), + ]), + }); + case RN_OSS_DEV: + case RN_OSS_PROD: + case RN_OSS_PROFILING: + case RN_FB_DEV: + case RN_FB_PROD: + case RN_FB_PROFILING: + return Object.assign({}, options, { + plugins: options.plugins.concat([ + [ + require('../../error-codes/transform-error-messages'), + // Preserve full error messages in React Native build + {noMinify: true}, + ], + // Wrap warning() calls in a __DEV__ check so they are stripped from production. + require('../../babel/wrap-warning-with-env-check'), + ]), + }); + case UMD_DEV: + case UMD_PROD: + case UMD_PROFILING: + case ESM_DEV: + case ESM_PROD: + case NODE_DEV: + case NODE_PROD: + case NODE_PROFILING: + return Object.assign({}, options, { + plugins: options.plugins.concat([ + // Use object-assign polyfill in open source + path.resolve('./scripts/babel/transform-object-assign-require'), + // Minify invariant messages + require('../../error-codes/transform-error-messages'), + // Wrap warning() calls in a __DEV__ check so they are stripped from production. + require('../../babel/wrap-warning-with-env-check'), + ]), + }); + default: + return options; + } +}; diff --git a/scripts/rollup/build/getBundlesToBuild.js b/scripts/rollup/build/getBundlesToBuild.js new file mode 100644 index 000000000000..7ce0cac89406 --- /dev/null +++ b/scripts/rollup/build/getBundlesToBuild.js @@ -0,0 +1,56 @@ +'use strict'; + +const { isExperimental } = require('./predicates') +const Bundles = require('../bundles'); +const { + UMD_DEV, + UMD_PROD, + UMD_PROFILING, + ESM_DEV, + ESM_PROD, + NODE_DEV, + NODE_PROD, + NODE_PROFILING, + FB_WWW_DEV, + FB_WWW_PROD, + FB_WWW_PROFILING, + RN_OSS_DEV, + RN_OSS_PROD, + RN_OSS_PROFILING, + RN_FB_DEV, + RN_FB_PROD, + RN_FB_PROFILING, +} = Bundles.bundleTypes; + +module.exports = function getBundlesToBuild() { + let bundles = []; + // eslint-disable-next-line no-for-of-loops/no-for-of-loops + for (const bundle of Bundles.bundles) { + bundles.push( + [bundle, UMD_DEV], + [bundle, UMD_PROD], + [bundle, UMD_PROFILING], + [bundle, NODE_DEV], + [bundle, NODE_PROD], + [bundle, NODE_PROFILING], + [bundle, ESM_DEV], + [bundle, ESM_PROD], + [bundle, RN_OSS_DEV], + [bundle, RN_OSS_PROD], + [bundle, RN_OSS_PROFILING], + [bundle, RN_FB_DEV], + [bundle, RN_FB_PROD], + [bundle, RN_FB_PROFILING] + ); + + if (isExperimental()) { + // www uses experimental builds only. + bundles.push( + [bundle, FB_WWW_DEV], + [bundle, FB_WWW_PROD], + [bundle, FB_WWW_PROFILING] + ); + } + } + return bundles; +} diff --git a/scripts/rollup/build/getFilename.js b/scripts/rollup/build/getFilename.js new file mode 100644 index 000000000000..d92bba95516b --- /dev/null +++ b/scripts/rollup/build/getFilename.js @@ -0,0 +1,59 @@ +'use strict'; +const Bundles = require('../bundles'); +const { + UMD_DEV, + UMD_PROD, + UMD_PROFILING, + ESM_DEV, + ESM_PROD, + NODE_DEV, + NODE_PROD, + NODE_PROFILING, + FB_WWW_DEV, + FB_WWW_PROD, + FB_WWW_PROFILING, + RN_OSS_DEV, + RN_OSS_PROD, + RN_OSS_PROFILING, + RN_FB_DEV, + RN_FB_PROD, + RN_FB_PROFILING, +} = Bundles.bundleTypes; + +/** + * Gets the output filename to use based on the bundle type + */ +module.exports = function getFilename(name, globalName, bundleType) { + // we do this to replace / to -, for react-dom/server + name = name.replace('/', '-'); + switch (bundleType) { + case UMD_DEV: + return `${name}.development.js`; + case UMD_PROD: + return `${name}.production.min.js`; + case UMD_PROFILING: + return `${name}.profiling.min.js`; + case ESM_DEV: + return `${name}.development.mjs`; + case ESM_PROD: + return `${name}.production.mjs`; + case NODE_DEV: + return `${name}.development.js`; + case NODE_PROD: + return `${name}.production.min.js`; + case NODE_PROFILING: + return `${name}.profiling.min.js`; + case FB_WWW_DEV: + case RN_OSS_DEV: + case RN_FB_DEV: + return `${globalName}-dev.js`; + case FB_WWW_PROD: + case RN_OSS_PROD: + case RN_FB_PROD: + return `${globalName}-prod.js`; + case FB_WWW_PROFILING: + case RN_FB_PROFILING: + case RN_OSS_PROFILING: + return `${globalName}-profiling.js`; + } +}; diff --git a/scripts/rollup/build/getFormat.js b/scripts/rollup/build/getFormat.js new file mode 100644 index 000000000000..c001c8b90a0d --- /dev/null +++ b/scripts/rollup/build/getFormat.js @@ -0,0 +1,50 @@ +'use strict'; + +const Bundles = require('../bundles'); +const { + UMD_DEV, + UMD_PROD, + UMD_PROFILING, + ESM_DEV, + ESM_PROD, + NODE_DEV, + NODE_PROD, + NODE_PROFILING, + FB_WWW_DEV, + FB_WWW_PROD, + FB_WWW_PROFILING, + RN_OSS_DEV, + RN_OSS_PROD, + RN_OSS_PROFILING, + RN_FB_DEV, + RN_FB_PROD, + RN_FB_PROFILING, +} = Bundles.bundleTypes; + +/** + * Gets the rollup output format to use based on the bundle type + */ +module.exports = function getFormat(bundleType) { + switch (bundleType) { + case UMD_DEV: + case UMD_PROD: + case UMD_PROFILING: + return `umd`; + case ESM_DEV: + case ESM_PROD: + return 'es'; + case NODE_DEV: + case NODE_PROD: + case NODE_PROFILING: + case FB_WWW_DEV: + case FB_WWW_PROD: + case FB_WWW_PROFILING: + case RN_OSS_DEV: + case RN_OSS_PROD: + case RN_OSS_PROFILING: + case RN_FB_DEV: + case RN_FB_PROD: + case RN_FB_PROFILING: + return `cjs`; + } +} diff --git a/scripts/rollup/build/getRollupPlugins.js b/scripts/rollup/build/getRollupPlugins.js new file mode 100644 index 000000000000..6142a9550ac9 --- /dev/null +++ b/scripts/rollup/build/getRollupPlugins.js @@ -0,0 +1,193 @@ +'use strict'; +require('./handlePromiseErrors'); +const babel = require('rollup-plugin-babel'); +const closure = require('../plugins/closure-plugin'); +const commonjs = require('rollup-plugin-commonjs'); +const prettier = require('rollup-plugin-prettier'); +const replace = require('rollup-plugin-replace'); +const stripBanner = require('rollup-plugin-strip-banner'); +const resolve = require('rollup-plugin-node-resolve'); +const argv = require('minimist')(process.argv.slice(2)); +const Modules = require('../modules'); +const Bundles = require('../bundles'); +const Stats = require('../stats'); +const sizes = require('../plugins/sizes-plugin'); +const useForks = require('../plugins/use-forks-plugin'); +const forbidFBJSImports = require('../plugins/forbid-fbjs'); +const stripUnusedImports = require('../plugins/strip-unused-imports'); +const extractErrorCodes = require('../../error-codes/extract-errors'); +const Wrappers = require('../wrappers'); +const getBabelConfig = require('./getBabelConfig'); +const { + isProductionBundleType, + isMinifiable, + isEsmBundle, + isProfilingBundleType, + isExperimental, +} = require('./predicates') + +const { + UMD_DEV, + UMD_PROD, + UMD_PROFILING, + ESM_DEV, + ESM_PROD, + NODE_DEV, + NODE_PROD, + NODE_PROFILING, + FB_WWW_DEV, + FB_WWW_PROD, + FB_WWW_PROFILING, + RN_OSS_DEV, + RN_OSS_PROD, + RN_OSS_PROFILING, + RN_FB_DEV, + RN_FB_PROD, + RN_FB_PROFILING, +} = Bundles.bundleTypes; + +const forcePrettyOutput = argv.pretty; +const shouldExtractErrors = argv['extract-errors']; +const errorCodeOpts = { + errorMapFilePath: 'scripts/error-codes/codes.json', +}; + +const closureOptions = { + compilation_level: 'SIMPLE', + env: 'CUSTOM', + warning_level: 'QUIET', + module_resolution: 'NODE', + apply_input_source_maps: false, + use_types_for_optimization: false, + process_common_js_modules: false, + rewrite_polyfills: false, +}; + +function getOutputType(bundleType) { + if (isEsmBundle) { + return 'ECMASCRIPT6_STRICT'; + } else { + return 'ECMASCRIPT5_STRICT'; + } +} + +module.exports = function getPlugins( + entry, + externals, + updateBabelOptions, + filename, + packageName, + bundleType, + globalName, + moduleType, + pureExternalModules +) { + const findAndRecordErrorCodes = extractErrorCodes(errorCodeOpts); + const forks = Modules.getForks(bundleType, entry, moduleType); + const isProduction = isProductionBundleType(bundleType); + const isMinified = isMinifiable(bundleType); + const isProfiling = isProfilingBundleType(bundleType); + const isUMDBundle = + bundleType === UMD_DEV || + bundleType === UMD_PROD || + bundleType === UMD_PROFILING; + const isFBBundle = + bundleType === FB_WWW_DEV || + bundleType === FB_WWW_PROD || + bundleType === FB_WWW_PROFILING; + const isRNBundle = + bundleType === RN_OSS_DEV || + bundleType === RN_OSS_PROD || + bundleType === RN_OSS_PROFILING || + bundleType === RN_FB_DEV || + bundleType === RN_FB_PROD || + bundleType === RN_FB_PROFILING; + const shouldStayReadable = isFBBundle || isRNBundle || forcePrettyOutput; + return [ + // Extract error codes from invariant() messages into a file. + shouldExtractErrors && { + transform(source) { + findAndRecordErrorCodes(source); + return source; + }, + }, + // Shim any modules that need forking in this environment. + useForks(forks), + // Ensure we don't try to bundle any fbjs modules. + forbidFBJSImports(), + // Replace any externals with their valid internal FB mappings + isFBBundle && replace(Bundles.fbBundleExternalsMap), + // Use Node resolution mechanism. + resolve({ + skip: externals, + }), + // Remove license headers from individual modules + stripBanner({ + exclude: 'node_modules/**/*', + }), + // Compile to ES5. + babel(getBabelConfig(updateBabelOptions, bundleType)), + // Remove 'use strict' from individual source files. + { + transform(source) { + return source.replace(/['"]use strict["']/g, ''); + }, + }, + // Turn __DEV__ and process.env checks into constants. + replace({ + __DEV__: isProduction ? 'false' : 'true', + __PROFILE__: isProfiling || !isProduction ? 'true' : 'false', + __UMD__: isUMDBundle ? 'true' : 'false', + 'process.env.NODE_ENV': isProduction ? "'production'" : "'development'", + __EXPERIMENTAL__: isExperimental, + }), + // We still need CommonJS for external deps like object-assign. + commonjs(), + // Apply dead code elimination and/or minification. + isMinified && + closure( + Object.assign({}, closureOptions, { + // Don't let it create global variables in the browser. + // https://github.com/facebook/react/issues/10909 + assume_function_wrapper: !isUMDBundle, + renaming: !shouldStayReadable, + language_out: getOutputType(bundleType), + }) + ), + // HACK to work around the fact that Rollup isn't removing unused, pure-module imports. + // Note that this plugin must be called after closure applies DCE. + isProduction && stripUnusedImports(pureExternalModules), + // Add the whitespace back if necessary. + shouldStayReadable && prettier({parser: 'babylon'}), + // License and haste headers, top-level `if` blocks. + { + transformBundle(source) { + return Wrappers.wrapBundle( + source, + bundleType, + globalName, + filename, + moduleType + ); + }, + }, + // Record bundle size. + sizes({ + getSize: (size, gzip) => { + const currentSizes = Stats.currentBuildResults.bundleSizes; + const recordIndex = currentSizes.findIndex( + record => + record.filename === filename && record.bundleType === bundleType + ); + const index = recordIndex !== -1 ? recordIndex : currentSizes.length; + currentSizes[index] = { + filename, + bundleType, + packageName, + size, + gzip, + }; + }, + }), + ].filter(Boolean); +}; diff --git a/scripts/rollup/build/handlePromiseErrors.js b/scripts/rollup/build/handlePromiseErrors.js new file mode 100644 index 000000000000..caf8975a1786 --- /dev/null +++ b/scripts/rollup/build/handlePromiseErrors.js @@ -0,0 +1,12 @@ + +// Errors in promises should be fatal. +let loggedErrors = new Set(); +process.on('unhandledRejection', err => { + if (loggedErrors.has(err)) { + // No need to print it twice. + process.exit(1); + } + throw err; +}); + +module.exports = loggedErrors; diff --git a/scripts/rollup/build/handleRollupIssues.js b/scripts/rollup/build/handleRollupIssues.js new file mode 100644 index 000000000000..a37dc739c1a8 --- /dev/null +++ b/scripts/rollup/build/handleRollupIssues.js @@ -0,0 +1,78 @@ +'use strict'; +const fs = require('fs'); +const Modules = require('../modules'); +const codeFrame = require('babel-code-frame'); +const loggedErrors = require('./handlePromiseErrors'); + +function handleRollupWarning(warning) { + if (warning.code === 'UNUSED_EXTERNAL_IMPORT') { + const match = warning.message.match(/external module '([^']+)'/); + if (!match || typeof match[1] !== 'string') { + throw new Error( + 'Could not parse a Rollup warning. ' + 'Fix this method.' + ); + } + const importSideEffects = Modules.getImportSideEffects(); + const externalModule = match[1]; + if (typeof importSideEffects[externalModule] !== 'boolean') { + throw new Error( + 'An external module "' + + externalModule + + '" is used in a DEV-only code path ' + + 'but we do not know if it is safe to omit an unused require() to it in production. ' + + 'Please add it to the `importSideEffects` list in `scripts/rollup/modules.js`.' + ); + } + // Don't warn. We will remove side effectless require() in a later pass. + return; + } + + if (typeof warning.code === 'string') { + // This is a warning coming from Rollup itself. + // These tend to be important (e.g. clashes in namespaced exports) + // so we'll fail the build on any of them. + console.error(); + console.error(warning.message || warning); + console.error(); + process.exit(1); + } else { + // The warning is from one of the plugins. + // Maybe it's not important, so just print it. + console.warn(warning.message || warning); + } +} + +function handleRollupError(error) { + loggedErrors.add(error); + if (!error.code) { + console.error(error); + return; + } + console.error( + `\x1b[31m-- ${error.code}${error.plugin ? ` (${error.plugin})` : ''} --` + ); + console.error(error.stack); + if (error.loc && error.loc.file) { + const {file, line, column} = error.loc; + // This looks like an error from Rollup, e.g. missing export. + // We'll use the accurate line numbers provided by Rollup but + // use Babel code frame because it looks nicer. + const rawLines = fs.readFileSync(file, 'utf-8'); + // column + 1 is required due to rollup counting column start position from 0 + // whereas babel-code-frame counts from 1 + const frame = codeFrame(rawLines, line, column + 1, { + highlightCode: true, + }); + console.error(frame); + } else if (error.codeFrame) { + // This looks like an error from a plugin (e.g. Babel). + // In this case we'll resort to displaying the provided code frame + // because we can't be sure the reported location is accurate. + console.error(error.codeFrame); + } +} + +module.exports = { + handleRollupError, + handleRollupWarning, +} diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js new file mode 100644 index 000000000000..49e20396cfce --- /dev/null +++ b/scripts/rollup/build/index.js @@ -0,0 +1,64 @@ +'use strict'; + +require('./handlePromiseErrors') +const argv = require('minimist')(process.argv.slice(2)); +const Stats = require('../stats'); +const Sync = require('../sync'); +const Packaging = require('../packaging'); +const {asyncRimRaf} = require('../utils'); +const getBundlesToBuild = require('./getBundlesToBuild'); +const createBundle = require('./createBundle'); + +const forcePrettyOutput = argv.pretty; +const syncFBSourcePath = argv['sync-fbsource']; +const syncWWWPath = argv['sync-www']; +const shouldExtractErrors = argv['extract-errors']; + +async function buildEverything() { + /** + * Remove the build directory unless the unsafe-partial CLI flag is set + */ + if (!argv['unsafe-partial']) { + await asyncRimRaf('build'); + } + + // Run bundle builds serially for better console output + // and to avoid any potential race conditions. + const bundles = getBundlesToBuild(); + + if (!shouldExtractErrors && process.env.CIRCLE_NODE_TOTAL) { + // In CI, parallelize bundles across multiple tasks. + const nodeTotal = parseInt(process.env.CIRCLE_NODE_TOTAL, 10); + const nodeIndex = parseInt(process.env.CIRCLE_NODE_INDEX, 10); + bundles = bundles.filter((_, i) => i % nodeTotal === nodeIndex); + } + + // eslint-disable-next-line no-for-of-loops/no-for-of-loops + for (const [bundle, bundleType] of bundles) { + await createBundle(bundle, bundleType); + } + + await Packaging.copyAllShims(); + await Packaging.prepareNpmPackages(); + + if (syncFBSourcePath) { + await Sync.syncReactNative(syncFBSourcePath); + } else if (syncWWWPath) { + await Sync.syncReactDom('build/facebook-www', syncWWWPath); + } + + console.log(Stats.printResults()); + if (!forcePrettyOutput) { + Stats.saveResults(); + } + + if (shouldExtractErrors) { + console.warn( + '\nWarning: this build was created with --extract-errors enabled.\n' + + 'this will result in extremely slow builds and should only be\n' + + 'used when the error map needs to be rebuilt.\n' + ); + } +} + +buildEverything(); diff --git a/scripts/rollup/build/messages.js b/scripts/rollup/build/messages.js new file mode 100644 index 000000000000..587291bec19d --- /dev/null +++ b/scripts/rollup/build/messages.js @@ -0,0 +1,21 @@ +'use strict'; + +const chalk = require('chalk'); + +function building(logKey) { + return `${chalk.bgYellow.black(' BUILDING ')} ${logKey}`; +} + +function complete(logKey) { + return `${chalk.bgGreen.black(' COMPLETE ')} ${logKey}\n`; +} + +function fatal(logKey) { + return `${chalk.bgRed.black(' OH NOES! ')} ${logKey}\n`; +} + +module.exports = { + building, + complete, + fatal +}; diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js new file mode 100644 index 000000000000..89e6abee8284 --- /dev/null +++ b/scripts/rollup/build/predicates.js @@ -0,0 +1,170 @@ +'use strict'; +const Bundles = require('../bundles'); +const argv = require('minimist')(process.argv.slice(2)); +const RELEASE_CHANNEL = process.env.RELEASE_CHANNEL; + +// Default to building in experimental mode. If the release channel is set via +// an environment variable, then check if it's "experimental". +function isExperimental() { + return typeof RELEASE_CHANNEL === 'string' + ? RELEASE_CHANNEL === 'experimental' + : true; +} + +const { + UMD_DEV, + UMD_PROD, + UMD_PROFILING, + ESM_DEV, + ESM_PROD, + NODE_DEV, + NODE_PROD, + NODE_PROFILING, + FB_WWW_DEV, + FB_WWW_PROD, + FB_WWW_PROFILING, + RN_OSS_DEV, + RN_OSS_PROD, + RN_OSS_PROFILING, + RN_FB_DEV, + RN_FB_PROD, + RN_FB_PROFILING, +} = Bundles.bundleTypes; + +function isProductionBundleType(bundleType) { + switch (bundleType) { + case UMD_DEV: + case NODE_DEV: + case ESM_DEV: + case FB_WWW_DEV: + case RN_OSS_DEV: + case RN_FB_DEV: + return false; + case UMD_PROD: + case NODE_PROD: + case UMD_PROFILING: + case NODE_PROFILING: + case ESM_PROD: + case FB_WWW_PROD: + case FB_WWW_PROFILING: + case RN_OSS_PROD: + case RN_OSS_PROFILING: + case RN_FB_PROD: + case RN_FB_PROFILING: + return true; + default: + throw new Error(`Unknown type: ${bundleType}`); + } +} + +function isMinifiable(bundleType) { + // esm minification is TODO + return isProductionBundleType(bundleType) && !isEsmBundle(bundleType); +} + +function isEsmBundle(bundleType) { + return bundleType === ESM_DEV || bundleType === ESM_PROD; +} + +function isProfilingBundleType(bundleType) { + switch (bundleType) { + case FB_WWW_DEV: + case FB_WWW_PROD: + case NODE_DEV: + case NODE_PROD: + case RN_FB_DEV: + case RN_FB_PROD: + case RN_OSS_DEV: + case RN_OSS_PROD: + case UMD_DEV: + case UMD_PROD: + case ESM_DEV: + case ESM_PROD: + return false; + case FB_WWW_PROFILING: + case NODE_PROFILING: + case RN_FB_PROFILING: + case RN_OSS_PROFILING: + case UMD_PROFILING: + return true; + default: + throw new Error(`Unknown type: ${bundleType}`); + } +} + +function isFatBundle(bundleType) { + return bundleType === UMD_DEV || + bundleType === UMD_PROD || + bundleType === UMD_PROFILING; +} + +function isFacebookBundle(bundleType) { + return bundleType === FB_WWW_DEV || + bundleType === FB_WWW_PROD || + bundleType === FB_WWW_PROFILING; +} + +function isSkippableBundle(bundle, bundleType) { + const shouldSkipBundleType = bundle.bundleTypes.indexOf(bundleType) === -1; + if (shouldSkipBundleType) { + return true; + } + if (requestedBundleTypes.length > 0) { + const isAskingForDifferentType = requestedBundleTypes.every( + requestedType => bundleType.indexOf(requestedType) === -1 + ); + if (isAskingForDifferentType) { + return true; + } + } + if (requestedBundleNames.length > 0) { + const isAskingForDifferentNames = requestedBundleNames.every( + // If the name ends with `something/index` we only match if the + // entry ends in something. Such as `react-dom/index` only matches + // `react-dom` but not `react-dom/server`. Everything else is fuzzy + // search. + requestedName => + (bundle.entry + '/index.js').indexOf(requestedName) === -1 + ); + if (isAskingForDifferentNames) { + return true; + } + } + return false; +} + +const requestedBundleTypes = argv.type + ? parseRequestedNames([argv.type], 'uppercase') + : []; +const requestedBundleNames = parseRequestedNames(argv._, 'lowercase'); + +function parseRequestedNames(names, toCase) { + let result = []; + for (let i = 0; i < names.length; i++) { + let splitNames = names[i].split(','); + for (let j = 0; j < splitNames.length; j++) { + let name = splitNames[j].trim(); + if (!name) { + continue; + } + if (toCase === 'uppercase') { + name = name.toUpperCase(); + } else if (toCase === 'lowercase') { + name = name.toLowerCase(); + } + result.push(name); + } + } + return result; +} + +module.exports = { + isProductionBundleType, + isMinifiable, + isEsmBundle, + isProfilingBundleType, + isSkippableBundle, + isFatBundle, + isFacebookBundle, + isExperimental +} From 7f880946ea2dab36f9e8065e39809415849381cf Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 10:29:13 -0800 Subject: [PATCH 08/49] run prettier --- scripts/rollup/build/createBundle.js | 17 ++++++++++------- scripts/rollup/build/getBabelConfig.js | 6 +++++- scripts/rollup/build/getBundlesToBuild.js | 4 ++-- scripts/rollup/build/getFormat.js | 2 +- scripts/rollup/build/getRollupPlugins.js | 2 +- scripts/rollup/build/handlePromiseErrors.js | 1 - scripts/rollup/build/handleRollupIssues.js | 2 +- scripts/rollup/build/index.js | 2 +- scripts/rollup/build/messages.js | 2 +- scripts/rollup/build/predicates.js | 20 ++++++++++++-------- 10 files changed, 34 insertions(+), 24 deletions(-) diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 33969c3d4c9a..6c37fc43492b 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -12,13 +12,16 @@ const { isProductionBundleType, isSkippableBundle, isFatBundle, - isFacebookBundle -} = require('./predicates') -const getFilename = require('./getFilename') -const getFormat = require('./getFormat') -const { handleRollupWarning, handleRollupError } = require('./handleRollupIssues'); + isFacebookBundle, +} = require('./predicates'); +const getFilename = require('./getFilename'); +const getFormat = require('./getFormat'); +const { + handleRollupWarning, + handleRollupError, +} = require('./handleRollupIssues'); const getRollupPlugins = require('./getRollupPlugins'); -const { building, complete, fatal } = require('./messages') +const {building, complete, fatal} = require('./messages'); const isWatchMode = argv.watch; @@ -108,7 +111,7 @@ module.exports = async function createBundle(bundle, bundleType) { pureExternalModules ), // We can't use getters in www. - legacy: isFacebookBundle(bundleType) + legacy: isFacebookBundle(bundleType), }; const [mainOutputPath, ...otherOutputPaths] = Packaging.getBundleOutputPaths( diff --git a/scripts/rollup/build/getBabelConfig.js b/scripts/rollup/build/getBabelConfig.js index 7aa13bc6ed99..bef97e201fa7 100644 --- a/scripts/rollup/build/getBabelConfig.js +++ b/scripts/rollup/build/getBabelConfig.js @@ -23,7 +23,11 @@ const { RN_FB_PROFILING, } = Bundles.bundleTypes; -module.exports = function getBabelConfig(updateBabelOptions, bundleType, filename) { +module.exports = function getBabelConfig( + updateBabelOptions, + bundleType, + filename +) { let options = { exclude: '/**/node_modules/**', presets: [], diff --git a/scripts/rollup/build/getBundlesToBuild.js b/scripts/rollup/build/getBundlesToBuild.js index 7ce0cac89406..5466611a2ea9 100644 --- a/scripts/rollup/build/getBundlesToBuild.js +++ b/scripts/rollup/build/getBundlesToBuild.js @@ -1,6 +1,6 @@ 'use strict'; -const { isExperimental } = require('./predicates') +const {isExperimental} = require('./predicates'); const Bundles = require('../bundles'); const { UMD_DEV, @@ -53,4 +53,4 @@ module.exports = function getBundlesToBuild() { } } return bundles; -} +}; diff --git a/scripts/rollup/build/getFormat.js b/scripts/rollup/build/getFormat.js index c001c8b90a0d..5f10b95ce859 100644 --- a/scripts/rollup/build/getFormat.js +++ b/scripts/rollup/build/getFormat.js @@ -47,4 +47,4 @@ module.exports = function getFormat(bundleType) { case RN_FB_PROFILING: return `cjs`; } -} +}; diff --git a/scripts/rollup/build/getRollupPlugins.js b/scripts/rollup/build/getRollupPlugins.js index 6142a9550ac9..00fc6cd77196 100644 --- a/scripts/rollup/build/getRollupPlugins.js +++ b/scripts/rollup/build/getRollupPlugins.js @@ -24,7 +24,7 @@ const { isEsmBundle, isProfilingBundleType, isExperimental, -} = require('./predicates') +} = require('./predicates'); const { UMD_DEV, diff --git a/scripts/rollup/build/handlePromiseErrors.js b/scripts/rollup/build/handlePromiseErrors.js index caf8975a1786..6274b122d375 100644 --- a/scripts/rollup/build/handlePromiseErrors.js +++ b/scripts/rollup/build/handlePromiseErrors.js @@ -1,4 +1,3 @@ - // Errors in promises should be fatal. let loggedErrors = new Set(); process.on('unhandledRejection', err => { diff --git a/scripts/rollup/build/handleRollupIssues.js b/scripts/rollup/build/handleRollupIssues.js index a37dc739c1a8..b99306f67a8b 100644 --- a/scripts/rollup/build/handleRollupIssues.js +++ b/scripts/rollup/build/handleRollupIssues.js @@ -75,4 +75,4 @@ function handleRollupError(error) { module.exports = { handleRollupError, handleRollupWarning, -} +}; diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js index 49e20396cfce..866adda7ed18 100644 --- a/scripts/rollup/build/index.js +++ b/scripts/rollup/build/index.js @@ -1,6 +1,6 @@ 'use strict'; -require('./handlePromiseErrors') +require('./handlePromiseErrors'); const argv = require('minimist')(process.argv.slice(2)); const Stats = require('../stats'); const Sync = require('../sync'); diff --git a/scripts/rollup/build/messages.js b/scripts/rollup/build/messages.js index 587291bec19d..2e391a4bf420 100644 --- a/scripts/rollup/build/messages.js +++ b/scripts/rollup/build/messages.js @@ -17,5 +17,5 @@ function fatal(logKey) { module.exports = { building, complete, - fatal + fatal, }; diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index 89e6abee8284..610561c72162 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -93,15 +93,19 @@ function isProfilingBundleType(bundleType) { } function isFatBundle(bundleType) { - return bundleType === UMD_DEV || - bundleType === UMD_PROD || - bundleType === UMD_PROFILING; + return ( + bundleType === UMD_DEV || + bundleType === UMD_PROD || + bundleType === UMD_PROFILING + ); } function isFacebookBundle(bundleType) { - return bundleType === FB_WWW_DEV || - bundleType === FB_WWW_PROD || - bundleType === FB_WWW_PROFILING; + return ( + bundleType === FB_WWW_DEV || + bundleType === FB_WWW_PROD || + bundleType === FB_WWW_PROFILING + ); } function isSkippableBundle(bundle, bundleType) { @@ -166,5 +170,5 @@ module.exports = { isSkippableBundle, isFatBundle, isFacebookBundle, - isExperimental -} + isExperimental, +}; From afb12939e21012325449b384b85384003238cc6f Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 10:32:11 -0800 Subject: [PATCH 09/49] build: add a doc note about what the transform-object-assign-require plugin does --- scripts/babel/transform-object-assign-require.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/babel/transform-object-assign-require.js b/scripts/babel/transform-object-assign-require.js index 79c7421c5e2e..1d35a1872fa7 100644 --- a/scripts/babel/transform-object-assign-require.js +++ b/scripts/babel/transform-object-assign-require.js @@ -9,6 +9,10 @@ const helperModuleImports = require('@babel/helper-module-imports'); +/** + * This babel plugin will scan modules for usage of Object.assign and auto-insert + * a `require('object-assign')` statement in for polyfilling. + */ module.exports = function autoImporter(babel) { function getAssignIdent(path, file, state) { if (state.id) { From 57364ccfefe7f53b25e84e108877ae5cfaeb66e2 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 10:34:00 -0800 Subject: [PATCH 10/49] update .gitignore to ignore top-level build folder --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 9e53f84eb5b7..0bc854377c96 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,7 @@ scripts/flow/*/.flowconfig .grunt _SpecRunner.html __benchmarks__ -build/* -!rollup/scripts/build/ +/build remote-repo/ coverage/ .module-cache From 4618a452d233447ae09f2a1ae21d11f6aa2b0f4f Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 11:15:37 -0800 Subject: [PATCH 11/49] add esm bundle generation, move some argvs to predicates --- scripts/rollup/build/createBundle.js | 146 +++++++++++++++++---------- scripts/rollup/build/getFilename.js | 2 +- scripts/rollup/build/index.js | 14 ++- scripts/rollup/build/predicates.js | 25 +++++ 4 files changed, 129 insertions(+), 58 deletions(-) diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 6c37fc43492b..0c61634e6052 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -3,6 +3,7 @@ const rollup = require('rollup'); const chalk = require('chalk'); const fs = require('fs'); +const path = require('path') const argv = require('minimist')(process.argv.slice(2)); const Modules = require('../modules'); const Bundles = require('../bundles'); @@ -13,6 +14,8 @@ const { isSkippableBundle, isFatBundle, isFacebookBundle, + isEsmEntryGenerator, + isWatchMode } = require('./predicates'); const getFilename = require('./getFilename'); const getFormat = require('./getFormat'); @@ -23,8 +26,6 @@ const { const getRollupPlugins = require('./getRollupPlugins'); const {building, complete, fatal} = require('./messages'); -const isWatchMode = argv.watch; - function getRollupOutputOptions( outputPath, format, @@ -58,7 +59,64 @@ module.exports = async function createBundle(bundle, bundleType) { chalk.white.bold(filename) + chalk.dim(` (${bundleType.toLowerCase()})`); const format = getFormat(bundleType); const packageName = Packaging.getPackageName(bundle.entry); + const peerGlobals = Modules.getPeerGlobals(bundle.externals, bundleType); + const rollupConfig = getRollupConfig(bundle, bundleType, packageName); + const [mainOutputPath, ...otherOutputPaths] = Packaging.getBundleOutputPaths( + bundleType, + filename, + packageName + ); + const rollupOutputOptions = getRollupOutputOptions( + mainOutputPath, + format, + peerGlobals, + bundle.global, + bundleType + ); + if (isWatchMode()) { + rollupConfig.output = [rollupOutputOptions]; + const watcher = rollup.watch(rollupConfig); + watcher.on('event', async event => { + switch (event.code) { + case 'BUNDLE_START': + console.log(building(logKey)); + break; + case 'BUNDLE_END': + for (let i = 0; i < otherOutputPaths.length; i++) { + await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); + } + console.log(complete(logKey)); + break; + case 'ERROR': + case 'FATAL': + console.log(fatal(logKey)); + handleRollupError(event.error); + break; + } + }); + } else { + console.log(building(logKey)); + try { + const result = await rollup.rollup(rollupConfig); + await result.write(rollupOutputOptions); + if (isEsmEntryGenerator(bundleType)) { + writeEsmEntry(result, packageName) + } + } catch (error) { + console.log(fatal(logKey)); + handleRollupError(error); + throw error; + } + for (let i = 0; i < otherOutputPaths.length; i++) { + await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); + } + console.log(complete(logKey)); + } +}; + +function getRollupConfig(bundle, bundleType, packageName) { + const filename = getFilename(bundle.entry, bundle.global, bundleType); let resolvedEntry = require.resolve(bundle.entry); const isFBBundle = isFacebookBundle(); if (isFBBundle) { @@ -85,7 +143,7 @@ module.exports = async function createBundle(bundle, bundleType) { module => !importSideEffects[module] ); - const rollupConfig = { + return { input: resolvedEntry, treeshake: { pureExternalModules, @@ -112,55 +170,39 @@ module.exports = async function createBundle(bundle, bundleType) { ), // We can't use getters in www. legacy: isFacebookBundle(bundleType), - }; + } +} - const [mainOutputPath, ...otherOutputPaths] = Packaging.getBundleOutputPaths( - bundleType, - filename, - packageName - ); - const rollupOutputOptions = getRollupOutputOptions( - mainOutputPath, - format, - peerGlobals, - bundle.global, - bundleType - ); +function writeEsmEntry(bundle, packageName) { + const filepath = path.resolve( + `build/node_modules/${packageName}`, + 'index.mjs' + ); + // write esm entry point + fs.writeFileSync( + filepath, + genererateEsmEntry(packageName, bundle.exports) + ); +} - if (isWatchMode) { - rollupConfig.output = [rollupOutputOptions]; - const watcher = rollup.watch(rollupConfig); - watcher.on('event', async event => { - switch (event.code) { - case 'BUNDLE_START': - console.log(building(logKey)); - break; - case 'BUNDLE_END': - for (let i = 0; i < otherOutputPaths.length; i++) { - await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); - } - console.log(complete(logKey)); - break; - case 'ERROR': - case 'FATAL': - console.log(fatal(logKey)); - handleRollupError(event.error); - break; - } - }); - } else { - console.log(building(logKey)); - try { - const result = await rollup.rollup(rollupConfig); - await result.write(rollupOutputOptions); - } catch (error) { - console.log(fatal(logKey)); - handleRollupError(error); - throw error; - } - for (let i = 0; i < otherOutputPaths.length; i++) { - await asyncCopyTo(mainOutputPath, otherOutputPaths[i]); +function genererateEsmEntry(packageName, exports) { + const exportStatements = exports.map(name => { + const pickedBundle = `isProduction ? prod.${name} : dev.${name}`; + if (name !== 'default') { + return `export const ${name} = ${pickedBundle};` + } else { + return ` +const defaultExport = ${pickedBundle}; +export default defaultExport; + ` } - console.log(complete(logKey)); - } -}; + }); + + return ` +import * as dev from "./esm/${packageName}.development.mjs"; +import * as prod from "./esm/${packageName}.production.min.mjs"; + +const isProduction = process.env.NODE_ENV === 'production' +${exportStatements.join("\n")} + `; +} diff --git a/scripts/rollup/build/getFilename.js b/scripts/rollup/build/getFilename.js index d92bba95516b..f876cfae075a 100644 --- a/scripts/rollup/build/getFilename.js +++ b/scripts/rollup/build/getFilename.js @@ -36,7 +36,7 @@ module.exports = function getFilename(name, globalName, bundleType) { case ESM_DEV: return `${name}.development.mjs`; case ESM_PROD: - return `${name}.production.mjs`; + return `${name}.production.min.mjs`; case NODE_DEV: return `${name}.development.js`; case NODE_PROD: diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js index 866adda7ed18..931ba70549f7 100644 --- a/scripts/rollup/build/index.js +++ b/scripts/rollup/build/index.js @@ -8,17 +8,21 @@ const Packaging = require('../packaging'); const {asyncRimRaf} = require('../utils'); const getBundlesToBuild = require('./getBundlesToBuild'); const createBundle = require('./createBundle'); +const { + isUnsafePartialBuild, + isPrettyOutput, + isFBSourcePathSync, + shouldExtractErrors, +} = require('./predicates'); -const forcePrettyOutput = argv.pretty; const syncFBSourcePath = argv['sync-fbsource']; const syncWWWPath = argv['sync-www']; -const shouldExtractErrors = argv['extract-errors']; async function buildEverything() { /** * Remove the build directory unless the unsafe-partial CLI flag is set */ - if (!argv['unsafe-partial']) { + if (!isUnsafePartialBuild()) { await asyncRimRaf('build'); } @@ -48,11 +52,11 @@ async function buildEverything() { } console.log(Stats.printResults()); - if (!forcePrettyOutput) { + if (!isPrettyOutput()) { Stats.saveResults(); } - if (shouldExtractErrors) { + if (shouldExtractErrors()) { console.warn( '\nWarning: this build was created with --extract-errors enabled.\n' + 'this will result in extremely slow builds and should only be\n' + diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index 610561c72162..3f3006eab42c 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -11,6 +11,22 @@ function isExperimental() { : true; } +function isWatchMode() { + return argv.watch; +} + +function isUnsafePartialBuild() { + return argv['unsafe-partial'] +} + +function isPrettyOutput() { + return argv.pretty; +} + +function shouldExtractErrors() { + return argv['extract-errors']; +} + const { UMD_DEV, UMD_PROD, @@ -31,6 +47,10 @@ const { RN_FB_PROFILING, } = Bundles.bundleTypes; +function isEsmEntryGenerator(bundleType) { + return bundleType === ESM_PROD; +} + function isProductionBundleType(bundleType) { switch (bundleType) { case UMD_DEV: @@ -171,4 +191,9 @@ module.exports = { isFatBundle, isFacebookBundle, isExperimental, + isEsmEntryGenerator, + isWatchMode, + isUnsafePartialBuild, + isPrettyOutput, + shouldExtractErrors }; From ac94f10d510491e1561e23a46507053d108f252c Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 11:36:43 -0800 Subject: [PATCH 12/49] add "module" fields to esm-supporting packages --- packages/create-subscription/package.json | 2 +- .../eslint-plugin-react-hooks/package.json | 2 ++ packages/jest-mock-scheduler/package.json | 1 + packages/jest-react/package.json | 1 + packages/react-art/package.json | 1 + packages/react-cache/package.json | 2 ++ packages/react-debug-tools/package.json | 1 + packages/react-dom/package.json | 1 + .../react-flight-dom-webpack/package.json | 1 + packages/react-flight/package.json | 1 + packages/react-interactions/package.json | 1 + packages/react-is/package.json | 2 +- packages/react-noop-renderer/package.json | 1 + packages/react-refresh/package.json | 1 + packages/react-test-renderer/package.json | 1 + packages/react/package.json | 1 + packages/scheduler/package.json | 1 + packages/use-subscription/package.json | 2 ++ scripts/rollup/build/createBundle.js | 29 +++++++++---------- scripts/rollup/build/predicates.js | 4 +-- 20 files changed, 36 insertions(+), 20 deletions(-) diff --git a/packages/create-subscription/package.json b/packages/create-subscription/package.json index b4a5fec1aab0..29f34e35489b 100644 --- a/packages/create-subscription/package.json +++ b/packages/create-subscription/package.json @@ -3,7 +3,7 @@ "description": "utility for subscribing to external data sources inside React components", "version": "16.12.0", "main": "index.js", - "module": "esm/create-subscription.production.mjs", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/eslint-plugin-react-hooks/package.json b/packages/eslint-plugin-react-hooks/package.json index eb1b985b2dcf..6393c6267b2b 100644 --- a/packages/eslint-plugin-react-hooks/package.json +++ b/packages/eslint-plugin-react-hooks/package.json @@ -7,6 +7,8 @@ "url": "https://github.com/facebook/react.git", "directory": "packages/eslint-plugin-react-hooks" }, + "main": "index.js", + "module": "index.mjs", "files": [ "LICENSE", "README.md", diff --git a/packages/jest-mock-scheduler/package.json b/packages/jest-mock-scheduler/package.json index d336580f9b4b..ead7aa5de919 100644 --- a/packages/jest-mock-scheduler/package.json +++ b/packages/jest-mock-scheduler/package.json @@ -4,6 +4,7 @@ "version": "0.1.0", "description": "Jest matchers and utilities for testing the scheduler package.", "main": "index.js", + "module": "index.mjs", "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/jest-react/package.json b/packages/jest-react/package.json index b4bcb25cb5d9..a86fdba16f55 100644 --- a/packages/jest-react/package.json +++ b/packages/jest-react/package.json @@ -3,6 +3,7 @@ "version": "0.10.0", "description": "Jest matchers and utilities for testing React components.", "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-art/package.json b/packages/react-art/package.json index 2b739f3861bb..774937360e1c 100644 --- a/packages/react-art/package.json +++ b/packages/react-art/package.json @@ -3,6 +3,7 @@ "description": "React ART is a JavaScript library for drawing vector graphics using React. It provides declarative and reactive bindings to the ART library. Using the same declarative API you can render the output to either Canvas, SVG or VML (IE8).", "version": "16.12.0", "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-cache/package.json b/packages/react-cache/package.json index 53e2c65bc581..91541b42e8e9 100644 --- a/packages/react-cache/package.json +++ b/packages/react-cache/package.json @@ -3,6 +3,8 @@ "name": "react-cache", "description": "A basic cache for React applications", "version": "2.0.0-alpha.0", + "main": "index.js", + "module": "index.mjs", "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index 09ea83d5f6b0..0dd93aabded3 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -18,6 +18,7 @@ "esm/" ], "main": "index.js", + "module": "index.mjs", "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 98c465667a52..8c78c421998b 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -3,6 +3,7 @@ "version": "16.12.0", "description": "React package for working with the DOM.", "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-flight-dom-webpack/package.json b/packages/react-flight-dom-webpack/package.json index 9304005b848f..e40531b42f67 100644 --- a/packages/react-flight-dom-webpack/package.json +++ b/packages/react-flight-dom-webpack/package.json @@ -24,6 +24,7 @@ "./server.js": "./server.browser.js" }, "main": "index.js", + "module": "index.mjs", "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-flight/package.json b/packages/react-flight/package.json index 443c7c2fcecc..2d30da0190e6 100644 --- a/packages/react-flight/package.json +++ b/packages/react-flight/package.json @@ -17,6 +17,7 @@ "esm/" ], "main": "index.js", + "module": "index.mjs", "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-interactions/package.json b/packages/react-interactions/package.json index aa12a40e35b8..a79b94bdc58d 100644 --- a/packages/react-interactions/package.json +++ b/packages/react-interactions/package.json @@ -30,6 +30,7 @@ "esm/" ], "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-is/package.json b/packages/react-is/package.json index 784ccc22396c..ae3d098cbb08 100644 --- a/packages/react-is/package.json +++ b/packages/react-is/package.json @@ -3,7 +3,7 @@ "version": "16.12.0", "description": "Brand checking of React Elements.", "main": "index.js", - "module": "esm/react-is.production.mjs", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-noop-renderer/package.json b/packages/react-noop-renderer/package.json index d5192b566a79..4e1ccd425ff1 100644 --- a/packages/react-noop-renderer/package.json +++ b/packages/react-noop-renderer/package.json @@ -4,6 +4,7 @@ "private": true, "description": "React package for testing the Fiber, Fizz and Flight reconcilers.", "main": "index.js", + "module": "index.mjs", "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-refresh/package.json b/packages/react-refresh/package.json index 6ac8cfa856e2..499db8f576fc 100644 --- a/packages/react-refresh/package.json +++ b/packages/react-refresh/package.json @@ -19,6 +19,7 @@ "esm/" ], "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index d5b6718d1e5b..5d90cd5f8c50 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -3,6 +3,7 @@ "version": "16.12.0", "description": "React package for snapshot testing.", "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react/package.json b/packages/react/package.json index 938019a98520..0b02b2104271 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -18,6 +18,7 @@ "esm/" ], "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index 899fe33269c6..6e332c8ffa3a 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -3,6 +3,7 @@ "version": "0.18.0", "description": "Cooperative scheduler for the browser environment.", "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/use-subscription/package.json b/packages/use-subscription/package.json index 88d81647f8ab..6a4a3ab2b820 100644 --- a/packages/use-subscription/package.json +++ b/packages/use-subscription/package.json @@ -2,6 +2,8 @@ "name": "use-subscription", "description": "Reusable hooks", "version": "1.3.0", + "main": "index.js", + "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 0c61634e6052..17e6ef0533f4 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -3,7 +3,7 @@ const rollup = require('rollup'); const chalk = require('chalk'); const fs = require('fs'); -const path = require('path') +const path = require('path'); const argv = require('minimist')(process.argv.slice(2)); const Modules = require('../modules'); const Bundles = require('../bundles'); @@ -15,7 +15,7 @@ const { isFatBundle, isFacebookBundle, isEsmEntryGenerator, - isWatchMode + isWatchMode, } = require('./predicates'); const getFilename = require('./getFilename'); const getFormat = require('./getFormat'); @@ -101,7 +101,7 @@ module.exports = async function createBundle(bundle, bundleType) { const result = await rollup.rollup(rollupConfig); await result.write(rollupOutputOptions); if (isEsmEntryGenerator(bundleType)) { - writeEsmEntry(result, packageName) + writeEsmEntry(result, packageName); } } catch (error) { console.log(fatal(logKey)); @@ -170,31 +170,28 @@ function getRollupConfig(bundle, bundleType, packageName) { ), // We can't use getters in www. legacy: isFacebookBundle(bundleType), - } + }; } function writeEsmEntry(bundle, packageName) { - const filepath = path.resolve( - `build/node_modules/${packageName}`, - 'index.mjs' - ); - // write esm entry point - fs.writeFileSync( - filepath, - genererateEsmEntry(packageName, bundle.exports) - ); + const filepath = path.resolve( + `build/node_modules/${packageName}`, + 'index.mjs' + ); + // write esm entry point + fs.writeFileSync(filepath, genererateEsmEntry(packageName, bundle.exports)); } function genererateEsmEntry(packageName, exports) { const exportStatements = exports.map(name => { const pickedBundle = `isProduction ? prod.${name} : dev.${name}`; if (name !== 'default') { - return `export const ${name} = ${pickedBundle};` + return `export const ${name} = ${pickedBundle};`; } else { return ` const defaultExport = ${pickedBundle}; export default defaultExport; - ` + `; } }); @@ -203,6 +200,6 @@ import * as dev from "./esm/${packageName}.development.mjs"; import * as prod from "./esm/${packageName}.production.min.mjs"; const isProduction = process.env.NODE_ENV === 'production' -${exportStatements.join("\n")} +${exportStatements.join('\n')} `; } diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index 3f3006eab42c..af5c8f465855 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -16,7 +16,7 @@ function isWatchMode() { } function isUnsafePartialBuild() { - return argv['unsafe-partial'] + return argv['unsafe-partial']; } function isPrettyOutput() { @@ -195,5 +195,5 @@ module.exports = { isWatchMode, isUnsafePartialBuild, isPrettyOutput, - shouldExtractErrors + shouldExtractErrors, }; From 67e2c7f77b1113f4949531d85dc6f923b36e4103 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 16:24:43 -0800 Subject: [PATCH 13/49] move more predicates to predicates file --- scripts/rollup/build/createBundle.js | 46 ++++++++++++------------ scripts/rollup/build/getRollupPlugins.js | 41 ++++----------------- scripts/rollup/build/index.js | 1 - scripts/rollup/build/predicates.js | 21 +++++++++++ 4 files changed, 50 insertions(+), 59 deletions(-) diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 17e6ef0533f4..23428c4369f2 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -26,29 +26,6 @@ const { const getRollupPlugins = require('./getRollupPlugins'); const {building, complete, fatal} = require('./messages'); -function getRollupOutputOptions( - outputPath, - format, - globals, - globalName, - bundleType -) { - const isProduction = isProductionBundleType(bundleType); - - return Object.assign( - {}, - { - file: outputPath, - format, - globals, - freeze: !isProduction, - interop: false, - name: globalName, - sourcemap: false, - } - ); -} - module.exports = async function createBundle(bundle, bundleType) { if (isSkippableBundle(bundle, bundleType)) { return; @@ -73,6 +50,7 @@ module.exports = async function createBundle(bundle, bundleType) { bundle.global, bundleType ); + console.log(`globals for ${packageName}`, peerGlobals); if (isWatchMode()) { rollupConfig.output = [rollupOutputOptions]; @@ -115,6 +93,28 @@ module.exports = async function createBundle(bundle, bundleType) { } }; +function getRollupOutputOptions( + outputPath, + format, + globals, + globalName, + bundleType +) { + const isProduction = isProductionBundleType(bundleType); + return Object.assign( + {}, + { + file: outputPath, + format, + globals, + freeze: !isProduction, + interop: false, + name: globalName, + sourcemap: false, + } + ); +} + function getRollupConfig(bundle, bundleType, packageName) { const filename = getFilename(bundle.entry, bundle.global, bundleType); let resolvedEntry = require.resolve(bundle.entry); diff --git a/scripts/rollup/build/getRollupPlugins.js b/scripts/rollup/build/getRollupPlugins.js index 00fc6cd77196..08ffc10e8a48 100644 --- a/scripts/rollup/build/getRollupPlugins.js +++ b/scripts/rollup/build/getRollupPlugins.js @@ -24,28 +24,11 @@ const { isEsmBundle, isProfilingBundleType, isExperimental, + isFacebookBundle, + isUmdBundle, + isReactNativeBundleType, } = require('./predicates'); -const { - UMD_DEV, - UMD_PROD, - UMD_PROFILING, - ESM_DEV, - ESM_PROD, - NODE_DEV, - NODE_PROD, - NODE_PROFILING, - FB_WWW_DEV, - FB_WWW_PROD, - FB_WWW_PROFILING, - RN_OSS_DEV, - RN_OSS_PROD, - RN_OSS_PROFILING, - RN_FB_DEV, - RN_FB_PROD, - RN_FB_PROFILING, -} = Bundles.bundleTypes; - const forcePrettyOutput = argv.pretty; const shouldExtractErrors = argv['extract-errors']; const errorCodeOpts = { @@ -87,21 +70,9 @@ module.exports = function getPlugins( const isProduction = isProductionBundleType(bundleType); const isMinified = isMinifiable(bundleType); const isProfiling = isProfilingBundleType(bundleType); - const isUMDBundle = - bundleType === UMD_DEV || - bundleType === UMD_PROD || - bundleType === UMD_PROFILING; - const isFBBundle = - bundleType === FB_WWW_DEV || - bundleType === FB_WWW_PROD || - bundleType === FB_WWW_PROFILING; - const isRNBundle = - bundleType === RN_OSS_DEV || - bundleType === RN_OSS_PROD || - bundleType === RN_OSS_PROFILING || - bundleType === RN_FB_DEV || - bundleType === RN_FB_PROD || - bundleType === RN_FB_PROFILING; + const isUMDBundle = isUmdBundle(bundleType); + const isFBBundle = isFacebookBundle(bundleType); + const isRNBundle = isReactNativeBundleType(bundleType); const shouldStayReadable = isFBBundle || isRNBundle || forcePrettyOutput; return [ // Extract error codes from invariant() messages into a file. diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js index 931ba70549f7..aa4c77b39a54 100644 --- a/scripts/rollup/build/index.js +++ b/scripts/rollup/build/index.js @@ -11,7 +11,6 @@ const createBundle = require('./createBundle'); const { isUnsafePartialBuild, isPrettyOutput, - isFBSourcePathSync, shouldExtractErrors, } = require('./predicates'); diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index af5c8f465855..26a2704487a2 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -51,6 +51,17 @@ function isEsmEntryGenerator(bundleType) { return bundleType === ESM_PROD; } +function isReactNativeBundleType(bundleType) { + return ( + bundleType === RN_OSS_DEV || + bundleType === RN_OSS_PROD || + bundleType === RN_OSS_PROFILING || + bundleType === RN_FB_DEV || + bundleType === RN_FB_PROD || + bundleType === RN_FB_PROFILING + ); +} + function isProductionBundleType(bundleType) { switch (bundleType) { case UMD_DEV: @@ -128,6 +139,14 @@ function isFacebookBundle(bundleType) { ); } +function isUmdBundle(bundleType) { + return ( + bundleType === UMD_DEV || + bundleType === UMD_PROD || + bundleType === UMD_PROFILING + ); +} + function isSkippableBundle(bundle, bundleType) { const shouldSkipBundleType = bundle.bundleTypes.indexOf(bundleType) === -1; if (shouldSkipBundleType) { @@ -195,5 +214,7 @@ module.exports = { isWatchMode, isUnsafePartialBuild, isPrettyOutput, + isUmdBundle, shouldExtractErrors, + isReactNativeBundleType, }; From 10eee7cdfc24890e63975af051101cde4f9a3cef Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 17:37:44 -0800 Subject: [PATCH 14/49] pass bundleType to isFBBundle --- scripts/rollup/build/createBundle.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 23428c4369f2..f1b5ac1576b7 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -118,7 +118,8 @@ function getRollupOutputOptions( function getRollupConfig(bundle, bundleType, packageName) { const filename = getFilename(bundle.entry, bundle.global, bundleType); let resolvedEntry = require.resolve(bundle.entry); - const isFBBundle = isFacebookBundle(); + const isFBBundle = isFacebookBundle(bundleType); + if (isFBBundle) { const resolvedFBEntry = resolvedEntry.replace('.js', '.fb.js'); if (fs.existsSync(resolvedFBEntry)) { From 866309ffcd5e79ae63716d8b80a13bc983e0eeec Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 18:22:33 -0800 Subject: [PATCH 15/49] predicate updates --- scripts/rollup/build/getRollupPlugins.js | 11 ++++++----- scripts/rollup/build/index.js | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/rollup/build/getRollupPlugins.js b/scripts/rollup/build/getRollupPlugins.js index 08ffc10e8a48..6aa94bbf9b96 100644 --- a/scripts/rollup/build/getRollupPlugins.js +++ b/scripts/rollup/build/getRollupPlugins.js @@ -27,9 +27,9 @@ const { isFacebookBundle, isUmdBundle, isReactNativeBundleType, + isPrettyOutput, } = require('./predicates'); -const forcePrettyOutput = argv.pretty; const shouldExtractErrors = argv['extract-errors']; const errorCodeOpts = { errorMapFilePath: 'scripts/error-codes/codes.json', @@ -47,7 +47,7 @@ const closureOptions = { }; function getOutputType(bundleType) { - if (isEsmBundle) { + if (isEsmBundle(bundleType)) { return 'ECMASCRIPT6_STRICT'; } else { return 'ECMASCRIPT5_STRICT'; @@ -72,8 +72,9 @@ module.exports = function getPlugins( const isProfiling = isProfilingBundleType(bundleType); const isUMDBundle = isUmdBundle(bundleType); const isFBBundle = isFacebookBundle(bundleType); - const isRNBundle = isReactNativeBundleType(bundleType); - const shouldStayReadable = isFBBundle || isRNBundle || forcePrettyOutput; + const shouldStayReadable = + isFBBundle || isReactNativeBundleType(bundleType) || isPrettyOutput(); + return [ // Extract error codes from invariant() messages into a file. shouldExtractErrors && { @@ -110,7 +111,7 @@ module.exports = function getPlugins( __PROFILE__: isProfiling || !isProduction ? 'true' : 'false', __UMD__: isUMDBundle ? 'true' : 'false', 'process.env.NODE_ENV': isProduction ? "'production'" : "'development'", - __EXPERIMENTAL__: isExperimental, + __EXPERIMENTAL__: isExperimental(), }), // We still need CommonJS for external deps like object-assign. commonjs(), diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js index aa4c77b39a54..0f5c479296be 100644 --- a/scripts/rollup/build/index.js +++ b/scripts/rollup/build/index.js @@ -29,7 +29,7 @@ async function buildEverything() { // and to avoid any potential race conditions. const bundles = getBundlesToBuild(); - if (!shouldExtractErrors && process.env.CIRCLE_NODE_TOTAL) { + if (!shouldExtractErrors() && process.env.CIRCLE_NODE_TOTAL) { // In CI, parallelize bundles across multiple tasks. const nodeTotal = parseInt(process.env.CIRCLE_NODE_TOTAL, 10); const nodeIndex = parseInt(process.env.CIRCLE_NODE_INDEX, 10); From dea8c04bf44191800eedb9f861f71190edd97cb0 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 18:27:44 -0800 Subject: [PATCH 16/49] change bundles to be a let variable --- scripts/rollup/build/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js index 0f5c479296be..924bbd034196 100644 --- a/scripts/rollup/build/index.js +++ b/scripts/rollup/build/index.js @@ -27,7 +27,7 @@ async function buildEverything() { // Run bundle builds serially for better console output // and to avoid any potential race conditions. - const bundles = getBundlesToBuild(); + let bundles = getBundlesToBuild(); if (!shouldExtractErrors() && process.env.CIRCLE_NODE_TOTAL) { // In CI, parallelize bundles across multiple tasks. From 4558905fd5f1c767653e63930147324cf4bc4b25 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 18:37:15 -0800 Subject: [PATCH 17/49] remove console.log statement --- scripts/rollup/build/createBundle.js | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index f1b5ac1576b7..02616c07cbd0 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -50,7 +50,6 @@ module.exports = async function createBundle(bundle, bundleType) { bundle.global, bundleType ); - console.log(`globals for ${packageName}`, peerGlobals); if (isWatchMode()) { rollupConfig.output = [rollupOutputOptions]; From 4e7f9ac36dc6ef7268b27094e8921ebfeef02cfb Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 18:52:21 -0800 Subject: [PATCH 18/49] add index.mjs to pkg.json files arrays --- packages/create-subscription/package.json | 1 + packages/eslint-plugin-react-hooks/package.json | 1 + packages/jest-mock-scheduler/package.json | 1 + packages/jest-react/package.json | 1 + packages/react-art/package.json | 1 + packages/react-cache/package.json | 1 + packages/react-debug-tools/package.json | 1 + packages/react-dom/package.json | 1 + packages/react-flight-dom-webpack/package.json | 1 + packages/react-flight/package.json | 1 + packages/react-interactions/package.json | 3 ++- packages/react-is/package.json | 1 + packages/react-noop-renderer/package.json | 1 + packages/react-refresh/package.json | 1 + packages/react-test-renderer/package.json | 1 + packages/react/package.json | 1 + packages/scheduler/package.json | 1 + packages/use-subscription/package.json | 1 + 18 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/create-subscription/package.json b/packages/create-subscription/package.json index 29f34e35489b..e41b42fe02be 100644 --- a/packages/create-subscription/package.json +++ b/packages/create-subscription/package.json @@ -14,6 +14,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "esm/" ], diff --git a/packages/eslint-plugin-react-hooks/package.json b/packages/eslint-plugin-react-hooks/package.json index 6393c6267b2b..f1f03e71dc7c 100644 --- a/packages/eslint-plugin-react-hooks/package.json +++ b/packages/eslint-plugin-react-hooks/package.json @@ -14,6 +14,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "esm/" ], diff --git a/packages/jest-mock-scheduler/package.json b/packages/jest-mock-scheduler/package.json index ead7aa5de919..cf0017dea6d6 100644 --- a/packages/jest-mock-scheduler/package.json +++ b/packages/jest-mock-scheduler/package.json @@ -28,6 +28,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "esm/" ] diff --git a/packages/jest-react/package.json b/packages/jest-react/package.json index a86fdba16f55..ac03b204857a 100644 --- a/packages/jest-react/package.json +++ b/packages/jest-react/package.json @@ -29,6 +29,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "esm/" ] diff --git a/packages/react-art/package.json b/packages/react-art/package.json index 774937360e1c..c7162533ec9c 100644 --- a/packages/react-art/package.json +++ b/packages/react-art/package.json @@ -38,6 +38,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "esm/", "umd/", diff --git a/packages/react-cache/package.json b/packages/react-cache/package.json index 91541b42e8e9..87cbea7c3e78 100644 --- a/packages/react-cache/package.json +++ b/packages/react-cache/package.json @@ -15,6 +15,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "umd/", "esm/" diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index 0dd93aabded3..16e7ef2c2777 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -14,6 +14,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "esm/" ], diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 8c78c421998b..bfebcaaea63b 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -31,6 +31,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "profiling.js", "server.js", "server.browser.js", diff --git a/packages/react-flight-dom-webpack/package.json b/packages/react-flight-dom-webpack/package.json index e40531b42f67..00aa0c306ee9 100644 --- a/packages/react-flight-dom-webpack/package.json +++ b/packages/react-flight-dom-webpack/package.json @@ -13,6 +13,7 @@ "LICENSE", "README.md", "index.js", + "index.mjs", "server.js", "server.browser.js", "server.node.js", diff --git a/packages/react-flight/package.json b/packages/react-flight/package.json index 2d30da0190e6..30e1be184788 100644 --- a/packages/react-flight/package.json +++ b/packages/react-flight/package.json @@ -13,6 +13,7 @@ "LICENSE", "README.md", "index.js", + "index.mjs", "cjs/", "esm/" ], diff --git a/packages/react-interactions/package.json b/packages/react-interactions/package.json index a79b94bdc58d..4784113b29a5 100644 --- a/packages/react-interactions/package.json +++ b/packages/react-interactions/package.json @@ -27,7 +27,8 @@ "build-info.json", "cjs/", "umd/", - "esm/" + "esm/", + "index.mjs" ], "main": "index.js", "module": "index.mjs", diff --git a/packages/react-is/package.json b/packages/react-is/package.json index ae3d098cbb08..0b48e1448a02 100644 --- a/packages/react-is/package.json +++ b/packages/react-is/package.json @@ -22,6 +22,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "umd/", "esm/" diff --git a/packages/react-noop-renderer/package.json b/packages/react-noop-renderer/package.json index 4e1ccd425ff1..a59df5ad489b 100644 --- a/packages/react-noop-renderer/package.json +++ b/packages/react-noop-renderer/package.json @@ -27,6 +27,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "persistent.js", "server.js", "flight-client.js", diff --git a/packages/react-refresh/package.json b/packages/react-refresh/package.json index 499db8f576fc..a1819c51e609 100644 --- a/packages/react-refresh/package.json +++ b/packages/react-refresh/package.json @@ -11,6 +11,7 @@ "files": [ "LICENSE", "README.md", + "index.mjs", "babel.js", "runtime.js", "build-info.json", diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index 5d90cd5f8c50..df74b7f64e14 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -33,6 +33,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "shallow.js", "cjs/", "umd/", diff --git a/packages/react/package.json b/packages/react/package.json index 0b02b2104271..ec0df9469e90 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -13,6 +13,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "umd/", "esm/" diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index 6e332c8ffa3a..d846e6c23eda 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -26,6 +26,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "tracing.js", "tracing-profiling.js", "unstable_mock.js", diff --git a/packages/use-subscription/package.json b/packages/use-subscription/package.json index 6a4a3ab2b820..9edd67959d25 100644 --- a/packages/use-subscription/package.json +++ b/packages/use-subscription/package.json @@ -14,6 +14,7 @@ "README.md", "build-info.json", "index.js", + "index.mjs", "cjs/", "esm/" ], From 3274958f033ccc689fdcc3b57b090586225cb849 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 19:08:18 -0800 Subject: [PATCH 19/49] remove main and module fields from react-interactions --- packages/react-interactions/package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/react-interactions/package.json b/packages/react-interactions/package.json index 4784113b29a5..753a83c5f7ab 100644 --- a/packages/react-interactions/package.json +++ b/packages/react-interactions/package.json @@ -27,11 +27,8 @@ "build-info.json", "cjs/", "umd/", - "esm/", - "index.mjs" + "esm/" ], - "main": "index.js", - "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", From f89c7caf9098338a77383a7a0bbe587351a2faf4 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 19:09:12 -0800 Subject: [PATCH 20/49] remove main and module fields from react-refresh --- packages/react-refresh/package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/react-refresh/package.json b/packages/react-refresh/package.json index a1819c51e609..9490ab46b28f 100644 --- a/packages/react-refresh/package.json +++ b/packages/react-refresh/package.json @@ -11,7 +11,6 @@ "files": [ "LICENSE", "README.md", - "index.mjs", "babel.js", "runtime.js", "build-info.json", @@ -19,8 +18,6 @@ "umd/", "esm/" ], - "main": "index.js", - "module": "index.mjs", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", From a8cdedf8e10e0b35ef44f6fdbe535374f8a72508 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 20:30:29 -0800 Subject: [PATCH 21/49] update rollup to get better output of esm module exports --- package.json | 14 +- scripts/rollup/build/createBundle.js | 9 +- scripts/rollup/build/getRollupPlugins.js | 4 +- scripts/rollup/plugins/closure-plugin.js | 2 +- scripts/rollup/plugins/sizes-plugin.js | 8 +- .../rollup/plugins/strip-unused-imports.js | 2 +- yarn.lock | 410 ++++++------------ 7 files changed, 164 insertions(+), 285 deletions(-) diff --git a/package.json b/package.json index 747e804c7cdd..3f52b7473485 100644 --- a/package.json +++ b/package.json @@ -76,13 +76,13 @@ "random-seed": "^0.3.0", "react-lifecycles-compat": "^3.0.2", "rimraf": "^2.6.1", - "rollup": "^0.52.1", - "rollup-plugin-babel": "^4.0.1", - "rollup-plugin-commonjs": "^8.2.6", - "rollup-plugin-node-resolve": "^2.1.1", - "rollup-plugin-prettier": "^0.3.0", - "rollup-plugin-replace": "^2.0.0", - "rollup-plugin-strip-banner": "^0.2.0", + "rollup": "^1.27.5", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-commonjs": "^10.1.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-prettier": "^0.6.0", + "rollup-plugin-replace": "^2.2.0", + "rollup-plugin-strip-banner": "^1.0.0", "semver": "^5.5.0", "targz": "^1.0.1", "through2": "^2.0.0", diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 02616c07cbd0..45efeea52308 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -75,10 +75,10 @@ module.exports = async function createBundle(bundle, bundleType) { } else { console.log(building(logKey)); try { - const result = await rollup.rollup(rollupConfig); - await result.write(rollupOutputOptions); + const spec = await rollup.rollup(rollupConfig); + const result = await spec.write(rollupOutputOptions); if (isEsmEntryGenerator(bundleType)) { - writeEsmEntry(result, packageName); + writeEsmEntry(result.output[0], packageName); } } catch (error) { console.log(fatal(logKey)); @@ -169,7 +169,8 @@ function getRollupConfig(bundle, bundleType, packageName) { pureExternalModules ), // We can't use getters in www. - legacy: isFacebookBundle(bundleType), + // TODO + // legacy: isFacebookBundle(bundleType), }; } diff --git a/scripts/rollup/build/getRollupPlugins.js b/scripts/rollup/build/getRollupPlugins.js index 6aa94bbf9b96..2dc0a239bcbb 100644 --- a/scripts/rollup/build/getRollupPlugins.js +++ b/scripts/rollup/build/getRollupPlugins.js @@ -91,7 +91,7 @@ module.exports = function getPlugins( isFBBundle && replace(Bundles.fbBundleExternalsMap), // Use Node resolution mechanism. resolve({ - skip: externals, + external: externals, }), // Remove license headers from individual modules stripBanner({ @@ -133,7 +133,7 @@ module.exports = function getPlugins( shouldStayReadable && prettier({parser: 'babylon'}), // License and haste headers, top-level `if` blocks. { - transformBundle(source) { + renderChunk(source) { return Wrappers.wrapBundle( source, bundleType, diff --git a/scripts/rollup/plugins/closure-plugin.js b/scripts/rollup/plugins/closure-plugin.js index 0c95ee99e22e..258f3b6be785 100644 --- a/scripts/rollup/plugins/closure-plugin.js +++ b/scripts/rollup/plugins/closure-plugin.js @@ -22,7 +22,7 @@ function compile(flags) { module.exports = function closure(flags = {}) { return { name: 'scripts/rollup/plugins/closure-plugin', - async transformBundle(code) { + async renderChunk(code) { const inputFile = tmp.fileSync(); const tempPath = inputFile.name; flags = Object.assign({}, flags, {js: tempPath}); diff --git a/scripts/rollup/plugins/sizes-plugin.js b/scripts/rollup/plugins/sizes-plugin.js index d2b994ef48ba..2a1cc258be3f 100644 --- a/scripts/rollup/plugins/sizes-plugin.js +++ b/scripts/rollup/plugins/sizes-plugin.js @@ -11,9 +11,11 @@ const gzip = require('gzip-size'); module.exports = function sizes(options) { return { name: 'scripts/rollup/plugins/sizes-plugin', - ongenerate(bundle, obj) { - const size = Buffer.byteLength(obj.code); - const gzipSize = gzip.sync(obj.code); + generateBundle(bundle, obj) { + const code = Object.keys(obj).map(key => obj[key].code).join('\n') + + const size = Buffer.byteLength(code); + const gzipSize = gzip.sync(code); options.getSize(size, gzipSize); }, diff --git a/scripts/rollup/plugins/strip-unused-imports.js b/scripts/rollup/plugins/strip-unused-imports.js index b5da1f292e0b..c0cd811d6462 100644 --- a/scripts/rollup/plugins/strip-unused-imports.js +++ b/scripts/rollup/plugins/strip-unused-imports.js @@ -9,7 +9,7 @@ module.exports = function stripUnusedImports(pureExternalModules) { return { name: 'scripts/rollup/plugins/strip-unused-imports', - transformBundle(code) { + renderChunk(code) { pureExternalModules.forEach(module => { // Ideally this would use a negative lookbehind: (? Date: Wed, 27 Nov 2019 20:57:55 -0800 Subject: [PATCH 22/49] silence circular dependency warnings --- scripts/rollup/build/handleRollupIssues.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/rollup/build/handleRollupIssues.js b/scripts/rollup/build/handleRollupIssues.js index b99306f67a8b..1840283b2d5b 100644 --- a/scripts/rollup/build/handleRollupIssues.js +++ b/scripts/rollup/build/handleRollupIssues.js @@ -5,6 +5,10 @@ const codeFrame = require('babel-code-frame'); const loggedErrors = require('./handlePromiseErrors'); function handleRollupWarning(warning) { + if (warning.code === "CIRCULAR_DEPENDENCY") { + // TODO: filter valid circular deps + return + } if (warning.code === 'UNUSED_EXTERNAL_IMPORT') { const match = warning.message.match(/external module '([^']+)'/); if (!match || typeof match[1] !== 'string') { From 68c234b1f27cdeedb62f118efd7c8ac85b9b9a45 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 21:02:12 -0800 Subject: [PATCH 23/49] run prettier --- scripts/rollup/build/handleRollupIssues.js | 4 ++-- scripts/rollup/plugins/sizes-plugin.js | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/rollup/build/handleRollupIssues.js b/scripts/rollup/build/handleRollupIssues.js index 1840283b2d5b..ed031e366e46 100644 --- a/scripts/rollup/build/handleRollupIssues.js +++ b/scripts/rollup/build/handleRollupIssues.js @@ -5,9 +5,9 @@ const codeFrame = require('babel-code-frame'); const loggedErrors = require('./handlePromiseErrors'); function handleRollupWarning(warning) { - if (warning.code === "CIRCULAR_DEPENDENCY") { + if (warning.code === 'CIRCULAR_DEPENDENCY') { // TODO: filter valid circular deps - return + return; } if (warning.code === 'UNUSED_EXTERNAL_IMPORT') { const match = warning.message.match(/external module '([^']+)'/); diff --git a/scripts/rollup/plugins/sizes-plugin.js b/scripts/rollup/plugins/sizes-plugin.js index 2a1cc258be3f..ac9da401a959 100644 --- a/scripts/rollup/plugins/sizes-plugin.js +++ b/scripts/rollup/plugins/sizes-plugin.js @@ -12,7 +12,9 @@ module.exports = function sizes(options) { return { name: 'scripts/rollup/plugins/sizes-plugin', generateBundle(bundle, obj) { - const code = Object.keys(obj).map(key => obj[key].code).join('\n') + const code = Object.keys(obj) + .map(key => obj[key].code) + .join('\n'); const size = Buffer.byteLength(code); const gzipSize = gzip.sync(code); From 368421907cbb9a45f3febfae44f26911fa8a6c34 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 21:43:44 -0800 Subject: [PATCH 24/49] add globalThis global to umd build-lint --- scripts/rollup/validate/eslintrc.umd.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/rollup/validate/eslintrc.umd.js b/scripts/rollup/validate/eslintrc.umd.js index ffaeb9488e0b..e15b5bb013c5 100644 --- a/scripts/rollup/validate/eslintrc.umd.js +++ b/scripts/rollup/validate/eslintrc.umd.js @@ -35,6 +35,9 @@ module.exports = { // Flight Uint8Array: true, Promise: true, + + // used by rollup generated code to determine global object + globalThis: true, }, parserOptions: { ecmaVersion: 5, From 2b7d9d3f60fe627cce548759f7de76f51b70c100 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 22:05:03 -0800 Subject: [PATCH 25/49] use terser to minify esm as a stopgop --- package.json | 1 + scripts/rollup/build/getRollupPlugins.js | 27 +++++++++++++----------- scripts/rollup/build/predicates.js | 5 ----- yarn.lock | 20 ++++++++++++++++++ 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 3f52b7473485..9df7359b4310 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "rollup-plugin-prettier": "^0.6.0", "rollup-plugin-replace": "^2.2.0", "rollup-plugin-strip-banner": "^1.0.0", + "rollup-plugin-terser": "^5.1.2", "semver": "^5.5.0", "targz": "^1.0.1", "through2": "^2.0.0", diff --git a/scripts/rollup/build/getRollupPlugins.js b/scripts/rollup/build/getRollupPlugins.js index 2dc0a239bcbb..c016a16b91d8 100644 --- a/scripts/rollup/build/getRollupPlugins.js +++ b/scripts/rollup/build/getRollupPlugins.js @@ -6,6 +6,7 @@ const commonjs = require('rollup-plugin-commonjs'); const prettier = require('rollup-plugin-prettier'); const replace = require('rollup-plugin-replace'); const stripBanner = require('rollup-plugin-strip-banner'); +const {terser} = require('rollup-plugin-terser'); const resolve = require('rollup-plugin-node-resolve'); const argv = require('minimist')(process.argv.slice(2)); const Modules = require('../modules'); @@ -20,7 +21,6 @@ const Wrappers = require('../wrappers'); const getBabelConfig = require('./getBabelConfig'); const { isProductionBundleType, - isMinifiable, isEsmBundle, isProfilingBundleType, isExperimental, @@ -68,7 +68,6 @@ module.exports = function getPlugins( const findAndRecordErrorCodes = extractErrorCodes(errorCodeOpts); const forks = Modules.getForks(bundleType, entry, moduleType); const isProduction = isProductionBundleType(bundleType); - const isMinified = isMinifiable(bundleType); const isProfiling = isProfilingBundleType(bundleType); const isUMDBundle = isUmdBundle(bundleType); const isFBBundle = isFacebookBundle(bundleType); @@ -116,16 +115,20 @@ module.exports = function getPlugins( // We still need CommonJS for external deps like object-assign. commonjs(), // Apply dead code elimination and/or minification. - isMinified && - closure( - Object.assign({}, closureOptions, { - // Don't let it create global variables in the browser. - // https://github.com/facebook/react/issues/10909 - assume_function_wrapper: !isUMDBundle, - renaming: !shouldStayReadable, - language_out: getOutputType(bundleType), - }) - ), + // TODO: using terser on ESM code is a stopgap until we can get + // closure compiler working on ESM + isProduction && + (isEsmBundle(bundleType) + ? terser() + : closure( + Object.assign({}, closureOptions, { + // Don't let it create global variables in the browser. + // https://github.com/facebook/react/issues/10909 + assume_function_wrapper: !isUMDBundle, + renaming: !shouldStayReadable, + language_out: getOutputType(bundleType), + }) + )), // HACK to work around the fact that Rollup isn't removing unused, pure-module imports. // Note that this plugin must be called after closure applies DCE. isProduction && stripUnusedImports(pureExternalModules), diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index 26a2704487a2..85038c1f5472 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -88,11 +88,6 @@ function isProductionBundleType(bundleType) { } } -function isMinifiable(bundleType) { - // esm minification is TODO - return isProductionBundleType(bundleType) && !isEsmBundle(bundleType); -} - function isEsmBundle(bundleType) { return bundleType === ESM_DEV || bundleType === ESM_PROD; } diff --git a/yarn.lock b/yarn.lock index a52969c2495e..edb0a413bd45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10945,6 +10945,17 @@ rollup-plugin-strip-banner@^1.0.0: magic-string "0.25.4" rollup-pluginutils "2.8.2" +rollup-plugin-terser@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.1.2.tgz#3e41256205cb75f196fc70d4634227d1002c255c" + integrity sha512-sWKBCOS+vUkRtHtEiJPAf+WnBqk/C402fBD9AVHxSIXMqjsY7MnYWKYEUqGixtr0c8+1DjzUEPlNgOYQPVrS1g== + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^24.6.0" + rollup-pluginutils "^2.8.1" + serialize-javascript "^1.7.0" + terser "^4.1.0" + rollup-pluginutils@2.8.2, rollup-pluginutils@^2.6.0: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" @@ -12256,6 +12267,15 @@ terser-webpack-plugin@^1.4.1: webpack-sources "^1.4.0" worker-farm "^1.7.0" +terser@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3" + integrity sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + terser@^4.1.2: version "4.1.4" resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.4.tgz#4478b6a08bb096a61e793fea1a4434408bab936c" From 428530758597b385583af30c34807291ea4bc2e6 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 22:09:38 -0800 Subject: [PATCH 26/49] remove isminifyable from predicates export list --- scripts/rollup/build/predicates.js | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index 85038c1f5472..d33b1bc27002 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -198,7 +198,6 @@ function parseRequestedNames(names, toCase) { module.exports = { isProductionBundleType, - isMinifiable, isEsmBundle, isProfilingBundleType, isSkippableBundle, From 44437506df2dc0df0e74c13cf311945c1c8036b5 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 22:34:27 -0800 Subject: [PATCH 27/49] add script to verify main/module file existence --- packages/react-flight/package.json | 1 - scripts/tasks/package-check.js | 40 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 scripts/tasks/package-check.js diff --git a/packages/react-flight/package.json b/packages/react-flight/package.json index 30e1be184788..f535da61e7f6 100644 --- a/packages/react-flight/package.json +++ b/packages/react-flight/package.json @@ -18,7 +18,6 @@ "esm/" ], "main": "index.js", - "module": "index.mjs", "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js new file mode 100644 index 000000000000..f75b6e0a9597 --- /dev/null +++ b/scripts/tasks/package-check.js @@ -0,0 +1,40 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const packagesDir = path.join(__dirname, '../../build/node_modules'); +const packages = fs.readdirSync(packagesDir); + +packages.forEach(packageName => { + const packageDir = path.join(packagesDir, packageName); + const packageJson = require(path.join(packageDir, 'package.json')); + + if (packageJson.main != null) { + if (!fs.existsSync(path.join(packageDir, packageJson.main))) { + console.error( + `package.json for build module ${ + packageJson.name + } contains a 'main' entry that does not exist` + ); + process.exit(1); + } + } + if (packageJson.module != null) { + if (!fs.existsSync(path.join(packageDir, packageJson.module))) { + console.error( + `package.json for build module ${ + packageJson.name + } contains a 'module' entry that does not exist` + ); + process.exit(1); + } + } +}); From 1970c745e638fc43d7a88a1c11ec55754eaff0de Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 22:38:44 -0800 Subject: [PATCH 28/49] add a check to verify package structure --- .circleci/config.yml | 16 ++++++++++++++++ package.json | 1 + 2 files changed, 17 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 32afc1aa66e3..92af8f5c6673 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -254,6 +254,19 @@ jobs: RELEASE_CHANNEL: stable command: yarn test-build --maxWorkers=2 + test_package_structure: + docker: *docker + environment: *environment + steps: + - checkout + - attach_workspace: *attach_workspace + - *restore_yarn_cache + - *run_yarn + - run: + environment: + RELEASE_CHANNEL: stable + command: yarn test-package-structure + test_build_experimental: docker: *docker environment: *environment @@ -371,6 +384,9 @@ workflows: - test_build: requires: - build + - test_package_structure: + requires: + - build - test_build_prod: requires: - build diff --git a/package.json b/package.json index 9df7359b4310..242298572c9c 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,7 @@ "test-build": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build.js", "test-build-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.build.js", "test-build-devtools": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build-devtools.js", + "test-package-structure": "node ./scripts/tasks/package-check.js", "debug-test-build-devtools": "cross-env NODE_ENV=development node --inspect-brk node_modules/.bin/jest --config ./scripts/jest/config.build-devtools.js", "test-dom-fixture": "cd fixtures/dom && yarn && yarn prestart && yarn test", "flow": "node ./scripts/tasks/flow.js", From ec52686b40106a2bfc6bddae862f73aa2251a345 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Wed, 27 Nov 2019 22:47:27 -0800 Subject: [PATCH 29/49] yaml update --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 92af8f5c6673..23bcaa3ae704 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -254,7 +254,7 @@ jobs: RELEASE_CHANNEL: stable command: yarn test-build --maxWorkers=2 - test_package_structure: + test_package_structure: docker: *docker environment: *environment steps: From f3879264e51fa505865adf889a515ac8d8191173 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Thu, 28 Nov 2019 11:02:22 -0800 Subject: [PATCH 30/49] Use the conditionl-exports based dual-entry model described in the node docs --- package.json | 2 +- packages/create-subscription/package.json | 5 ++- .../eslint-plugin-react-hooks/package.json | 5 ++- packages/jest-mock-scheduler/package.json | 5 ++- packages/jest-react/package.json | 5 ++- packages/react-art/package.json | 5 ++- packages/react-cache/package.json | 5 ++- packages/react-debug-tools/package.json | 5 ++- packages/react-dom/package.json | 5 ++- .../react-flight-dom-webpack/package.json | 5 ++- packages/react-is/package.json | 5 ++- packages/react-noop-renderer/package.json | 5 ++- packages/react-test-renderer/package.json | 5 ++- packages/react/package.json | 5 ++- packages/scheduler/package.json | 5 ++- packages/use-subscription/package.json | 5 ++- scripts/tasks/package-check.js | 39 +++++++++++++++---- 17 files changed, 93 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 242298572c9c..c1fa74aef724 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "webpack": "^4.41.2" }, "devEngines": { - "node": "8.x || 9.x || 10.x || 11.x || 12.x" + "node": "8.x || 9.x || 10.x || 11.x || 12.x || 13.x" }, "jest": { "testRegex": "/scripts/jest/dont-run-jest-directly\\.js$" diff --git a/packages/create-subscription/package.json b/packages/create-subscription/package.json index e41b42fe02be..1e96557cbd00 100644 --- a/packages/create-subscription/package.json +++ b/packages/create-subscription/package.json @@ -3,7 +3,10 @@ "description": "utility for subscribing to external data sources inside React components", "version": "16.12.0", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/eslint-plugin-react-hooks/package.json b/packages/eslint-plugin-react-hooks/package.json index f1f03e71dc7c..371b61c58787 100644 --- a/packages/eslint-plugin-react-hooks/package.json +++ b/packages/eslint-plugin-react-hooks/package.json @@ -8,7 +8,10 @@ "directory": "packages/eslint-plugin-react-hooks" }, "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "files": [ "LICENSE", "README.md", diff --git a/packages/jest-mock-scheduler/package.json b/packages/jest-mock-scheduler/package.json index cf0017dea6d6..b05dbc24d21e 100644 --- a/packages/jest-mock-scheduler/package.json +++ b/packages/jest-mock-scheduler/package.json @@ -4,7 +4,10 @@ "version": "0.1.0", "description": "Jest matchers and utilities for testing the scheduler package.", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/jest-react/package.json b/packages/jest-react/package.json index ac03b204857a..7c0015da7b87 100644 --- a/packages/jest-react/package.json +++ b/packages/jest-react/package.json @@ -3,7 +3,10 @@ "version": "0.10.0", "description": "Jest matchers and utilities for testing React components.", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-art/package.json b/packages/react-art/package.json index c7162533ec9c..e0538fed2232 100644 --- a/packages/react-art/package.json +++ b/packages/react-art/package.json @@ -3,7 +3,10 @@ "description": "React ART is a JavaScript library for drawing vector graphics using React. It provides declarative and reactive bindings to the ART library. Using the same declarative API you can render the output to either Canvas, SVG or VML (IE8).", "version": "16.12.0", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-cache/package.json b/packages/react-cache/package.json index 87cbea7c3e78..e06521cc32ba 100644 --- a/packages/react-cache/package.json +++ b/packages/react-cache/package.json @@ -4,7 +4,10 @@ "description": "A basic cache for React applications", "version": "2.0.0-alpha.0", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index 16e7ef2c2777..e0750910fccf 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -19,7 +19,10 @@ "esm/" ], "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index bfebcaaea63b..f524301c74ac 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -3,7 +3,10 @@ "version": "16.12.0", "description": "React package for working with the DOM.", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-flight-dom-webpack/package.json b/packages/react-flight-dom-webpack/package.json index 00aa0c306ee9..6ad4fc62e65d 100644 --- a/packages/react-flight-dom-webpack/package.json +++ b/packages/react-flight-dom-webpack/package.json @@ -25,7 +25,10 @@ "./server.js": "./server.browser.js" }, "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-is/package.json b/packages/react-is/package.json index 0b48e1448a02..42bb3bb4bb6a 100644 --- a/packages/react-is/package.json +++ b/packages/react-is/package.json @@ -3,7 +3,10 @@ "version": "16.12.0", "description": "Brand checking of React Elements.", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-noop-renderer/package.json b/packages/react-noop-renderer/package.json index a59df5ad489b..d0cc2b02f313 100644 --- a/packages/react-noop-renderer/package.json +++ b/packages/react-noop-renderer/package.json @@ -4,7 +4,10 @@ "private": true, "description": "React package for testing the Fiber, Fizz and Flight reconcilers.", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index df74b7f64e14..bbc6efbd6d49 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -3,7 +3,10 @@ "version": "16.12.0", "description": "React package for snapshot testing.", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react/package.json b/packages/react/package.json index ec0df9469e90..22b02f191704 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -19,7 +19,10 @@ "esm/" ], "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index d846e6c23eda..44b73ebdc6a5 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -3,7 +3,10 @@ "version": "0.18.0", "description": "Cooperative scheduler for the browser environment.", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/use-subscription/package.json b/packages/use-subscription/package.json index 9edd67959d25..975053a1e91e 100644 --- a/packages/use-subscription/package.json +++ b/packages/use-subscription/package.json @@ -3,7 +3,10 @@ "description": "Reusable hooks", "version": "1.3.0", "main": "index.js", - "module": "index.mjs", + "exports": { + "require": "./index.js", + "default": "./index.mjs" + }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js index f75b6e0a9597..3124c25b2fda 100644 --- a/scripts/tasks/package-check.js +++ b/scripts/tasks/package-check.js @@ -13,6 +13,11 @@ const path = require('path'); const packagesDir = path.join(__dirname, '../../build/node_modules'); const packages = fs.readdirSync(packagesDir); +process.on('unhandledRejection', err => { + console.error(err); + process.exit(1); +}); + packages.forEach(packageName => { const packageDir = path.join(packagesDir, packageName); const packageJson = require(path.join(packageDir, 'package.json')); @@ -27,14 +32,34 @@ packages.forEach(packageName => { process.exit(1); } } - if (packageJson.module != null) { - if (!fs.existsSync(path.join(packageDir, packageJson.module))) { - console.error( - `package.json for build module ${ - packageJson.name - } contains a 'module' entry that does not exist` + if (packageJson.exports != null) { + if (packageJson.exports.require != null) { + const cjsEntryFileName = path.join( + packageDir, + packageJson.exports.require ); - process.exit(1); + if (!fs.existsSync(cjsEntryFileName)) { + console.error( + `package.json for build module ${ + packageJson.name + } contains a 'module' entry that does not exist` + ); + process.exit(1); + } + } + if (packageJson.exports.default != null) { + const esmEntryFileName = path.join( + packageDir, + packageJson.exports.default + ); + if (!fs.existsSync(esmEntryFileName)) { + console.error( + `package.json for build module ${ + packageJson.name + } contains a 'module' entry that does not exist` + ); + process.exit(1); + } } } }); From 45b594e084ae0083091d3e17334c7d76fb89d319 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Thu, 28 Nov 2019 11:20:19 -0800 Subject: [PATCH 31/49] update package-check script to verify require() and import() on packages using --experimenta-conditional-exports feature --- package.json | 4 +- scripts/tasks/package-check.js | 83 ++++++++++----- yarn.lock | 182 +++++++++++++++++++++++++++++++-- 3 files changed, 235 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index c1fa74aef724..1e49544f7fa1 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "babel-eslint": "^10.0.0", "babel-plugin-syntax-trailing-function-commas": "^6.5.0", "babylon": "6.18.0", + "canvas": "^2.6.0", "chalk": "^1.1.3", "cli-table": "^0.3.1", "coffee-script": "^1.8.0", @@ -65,6 +66,7 @@ "jest": "^24.9.0", "jest-diff": "^24.9.0", "jest-snapshot-serializer-raw": "^1.1.0", + "jsdom": "^15.2.1", "minimatch": "^3.0.4", "minimist": "^1.2.0", "mkdirp": "^0.5.1", @@ -113,7 +115,7 @@ "test-build": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build.js", "test-build-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.build.js", "test-build-devtools": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build-devtools.js", - "test-package-structure": "node ./scripts/tasks/package-check.js", + "test-package-structure": "node --experimental-conditional-exports ./scripts/tasks/package-check.js", "debug-test-build-devtools": "cross-env NODE_ENV=development node --inspect-brk node_modules/.bin/jest --config ./scripts/jest/config.build-devtools.js", "test-dom-fixture": "cd fixtures/dom && yarn && yarn prestart && yarn test", "flow": "node ./scripts/tasks/flow.js", diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js index 3124c25b2fda..0836e5118e6b 100644 --- a/scripts/tasks/package-check.js +++ b/scripts/tasks/package-check.js @@ -9,6 +9,18 @@ const fs = require('fs'); const path = require('path'); +const {JSDOM} = require('jsdom'); + +const {window} = new JSDOM( + ` + +`, + {runScripts: 'dangerously'} +); + +global.window = window; +global.document = window.document; +global.navigator = window.navigator; const packagesDir = path.join(__dirname, '../../build/node_modules'); const packages = fs.readdirSync(packagesDir); @@ -18,48 +30,69 @@ process.on('unhandledRejection', err => { process.exit(1); }); -packages.forEach(packageName => { +function failHardIf(predicate, message) { + if (predicate) { + console.error(message); + process.exit(1); + } +} + +packages.forEach(async packageName => { + console.log(`inspect ${packageName}`); const packageDir = path.join(packagesDir, packageName); const packageJson = require(path.join(packageDir, 'package.json')); if (packageJson.main != null) { - if (!fs.existsSync(path.join(packageDir, packageJson.main))) { - console.error( - `package.json for build module ${ - packageJson.name - } contains a 'main' entry that does not exist` - ); - process.exit(1); - } + failHardIf( + !fs.existsSync(path.join(packageDir, packageJson.main)), + `package.json for build module ${ + packageJson.name + } contains a 'main' entry that does not exist` + ); + + const exported = require(packageDir); + failHardIf( + !exported, + `package.json for build module ${ + packageJson.name + } does not export anything from main` + ); } + if (packageJson.exports != null) { if (packageJson.exports.require != null) { + console.log('\tinspect cjs export'); const cjsEntryFileName = path.join( packageDir, packageJson.exports.require ); - if (!fs.existsSync(cjsEntryFileName)) { - console.error( - `package.json for build module ${ - packageJson.name - } contains a 'module' entry that does not exist` - ); - process.exit(1); - } + failHardIf( + !fs.existsSync(cjsEntryFileName), + `package.json for build module ${ + packageJson.name + } contains a 'module' entry that does not exist` + ); } if (packageJson.exports.default != null) { + console.log('\tinspect esm export'); const esmEntryFileName = path.join( packageDir, packageJson.exports.default ); - if (!fs.existsSync(esmEntryFileName)) { - console.error( - `package.json for build module ${ - packageJson.name - } contains a 'module' entry that does not exist` - ); - process.exit(1); - } + failHardIf( + !fs.existsSync(esmEntryFileName), + `package.json for build module ${ + packageJson.name + } contains a 'module' entry that does not exist` + ); + + const result = await import(packageDir); + failHardIf( + !result, + `package.json for build module ${ + packageJson.name + } does not export anything from esm` + ); } } }); diff --git a/yarn.lock b/yarn.lock index edb0a413bd45..20bd2a5f537d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1539,6 +1539,14 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-globals@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -3215,6 +3223,15 @@ caniuse-lite@^1.0.30000984: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== +canvas@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.6.0.tgz#7a8f87b6148845d97e6ee30947fba1508bed4941" + integrity sha512-bEO9f1ThmbknLPxCa8Es7obPlN9W3stB1bo7njlhOFKIdUTldeTqXCh9YclCPAi2pSQs84XA0jq/QEZXSzgyMw== + dependencies: + nan "^2.14.0" + node-pre-gyp "^0.11.0" + simple-get "^3.0.3" + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3993,11 +4010,16 @@ cssesc@^0.1.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== +cssom@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + "cssstyle@>= 0.3.1 < 0.4.0": version "0.3.1" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" @@ -4005,6 +4027,13 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +cssstyle@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.0.0.tgz#911f0fe25532db4f5d44afc83f89cc4b82c97fe3" + integrity sha512-QXSAu2WBsSRXCPjvI43Y40m6fMevvyRm8JVAuF9ksQz5jha4pWP1wpaK7Yu5oLFc6+XAY+hj8YhefyXcBB53gg== + dependencies: + cssom "~0.3.6" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -4081,7 +4110,7 @@ data-uri-to-buffer@2: dependencies: "@types/node" "^8.0.7" -data-urls@^1.0.0: +data-urls@^1.0.0, data-urls@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== @@ -4152,6 +4181,13 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + deep-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-3.0.0.tgz#c8e4c4d401cba25550a2f0f486a2e75bc5f219a2" @@ -4439,7 +4475,7 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== -domexception@^1.0.0: +domexception@^1.0.0, domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== @@ -4793,7 +4829,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.x.x, escodegen@^1.9.0: +escodegen@1.x.x, escodegen@^1.11.1, escodegen@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== @@ -7710,6 +7746,38 @@ jsdom@^11.5.1: ws "^4.0.0" xml-name-validator "^3.0.0" +jsdom@^15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== + dependencies: + abab "^2.0.0" + acorn "^7.1.0" + acorn-globals "^4.3.2" + array-equal "^1.0.0" + cssom "^0.4.1" + cssstyle "^2.0.0" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.1" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.2.0" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.7" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^7.0.0" + xml-name-validator "^3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -8551,6 +8619,11 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46" + integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -8730,7 +8803,7 @@ mz@2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.10.0, nan@^2.12.1: +nan@^2.10.0, nan@^2.12.1, nan@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -8938,6 +9011,22 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" @@ -9122,6 +9211,11 @@ nwsapi@^2.0.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -9637,6 +9731,11 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -10619,6 +10718,13 @@ request-promise-core@1.1.2: dependencies: lodash "^4.17.11" +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + request-promise-native@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" @@ -10628,6 +10734,15 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" +request-promise-native@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" @@ -10680,7 +10795,7 @@ request@2.87.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.45.0, request@^2.83.0, request@~2.88.0: +request@^2.45.0, request@^2.83.0, request@^2.88.0, request@~2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -11071,6 +11186,13 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + scheduler@^0.11.0: version "0.11.3" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b" @@ -11321,6 +11443,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + single-line-log@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" @@ -12500,6 +12636,15 @@ tough-cookie@^2.3.3: psl "^1.1.28" punycode "^2.1.1" +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" @@ -12974,6 +13119,15 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -13207,7 +13361,7 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== @@ -13219,7 +13373,7 @@ whatwg-fetch@>=0.10.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== @@ -13391,6 +13545,13 @@ ws@^7: dependencies: async-limiter "^1.0.0" +ws@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7" + integrity sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg== + dependencies: + async-limiter "^1.0.0" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -13414,6 +13575,11 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xregexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" From 7f08a448e298dfc2ce2727a03da2a3d1323c4de9 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Thu, 28 Nov 2019 11:34:21 -0800 Subject: [PATCH 32/49] remove exports object from packages in-situ - it interferes with the build --- package.json | 2 +- packages/create-subscription/package.json | 4 ---- packages/eslint-plugin-react-hooks/package.json | 4 ---- packages/jest-mock-scheduler/package.json | 4 ---- packages/jest-react/package.json | 4 ---- packages/react-art/package.json | 4 ---- packages/react-cache/package.json | 4 ---- packages/react-debug-tools/package.json | 4 ---- packages/react-dom/package.json | 4 ---- packages/react-flight-dom-webpack/package.json | 4 ---- packages/react-is/package.json | 4 ---- packages/react-noop-renderer/package.json | 4 ---- packages/react-test-renderer/package.json | 4 ---- packages/react/package.json | 6 +----- packages/scheduler/package.json | 4 ---- packages/use-subscription/package.json | 4 ---- 16 files changed, 2 insertions(+), 62 deletions(-) diff --git a/package.json b/package.json index 1e49544f7fa1..5d05f768b83c 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "testRegex": "/scripts/jest/dont-run-jest-directly\\.js$" }, "scripts": { - "build": "node ./scripts/rollup/build", + "build": "node --experimental-conditional-exports ./scripts/rollup/build", "linc": "node ./scripts/tasks/linc.js", "lint": "node ./scripts/tasks/eslint.js", "lint-build": "node ./scripts/rollup/validate/index.js", diff --git a/packages/create-subscription/package.json b/packages/create-subscription/package.json index 1e96557cbd00..50f7b41a3a27 100644 --- a/packages/create-subscription/package.json +++ b/packages/create-subscription/package.json @@ -3,10 +3,6 @@ "description": "utility for subscribing to external data sources inside React components", "version": "16.12.0", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/eslint-plugin-react-hooks/package.json b/packages/eslint-plugin-react-hooks/package.json index 371b61c58787..830a461880ae 100644 --- a/packages/eslint-plugin-react-hooks/package.json +++ b/packages/eslint-plugin-react-hooks/package.json @@ -8,10 +8,6 @@ "directory": "packages/eslint-plugin-react-hooks" }, "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "files": [ "LICENSE", "README.md", diff --git a/packages/jest-mock-scheduler/package.json b/packages/jest-mock-scheduler/package.json index b05dbc24d21e..300d3bd94b93 100644 --- a/packages/jest-mock-scheduler/package.json +++ b/packages/jest-mock-scheduler/package.json @@ -4,10 +4,6 @@ "version": "0.1.0", "description": "Jest matchers and utilities for testing the scheduler package.", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/jest-react/package.json b/packages/jest-react/package.json index 7c0015da7b87..a65f7b0f8aca 100644 --- a/packages/jest-react/package.json +++ b/packages/jest-react/package.json @@ -3,10 +3,6 @@ "version": "0.10.0", "description": "Jest matchers and utilities for testing React components.", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-art/package.json b/packages/react-art/package.json index e0538fed2232..ca5d8dcc5cbd 100644 --- a/packages/react-art/package.json +++ b/packages/react-art/package.json @@ -3,10 +3,6 @@ "description": "React ART is a JavaScript library for drawing vector graphics using React. It provides declarative and reactive bindings to the ART library. Using the same declarative API you can render the output to either Canvas, SVG or VML (IE8).", "version": "16.12.0", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-cache/package.json b/packages/react-cache/package.json index e06521cc32ba..61cf5612eef5 100644 --- a/packages/react-cache/package.json +++ b/packages/react-cache/package.json @@ -4,10 +4,6 @@ "description": "A basic cache for React applications", "version": "2.0.0-alpha.0", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index e0750910fccf..3f449aedf90e 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -19,10 +19,6 @@ "esm/" ], "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index f524301c74ac..9203df84a81b 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -3,10 +3,6 @@ "version": "16.12.0", "description": "React package for working with the DOM.", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-flight-dom-webpack/package.json b/packages/react-flight-dom-webpack/package.json index 6ad4fc62e65d..573111da1f22 100644 --- a/packages/react-flight-dom-webpack/package.json +++ b/packages/react-flight-dom-webpack/package.json @@ -25,10 +25,6 @@ "./server.js": "./server.browser.js" }, "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-is/package.json b/packages/react-is/package.json index 42bb3bb4bb6a..225041c7e31e 100644 --- a/packages/react-is/package.json +++ b/packages/react-is/package.json @@ -3,10 +3,6 @@ "version": "16.12.0", "description": "Brand checking of React Elements.", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react-noop-renderer/package.json b/packages/react-noop-renderer/package.json index d0cc2b02f313..cbc77693f0f3 100644 --- a/packages/react-noop-renderer/package.json +++ b/packages/react-noop-renderer/package.json @@ -4,10 +4,6 @@ "private": true, "description": "React package for testing the Fiber, Fizz and Flight reconcilers.", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type" : "git", "url" : "https://github.com/facebook/react.git", diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index bbc6efbd6d49..448082f0fe01 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -3,10 +3,6 @@ "version": "16.12.0", "description": "React package for snapshot testing.", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/react/package.json b/packages/react/package.json index 22b02f191704..c569b615f4e7 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -18,11 +18,7 @@ "umd/", "esm/" ], - "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, + "main": "./index.js", "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index 44b73ebdc6a5..2e17b4b95797 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -3,10 +3,6 @@ "version": "0.18.0", "description": "Cooperative scheduler for the browser environment.", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", diff --git a/packages/use-subscription/package.json b/packages/use-subscription/package.json index 975053a1e91e..81f4d4828f20 100644 --- a/packages/use-subscription/package.json +++ b/packages/use-subscription/package.json @@ -3,10 +3,6 @@ "description": "Reusable hooks", "version": "1.3.0", "main": "index.js", - "exports": { - "require": "./index.js", - "default": "./index.mjs" - }, "repository": { "type": "git", "url": "https://github.com/facebook/react.git", From 4b3377206202ecf67f5db708668e7bbed181b1d7 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Thu, 28 Nov 2019 11:59:42 -0800 Subject: [PATCH 33/49] wire exports map into packages as a build step --- package.json | 4 ++-- scripts/rollup/packaging.js | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5d05f768b83c..1b05dfdddd43 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "testRegex": "/scripts/jest/dont-run-jest-directly\\.js$" }, "scripts": { - "build": "node --experimental-conditional-exports ./scripts/rollup/build", + "build": "node ./scripts/rollup/build", "linc": "node ./scripts/tasks/linc.js", "lint": "node ./scripts/tasks/eslint.js", "lint-build": "node ./scripts/rollup/validate/index.js", @@ -115,7 +115,7 @@ "test-build": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build.js", "test-build-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.build.js", "test-build-devtools": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build-devtools.js", - "test-package-structure": "node --experimental-conditional-exports ./scripts/tasks/package-check.js", + "test-package-structure": "node --experimental-conditional-exports ./build/node_modules/package-check.js", "debug-test-build-devtools": "cross-env NODE_ENV=development node --inspect-brk node_modules/.bin/jest --config ./scripts/jest/config.build-devtools.js", "test-dom-fixture": "cd fixtures/dom && yarn && yarn prestart && yarn test", "flow": "node ./scripts/tasks/flow.js", diff --git a/scripts/rollup/packaging.js b/scripts/rollup/packaging.js index 4c184b5c719b..81ff944afbed 100644 --- a/scripts/rollup/packaging.js +++ b/scripts/rollup/packaging.js @@ -1,7 +1,8 @@ 'use strict'; -const {existsSync, readdirSync, unlinkSync} = require('fs'); +const {existsSync, readdirSync, unlinkSync, writeFileSync} = require('fs'); const Bundles = require('./bundles'); +const path = require('path'); const { asyncCopyTo, asyncExecuteCommand, @@ -140,14 +141,32 @@ async function prepareNpmPackage(name) { ), asyncCopyTo(`packages/${name}/npm`, `build/node_modules/${name}`), ]); + await injectExportsMapInPackageJson(name); const tgzName = (await asyncExecuteCommand( `npm pack build/node_modules/${name}` )).trim(); + await asyncRimRaf(`build/node_modules/${name}`); await asyncExtractTar(getTarOptions(tgzName, name)); unlinkSync(tgzName); } +async function injectExportsMapInPackageJson(name) { + const pkgJsonPath = path.join( + __dirname, + '../..', + `build/node_modules/${name}/package.json` + ); + const pkgJson = require(pkgJsonPath); + if (pkgJson.files.some(file => file === 'index.mjs')) { + pkgJson.exports = { + require: './index.js', + default: './index.mjs', + }; + writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2)); + } +} + async function prepareNpmPackages() { if (!existsSync('build/node_modules')) { // We didn't build any npm packages. From 15b0128d749a8aaf7de17cc08718426eb279902d Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 13:26:19 -0800 Subject: [PATCH 34/49] move exports map to package.json in src/ folder --- package.json | 2 +- packages/create-subscription/package.json | 4 +--- packages/eslint-plugin-react-hooks/package.json | 6 ++++++ packages/jest-react/package.json | 8 +++++++- packages/react-debug-tools/package.json | 3 +-- packages/react-dom/package.json | 4 +--- packages/react-is/package.json | 8 +++++++- packages/react/package.json | 4 +--- packages/scheduler/package.json | 16 ++++++++++++++++ packages/use-subscription/package.json | 4 +--- scripts/rollup/packaging.js | 11 +++++++---- 11 files changed, 49 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 1b05dfdddd43..88a345adb4fb 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "test-build": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build.js", "test-build-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.build.js", "test-build-devtools": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build-devtools.js", - "test-package-structure": "node --experimental-conditional-exports ./build/node_modules/package-check.js", + "test-package-structure": "node --experimental-conditional-exports ./build/package-check.js", "debug-test-build-devtools": "cross-env NODE_ENV=development node --inspect-brk node_modules/.bin/jest --config ./scripts/jest/config.build-devtools.js", "test-dom-fixture": "cd fixtures/dom && yarn && yarn prestart && yarn test", "flow": "node ./scripts/tasks/flow.js", diff --git a/packages/create-subscription/package.json b/packages/create-subscription/package.json index 50f7b41a3a27..d157f921e0b2 100644 --- a/packages/create-subscription/package.json +++ b/packages/create-subscription/package.json @@ -13,9 +13,7 @@ "README.md", "build-info.json", "index.js", - "index.mjs", - "cjs/", - "esm/" + "cjs/" ], "peerDependencies": { "react": "^16.3.0" diff --git a/packages/eslint-plugin-react-hooks/package.json b/packages/eslint-plugin-react-hooks/package.json index 830a461880ae..297dbb00c3a4 100644 --- a/packages/eslint-plugin-react-hooks/package.json +++ b/packages/eslint-plugin-react-hooks/package.json @@ -17,6 +17,12 @@ "cjs/", "esm/" ], + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } + }, "keywords": [ "eslint", "eslint-plugin", diff --git a/packages/jest-react/package.json b/packages/jest-react/package.json index a65f7b0f8aca..0b2e4ba3e02d 100644 --- a/packages/jest-react/package.json +++ b/packages/jest-react/package.json @@ -31,5 +31,11 @@ "index.mjs", "cjs/", "esm/" - ] + ], + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } + } } diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index 3f449aedf90e..e3265a97a747 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -15,8 +15,7 @@ "build-info.json", "index.js", "index.mjs", - "cjs/", - "esm/" + "cjs/" ], "main": "index.js", "repository": { diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 9203df84a81b..7e6cf5e5c0ee 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -30,7 +30,6 @@ "README.md", "build-info.json", "index.js", - "index.mjs", "profiling.js", "server.js", "server.browser.js", @@ -42,8 +41,7 @@ "unstable-fizz.node.js", "unstable-native-dependencies.js", "cjs/", - "umd/", - "esm/" + "umd/" ], "browser": { "./server.js": "./server.browser.js", diff --git a/packages/react-is/package.json b/packages/react-is/package.json index 225041c7e31e..472f315decd1 100644 --- a/packages/react-is/package.json +++ b/packages/react-is/package.json @@ -25,5 +25,11 @@ "cjs/", "umd/", "esm/" - ] + ], + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } + } } diff --git a/packages/react/package.json b/packages/react/package.json index c569b615f4e7..7a3da14f54ae 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -13,10 +13,8 @@ "README.md", "build-info.json", "index.js", - "index.mjs", "cjs/", - "umd/", - "esm/" + "umd/" ], "main": "./index.js", "repository": { diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index 2e17b4b95797..d68cf148728f 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -27,12 +27,28 @@ "index.js", "index.mjs", "tracing.js", + "tracing.mjs", "tracing-profiling.js", "unstable_mock.js", + "unstable_mock.mjs", "cjs/", "umd/", "esm/" ], + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + }, + "./unstable_mock": { + "require": "./unstable_mock.js", + "default": "./unstable_mock.mjs" + }, + "./tracing": { + "require": "./tracing.js", + "default": "./tracing.mjs" + } + }, "browserify": { "transform": [ "loose-envify" diff --git a/packages/use-subscription/package.json b/packages/use-subscription/package.json index 81f4d4828f20..171dd7fc9a0a 100644 --- a/packages/use-subscription/package.json +++ b/packages/use-subscription/package.json @@ -13,9 +13,7 @@ "README.md", "build-info.json", "index.js", - "index.mjs", - "cjs/", - "esm/" + "cjs/" ], "dependencies": { "object-assign": "^4.1.1" diff --git a/scripts/rollup/packaging.js b/scripts/rollup/packaging.js index 81ff944afbed..3bee5553f473 100644 --- a/scripts/rollup/packaging.js +++ b/scripts/rollup/packaging.js @@ -158,11 +158,14 @@ async function injectExportsMapInPackageJson(name) { `build/node_modules/${name}/package.json` ); const pkgJson = require(pkgJsonPath); + + // Copy the __exports into exports + // This is done because the exports map interferes with + // module resolution during builds. It is meant to be used + // with the built and packaged package. if (pkgJson.files.some(file => file === 'index.mjs')) { - pkgJson.exports = { - require: './index.js', - default: './index.mjs', - }; + pkgJson.exports = pkgJson.__exports; + delete pkgJson.__exports; writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2)); } } From 28058ef2a17a9347e82a877cb516c1a1e30c9fb9 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 14:13:35 -0800 Subject: [PATCH 35/49] improve package-check script --- scripts/rollup/build/index.js | 6 +- scripts/tasks/package-check.js | 160 +++++++++++++++++++++------------ 2 files changed, 106 insertions(+), 60 deletions(-) diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js index 924bbd034196..200748241aee 100644 --- a/scripts/rollup/build/index.js +++ b/scripts/rollup/build/index.js @@ -4,8 +4,9 @@ require('./handlePromiseErrors'); const argv = require('minimist')(process.argv.slice(2)); const Stats = require('../stats'); const Sync = require('../sync'); +const path = require('path'); const Packaging = require('../packaging'); -const {asyncRimRaf} = require('../utils'); +const {asyncRimRaf, asyncCopyTo} = require('../utils'); const getBundlesToBuild = require('./getBundlesToBuild'); const createBundle = require('./createBundle'); const { @@ -25,6 +26,9 @@ async function buildEverything() { await asyncRimRaf('build'); } + // Copy the package-check script + asyncCopyTo(path.join(__dirname, '../../tasks/package-check.js'), path.join(__dirname, '../../../build/package-check.js')); + // Run bundle builds serially for better console output // and to avoid any potential race conditions. let bundles = getBundlesToBuild(); diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js index 0836e5118e6b..b2ab690d1bbb 100644 --- a/scripts/tasks/package-check.js +++ b/scripts/tasks/package-check.js @@ -4,11 +4,13 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +/* eslint-disable no-for-of-loops/no-for-of-loops */ 'use strict'; const fs = require('fs'); const path = require('path'); +const chalk = require('chalk'); const {JSDOM} = require('jsdom'); const {window} = new JSDOM( @@ -22,77 +24,117 @@ global.window = window; global.document = window.document; global.navigator = window.navigator; -const packagesDir = path.join(__dirname, '../../build/node_modules'); +const packagesDir = path.join(__dirname, 'node_modules'); const packages = fs.readdirSync(packagesDir); +let errors = []; process.on('unhandledRejection', err => { console.error(err); - process.exit(1); + errors.push({err}); }); -function failHardIf(predicate, message) { - if (predicate) { - console.error(message); - process.exit(1); +function ok(key) { + console.log(`\t${key} ${chalk.green('ok')}`); +} + +function fail(key, message) { + errors.push({key, message}); + if (message) { + console.log(`\t${key} ${chalk.red('fail')}\n\t\t`, message); + } else { + console.log(`\t${key} ${chalk.red('fail')}`); } } -packages.forEach(async packageName => { - console.log(`inspect ${packageName}`); - const packageDir = path.join(packagesDir, packageName); - const packageJson = require(path.join(packageDir, 'package.json')); - - if (packageJson.main != null) { - failHardIf( - !fs.existsSync(path.join(packageDir, packageJson.main)), - `package.json for build module ${ - packageJson.name - } contains a 'main' entry that does not exist` - ); - - const exported = require(packageDir); - failHardIf( - !exported, - `package.json for build module ${ - packageJson.name - } does not export anything from main` - ); +function check(key, predicate) { + if (predicate) { + ok(key); + } else { + fail(key); } +} - if (packageJson.exports != null) { - if (packageJson.exports.require != null) { - console.log('\tinspect cjs export'); - const cjsEntryFileName = path.join( - packageDir, - packageJson.exports.require - ); - failHardIf( - !fs.existsSync(cjsEntryFileName), - `package.json for build module ${ - packageJson.name - } contains a 'module' entry that does not exist` - ); +async function checkPackages() { + for (let packageName of packages) { + console.log(`inspect ${packageName}`); + const packageDir = path.join(packagesDir, packageName); + const packageJson = require(path.join(packageDir, 'package.json')); + let mainFileName; + + // check main file existence + if (packageJson.main) { + mainFileName = path.join(packageDir, packageJson.main); + check('pkg.main file exists', fs.existsSync(mainFileName)); } - if (packageJson.exports.default != null) { - console.log('\tinspect esm export'); - const esmEntryFileName = path.join( - packageDir, - packageJson.exports.default - ); - failHardIf( - !fs.existsSync(esmEntryFileName), - `package.json for build module ${ - packageJson.name - } contains a 'module' entry that does not exist` - ); - const result = await import(packageDir); - failHardIf( - !result, - `package.json for build module ${ - packageJson.name - } does not export anything from esm` - ); + // check exports map file existence + if (packageJson.exports) { + const exportKeys = Object.keys(packageJson.exports); + exportKeys.forEach(key => { + if (packageJson.exports[key].require) { + check( + `pkg.exports[${key}].require file exists`, + fs.existsSync( + path.join(packageDir, packageJson.exports[key].require) + ) + ); + } + if (packageJson.exports[key].default) { + check( + `pkg.exports[${key}].default file exists`, + fs.existsSync( + path.join(packageDir, packageJson.exports[key].default) + ) + ); + } + }); + } + + // check top-level require + checkRequire(packageName); + + if (packageJson.exports) { + for (let exportKey of Object.keys(packageJson.exports)) { + let importPath = path.join(packageName, exportKey); + + checkRequire(importPath); + await checkImport(importPath); + } } } -}); +} + +function checkRequire(requirePath) { + try { + const result = require(requirePath); + ok(`require('${requirePath}') doesn't throw`); + check(`require('${requirePath}') has valid exports`, result); + } catch (err) { + fail(`require('${requirePath}') doesn't throw`, err); + } +} + +function checkImport(importPath) { + return import(importPath) + .then(result => { + check( + `import('${importPath}') has valid exports`, + result && Object.keys(result).length > 0 + ); + }) + .catch(err => { + fail(`import('${importPath}') doesn't throw`, err.message); + }); +} + +checkPackages() + .then(() => { + if (errors.length > 0) { + console.log(`caught ${errors.length} errors`); + process.exit(1); + } + }) + .catch(error => { + console.log(`unhnadled error`, error); + process.exit(2); + }); From f4e19ecfd5895f6ef39cd83007becc892ad78bde Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 14:28:19 -0800 Subject: [PATCH 36/49] add ignored package map to package-check --- scripts/tasks/package-check.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js index b2ab690d1bbb..851e8f1b18ce 100644 --- a/scripts/tasks/package-check.js +++ b/scripts/tasks/package-check.js @@ -24,8 +24,12 @@ global.window = window; global.document = window.document; global.navigator = window.navigator; +const IGNORED_PACKAGES = { + 'react-refresh': true, + 'react-interactions': true, +}; const packagesDir = path.join(__dirname, 'node_modules'); -const packages = fs.readdirSync(packagesDir); +const packages = fs.readdirSync(packagesDir).filter(t => !IGNORED_PACKAGES[t]); let errors = []; process.on('unhandledRejection', err => { From 4158093976bd243b68a78d937dc4938735ed1fa4 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 15:06:57 -0800 Subject: [PATCH 37/49] remove esm entry generation, add mjs to sceduler package --- packages/scheduler/npm/index.mjs | 28 ++++++++++++++++++ packages/scheduler/npm/tracing.mjs | 18 ++++++++++++ packages/scheduler/npm/unstable_mock.mjs | 16 +++++++++++ scripts/rollup/build/createBundle.js | 36 +----------------------- 4 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 packages/scheduler/npm/index.mjs create mode 100644 packages/scheduler/npm/tracing.mjs create mode 100644 packages/scheduler/npm/unstable_mock.mjs diff --git a/packages/scheduler/npm/index.mjs b/packages/scheduler/npm/index.mjs new file mode 100644 index 000000000000..f2574a36c749 --- /dev/null +++ b/packages/scheduler/npm/index.mjs @@ -0,0 +1,28 @@ +import * as dev from './esm/scheduler.development.mjs'; +import * as prod from './esm/scheduler.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; +function select(key) { + return isProduction ? prod[key] : dev[key] +} + +export const unstable_IdlePriority = select('unstable_IdlePriority'); +export const unstable_ImmediatePriority = select('unstable_ImmediatePriority'); +export const unstable_LowPriority = select('unstable_LowPriority'); +export const unstable_NormalPriority = select('unstable_NormalPriority'); +export const unstable_Profiling = select('unstable_Profiling'); +export const unstable_UserBlockingPriority = select('unstable_UserBlockingPriority'); +export const unstable_cancelCallback = select('unstable_cancelCallback'); +export const unstable_continueExecution = select('unstable_continueExecution'); +export const unstable_forceFrameRate = select('unstable_forceFrameRate'); +export const unstable_getCurrentPriorityLevel = select('unstable_getCurrentPriorityLevel'); +export const unstable_getFirstCallbackNode = select('unstable_getFirstCallbackNode'); +export const unstable_next = select('unstable_next'); +export const unstable_now = select('unstable_now'); +export const unstable_pauseExecution = select('unstable_pauseExecution'); +export const unstable_requestPaint = select('unstable_requestPaint'); +export const unstable_runWithPriority = select('unstable_runWithPriority'); +export const unstable_scheduleCallback = select('unstable_scheduleCallback'); +export const unstable_shouldYield = select('unstable_shouldYield'); +export const unstable_wrapCallback = select('unstable_wrapCallback'); + diff --git a/packages/scheduler/npm/tracing.mjs b/packages/scheduler/npm/tracing.mjs new file mode 100644 index 000000000000..a7823dae8db7 --- /dev/null +++ b/packages/scheduler/npm/tracing.mjs @@ -0,0 +1,18 @@ +import * as dev from './esm/scheduler-tracing.development.mjs'; +import * as prod from './esm/scheduler-tracing.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; +function select(key) { + return isProduction ? prod[key] : dev[key] +} + +export const __interactionsRef = select('__interactionsRef'); +export const __subscriberRef = select('__subscriberRef'); +export const unstable_clear = select('unstable_clear'); +export const unstable_getCurrent = select('unstable_getCurrent'); +export const unstable_getThreadID = select('unstable_getThreadID'); +export const unstable_subscribe = select('unstable_subscribe'); +export const unstable_trace = select('unstable_trace'); +export const unstable_unsubscribe = select('unstable_unsubscribe'); +export const unstable_wrap = select('unstable_wrap'); + diff --git a/packages/scheduler/npm/unstable_mock.mjs b/packages/scheduler/npm/unstable_mock.mjs new file mode 100644 index 000000000000..0e270591a204 --- /dev/null +++ b/packages/scheduler/npm/unstable_mock.mjs @@ -0,0 +1,16 @@ +import * as dev from './esm/scheduler-unstable_mock.development.mjs'; +import * as prod from './esm/scheduler-unstable_mock.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; +function select(key) { + return isProduction ? prod[key] : dev[key] +} + +export const unstable_flushAllWithoutAsserting = select('unstable_flushAllWithoutAsserting'); +export const unstable_flushNumberOfYields = select('unstable_flushNumberOfYields'); +export const unstable_flushExpired = select('unstable_flushExpired'); +export const unstable_clearYields = select('unstable_clearYields'); +export const unstable_flushUntilNextPaint = select('unstable_flushUntilNextPaint'); +export const unstable_flushAll = select('unstable_flushAll'); +export const unstable_yieldValue = select('unstable_yieldValue'); +export const unstable_advanceTime = select('unstable_advanceTime'); diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 45efeea52308..520aabed1ec3 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -76,10 +76,7 @@ module.exports = async function createBundle(bundle, bundleType) { console.log(building(logKey)); try { const spec = await rollup.rollup(rollupConfig); - const result = await spec.write(rollupOutputOptions); - if (isEsmEntryGenerator(bundleType)) { - writeEsmEntry(result.output[0], packageName); - } + await spec.write(rollupOutputOptions); } catch (error) { console.log(fatal(logKey)); handleRollupError(error); @@ -173,34 +170,3 @@ function getRollupConfig(bundle, bundleType, packageName) { // legacy: isFacebookBundle(bundleType), }; } - -function writeEsmEntry(bundle, packageName) { - const filepath = path.resolve( - `build/node_modules/${packageName}`, - 'index.mjs' - ); - // write esm entry point - fs.writeFileSync(filepath, genererateEsmEntry(packageName, bundle.exports)); -} - -function genererateEsmEntry(packageName, exports) { - const exportStatements = exports.map(name => { - const pickedBundle = `isProduction ? prod.${name} : dev.${name}`; - if (name !== 'default') { - return `export const ${name} = ${pickedBundle};`; - } else { - return ` -const defaultExport = ${pickedBundle}; -export default defaultExport; - `; - } - }); - - return ` -import * as dev from "./esm/${packageName}.development.mjs"; -import * as prod from "./esm/${packageName}.production.min.mjs"; - -const isProduction = process.env.NODE_ENV === 'production' -${exportStatements.join('\n')} - `; -} From c3692b8fd2db4ca0bd90dab3ea7af1605292d9cc Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 17:13:57 -0800 Subject: [PATCH 38/49] add npm/.mjs files to packages with esm support --- .../eslint-plugin-react-hooks/npm/index.mjs | 8 +++++ packages/jest-mock-scheduler/npm/index.mjs | 4 +++ packages/jest-react/npm/index.mjs | 9 +++++ packages/react-art/package.json | 2 -- packages/react-cache/npm/index.mjs | 11 ++++++ packages/react-cache/package.json | 6 ++++ packages/react-debug-tools/npm/index.mjs | 14 ++++++++ packages/react-debug-tools/package.json | 6 ++++ packages/react-dom/package.json | 1 - .../react-flight-dom-webpack/npm/index.mjs | 6 ++++ .../react-flight-dom-webpack/package.json | 6 ++++ packages/react-flight/package.json | 4 +-- packages/react-is/npm/index.mjs | 22 ++++++++++++ packages/react-noop-renderer/npm/index.mjs | 6 ++++ packages/react-noop-renderer/package.json | 8 ++++- packages/react-server/package.json | 3 +- packages/react-test-renderer/package.json | 4 +-- packages/scheduler/npm/unstable_mock.mjs | 35 ++++++++++++++----- scripts/rollup/build/index.js | 5 ++- scripts/tasks/package-check.js | 13 ++++++- 20 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 packages/eslint-plugin-react-hooks/npm/index.mjs create mode 100644 packages/jest-mock-scheduler/npm/index.mjs create mode 100644 packages/jest-react/npm/index.mjs create mode 100644 packages/react-cache/npm/index.mjs create mode 100644 packages/react-debug-tools/npm/index.mjs create mode 100644 packages/react-flight-dom-webpack/npm/index.mjs create mode 100644 packages/react-is/npm/index.mjs create mode 100644 packages/react-noop-renderer/npm/index.mjs diff --git a/packages/eslint-plugin-react-hooks/npm/index.mjs b/packages/eslint-plugin-react-hooks/npm/index.mjs new file mode 100644 index 000000000000..81d1bb42de16 --- /dev/null +++ b/packages/eslint-plugin-react-hooks/npm/index.mjs @@ -0,0 +1,8 @@ +import dev from './esm/eslint-plugin-react-hooks.development.mjs'; +import prod from './esm/eslint-plugin-react-hooks.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; + +const defaultValue = isProduction ? prod : dev; +export default defaultValue; + diff --git a/packages/jest-mock-scheduler/npm/index.mjs b/packages/jest-mock-scheduler/npm/index.mjs new file mode 100644 index 000000000000..569a00811e24 --- /dev/null +++ b/packages/jest-mock-scheduler/npm/index.mjs @@ -0,0 +1,4 @@ +import * as mock from 'scheduler/unstable_mock'; + +export default mock; + diff --git a/packages/jest-react/npm/index.mjs b/packages/jest-react/npm/index.mjs new file mode 100644 index 000000000000..c8564a618fcf --- /dev/null +++ b/packages/jest-react/npm/index.mjs @@ -0,0 +1,9 @@ +import * as dev from './esm/jest-react.development.mjs'; +import * as prod from './esm/jest-react.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; +function select(key) { + return isProduction ? prod[key] : dev[key] +} + +export const unstable_toMatchRenderedOutput = select('unstable_toMatchRenderedOutput'); diff --git a/packages/react-art/package.json b/packages/react-art/package.json index ca5d8dcc5cbd..863bb025dd96 100644 --- a/packages/react-art/package.json +++ b/packages/react-art/package.json @@ -37,9 +37,7 @@ "README.md", "build-info.json", "index.js", - "index.mjs", "cjs/", - "esm/", "umd/", "Circle.js", "Rectangle.js", diff --git a/packages/react-cache/npm/index.mjs b/packages/react-cache/npm/index.mjs new file mode 100644 index 000000000000..95edee35f3fa --- /dev/null +++ b/packages/react-cache/npm/index.mjs @@ -0,0 +1,11 @@ +import * as dev from './esm/react-cache.development.mjs'; +import * as prod from './esm/react-cache.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; +function select(key) { + return isProduction ? prod[key] : dev[key] +} + +export const unstable_createResource = select('unstable_createResource'); +export const unstable_setGlobalCacheLimit = select('unstable_setGlobalCacheLimit'); + diff --git a/packages/react-cache/package.json b/packages/react-cache/package.json index 61cf5612eef5..7744971006ea 100644 --- a/packages/react-cache/package.json +++ b/packages/react-cache/package.json @@ -21,5 +21,11 @@ ], "peerDependencies": { "react": "^16.3.0-alpha.1" + }, + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } } } diff --git a/packages/react-debug-tools/npm/index.mjs b/packages/react-debug-tools/npm/index.mjs new file mode 100644 index 000000000000..056536be8698 --- /dev/null +++ b/packages/react-debug-tools/npm/index.mjs @@ -0,0 +1,14 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ +import dev from './esm/react-debug-tools.development.mjs'; +import prod from './esm/react-debug-tools.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; + +export default isProduction ? prod : dev; diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index e3265a97a747..7d12fdb84894 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -31,5 +31,11 @@ }, "dependencies": { "error-stack-parser": "^2.0.2" + }, + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } } } diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 7e6cf5e5c0ee..39395187ad04 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -35,7 +35,6 @@ "server.browser.js", "server.node.js", "test-utils.js", - "unstable-fire.js", "unstable-fizz.js", "unstable-fizz.browser.js", "unstable-fizz.node.js", diff --git a/packages/react-flight-dom-webpack/npm/index.mjs b/packages/react-flight-dom-webpack/npm/index.mjs new file mode 100644 index 000000000000..f46589e94df5 --- /dev/null +++ b/packages/react-flight-dom-webpack/npm/index.mjs @@ -0,0 +1,6 @@ +import dev from './esm/react-flight-dom-webpack.development.mjs'; +import prod from './esm/react-flight-dom-webpack.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; + +export default isProduction ? prod : dev; diff --git a/packages/react-flight-dom-webpack/package.json b/packages/react-flight-dom-webpack/package.json index 573111da1f22..2e5c8fb9b0d7 100644 --- a/packages/react-flight-dom-webpack/package.json +++ b/packages/react-flight-dom-webpack/package.json @@ -46,5 +46,11 @@ "transform": [ "loose-envify" ] + }, + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } } } diff --git a/packages/react-flight/package.json b/packages/react-flight/package.json index f535da61e7f6..e6eabd3c4b02 100644 --- a/packages/react-flight/package.json +++ b/packages/react-flight/package.json @@ -13,9 +13,7 @@ "LICENSE", "README.md", "index.js", - "index.mjs", - "cjs/", - "esm/" + "cjs/" ], "main": "index.js", "repository": { diff --git a/packages/react-is/npm/index.mjs b/packages/react-is/npm/index.mjs new file mode 100644 index 000000000000..a65b302f9905 --- /dev/null +++ b/packages/react-is/npm/index.mjs @@ -0,0 +1,22 @@ +import * as dev from './esm/react-is.development.mjs'; +import * as prod from './esm/react-is.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; +function select(key) { + return isProduction ? prod[key] : dev[key] +} + +// AsyncMode should be deprecated +export const isAsyncMode = select('isAsyncMode'); +export const isConcurrentMode = select('isConcurrentMode'); +export const isContextConsumer = select('isContextConsumer'); +export const isContextProvider = select('isContextProvider'); +export const isElement = select('isElement'); +export const isForwardRef = select('isForwardRef'); +export const isFragment = select('isFragment'); +export const isLazy = select('isLazy'); +export const isMemo = select('isMemo'); +export const isPortal = select('isPortal'); +export const isProfiler = select('isProfiler'); +export const isStrictMode = select('isStrictMode'); +export const isSuspense = select('isSuspense'); diff --git a/packages/react-noop-renderer/npm/index.mjs b/packages/react-noop-renderer/npm/index.mjs new file mode 100644 index 000000000000..e338429d61bd --- /dev/null +++ b/packages/react-noop-renderer/npm/index.mjs @@ -0,0 +1,6 @@ +import dev from './esm/react-noop-renderer.development.mjs'; +import prod from './esm/react-noop-renderer.production.min.mjs'; + +const isProduction = process.env.NODE_ENV === 'production'; + +export default isProduction ? prod : dev; diff --git a/packages/react-noop-renderer/package.json b/packages/react-noop-renderer/package.json index cbc77693f0f3..188a640d4a42 100644 --- a/packages/react-noop-renderer/package.json +++ b/packages/react-noop-renderer/package.json @@ -33,5 +33,11 @@ "flight-server.js", "cjs/", "esm/" - ] + ], + "__exports": { + ".": { + "require": "./index.js", + "default": "./index.mjs" + } + } } diff --git a/packages/react-server/package.json b/packages/react-server/package.json index ce532182b926..77ff922fcd53 100644 --- a/packages/react-server/package.json +++ b/packages/react-server/package.json @@ -14,8 +14,7 @@ "README.md", "index.js", "flight.js", - "cjs/", - "esm/" + "cjs/" ], "main": "index.js", "repository": { diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index 448082f0fe01..85e8653c0bd6 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -32,10 +32,8 @@ "README.md", "build-info.json", "index.js", - "index.mjs", "shallow.js", "cjs/", - "umd/", - "esm/" + "umd/" ] } diff --git a/packages/scheduler/npm/unstable_mock.mjs b/packages/scheduler/npm/unstable_mock.mjs index 0e270591a204..ffcf3492e433 100644 --- a/packages/scheduler/npm/unstable_mock.mjs +++ b/packages/scheduler/npm/unstable_mock.mjs @@ -6,11 +6,30 @@ function select(key) { return isProduction ? prod[key] : dev[key] } -export const unstable_flushAllWithoutAsserting = select('unstable_flushAllWithoutAsserting'); -export const unstable_flushNumberOfYields = select('unstable_flushNumberOfYields'); -export const unstable_flushExpired = select('unstable_flushExpired'); -export const unstable_clearYields = select('unstable_clearYields'); -export const unstable_flushUntilNextPaint = select('unstable_flushUntilNextPaint'); -export const unstable_flushAll = select('unstable_flushAll'); -export const unstable_yieldValue = select('unstable_yieldValue'); -export const unstable_advanceTime = select('unstable_advanceTime'); +export const unstable_IdlePriority = select('unstable_IdlePriority') +export const unstable_ImmediatePriority = select('unstable_ImmediatePriority') +export const unstable_LowPriority = select('unstable_LowPriority') +export const unstable_NormalPriority = select('unstable_NormalPriority') +export const unstable_Profiling = select('unstable_Profiling') +export const unstable_UserBlockingPriority = select('unstable_UserBlockingPriority') +export const unstable_advanceTime = select('unstable_advanceTime') +export const unstable_cancelCallback = select('unstable_cancelCallback') +export const unstable_clearYields = select('unstable_clearYields') +export const unstable_continueExecution = select('unstable_continueExecution') +export const unstable_flushAll = select('unstable_flushAll') +export const unstable_flushAllWithoutAsserting = select('unstable_flushAllWithoutAsserting') +export const unstable_flushExpired = select('unstable_flushExpired') +export const unstable_flushNumberOfYields = select('unstable_flushNumberOfYields') +export const unstable_flushUntilNextPaint = select('unstable_flushUntilNextPaint') +export const unstable_forceFrameRate = select('unstable_forceFrameRate') +export const unstable_getCurrentPriorityLevel = select('unstable_getCurrentPriorityLevel') +export const unstable_getFirstCallbackNode = select('unstable_getFirstCallbackNode') +export const unstable_next = select('unstable_next') +export const unstable_now = select('unstable_now') +export const unstable_pauseExecution = select('unstable_pauseExecution') +export const unstable_requestPaint = select('unstable_requestPaint') +export const unstable_runWithPriority = select('unstable_runWithPriority') +export const unstable_scheduleCallback = select('unstable_scheduleCallback') +export const unstable_shouldYield = select('unstable_shouldYield') +export const unstable_wrapCallback = select('unstable_wrapCallback') +export const unstable_yieldValue = select('unstable_yieldValue') diff --git a/scripts/rollup/build/index.js b/scripts/rollup/build/index.js index 200748241aee..2e88557eca65 100644 --- a/scripts/rollup/build/index.js +++ b/scripts/rollup/build/index.js @@ -27,7 +27,10 @@ async function buildEverything() { } // Copy the package-check script - asyncCopyTo(path.join(__dirname, '../../tasks/package-check.js'), path.join(__dirname, '../../../build/package-check.js')); + asyncCopyTo( + path.join(__dirname, '../../tasks/package-check.js'), + path.join(__dirname, '../../../build/package-check.js') + ); // Run bundle builds serially for better console output // and to avoid any potential race conditions. diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js index 851e8f1b18ce..16855774a6cc 100644 --- a/scripts/tasks/package-check.js +++ b/scripts/tasks/package-check.js @@ -28,6 +28,10 @@ const IGNORED_PACKAGES = { 'react-refresh': true, 'react-interactions': true, }; +const IGONORED_FILES = { + 'build-info.json': true, +}; + const packagesDir = path.join(__dirname, 'node_modules'); const packages = fs.readdirSync(packagesDir).filter(t => !IGNORED_PACKAGES[t]); let errors = []; @@ -71,6 +75,13 @@ async function checkPackages() { check('pkg.main file exists', fs.existsSync(mainFileName)); } + for (let fileName of packageJson.files.filter(f => !IGONORED_FILES[f])) { + check( + `pkg.files@[${fileName}] exists`, + fs.existsSync(path.join(packageDir, fileName)) + ); + } + // check exports map file existence if (packageJson.exports) { const exportKeys = Object.keys(packageJson.exports); @@ -122,7 +133,7 @@ function checkImport(importPath) { return import(importPath) .then(result => { check( - `import('${importPath}') has valid exports`, + `${chalk.yellow('import')}('${importPath}') has valid exports`, result && Object.keys(result).length > 0 ); }) From 287353b9fbcc19285b30ba8d174c66019a084a36 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 17:27:25 -0800 Subject: [PATCH 39/49] remove isEsmEntryGenerator predicate --- scripts/rollup/build/createBundle.js | 1 - scripts/rollup/build/predicates.js | 4 ---- 2 files changed, 5 deletions(-) diff --git a/scripts/rollup/build/createBundle.js b/scripts/rollup/build/createBundle.js index 520aabed1ec3..532ee314ddb5 100644 --- a/scripts/rollup/build/createBundle.js +++ b/scripts/rollup/build/createBundle.js @@ -14,7 +14,6 @@ const { isSkippableBundle, isFatBundle, isFacebookBundle, - isEsmEntryGenerator, isWatchMode, } = require('./predicates'); const getFilename = require('./getFilename'); diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index d33b1bc27002..cd0808c93c45 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -47,10 +47,6 @@ const { RN_FB_PROFILING, } = Bundles.bundleTypes; -function isEsmEntryGenerator(bundleType) { - return bundleType === ESM_PROD; -} - function isReactNativeBundleType(bundleType) { return ( bundleType === RN_OSS_DEV || From e8ab37df19920096e61971b24c8e3eaeceb0c17d Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 17:42:25 -0800 Subject: [PATCH 40/49] add esm/ folder to react-debug-tools --- packages/react-debug-tools/package.json | 1 + scripts/rollup/build/predicates.js | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-debug-tools/package.json b/packages/react-debug-tools/package.json index 7d12fdb84894..9f052a0ba9a2 100644 --- a/packages/react-debug-tools/package.json +++ b/packages/react-debug-tools/package.json @@ -15,6 +15,7 @@ "build-info.json", "index.js", "index.mjs", + "esm/", "cjs/" ], "main": "index.js", diff --git a/scripts/rollup/build/predicates.js b/scripts/rollup/build/predicates.js index cd0808c93c45..0f168311f8dd 100644 --- a/scripts/rollup/build/predicates.js +++ b/scripts/rollup/build/predicates.js @@ -200,7 +200,6 @@ module.exports = { isFatBundle, isFacebookBundle, isExperimental, - isEsmEntryGenerator, isWatchMode, isUnsafePartialBuild, isPrettyOutput, From ee65e0f2b2db48b5bae9e9541e70eced990d910f Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 18:33:14 -0800 Subject: [PATCH 41/49] Add github action to verify package structure --- .github/workflows/check_package_structure.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/check_package_structure.yml diff --git a/.github/workflows/check_package_structure.yml b/.github/workflows/check_package_structure.yml new file mode 100644 index 000000000000..5f974c1ddd62 --- /dev/null +++ b/.github/workflows/check_package_structure.yml @@ -0,0 +1,37 @@ +name: Check Package Structure +on: [push, pull_request] +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [13.x] + + steps: + - uses: actions/checkout@v1 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Get yarn cache path + id: yarn-cache + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v1 + name: Cache yarn cache + id: cache-yarn-cache + with: + path: ${{ steps.yarn-cache.outputs.dir }} + key: ${{ runner.os }}-${{ matrix.node-version }}-yarn-${{ hashFiles('**/yarn.lock') }} + + - run: yarn install + name: Install Dependencies + if: steps.cache-yarn-cache.outputs.cache-hit != 'true' + + - run: yarn build + name: Build + + - run: yarn test-package-structure + name: Verify Package Structure From 79653639697450b089a708e6f514a4cea6f39c8a Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 18:33:54 -0800 Subject: [PATCH 42/49] remove test_package_structure from circleci config --- .circleci/config.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 23bcaa3ae704..32afc1aa66e3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -254,19 +254,6 @@ jobs: RELEASE_CHANNEL: stable command: yarn test-build --maxWorkers=2 - test_package_structure: - docker: *docker - environment: *environment - steps: - - checkout - - attach_workspace: *attach_workspace - - *restore_yarn_cache - - *run_yarn - - run: - environment: - RELEASE_CHANNEL: stable - command: yarn test-package-structure - test_build_experimental: docker: *docker environment: *environment @@ -384,9 +371,6 @@ workflows: - test_build: requires: - build - - test_package_structure: - requires: - - build - test_build_prod: requires: - build From 333d83612de5e0de05445c143af652bc072291f8 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 20:55:07 -0800 Subject: [PATCH 43/49] incorporate custom babel plugin from pull #13356 to replace legacy mode --- .../transform-remove-getters-test.js | 66 +++++++++++++++++++ scripts/babel/transform-remove-getters.js | 54 +++++++++++++++ scripts/rollup/build/getBabelConfig.js | 2 + scripts/tasks/package-check.js | 6 +- 4 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 scripts/babel/__tests__/transform-remove-getters-test.js create mode 100644 scripts/babel/transform-remove-getters.js diff --git a/scripts/babel/__tests__/transform-remove-getters-test.js b/scripts/babel/__tests__/transform-remove-getters-test.js new file mode 100644 index 000000000000..8c9fa707b49f --- /dev/null +++ b/scripts/babel/__tests__/transform-remove-getters-test.js @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict'; + +const babel = require('babel-core'); +const removeGetters = require('../remove-getters'); + +function transform(input) { + return babel.transform(input, { + plugins: [removeGetters], + }).code; +} + +function compare(input, output) { + const compiled = transform(input); + expect(compiled).toEqual(output); +} + +describe('remove-getters', () => { + it('should remove getters', () => { + compare( + `const object = { + get prop() { + return variable; + } +};`, + `const object = { + prop: variable +};` + ); + }); + + it('should not remove other methods or properties', () => { + compare( + `const object = { + prop: 'foo', + method() { + return 'bar'; + } +};`, + `const object = { + prop: 'foo', + method() { + return 'bar'; + } +};` + ); + }); + + it('should throw when finding getters with a different syntax from the ones generated by Rollup', () => { + expect(() => { + transform( + `const object = { + get prop() { + const foo = 'foo'; + return foo; + } +};` + ); + }).toThrow(); + }); +}); diff --git a/scripts/babel/transform-remove-getters.js b/scripts/babel/transform-remove-getters.js new file mode 100644 index 000000000000..3ce9e4a9009c --- /dev/null +++ b/scripts/babel/transform-remove-getters.js @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict'; + +module.exports = ({types: t}) => { + return { + visitor: { + ObjectMethod: path => { + // Turns this code: + // + // get prop() { + // return variable; + // } + // + // into this: + // + // prop: variable; + if (path.node.kind !== 'get') { + return; + } + + const keyNode = path.node.key; + const isValidKey = t.isIdentifier(keyNode); + if (!isValidKey) { + throw path.buildCodeFrameError( + 'Getter key format not supported. Expected identifier.' + ); + } + + const bodyNode = path.node.body; + const isValidBody = + bodyNode.body.length === 1 && + t.isReturnStatement(bodyNode.body[0]) && + t.isIdentifier(bodyNode.body[0].argument); + if (!isValidBody) { + throw path.buildCodeFrameError( + 'Getter body format not supported. Expected return of identifier.' + ); + } + + const prop = keyNode.name; + const variable = bodyNode.body[0].argument.name; + + path.replaceWith( + t.objectProperty(t.identifier(prop), t.identifier(variable)) + ); + }, + }, + }; +}; diff --git a/scripts/rollup/build/getBabelConfig.js b/scripts/rollup/build/getBabelConfig.js index bef97e201fa7..213096ca36b4 100644 --- a/scripts/rollup/build/getBabelConfig.js +++ b/scripts/rollup/build/getBabelConfig.js @@ -46,6 +46,8 @@ module.exports = function getBabelConfig( require('../../error-codes/transform-error-messages'), // Wrap warning() calls in a __DEV__ check so they are stripped from production. require('../../babel/wrap-warning-with-env-check'), + // Remove getters for IE8 support + require('../../babel/transform-remove-getters') ]), }); case RN_OSS_DEV: diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js index 16855774a6cc..8c3d4ba56a9f 100644 --- a/scripts/tasks/package-check.js +++ b/scripts/tasks/package-check.js @@ -42,15 +42,15 @@ process.on('unhandledRejection', err => { }); function ok(key) { - console.log(`\t${key} ${chalk.green('ok')}`); + console.log(`\t${chalk.green('✓')} ${key}`); } function fail(key, message) { errors.push({key, message}); if (message) { - console.log(`\t${key} ${chalk.red('fail')}\n\t\t`, message); + console.log(`\t${chalk.red('x')} ${key}\n\t\t`, message); } else { - console.log(`\t${key} ${chalk.red('fail')}`); + console.log(`\t${chalk.red('x')} ${key}`); } } From 49b0a01e370b7590b22ac746624f9a532cc96915 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 21:04:35 -0800 Subject: [PATCH 44/49] emojify the package-check script --- scripts/tasks/package-check.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tasks/package-check.js b/scripts/tasks/package-check.js index 8c3d4ba56a9f..60650ed85dae 100644 --- a/scripts/tasks/package-check.js +++ b/scripts/tasks/package-check.js @@ -64,7 +64,7 @@ function check(key, predicate) { async function checkPackages() { for (let packageName of packages) { - console.log(`inspect ${packageName}`); + console.log(` 📦 ${chalk.bold.underline(packageName)}`); const packageDir = path.join(packagesDir, packageName); const packageJson = require(path.join(packageDir, 'package.json')); let mainFileName; From fe0c7964d072f67dd3d706339c52df30b51c4614 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 21:06:48 -0800 Subject: [PATCH 45/49] run prettier --- scripts/rollup/build/getBabelConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/rollup/build/getBabelConfig.js b/scripts/rollup/build/getBabelConfig.js index 213096ca36b4..e89c2c084ebb 100644 --- a/scripts/rollup/build/getBabelConfig.js +++ b/scripts/rollup/build/getBabelConfig.js @@ -47,7 +47,7 @@ module.exports = function getBabelConfig( // Wrap warning() calls in a __DEV__ check so they are stripped from production. require('../../babel/wrap-warning-with-env-check'), // Remove getters for IE8 support - require('../../babel/transform-remove-getters') + require('../../babel/transform-remove-getters'), ]), }); case RN_OSS_DEV: From d1ba8003ab2daf2ec12c48995f3061be5fb661c6 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 21:11:35 -0800 Subject: [PATCH 46/49] update babel-transform path --- scripts/babel/__tests__/transform-remove-getters-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/babel/__tests__/transform-remove-getters-test.js b/scripts/babel/__tests__/transform-remove-getters-test.js index 8c9fa707b49f..d0d749541814 100644 --- a/scripts/babel/__tests__/transform-remove-getters-test.js +++ b/scripts/babel/__tests__/transform-remove-getters-test.js @@ -7,7 +7,7 @@ 'use strict'; const babel = require('babel-core'); -const removeGetters = require('../remove-getters'); +const removeGetters = require('../transform-remove-getters'); function transform(input) { return babel.transform(input, { From f971c350d2d57a6ea1709023fd578e67fbb988a9 Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 21:39:02 -0800 Subject: [PATCH 47/49] update remove-getters tests --- .../__tests__/transform-remove-getters-test.js | 13 ++++++++----- scripts/babel/transform-remove-getters.js | 12 +++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/scripts/babel/__tests__/transform-remove-getters-test.js b/scripts/babel/__tests__/transform-remove-getters-test.js index d0d749541814..252bd8fd2a9c 100644 --- a/scripts/babel/__tests__/transform-remove-getters-test.js +++ b/scripts/babel/__tests__/transform-remove-getters-test.js @@ -10,9 +10,12 @@ const babel = require('babel-core'); const removeGetters = require('../transform-remove-getters'); function transform(input) { - return babel.transform(input, { + const result = babel.transform(input, { + babelrc: false, + presets: [], plugins: [removeGetters], - }).code; + }); + return result.code; } function compare(input, output) { @@ -28,7 +31,7 @@ describe('remove-getters', () => { return variable; } };`, - `const object = { + `var object = { prop: variable };` ); @@ -42,9 +45,9 @@ describe('remove-getters', () => { return 'bar'; } };`, - `const object = { + `var object = { prop: 'foo', - method() { + method: function () { return 'bar'; } };` diff --git a/scripts/babel/transform-remove-getters.js b/scripts/babel/transform-remove-getters.js index 3ce9e4a9009c..fff2cdfdb930 100644 --- a/scripts/babel/transform-remove-getters.js +++ b/scripts/babel/transform-remove-getters.js @@ -6,7 +6,9 @@ */ 'use strict'; -module.exports = ({types: t}) => { +module.exports = ({ + types: {isIdentifier, isReturnStatement, objectProperty, identifier}, +}) => { return { visitor: { ObjectMethod: path => { @@ -24,7 +26,7 @@ module.exports = ({types: t}) => { } const keyNode = path.node.key; - const isValidKey = t.isIdentifier(keyNode); + const isValidKey = isIdentifier(keyNode); if (!isValidKey) { throw path.buildCodeFrameError( 'Getter key format not supported. Expected identifier.' @@ -34,8 +36,8 @@ module.exports = ({types: t}) => { const bodyNode = path.node.body; const isValidBody = bodyNode.body.length === 1 && - t.isReturnStatement(bodyNode.body[0]) && - t.isIdentifier(bodyNode.body[0].argument); + isReturnStatement(bodyNode.body[0]) && + isIdentifier(bodyNode.body[0].argument); if (!isValidBody) { throw path.buildCodeFrameError( 'Getter body format not supported. Expected return of identifier.' @@ -46,7 +48,7 @@ module.exports = ({types: t}) => { const variable = bodyNode.body[0].argument.name; path.replaceWith( - t.objectProperty(t.identifier(prop), t.identifier(variable)) + objectProperty(identifier(prop), identifier(variable)) ); }, }, From 9df712532d6cb28f2affee1ebd8ff1f6249a358c Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 21:57:30 -0800 Subject: [PATCH 48/49] simplify check_package_structure GH action --- .github/workflows/check_package_structure.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/check_package_structure.yml b/.github/workflows/check_package_structure.yml index 5f974c1ddd62..14ef7bb184f4 100644 --- a/.github/workflows/check_package_structure.yml +++ b/.github/workflows/check_package_structure.yml @@ -15,20 +15,8 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: Get yarn cache path - id: yarn-cache - run: echo "::set-output name=dir::$(yarn cache dir)" - - - uses: actions/cache@v1 - name: Cache yarn cache - id: cache-yarn-cache - with: - path: ${{ steps.yarn-cache.outputs.dir }} - key: ${{ runner.os }}-${{ matrix.node-version }}-yarn-${{ hashFiles('**/yarn.lock') }} - - run: yarn install name: Install Dependencies - if: steps.cache-yarn-cache.outputs.cache-hit != 'true' - run: yarn build name: Build From 87594d799be52afed571509f6183bee6eac97e2f Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Sat, 30 Nov 2019 22:14:05 -0800 Subject: [PATCH 49/49] cache install step --- .github/workflows/check_package_structure.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/check_package_structure.yml b/.github/workflows/check_package_structure.yml index 14ef7bb184f4..fa5e79f46b49 100644 --- a/.github/workflows/check_package_structure.yml +++ b/.github/workflows/check_package_structure.yml @@ -15,7 +15,27 @@ jobs: with: node-version: ${{ matrix.node-version }} + + - name: Get yarn cache path + id: yarn-cache + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v1 + name: Cache yarn cache + id: cache-yarn-cache + with: + path: ${{ steps.yarn-cache.outputs.dir }} + key: ${{ runner.os }}-${{ matrix.node-version }}-yarn-${{ hashFiles('**/yarn.lock') }} + + - uses: actions/cache@v1 + name: Cache node_modules + id: cache-node-modules + with: + path: node_modules + key: ${{ runner.os }}-${{ matrix.node-version }}-nodemodules-${{ hashFiles('**/yarn.lock') }} + - run: yarn install + if: steps.cache-yarn-cache.outputs.cache-hit != 'true' || steps.cache-node-modules.outputs.cache-hit != 'true' name: Install Dependencies - run: yarn build