From 4061dae823033df27c31323d060f026b8fd7026a Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Tue, 29 Nov 2022 00:32:34 +0800 Subject: [PATCH 1/9] fix: Computed properties should keep order --- .../babel-helpers/src/helpers-generated.ts | 4 + .../src/helpers/defineAccessor.js | 8 ++ .../src/index.ts | 79 ++++++------------- .../accessors/output.js | 12 +-- .../single-accessor/input.js | 3 + .../single-accessor/output.js | 3 + .../symbol/output.js | 6 +- .../test/fixtures/regression/15140/exec.js | 3 + .../test/fixtures/regression/15140/input.js | 2 + .../fixtures/regression/15140/options.json | 6 ++ .../test/fixtures/regression/15140/output.js | 7 ++ .../test/fixtures/spec/accessors/output.js | 12 +-- .../fixtures/spec/single-accessor/input.js | 3 + .../fixtures/spec/single-accessor/output.js | 3 + .../test/fixtures/spec/symbol/output.js | 6 +- packages/babel-runtime-corejs2/package.json | 9 +++ packages/babel-runtime-corejs3/package.json | 9 +++ packages/babel-runtime/package.json | 9 +++ 18 files changed, 112 insertions(+), 72 deletions(-) create mode 100644 packages/babel-helpers/src/helpers/defineAccessor.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/input.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/options.json create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/input.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js diff --git a/packages/babel-helpers/src/helpers-generated.ts b/packages/babel-helpers/src/helpers-generated.ts index 2c84fe632ee7..3f80c89a9984 100644 --- a/packages/babel-helpers/src/helpers-generated.ts +++ b/packages/babel-helpers/src/helpers-generated.ts @@ -45,6 +45,10 @@ export default Object.freeze({ "7.20.5", 'export default function _checkInRHS(value){if(Object(value)!==value)throw TypeError("right-hand side of \'in\' should be an object, got "+(null!==value?typeof value:"null"));return value}', ), + defineAccessor: helper( + "7.20.6", + "export default function _defineAccessor(obj,key,type,fn){var desc={configurable:!0,enumerable:!0};return desc[type]=fn,Object.defineProperty(obj,key,desc)}", + ), iterableToArrayLimit: helper( "7.0.0-beta.0", 'export default function _iterableToArrayLimit(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null!=_i){var _s,_e,_x,_r,_arr=[],_n=!0,_d=!1;try{if(_x=(_i=_i.call(arr)).next,0===i){if(Object(_i)!==_i)return;_n=!1}else for(;!(_n=(_s=_x.call(_i)).done)&&(_arr.push(_s.value),_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{if(!_n&&null!=_i.return&&(_r=_i.return(),Object(_r)!==_r))return}finally{if(_d)throw _e}}return _arr}}', diff --git a/packages/babel-helpers/src/helpers/defineAccessor.js b/packages/babel-helpers/src/helpers/defineAccessor.js new file mode 100644 index 000000000000..5e6d3aad6dfd --- /dev/null +++ b/packages/babel-helpers/src/helpers/defineAccessor.js @@ -0,0 +1,8 @@ +/* @minVersion 7.20.6 */ + +export default function _defineAccessor(obj, key, type, fn) { + var desc = { configurable: true, enumerable: true }; + // type should be "get" or "set" + desc[type] = fn; + return Object.defineProperty(obj, key, desc); +} diff --git a/packages/babel-plugin-transform-computed-properties/src/index.ts b/packages/babel-plugin-transform-computed-properties/src/index.ts index 00e25f4094fc..a7c3d4549647 100644 --- a/packages/babel-plugin-transform-computed-properties/src/index.ts +++ b/packages/babel-plugin-transform-computed-properties/src/index.ts @@ -1,5 +1,6 @@ +import { types as t } from "@babel/core"; +import type { PluginPass } from "@babel/core"; import { declare } from "@babel/helper-plugin-utils"; -import { template, types as t, type PluginPass } from "@babel/core"; import type { Scope } from "@babel/traverse"; export interface Options { @@ -12,7 +13,6 @@ type PropertyInfo = { body: t.Statement[]; computedProps: t.ObjectMember[]; initPropExpression: t.ObjectExpression; - getMutatorId: () => t.Identifier; state: PluginPass; }; @@ -26,11 +26,6 @@ export default declare((api, options: Options) => { ? pushComputedPropsLoose : pushComputedPropsSpec; - const buildMutatorMapAssign = template.statements(` - MUTATOR_MAP_REF[KEY] = MUTATOR_MAP_REF[KEY] || {}; - MUTATOR_MAP_REF[KEY].KIND = VALUE; - `); - /** * Get value of an object member under object expression. * Returns a function expression if prop is a ObjectMethod. @@ -72,31 +67,34 @@ export default declare((api, options: Options) => { ); } - function pushMutatorDefine( - { body, getMutatorId, scope }: PropertyInfo, + function pushAccessorDefine( + { body, computedProps, initPropExpression, objId, state }: PropertyInfo, prop: t.ObjectMethod, ) { - let key = + const key = !prop.computed && t.isIdentifier(prop.key) ? t.stringLiteral(prop.key.name) : prop.key; - const maybeMemoise = scope.maybeGenerateMemoised(key); - if (maybeMemoise) { + if (computedProps.length === 1) { + return t.callExpression(state.addHelper("defineAccessor"), [ + initPropExpression, + key, + t.stringLiteral(prop.kind), + getValue(prop), + ]); + } else { body.push( - t.expressionStatement(t.assignmentExpression("=", maybeMemoise, key)), + t.expressionStatement( + t.callExpression(state.addHelper("defineAccessor"), [ + t.cloneNode(objId), + key, + t.stringLiteral(prop.kind), + getValue(prop), + ]), + ), ); - key = maybeMemoise; } - - body.push( - ...buildMutatorMapAssign({ - MUTATOR_MAP_REF: getMutatorId(), - KEY: t.cloneNode(key), - VALUE: getValue(prop), - KIND: t.identifier(prop.kind), - }), - ); } function pushComputedPropsLoose(info: PropertyInfo) { @@ -105,7 +103,8 @@ export default declare((api, options: Options) => { t.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set") ) { - pushMutatorDefine(info, prop); + const single = pushAccessorDefine(info, prop); + if (single) return single; } else { pushAssign(t.cloneNode(info.objId), prop, info.body); } @@ -123,7 +122,8 @@ export default declare((api, options: Options) => { t.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set") ) { - pushMutatorDefine(info, prop); + const single = pushAccessorDefine(info, prop); + if (single) return single; } else { // the value of ObjectProperty in ObjectExpression must be an expression const value = getValue(prop) as t.Expression; @@ -195,44 +195,15 @@ export default declare((api, options: Options) => { ]), ); - let mutatorRef: t.Identifier; - - const getMutatorId = function () { - if (!mutatorRef) { - mutatorRef = scope.generateUidIdentifier("mutatorMap"); - - body.push( - t.variableDeclaration("var", [ - t.variableDeclarator(mutatorRef, t.objectExpression([])), - ]), - ); - } - - return t.cloneNode(mutatorRef); - }; - const single = pushComputedProps({ scope, objId, body, computedProps, initPropExpression, - getMutatorId, state, }); - if (mutatorRef) { - body.push( - t.expressionStatement( - t.callExpression( - state.addHelper("defineEnumerableProperties"), - [t.cloneNode(objId), t.cloneNode(mutatorRef)], - ), - ), - ); - } - - // @ts-expect-error todo(flow->ts) `void` should not be used as variable if (single) { path.replaceWith(single); } else { diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js index 4ccc5de32e3c..a780720dd09b 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js @@ -1,10 +1,10 @@ -var _foobar, _foobar2, _test, _test2, _obj, _mutatorMap; -var obj = (_obj = {}, _foobar = foobar, _mutatorMap = {}, _mutatorMap[_foobar] = _mutatorMap[_foobar] || {}, _mutatorMap[_foobar].get = function () { +var _obj; +var obj = (_obj = {}, babelHelpers.defineAccessor(_obj, foobar, "get", function () { return "foobar"; -}, _foobar2 = foobar, _mutatorMap[_foobar2] = _mutatorMap[_foobar2] || {}, _mutatorMap[_foobar2].set = function (x) { +}), babelHelpers.defineAccessor(_obj, foobar, "set", function (x) { console.log(x); -}, _test = "test", _mutatorMap[_test] = _mutatorMap[_test] || {}, _mutatorMap[_test].get = function () { +}), babelHelpers.defineAccessor(_obj, "test", "get", function () { return "regular getter after computed property"; -}, _test2 = "test", _mutatorMap[_test2] = _mutatorMap[_test2] || {}, _mutatorMap[_test2].set = function (x) { +}), babelHelpers.defineAccessor(_obj, "test", "set", function (x) { console.log(x); -}, babelHelpers.defineEnumerableProperties(_obj, _mutatorMap), _obj); +}), _obj); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/input.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/input.js new file mode 100644 index 000000000000..80da523fbf0c --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/input.js @@ -0,0 +1,3 @@ +var obj = { + get ["x" + foo]() { return "heh"; } +}; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js new file mode 100644 index 000000000000..7736dd14dc57 --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js @@ -0,0 +1,3 @@ +var obj = babelHelpers.defineAccessor({}, "x" + foo, "get", function () { + return "heh"; +}); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js index 6244fab7845b..d19c8bd1f40e 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js @@ -1,5 +1,5 @@ -var _foo, _mutatorMap; +var _foo; var k = Symbol(); -var foo = (_foo = {}, _foo[Symbol.iterator] = "foobar", _mutatorMap = {}, _mutatorMap[k] = _mutatorMap[k] || {}, _mutatorMap[k].get = function () { +var foo = (_foo = {}, _foo[Symbol.iterator] = "foobar", babelHelpers.defineAccessor(_foo, k, "get", function () { return k; -}, babelHelpers.defineEnumerableProperties(_foo, _mutatorMap), _foo); +}), _foo); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js new file mode 100644 index 000000000000..4f443cac461b --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js @@ -0,0 +1,3 @@ +var x = { x, get x() { return 0; }, x }; +x.x = 1; +expect(x.x).toBe(1); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js new file mode 100644 index 000000000000..c62a99a2ca9b --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js @@ -0,0 +1,2 @@ +var x = { x, get x() { return 0; }, x }; +x.x = 1; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/options.json b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/options.json new file mode 100644 index 000000000000..04d52618ff8b --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "transform-duplicate-keys", + "transform-computed-properties" + ] +} diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js new file mode 100644 index 000000000000..619a0c50bdff --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js @@ -0,0 +1,7 @@ +var _x; +var x = (_x = { + x +}, babelHelpers.defineAccessor(_x, "x", "get", function () { + return 0; +}), babelHelpers.defineProperty(_x, "x", x), _x); +x.x = 1; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js index 4ccc5de32e3c..a780720dd09b 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js @@ -1,10 +1,10 @@ -var _foobar, _foobar2, _test, _test2, _obj, _mutatorMap; -var obj = (_obj = {}, _foobar = foobar, _mutatorMap = {}, _mutatorMap[_foobar] = _mutatorMap[_foobar] || {}, _mutatorMap[_foobar].get = function () { +var _obj; +var obj = (_obj = {}, babelHelpers.defineAccessor(_obj, foobar, "get", function () { return "foobar"; -}, _foobar2 = foobar, _mutatorMap[_foobar2] = _mutatorMap[_foobar2] || {}, _mutatorMap[_foobar2].set = function (x) { +}), babelHelpers.defineAccessor(_obj, foobar, "set", function (x) { console.log(x); -}, _test = "test", _mutatorMap[_test] = _mutatorMap[_test] || {}, _mutatorMap[_test].get = function () { +}), babelHelpers.defineAccessor(_obj, "test", "get", function () { return "regular getter after computed property"; -}, _test2 = "test", _mutatorMap[_test2] = _mutatorMap[_test2] || {}, _mutatorMap[_test2].set = function (x) { +}), babelHelpers.defineAccessor(_obj, "test", "set", function (x) { console.log(x); -}, babelHelpers.defineEnumerableProperties(_obj, _mutatorMap), _obj); +}), _obj); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/input.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/input.js new file mode 100644 index 000000000000..80da523fbf0c --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/input.js @@ -0,0 +1,3 @@ +var obj = { + get ["x" + foo]() { return "heh"; } +}; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js new file mode 100644 index 000000000000..7736dd14dc57 --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js @@ -0,0 +1,3 @@ +var obj = babelHelpers.defineAccessor({}, "x" + foo, "get", function () { + return "heh"; +}); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js index db996b0530b3..1648025e0374 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js @@ -1,5 +1,5 @@ -var _foo, _mutatorMap; +var _foo; var k = Symbol(); -var foo = (_foo = {}, babelHelpers.defineProperty(_foo, Symbol.iterator, "foobar"), _mutatorMap = {}, _mutatorMap[k] = _mutatorMap[k] || {}, _mutatorMap[k].get = function () { +var foo = (_foo = {}, babelHelpers.defineProperty(_foo, Symbol.iterator, "foobar"), babelHelpers.defineAccessor(_foo, k, "get", function () { return k; -}, babelHelpers.defineEnumerableProperties(_foo, _mutatorMap), _foo); +}), _foo); diff --git a/packages/babel-runtime-corejs2/package.json b/packages/babel-runtime-corejs2/package.json index 414a9e3e357d..c32e7ec9d31d 100644 --- a/packages/babel-runtime-corejs2/package.json +++ b/packages/babel-runtime-corejs2/package.json @@ -90,6 +90,15 @@ "./helpers/checkInRHS.js" ], "./helpers/esm/checkInRHS": "./helpers/esm/checkInRHS.js", + "./helpers/defineAccessor": [ + { + "node": "./helpers/defineAccessor.js", + "import": "./helpers/esm/defineAccessor.js", + "default": "./helpers/defineAccessor.js" + }, + "./helpers/defineAccessor.js" + ], + "./helpers/esm/defineAccessor": "./helpers/esm/defineAccessor.js", "./helpers/iterableToArrayLimit": [ { "node": "./helpers/iterableToArrayLimit.js", diff --git a/packages/babel-runtime-corejs3/package.json b/packages/babel-runtime-corejs3/package.json index 0803f58ebb4a..5aef07259504 100644 --- a/packages/babel-runtime-corejs3/package.json +++ b/packages/babel-runtime-corejs3/package.json @@ -89,6 +89,15 @@ "./helpers/checkInRHS.js" ], "./helpers/esm/checkInRHS": "./helpers/esm/checkInRHS.js", + "./helpers/defineAccessor": [ + { + "node": "./helpers/defineAccessor.js", + "import": "./helpers/esm/defineAccessor.js", + "default": "./helpers/defineAccessor.js" + }, + "./helpers/defineAccessor.js" + ], + "./helpers/esm/defineAccessor": "./helpers/esm/defineAccessor.js", "./helpers/iterableToArrayLimit": [ { "node": "./helpers/iterableToArrayLimit.js", diff --git a/packages/babel-runtime/package.json b/packages/babel-runtime/package.json index ff5631d754de..f0ef84016081 100644 --- a/packages/babel-runtime/package.json +++ b/packages/babel-runtime/package.json @@ -89,6 +89,15 @@ "./helpers/checkInRHS.js" ], "./helpers/esm/checkInRHS": "./helpers/esm/checkInRHS.js", + "./helpers/defineAccessor": [ + { + "node": "./helpers/defineAccessor.js", + "import": "./helpers/esm/defineAccessor.js", + "default": "./helpers/defineAccessor.js" + }, + "./helpers/defineAccessor.js" + ], + "./helpers/esm/defineAccessor": "./helpers/esm/defineAccessor.js", "./helpers/iterableToArrayLimit": [ { "node": "./helpers/iterableToArrayLimit.js", From 86acf8769736bc6cae605dfb231e01f213953743 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Tue, 29 Nov 2022 15:46:13 +0800 Subject: [PATCH 2/9] Rename test --- .../test/fixtures/regression/15140/exec.js | 3 --- .../test/fixtures/regression/15140/input.js | 2 -- .../test/fixtures/regression/15140/output.js | 7 ------- .../test/fixtures/spec/definition-order/exec.js | 16 ++++++++++++++++ .../test/fixtures/spec/definition-order/input.js | 12 ++++++++++++ .../15140 => spec/definition-order}/options.json | 0 .../fixtures/spec/definition-order/output.js | 13 +++++++++++++ 7 files changed, 41 insertions(+), 12 deletions(-) delete mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js delete mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js delete mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js rename packages/babel-plugin-transform-computed-properties/test/fixtures/{regression/15140 => spec/definition-order}/options.json (100%) create mode 100644 packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js deleted file mode 100644 index 4f443cac461b..000000000000 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/exec.js +++ /dev/null @@ -1,3 +0,0 @@ -var x = { x, get x() { return 0; }, x }; -x.x = 1; -expect(x.x).toBe(1); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js deleted file mode 100644 index c62a99a2ca9b..000000000000 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/input.js +++ /dev/null @@ -1,2 +0,0 @@ -var x = { x, get x() { return 0; }, x }; -x.x = 1; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js deleted file mode 100644 index 619a0c50bdff..000000000000 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/output.js +++ /dev/null @@ -1,7 +0,0 @@ -var _x; -var x = (_x = { - x -}, babelHelpers.defineAccessor(_x, "x", "get", function () { - return 0; -}), babelHelpers.defineProperty(_x, "x", x), _x); -x.x = 1; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js new file mode 100644 index 000000000000..5cf2fd267981 --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js @@ -0,0 +1,16 @@ +var a = { + get ["x"]() { return 0; }, + ["y"]: 1, +}; +expect(Object.keys(a)).toStrictEqual(["x", "y"]); + +var b = { + get ["x"]() { return 0; }, + ["x"]: 1, +}; +expect(b.x).toBe(1); + +var x = { x, get x() { return 0; }, x }; +expect(x.x).toBe(undefined); +x.x = 1; +expect(x.x).toBe(1); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js new file mode 100644 index 000000000000..91bea94341dd --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js @@ -0,0 +1,12 @@ +var a = { + get ["x"]() { return 0; }, + ["y"]: 1, +}; + +var b = { + get ["x"]() { return 0; }, + ["x"]: 1, +}; + +var x = { x, get x() { return 0; }, x }; +x.x = 1; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/options.json b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/options.json similarity index 100% rename from packages/babel-plugin-transform-computed-properties/test/fixtures/regression/15140/options.json rename to packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/options.json diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js new file mode 100644 index 000000000000..89684e96ec33 --- /dev/null +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js @@ -0,0 +1,13 @@ +var _a, _b, _x; +var a = (_a = {}, babelHelpers.defineAccessor(_a, "x", "get", function () { + return 0; +}), babelHelpers.defineProperty(_a, "y", 1), _a); +var b = (_b = {}, babelHelpers.defineAccessor(_b, "x", "get", function () { + return 0; +}), babelHelpers.defineProperty(_b, "x", 1), _b); +var x = (_x = { + x +}, babelHelpers.defineAccessor(_x, "x", "get", function () { + return 0; +}), babelHelpers.defineProperty(_x, "x", x), _x); +x.x = 1; From 16758f36e8013998b4d80bce0dfc68ed8aa1df6e Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Tue, 29 Nov 2022 17:17:02 +0800 Subject: [PATCH 3/9] Update new-version-checklist --- Makefile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 23b3d0cf8c16..86106500ddb5 100644 --- a/Makefile +++ b/Makefile @@ -189,15 +189,15 @@ test-test262-update-allowlist: new-version-checklist: - # @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - # @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - # @echo "!!!!!! !!!!!!" - # @echo "!!!!!! Add any message here, and UNCOMMENT THESE LINES! !!!!!!" - # @echo "!!!!!! !!!!!!" - # @echo "!!!!!! !!!!!!" - # @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - # @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - # @exit 1 + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!! !!!!!!" + @echo "!!!!!! Update the minVersion of !!!!!!" + @echo "!!!!!! packages/babel-helpers/src/helpers/defineAccessor.js !!!!!!" + @echo "!!!!!! !!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @exit 1 new-version: $(MAKE) new-version-checklist From 1fd56a3c4e900159ae31202c5aae8e90c88042c6 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Tue, 29 Nov 2022 17:21:50 +0800 Subject: [PATCH 4/9] Change parameter order of defineAccessor --- packages/babel-helpers/src/helpers-generated.ts | 2 +- packages/babel-helpers/src/helpers/defineAccessor.js | 2 +- .../src/index.ts | 4 ++-- .../assumption-setComputedProperties/accessors/output.js | 8 ++++---- .../single-accessor/output.js | 2 +- .../assumption-setComputedProperties/symbol/output.js | 2 +- .../test/fixtures/spec/accessors/output.js | 8 ++++---- .../test/fixtures/spec/definition-order/output.js | 6 +++--- .../test/fixtures/spec/single-accessor/output.js | 2 +- .../test/fixtures/spec/symbol/output.js | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/babel-helpers/src/helpers-generated.ts b/packages/babel-helpers/src/helpers-generated.ts index 3f80c89a9984..852494961144 100644 --- a/packages/babel-helpers/src/helpers-generated.ts +++ b/packages/babel-helpers/src/helpers-generated.ts @@ -47,7 +47,7 @@ export default Object.freeze({ ), defineAccessor: helper( "7.20.6", - "export default function _defineAccessor(obj,key,type,fn){var desc={configurable:!0,enumerable:!0};return desc[type]=fn,Object.defineProperty(obj,key,desc)}", + "export default function _defineAccessor(type,obj,key,fn){var desc={configurable:!0,enumerable:!0};return desc[type]=fn,Object.defineProperty(obj,key,desc)}", ), iterableToArrayLimit: helper( "7.0.0-beta.0", diff --git a/packages/babel-helpers/src/helpers/defineAccessor.js b/packages/babel-helpers/src/helpers/defineAccessor.js index 5e6d3aad6dfd..9d77c3cf3acf 100644 --- a/packages/babel-helpers/src/helpers/defineAccessor.js +++ b/packages/babel-helpers/src/helpers/defineAccessor.js @@ -1,6 +1,6 @@ /* @minVersion 7.20.6 */ -export default function _defineAccessor(obj, key, type, fn) { +export default function _defineAccessor(type, obj, key, fn) { var desc = { configurable: true, enumerable: true }; // type should be "get" or "set" desc[type] = fn; diff --git a/packages/babel-plugin-transform-computed-properties/src/index.ts b/packages/babel-plugin-transform-computed-properties/src/index.ts index a7c3d4549647..7d31c5fc6d27 100644 --- a/packages/babel-plugin-transform-computed-properties/src/index.ts +++ b/packages/babel-plugin-transform-computed-properties/src/index.ts @@ -78,18 +78,18 @@ export default declare((api, options: Options) => { if (computedProps.length === 1) { return t.callExpression(state.addHelper("defineAccessor"), [ + t.stringLiteral(prop.kind), initPropExpression, key, - t.stringLiteral(prop.kind), getValue(prop), ]); } else { body.push( t.expressionStatement( t.callExpression(state.addHelper("defineAccessor"), [ + t.stringLiteral(prop.kind), t.cloneNode(objId), key, - t.stringLiteral(prop.kind), getValue(prop), ]), ), diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js index a780720dd09b..b30b13206978 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/accessors/output.js @@ -1,10 +1,10 @@ var _obj; -var obj = (_obj = {}, babelHelpers.defineAccessor(_obj, foobar, "get", function () { +var obj = (_obj = {}, babelHelpers.defineAccessor("get", _obj, foobar, function () { return "foobar"; -}), babelHelpers.defineAccessor(_obj, foobar, "set", function (x) { +}), babelHelpers.defineAccessor("set", _obj, foobar, function (x) { console.log(x); -}), babelHelpers.defineAccessor(_obj, "test", "get", function () { +}), babelHelpers.defineAccessor("get", _obj, "test", function () { return "regular getter after computed property"; -}), babelHelpers.defineAccessor(_obj, "test", "set", function (x) { +}), babelHelpers.defineAccessor("set", _obj, "test", function (x) { console.log(x); }), _obj); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js index 7736dd14dc57..8ac26e2fe4a1 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/single-accessor/output.js @@ -1,3 +1,3 @@ -var obj = babelHelpers.defineAccessor({}, "x" + foo, "get", function () { +var obj = babelHelpers.defineAccessor("get", {}, "x" + foo, function () { return "heh"; }); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js index d19c8bd1f40e..017a98dfc0a4 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/assumption-setComputedProperties/symbol/output.js @@ -1,5 +1,5 @@ var _foo; var k = Symbol(); -var foo = (_foo = {}, _foo[Symbol.iterator] = "foobar", babelHelpers.defineAccessor(_foo, k, "get", function () { +var foo = (_foo = {}, _foo[Symbol.iterator] = "foobar", babelHelpers.defineAccessor("get", _foo, k, function () { return k; }), _foo); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js index a780720dd09b..b30b13206978 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/accessors/output.js @@ -1,10 +1,10 @@ var _obj; -var obj = (_obj = {}, babelHelpers.defineAccessor(_obj, foobar, "get", function () { +var obj = (_obj = {}, babelHelpers.defineAccessor("get", _obj, foobar, function () { return "foobar"; -}), babelHelpers.defineAccessor(_obj, foobar, "set", function (x) { +}), babelHelpers.defineAccessor("set", _obj, foobar, function (x) { console.log(x); -}), babelHelpers.defineAccessor(_obj, "test", "get", function () { +}), babelHelpers.defineAccessor("get", _obj, "test", function () { return "regular getter after computed property"; -}), babelHelpers.defineAccessor(_obj, "test", "set", function (x) { +}), babelHelpers.defineAccessor("set", _obj, "test", function (x) { console.log(x); }), _obj); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js index 89684e96ec33..81651313fd61 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js @@ -1,13 +1,13 @@ var _a, _b, _x; -var a = (_a = {}, babelHelpers.defineAccessor(_a, "x", "get", function () { +var a = (_a = {}, babelHelpers.defineAccessor("get", _a, "x", function () { return 0; }), babelHelpers.defineProperty(_a, "y", 1), _a); -var b = (_b = {}, babelHelpers.defineAccessor(_b, "x", "get", function () { +var b = (_b = {}, babelHelpers.defineAccessor("get", _b, "x", function () { return 0; }), babelHelpers.defineProperty(_b, "x", 1), _b); var x = (_x = { x -}, babelHelpers.defineAccessor(_x, "x", "get", function () { +}, babelHelpers.defineAccessor("get", _x, "x", function () { return 0; }), babelHelpers.defineProperty(_x, "x", x), _x); x.x = 1; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js index 7736dd14dc57..8ac26e2fe4a1 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/single-accessor/output.js @@ -1,3 +1,3 @@ -var obj = babelHelpers.defineAccessor({}, "x" + foo, "get", function () { +var obj = babelHelpers.defineAccessor("get", {}, "x" + foo, function () { return "heh"; }); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js index 1648025e0374..0d2cbcca422e 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/symbol/output.js @@ -1,5 +1,5 @@ var _foo; var k = Symbol(); -var foo = (_foo = {}, babelHelpers.defineProperty(_foo, Symbol.iterator, "foobar"), babelHelpers.defineAccessor(_foo, k, "get", function () { +var foo = (_foo = {}, babelHelpers.defineProperty(_foo, Symbol.iterator, "foobar"), babelHelpers.defineAccessor("get", _foo, k, function () { return k; }), _foo); From c7351351bfcefe7cf1db19298f5af0347a4abb8c Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Tue, 29 Nov 2022 17:24:13 +0800 Subject: [PATCH 5/9] Update test spec/definition-order --- .../test/fixtures/spec/definition-order/exec.js | 9 +++++---- .../test/fixtures/spec/definition-order/input.js | 5 +++-- .../test/fixtures/spec/definition-order/output.js | 11 ++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js index 5cf2fd267981..adfa85643a00 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/exec.js @@ -10,7 +10,8 @@ var b = { }; expect(b.x).toBe(1); -var x = { x, get x() { return 0; }, x }; -expect(x.x).toBe(undefined); -x.x = 1; -expect(x.x).toBe(1); +var x = 1; +var y = { x, get x() { return 0; }, x }; +expect(y.x).toBe(1); +y.x = 2; +expect(y.x).toBe(2); diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js index 91bea94341dd..f82049658c53 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/input.js @@ -8,5 +8,6 @@ var b = { ["x"]: 1, }; -var x = { x, get x() { return 0; }, x }; -x.x = 1; +var x = 1; +var y = { x, get x() { return 0; }, x }; +y.x = 2; diff --git a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js index 81651313fd61..025dfbcc1266 100644 --- a/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js +++ b/packages/babel-plugin-transform-computed-properties/test/fixtures/spec/definition-order/output.js @@ -1,13 +1,14 @@ -var _a, _b, _x; +var _a, _b, _y; var a = (_a = {}, babelHelpers.defineAccessor("get", _a, "x", function () { return 0; }), babelHelpers.defineProperty(_a, "y", 1), _a); var b = (_b = {}, babelHelpers.defineAccessor("get", _b, "x", function () { return 0; }), babelHelpers.defineProperty(_b, "x", 1), _b); -var x = (_x = { +var x = 1; +var y = (_y = { x -}, babelHelpers.defineAccessor("get", _x, "x", function () { +}, babelHelpers.defineAccessor("get", _y, "x", function () { return 0; -}), babelHelpers.defineProperty(_x, "x", x), _x); -x.x = 1; +}), babelHelpers.defineProperty(_y, "x", x), _y); +y.x = 2; From b8acd2e97fa1e40434e3a8248a5b47f40c0cdb52 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Sat, 3 Dec 2022 03:35:59 +0800 Subject: [PATCH 6/9] Add fallback for helper function --- .../package.json | 3 +- .../src/index.ts | 55 +++++++++++++++---- yarn.lock | 1 + 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/packages/babel-plugin-transform-computed-properties/package.json b/packages/babel-plugin-transform-computed-properties/package.json index 38329f51467f..02deaca37446 100644 --- a/packages/babel-plugin-transform-computed-properties/package.json +++ b/packages/babel-plugin-transform-computed-properties/package.json @@ -17,7 +17,8 @@ "babel-plugin" ], "dependencies": { - "@babel/helper-plugin-utils": "workspace:^" + "@babel/helper-plugin-utils": "workspace:^", + "@babel/template": "workspace:^" }, "peerDependencies": { "@babel/core": "^7.0.0-0" diff --git a/packages/babel-plugin-transform-computed-properties/src/index.ts b/packages/babel-plugin-transform-computed-properties/src/index.ts index 7d31c5fc6d27..0f911ecc9e99 100644 --- a/packages/babel-plugin-transform-computed-properties/src/index.ts +++ b/packages/babel-plugin-transform-computed-properties/src/index.ts @@ -1,6 +1,7 @@ import { types as t } from "@babel/core"; import type { PluginPass } from "@babel/core"; import { declare } from "@babel/helper-plugin-utils"; +import template from "@babel/template"; import type { Scope } from "@babel/traverse"; export interface Options { @@ -26,6 +27,44 @@ export default declare((api, options: Options) => { ? pushComputedPropsLoose : pushComputedPropsSpec; + function buildDefineAccessor( + state: PluginPass, + type: "get" | "set", + obj: t.Expression, + key: t.Expression, + fn: t.Expression, + ) { + let helper: t.Identifier; + if (state.availableHelper("defineAccessor")) { + helper = state.addHelper("defineAccessor"); + } else { + // Fallback for @babel/helpers <= 7.20.6, manually add helper function + const file = state.file; + helper = file.declarations["defineAccessor"]; + if (!helper) { + helper = file.declarations["defineAccessor"] = + file.scope.generateUidIdentifier("defineAccessor"); + + const helperDeclaration = template.statement.ast` + function ${helper}(type, obj, key, fn) { + var desc = { configurable: true, enumerable: true }; + desc[type] = fn; + return Object.defineProperty(obj, key, desc); + } + `; + const helperPath = file.path.unshiftContainer( + "body", + helperDeclaration, + )[0]; + // TODO: NodePath#unshiftContainer should automatically register new bindings. + file.scope.registerDeclaration(helperPath); + } + helper = t.cloneNode(helper); + } + + return t.callExpression(helper, [t.stringLiteral(type), obj, key, fn]); + } + /** * Get value of an object member under object expression. * Returns a function expression if prop is a ObjectMethod. @@ -71,27 +110,19 @@ export default declare((api, options: Options) => { { body, computedProps, initPropExpression, objId, state }: PropertyInfo, prop: t.ObjectMethod, ) { + const kind = prop.kind as "get" | "set"; const key = !prop.computed && t.isIdentifier(prop.key) ? t.stringLiteral(prop.key.name) : prop.key; + const value = getValue(prop); if (computedProps.length === 1) { - return t.callExpression(state.addHelper("defineAccessor"), [ - t.stringLiteral(prop.kind), - initPropExpression, - key, - getValue(prop), - ]); + return buildDefineAccessor(state, kind, initPropExpression, key, value); } else { body.push( t.expressionStatement( - t.callExpression(state.addHelper("defineAccessor"), [ - t.stringLiteral(prop.kind), - t.cloneNode(objId), - key, - getValue(prop), - ]), + buildDefineAccessor(state, kind, t.cloneNode(objId), key, value), ), ); } diff --git a/yarn.lock b/yarn.lock index 8ba1cf3aed27..02d5f5d601b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2386,6 +2386,7 @@ __metadata: "@babel/core": "workspace:^" "@babel/helper-plugin-test-runner": "workspace:^" "@babel/helper-plugin-utils": "workspace:^" + "@babel/template": "workspace:^" peerDependencies: "@babel/core": ^7.0.0-0 languageName: unknown From 8a6ccb4b879e33de51e0c98d80157c1edaee93cf Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Sat, 3 Dec 2022 04:20:55 +0800 Subject: [PATCH 7/9] Better helper fallback --- .../src/transformation/file/file.ts | 2 +- .../src/index.ts | 33 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/babel-core/src/transformation/file/file.ts b/packages/babel-core/src/transformation/file/file.ts index cf687fb0b1ef..0a7b370f2712 100644 --- a/packages/babel-core/src/transformation/file/file.ts +++ b/packages/babel-core/src/transformation/file/file.ts @@ -210,7 +210,7 @@ export default class File { }); nodes.forEach(node => { - // @ts-expect-error Fixeme: document _compact node property + // @ts-expect-error Fixme: document _compact node property node._compact = true; }); diff --git a/packages/babel-plugin-transform-computed-properties/src/index.ts b/packages/babel-plugin-transform-computed-properties/src/index.ts index 0f911ecc9e99..8d23d849c9db 100644 --- a/packages/babel-plugin-transform-computed-properties/src/index.ts +++ b/packages/babel-plugin-transform-computed-properties/src/index.ts @@ -17,6 +17,15 @@ type PropertyInfo = { state: PluginPass; }; +const DefineAccessorHelper = template.expression.ast` +function (type, obj, key, fn) { + var desc = { configurable: true, enumerable: true }; + desc[type] = fn; + return Object.defineProperty(obj, key, desc); +}`; +// @ts-expect-error undocumented _compact node property +DefineAccessorHelper._compact = true; + export default declare((api, options: Options) => { api.assertVersion(7); @@ -40,24 +49,14 @@ export default declare((api, options: Options) => { } else { // Fallback for @babel/helpers <= 7.20.6, manually add helper function const file = state.file; - helper = file.declarations["defineAccessor"]; + helper = file.get("fallbackDefineAccessorHelper"); if (!helper) { - helper = file.declarations["defineAccessor"] = - file.scope.generateUidIdentifier("defineAccessor"); - - const helperDeclaration = template.statement.ast` - function ${helper}(type, obj, key, fn) { - var desc = { configurable: true, enumerable: true }; - desc[type] = fn; - return Object.defineProperty(obj, key, desc); - } - `; - const helperPath = file.path.unshiftContainer( - "body", - helperDeclaration, - )[0]; - // TODO: NodePath#unshiftContainer should automatically register new bindings. - file.scope.registerDeclaration(helperPath); + const id = file.scope.generateUidIdentifier("defineAccessor"); + file.scope.push({ + id, + init: DefineAccessorHelper, + }); + file.set("fallbackDefineAccessorHelper", (helper = id)); } helper = t.cloneNode(helper); } From 666e7deb69895185073cf15c09d9a607e2bc9355 Mon Sep 17 00:00:00 2001 From: Tianlan Zhou Date: Mon, 5 Dec 2022 18:46:13 +0800 Subject: [PATCH 8/9] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Ribaudo --- .../babel-plugin-transform-computed-properties/src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/babel-plugin-transform-computed-properties/src/index.ts b/packages/babel-plugin-transform-computed-properties/src/index.ts index 8d23d849c9db..ee502bb3cbbb 100644 --- a/packages/babel-plugin-transform-computed-properties/src/index.ts +++ b/packages/babel-plugin-transform-computed-properties/src/index.ts @@ -17,6 +17,7 @@ type PropertyInfo = { state: PluginPass; }; +// TODO(Babel 8): Remove this. const DefineAccessorHelper = template.expression.ast` function (type, obj, key, fn) { var desc = { configurable: true, enumerable: true }; @@ -48,6 +49,7 @@ export default declare((api, options: Options) => { helper = state.addHelper("defineAccessor"); } else { // Fallback for @babel/helpers <= 7.20.6, manually add helper function + // TODO(Babel 8): Remove this const file = state.file; helper = file.get("fallbackDefineAccessorHelper"); if (!helper) { From dac736ce874ce7deeb9f136473817c81f7149dc7 Mon Sep 17 00:00:00 2001 From: SuperSodaSea Date: Mon, 5 Dec 2022 19:27:52 +0800 Subject: [PATCH 9/9] Cleanup --- .../babel-plugin-transform-computed-properties/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-computed-properties/src/index.ts b/packages/babel-plugin-transform-computed-properties/src/index.ts index ee502bb3cbbb..6b02cc01d7b7 100644 --- a/packages/babel-plugin-transform-computed-properties/src/index.ts +++ b/packages/babel-plugin-transform-computed-properties/src/index.ts @@ -17,7 +17,7 @@ type PropertyInfo = { state: PluginPass; }; -// TODO(Babel 8): Remove this. +// TODO(Babel 8): Remove this const DefineAccessorHelper = template.expression.ast` function (type, obj, key, fn) { var desc = { configurable: true, enumerable: true };