diff --git a/babel.config.js b/babel.config.js index 82966a7f07ca..42667106d512 100644 --- a/babel.config.js +++ b/babel.config.js @@ -77,6 +77,7 @@ module.exports = function(api) { "@babel/proposal-object-rest-spread", { useBuiltIns: true, loose: true }, ], + "@babel/proposal-optional-chaining", // Explicitly use the lazy version of CommonJS modules. convertESM ? ["@babel/transform-modules-commonjs", { lazy: true }] : null, diff --git a/package.json b/package.json index a329e7667326..c68bb5f9d6f1 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@babel/plugin-proposal-class-properties": "^7.4.4", "@babel/plugin-proposal-export-namespace-from": "^7.2.0", "@babel/plugin-proposal-numeric-separator": "^7.2.0", + "@babel/plugin-proposal-optional-chaining": "^7.2.0", "@babel/plugin-transform-modules-commonjs": "^7.4.4", "@babel/plugin-transform-runtime": "^7.4.4", "@babel/preset-env": "^7.4.5", diff --git a/packages/babel-plugin-transform-modules-commonjs/test/node_modules/@babel/runtime/package.json b/packages/babel-plugin-transform-modules-commonjs/test/node_modules/@babel/runtime/package.json new file mode 100644 index 000000000000..20f5d5743e7b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/node_modules/@babel/runtime/package.json @@ -0,0 +1,3 @@ +{ + "version": "7.0.0-beta.0" +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-modules-commonjs/test/node_modules/README.md b/packages/babel-plugin-transform-modules-commonjs/test/node_modules/README.md new file mode 100644 index 000000000000..1de391fdf0b2 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/node_modules/README.md @@ -0,0 +1 @@ +Use a fixed version of @babel/runtime, to avoid warnings about mismatched versions diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/node_modules/@babel/runtime/package.json b/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/node_modules/@babel/runtime/package.json new file mode 100644 index 000000000000..20f5d5743e7b --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/node_modules/@babel/runtime/package.json @@ -0,0 +1,3 @@ +{ + "version": "7.0.0-beta.0" +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/node_modules/README.md b/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/node_modules/README.md new file mode 100644 index 000000000000..1de391fdf0b2 --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/node_modules/README.md @@ -0,0 +1 @@ +Use a fixed version of @babel/runtime, to avoid warnings about mismatched versions diff --git a/packages/babel-plugin-transform-runtime/scripts/build-dist.js b/packages/babel-plugin-transform-runtime/scripts/build-dist.js index e36ef0c68b0a..5008175c372b 100644 --- a/packages/babel-plugin-transform-runtime/scripts/build-dist.js +++ b/packages/babel-plugin-transform-runtime/scripts/build-dist.js @@ -153,7 +153,14 @@ function buildHelper( return babel.transformFromAst(tree, null, { presets: [[require("@babel/preset-env"), { modules: false }]], plugins: [ - [transformRuntime, { corejs, useESModules: esm }], + [ + transformRuntime, + { + corejs, + useESModules: esm, + version: require("@babel/runtime/package.json").version, + }, + ], buildRuntimeRewritePlugin( runtimeName, path.relative(path.dirname(helperFilename), pkgDirname), diff --git a/packages/babel-plugin-transform-runtime/src/helpers.js b/packages/babel-plugin-transform-runtime/src/helpers.js index f99730dc9498..ab17f6f58991 100644 --- a/packages/babel-plugin-transform-runtime/src/helpers.js +++ b/packages/babel-plugin-transform-runtime/src/helpers.js @@ -32,6 +32,57 @@ export function hasMinVersion(minVersion, runtimeVersion) { ); } +export function verifyRuntimeVersion( + options, + moduleName, + runtimeVersion, + actualRuntimeVersion, +) { + if (!actualRuntimeVersion) return; + + const minActualVersion = semver.minVersion(actualRuntimeVersion).version; + const minVersion = semver.minVersion(runtimeVersion).version; + + if (minActualVersion === minVersion) return; + + const fixedOptions = JSON.stringify( + { + plugins: [ + [ + "@babel/plugin-transform-runtime", + { ...options, version: minActualVersion }, + ], + ], + }, + null, + 2, + ).replace(/^/gm, " ".repeat(2)); + + if (semver.gt(minActualVersion, minVersion)) { + console.warn( + `The installed version of "${moduleName}" (${actualRuntimeVersion}) is greater ` + + `than the version specified in "@babel/transform-runtime"'s options ` + + `(${options.version}). This difference won't cause any problem in runtime ` + + `functionality, but it will make your compiled code larger since Babel ` + + `can't rely on some new or modified helpers to be present in the installed ` + + `"${moduleName}". For this reason, some helpers will be inlined in your code ` + + `as if you weren't using "@babel/plugin-transform-runtime", leadng to bigger bundles.\n` + + `To fix this problem, you can specify the correct version in ` + + `"@babel/transform-runtime"'s options:\n\n${fixedOptions}`, + ); + } else { + console.warn( + `The installed version of "${moduleName}" (${actualRuntimeVersion}) is lower ` + + `than the version specified in "@babel/transform-runtime"'s options ` + + `(${options.version}). For this reason, Babel will assume that some helpers ` + + `are supported by the installed "${moduleName}" version, even if they ` + + `might not actually be present.\n` + + `To fix this problem, you must specify the correct version in ` + + `"@babel/transform-runtime"'s options:\n\n${fixedOptions}`, + ); + } +} + // Note: We can't use NodePath#couldBeBaseType because it doesn't support arrays. // Even if we added support for arrays, this package needs to be compatible with // ^7.0.0 so we can't rely on it. diff --git a/packages/babel-plugin-transform-runtime/src/index.js b/packages/babel-plugin-transform-runtime/src/index.js index 7e227a6f20a8..a0849177ae58 100644 --- a/packages/babel-plugin-transform-runtime/src/index.js +++ b/packages/babel-plugin-transform-runtime/src/index.js @@ -1,4 +1,5 @@ import path from "path"; +import fs from "fs"; import resolve from "resolve"; import { declare } from "@babel/helper-plugin-utils"; import { addDefault, isModule } from "@babel/helper-module-imports"; @@ -6,7 +7,7 @@ import { types as t } from "@babel/core"; import getCoreJS2Definitions from "./runtime-corejs2-definitions"; import getCoreJS3Definitions from "./runtime-corejs3-definitions"; -import { typeAnnotationToString } from "./helpers"; +import { typeAnnotationToString, verifyRuntimeVersion } from "./helpers"; function resolveAbsoluteRuntime(moduleName: string, dirname: string) { try { @@ -27,6 +28,30 @@ function resolveAbsoluteRuntime(moduleName: string, dirname: string) { } } +function resolveRuntimeVersion( + moduleName: string, + modulePath: string, + dirname: string, +) { + try { + const runtimeDir = path.dirname( + resolve.sync(`${modulePath}/package.json`, { + basedir: dirname, + }), + ); + const pkgFilename = path.resolve(runtimeDir, "../../../package.json"); + const pkg = JSON.parse(fs.readFileSync(pkgFilename, "utf8")); + + return ( + pkg.dependencies?.[moduleName] || + pkg.devDependencies?.[moduleName] || + pkg.peerDependencies?.[moduleName] + ); + } catch {} + + return null; +} + function supportsStaticESM(caller) { return !!(caller && caller.supportsStaticESM); } @@ -189,6 +214,13 @@ export default declare((api, options, dirname) => { ); } + verifyRuntimeVersion( + options, + moduleName, + runtimeVersion, + resolveRuntimeVersion(moduleName, modulePath, dirname), + ); + return { name: "transform-runtime", diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/relative/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/relative/output.js index e783188c9e48..193734cbcf5f 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/relative/output.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/relative/output.js @@ -1,4 +1,4 @@ -var _classCallCheck = require("/packages/babel-plugin-transform-runtime/node_modules/@babel/runtime/helpers/classCallCheck"); +var _classCallCheck = require("/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime/helpers/classCallCheck"); let Foo = function Foo() { "use strict"; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js index e783188c9e48..193734cbcf5f 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js @@ -1,4 +1,4 @@ -var _classCallCheck = require("/packages/babel-plugin-transform-runtime/node_modules/@babel/runtime/helpers/classCallCheck"); +var _classCallCheck = require("/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime/helpers/classCallCheck"); let Foo = function Foo() { "use strict"; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/input.js b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/input.js new file mode 100644 index 000000000000..1c8a0e797620 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/input.js @@ -0,0 +1 @@ +; \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/node_modules/@babel/runtime/package.json b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/node_modules/@babel/runtime/package.json new file mode 100644 index 000000000000..f7dc274119bb --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/node_modules/@babel/runtime/package.json @@ -0,0 +1,3 @@ +{ + "version": "7.4.0" +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/options.json b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/options.json new file mode 100644 index 000000000000..1fe21e4cb291 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/options.json @@ -0,0 +1,4 @@ +{ + "validateLogs": true, + "plugins": [["transform-runtime", { "version": "7.2.0" }]] +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/output.js new file mode 100644 index 000000000000..092bc2b04126 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/output.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/package.json b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/package.json new file mode 100644 index 000000000000..f0ae756ec454 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@babel/runtime": "^7.3.0" + } +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/stderr.txt b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/stderr.txt new file mode 100644 index 000000000000..8466f4c0fe74 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/greater/stderr.txt @@ -0,0 +1,13 @@ +The installed version of "@babel/runtime" (^7.3.0) is greater than the version specified in "@babel/transform-runtime"'s options (7.2.0). This difference won't cause any problem in runtime functionality, but it will make your compiled code larger since Babel can't rely on some new or modified helpers to be present in the installed "@babel/runtime". For this reason, some helpers will be inlined in your code as if you weren't using "@babel/plugin-transform-runtime", leadng to bigger bundles. +To fix this problem, you can specify the correct version in "@babel/transform-runtime"'s options: + + { + "plugins": [ + [ + "@babel/plugin-transform-runtime", + { + "version": "7.3.0" + } + ] + ] + } diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/input.js b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/input.js new file mode 100644 index 000000000000..1c8a0e797620 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/input.js @@ -0,0 +1 @@ +; \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/node_modules/@babel/runtime/package.json b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/node_modules/@babel/runtime/package.json new file mode 100644 index 000000000000..f7dc274119bb --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/node_modules/@babel/runtime/package.json @@ -0,0 +1,3 @@ +{ + "version": "7.4.0" +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/options.json b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/options.json new file mode 100644 index 000000000000..d7672897a2c8 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/options.json @@ -0,0 +1,4 @@ +{ + "validateLogs": true, + "plugins": [["@babel/plugin-transform-runtime", { "version": "7.5.0" }]] +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/output.js new file mode 100644 index 000000000000..092bc2b04126 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/output.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/package.json b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/package.json new file mode 100644 index 000000000000..f0ae756ec454 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@babel/runtime": "^7.3.0" + } +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/stderr.txt b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/stderr.txt new file mode 100644 index 000000000000..464bf9ce48d6 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/version-warning/lower/stderr.txt @@ -0,0 +1,13 @@ +The installed version of "@babel/runtime" (^7.3.0) is lower than the version specified in "@babel/transform-runtime"'s options (7.5.0). For this reason, Babel will assume that some helpers are supported by the installed "@babel/runtime" version, even if they might not actually be present. +To fix this problem, you must specify the correct version in "@babel/transform-runtime"'s options: + + { + "plugins": [ + [ + "@babel/plugin-transform-runtime", + { + "version": "7.3.0" + } + ] + ] + } \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime-corejs2/package.json b/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime-corejs2/package.json new file mode 100644 index 000000000000..20f5d5743e7b --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime-corejs2/package.json @@ -0,0 +1,3 @@ +{ + "version": "7.0.0-beta.0" +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime-corejs3/package.json b/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime-corejs3/package.json new file mode 100644 index 000000000000..20f5d5743e7b --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime-corejs3/package.json @@ -0,0 +1,3 @@ +{ + "version": "7.0.0-beta.0" +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime/package.json b/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime/package.json new file mode 100644 index 000000000000..20f5d5743e7b --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/node_modules/@babel/runtime/package.json @@ -0,0 +1,3 @@ +{ + "version": "7.0.0-beta.0" +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-runtime/test/node_modules/README.md b/packages/babel-plugin-transform-runtime/test/node_modules/README.md new file mode 100644 index 000000000000..1de391fdf0b2 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/node_modules/README.md @@ -0,0 +1 @@ +Use a fixed version of @babel/runtime, to avoid warnings about mismatched versions diff --git a/yarn.lock b/yarn.lock index e9c8313a4122..4b19f9260560 100644 --- a/yarn.lock +++ b/yarn.lock @@ -317,6 +317,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" +"@babel/plugin-proposal-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" + integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" @@ -382,6 +390,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" + integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"