diff --git a/packages/babel-plugin-transform-runtime/src/index.js b/packages/babel-plugin-transform-runtime/src/index.js index 06efe3f0f19e..a9d0fd350deb 100644 --- a/packages/babel-plugin-transform-runtime/src/index.js +++ b/packages/babel-plugin-transform-runtime/src/index.js @@ -130,6 +130,14 @@ export default declare((api, options, dirname) => { return methods[name].types.some(name => name === type); } + function resolvePropertyName(path, computed) { + const { node } = path; + if (!computed) return node.name; + if (path.isStringLiteral()) return node.value; + const result = path.evaluate(); + return result.value; + } + if (has(options, "useBuiltIns")) { if (options.useBuiltIns) { throw new Error( @@ -297,8 +305,11 @@ export default declare((api, options, dirname) => { if (!t.isMemberExpression(callee)) return; - const { object, property } = callee; - const propertyName = property.name; + const { object } = callee; + const propertyName = resolvePropertyName( + path.get("callee.property"), + callee.computed, + ); // transform calling instance methods like `something.includes()` if (injectCoreJS3 && !hasStaticMapping(object.name, propertyName)) { @@ -375,29 +386,33 @@ export default declare((api, options, dirname) => { if (!path.isReferenced()) return; const { node } = path; - const { object, property } = node; + const { object } = node; if (!t.isReferenced(object, node)) return; - if (node.computed) { - if (injectCoreJS2) return; - // transform `something[Symbol.iterator]` to calling `getIteratorMethod(something)` helper - if (path.get("property").matchesPattern("Symbol.iterator")) { - path.replaceWith( - t.callExpression( - this.addDefaultImport( - `${moduleName}/core-js/get-iterator-method`, - "getIteratorMethod", - ), - [object], + // transform `something[Symbol.iterator]` to calling `getIteratorMethod(something)` helper + if ( + !injectCoreJS2 && + node.computed && + path.get("property").matchesPattern("Symbol.iterator") + ) { + path.replaceWith( + t.callExpression( + this.addDefaultImport( + `${moduleName}/core-js/get-iterator-method`, + "getIteratorMethod", ), - ); - } + [object], + ), + ); return; } const objectName = object.name; - const propertyName = property.name; + const propertyName = resolvePropertyName( + path.get("property"), + node.computed, + ); // doesn't reference the global if ( path.scope.getBindingIdentifier(objectName) || diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/input.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/input.js new file mode 100644 index 000000000000..6968e9a2729b --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/input.js @@ -0,0 +1,5 @@ +var _isArray = "isArray"; + +Array["from"]; // polyfill +Array[_isArray]; // polyfill +Array[of]; // don't polyfill diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/options.json b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/options.json new file mode 100644 index 000000000000..3514ed63b409 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["transform-runtime", { "corejs": 2 }]] +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/output.js new file mode 100644 index 000000000000..59868c6f60d5 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/evaluated-static-methods/output.js @@ -0,0 +1,10 @@ +var _Array$isArray = require("@babel/runtime-corejs2/core-js/array/is-array"); + +var _Array$from = require("@babel/runtime-corejs2/core-js/array/from"); + +var _isArray = "isArray"; +_Array$from; // polyfill + +_Array$isArray; // polyfill + +Array[of]; // don't polyfill diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/instance-computed/input.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/instance-computed/input.js index 87ed431301c8..0ca5137f3896 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/instance-computed/input.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs2/instance-computed/input.js @@ -1 +1 @@ -bar[filter]() \ No newline at end of file +bar[filter]() diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/input.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/input.js new file mode 100644 index 000000000000..edc557316374 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/input.js @@ -0,0 +1,9 @@ +var _map = "map"; + +object["filter"]; // polyfill +object[_map]; // polyfill +object[find]; // don't polyfill + +object["filter"](); // polyfill +object[_map](); // polyfill +object[find](); // don't polyfill diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/options.json b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/options.json new file mode 100644 index 000000000000..2b36aa6019b4 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + ["transform-runtime", { "corejs": { "version": 3, "proposals": true } }] + ] +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/output.js new file mode 100644 index 000000000000..1f2bc8c78155 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-instance-methods/output.js @@ -0,0 +1,21 @@ +var _mapInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/map"); + +var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/filter"); + +var _map = "map"; + +_filterInstanceProperty(object); // polyfill + + +_mapInstanceProperty(object); // polyfill + + +object[find]; // don't polyfill + +_filterInstanceProperty(object).call(object); // polyfill + + +_mapInstanceProperty(object).call(object); // polyfill + + +object[find](); // don't polyfill diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/input.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/input.js new file mode 100644 index 000000000000..6968e9a2729b --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/input.js @@ -0,0 +1,5 @@ +var _isArray = "isArray"; + +Array["from"]; // polyfill +Array[_isArray]; // polyfill +Array[of]; // don't polyfill diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/options.json b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/options.json new file mode 100644 index 000000000000..2b36aa6019b4 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + ["transform-runtime", { "corejs": { "version": 3, "proposals": true } }] + ] +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/output.js new file mode 100644 index 000000000000..83dde082836f --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/evaluated-static-methods/output.js @@ -0,0 +1,10 @@ +var _Array$isArray = require("@babel/runtime-corejs3/core-js/array/is-array"); + +var _Array$from = require("@babel/runtime-corejs3/core-js/array/from"); + +var _isArray = "isArray"; +_Array$from; // polyfill + +_Array$isArray; // polyfill + +Array[of]; // don't polyfill diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/instance-computed/input.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/instance-computed/input.js index 87ed431301c8..225ac3534de6 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/instance-computed/input.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime-corejs3/instance-computed/input.js @@ -1 +1 @@ -bar[filter]() \ No newline at end of file +bar['filter']()