From 29734b924aad9f3f43e2d4fd2bc50b7c10be00e7 Mon Sep 17 00:00:00 2001 From: Bin Xin Date: Thu, 5 Sep 2019 23:32:57 +0800 Subject: [PATCH] Don't allow instance properties transformation on namespace (#10372) --- packages/babel-plugin-transform-runtime/src/index.js | 7 +++++++ .../runtime-corejs3/modules-namespaced/input.mjs | 2 ++ .../runtime-corejs3/modules-namespaced/options.json | 3 +++ .../runtime-corejs3/modules-namespaced/output.mjs | 2 ++ .../src/polyfills/corejs2/usage-plugin.js | 4 ++++ .../src/polyfills/corejs3/usage-plugin.js | 6 ++++-- packages/babel-preset-env/src/utils.js | 7 +++++++ .../corejs2/usage-modules-namespaced/input.mjs | 2 ++ .../corejs2/usage-modules-namespaced/options.json | 12 ++++++++++++ .../corejs2/usage-modules-namespaced/output.mjs | 3 +++ .../corejs3/usage-modules-namespaced/input.mjs | 2 ++ .../corejs3/usage-modules-namespaced/options.json | 12 ++++++++++++ .../corejs3/usage-modules-namespaced/output.mjs | 2 ++ 13 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/input.mjs create mode 100644 packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/options.json create mode 100644 packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/output.mjs create mode 100644 packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/input.mjs create mode 100644 packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/options.json create mode 100644 packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/output.mjs create mode 100644 packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/input.mjs create mode 100644 packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/options.json create mode 100644 packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/output.mjs diff --git a/packages/babel-plugin-transform-runtime/src/index.js b/packages/babel-plugin-transform-runtime/src/index.js index 7e227a6f20..06efe3f0f1 100644 --- a/packages/babel-plugin-transform-runtime/src/index.js +++ b/packages/babel-plugin-transform-runtime/src/index.js @@ -113,7 +113,14 @@ export default declare((api, options, dirname) => { ); } + function isNamespaced(path) { + const binding = path.scope.getBinding(path.node.name); + if (!binding) return false; + return binding.path.isImportNamespaceSpecifier(); + } + function maybeNeedsPolyfill(path, methods, name) { + if (isNamespaced(path.get("object"))) return false; if (!methods[name].types) return true; const typeAnnotation = path.get("object").getTypeAnnotation(); diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/input.mjs b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/input.mjs new file mode 100644 index 0000000000..7962c3d200 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/input.mjs @@ -0,0 +1,2 @@ +import * as bar from "bar"; +bar.map(); diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/options.json b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/options.json new file mode 100644 index 0000000000..ea8bb9c3aa --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["transform-runtime", { "corejs": 3 }]] +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/output.mjs b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/output.mjs new file mode 100644 index 0000000000..7962c3d200 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/modules-namespaced/output.mjs @@ -0,0 +1,2 @@ +import * as bar from "bar"; +bar.map(); diff --git a/packages/babel-preset-env/src/polyfills/corejs2/usage-plugin.js b/packages/babel-preset-env/src/polyfills/corejs2/usage-plugin.js index 0387361008..bd80b5af9f 100644 --- a/packages/babel-preset-env/src/polyfills/corejs2/usage-plugin.js +++ b/packages/babel-preset-env/src/polyfills/corejs2/usage-plugin.js @@ -15,6 +15,7 @@ import { isPolyfillSource, getImportSource, getRequireSource, + isNamespaced, } from "../../utils"; import { logUsagePolyfills } from "../../debug"; @@ -102,6 +103,9 @@ export default function( const { node } = path; const { object, property } = node; + // ignore namespace + if (isNamespaced(path.get("object"))) return; + let evaluatedPropType = object.name; let propertyName = property.name; let instanceType = ""; diff --git a/packages/babel-preset-env/src/polyfills/corejs3/usage-plugin.js b/packages/babel-preset-env/src/polyfills/corejs3/usage-plugin.js index ea1e064921..2b06088aa6 100644 --- a/packages/babel-preset-env/src/polyfills/corejs3/usage-plugin.js +++ b/packages/babel-preset-env/src/polyfills/corejs3/usage-plugin.js @@ -21,6 +21,7 @@ import { isPolyfillSource, getImportSource, getRequireSource, + isNamespaced, } from "../../utils"; import { logUsagePolyfills } from "../../debug"; @@ -98,7 +99,7 @@ export default function( } } } - return { builtIn, instanceType }; + return { builtIn, instanceType, isNamespaced: isNamespaced(path) }; } const addAndRemovePolyfillImports = { @@ -230,7 +231,8 @@ export default function( }; this.addPropertyDependencies = function(source = {}, key) { - const { builtIn, instanceType } = source; + const { builtIn, instanceType, isNamespaced } = source; + if (isNamespaced) return; if (PossibleGlobalObjects.has(builtIn)) { this.addBuiltInDependencies(key); } else if (has(StaticProperties, builtIn)) { diff --git a/packages/babel-preset-env/src/utils.js b/packages/babel-preset-env/src/utils.js index 81c1c3721c..fa4e2ecce0 100644 --- a/packages/babel-preset-env/src/utils.js +++ b/packages/babel-preset-env/src/utils.js @@ -162,3 +162,10 @@ export function getModulePath(mod: string): string { export function createImport(path: NodePath, mod: string) { return addSideEffect(path, getModulePath(mod)); } + +export function isNamespaced(path: NodePath) { + if (!path.node) return false; + const binding = path.scope.getBinding(path.node.name); + if (!binding) return false; + return binding.path.isImportNamespaceSpecifier(); +} diff --git a/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/input.mjs b/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/input.mjs new file mode 100644 index 0000000000..3f57abb605 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/input.mjs @@ -0,0 +1,2 @@ +import * as ns from "ns"; +ns.map; diff --git a/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/options.json b/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/options.json new file mode 100644 index 0000000000..429ee132c9 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/options.json @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "../../../../lib", + { + "modules": false, + "useBuiltIns": "usage", + "corejs": 2 + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/output.mjs b/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/output.mjs new file mode 100644 index 0000000000..4efb9b0a49 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs2/usage-modules-namespaced/output.mjs @@ -0,0 +1,3 @@ +import * as ns from "ns"; +ns.map; + diff --git a/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/input.mjs b/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/input.mjs new file mode 100644 index 0000000000..3f57abb605 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/input.mjs @@ -0,0 +1,2 @@ +import * as ns from "ns"; +ns.map; diff --git a/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/options.json b/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/options.json new file mode 100644 index 0000000000..d15a6c1c28 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/options.json @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "../../../../lib", + { + "modules": false, + "useBuiltIns": "usage", + "corejs": 3 + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/output.mjs b/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/output.mjs new file mode 100644 index 0000000000..3f57abb605 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs3/usage-modules-namespaced/output.mjs @@ -0,0 +1,2 @@ +import * as ns from "ns"; +ns.map;