diff --git a/packages/babel-helper-create-class-features-plugin/src/misc.ts b/packages/babel-helper-create-class-features-plugin/src/misc.ts index 5daa046af26a..b47828f0352a 100644 --- a/packages/babel-helper-create-class-features-plugin/src/misc.ts +++ b/packages/babel-helper-create-class-features-plugin/src/misc.ts @@ -54,6 +54,14 @@ function handleClassTDZ( const classFieldDefinitionEvaluationTDZVisitor: Visitor = { ReferencedIdentifier: handleClassTDZ, + Function(path) { + const { parentPath } = path; + if ( + !(parentPath.isCallExpression() && parentPath.node.callee === path.node) + ) { + path.skip(); + } + }, }; interface RenamerState { diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/exec.js b/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/exec.js index 3a82579f1c64..58ac898cf8d6 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/exec.js +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/exec.js @@ -27,19 +27,15 @@ expect(errs.map(e => e.constructor)).toEqual([E, E, E]); const C = K; - // expect(fns.map(fn => fn())).toEqual([C, C, C]); - // todo: remove these three and enable the assertions above when we properly handle class tdz - expect(fns[0]()).toEqual(C); - expect(fns[1]).toThrow(E); - expect(fns[2]).toThrow(E); + expect(fns.map(fn => fn())).toEqual([C, C, C]); K = null; // expect(fns.map(fn => fn())).toEqual([null, C, C]); // todo: remove these three and enable the assertions above when we properly handle class tdz expect(fns[0]()).toEqual(null); - expect(fns[1]).toThrow(E); - expect(fns[2]).toThrow(E); + expect(fns[1]()).toEqual(null); + expect(fns[2]()).toEqual(null); } { diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/output.js b/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/output.js index 2116c6cfe966..110ab4bd7d97 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/output.js +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/2023-11-misc--to-es2015/outer-class-binding-mutated/output.js @@ -19,7 +19,7 @@ }; capture(() => K); assertUninitialized(() => K); - _ref = (_computedKeyDecs = [capture(() => (babelHelpers.classNameTDZError("K"), K)), assertUninitialized(() => (babelHelpers.classNameTDZError("K"), K))], _computedKey = babelHelpers.toPropertyKey((capture(() => (babelHelpers.classNameTDZError("K"), K)), assertUninitialized(() => (babelHelpers.classNameTDZError("K"), K))))); + _ref = (_computedKeyDecs = [capture(() => K), assertUninitialized(() => K)], _computedKey = babelHelpers.toPropertyKey((capture(() => K), assertUninitialized(() => K)))); class K { constructor() { babelHelpers.defineProperty(this, _ref, _init_computedKey(this)); diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/exec.js b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/exec.js new file mode 100644 index 000000000000..b337235c9618 --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/exec.js @@ -0,0 +1,6 @@ +let foo; +class A { + static x = 42; + static [foo = () => A.x]; +} +expect(foo()).toBe(42); diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/input.js b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/input.js new file mode 100644 index 000000000000..b337235c9618 --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/input.js @@ -0,0 +1,6 @@ +let foo; +class A { + static x = 42; + static [foo = () => A.x]; +} +expect(foo()).toBe(42); diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/options.json b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/options.json new file mode 100644 index 000000000000..717efc6a1bea --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-class-properties", "transform-classes"] +} diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/output.js b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/output.js new file mode 100644 index 000000000000..15d664f890d5 --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-closure/output.js @@ -0,0 +1,11 @@ +let _foo; +let foo; +_foo = foo = () => A.x; +let A = /*#__PURE__*/babelHelpers.createClass(function A() { + "use strict"; + + babelHelpers.classCallCheck(this, A); +}); +babelHelpers.defineProperty(A, "x", 42); +babelHelpers.defineProperty(A, _foo, void 0); +expect(foo()).toBe(42); diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/exec.js b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/exec.js new file mode 100644 index 000000000000..2eef66ac92a1 --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/exec.js @@ -0,0 +1,6 @@ +expect(() => { + class A { + static x = 42; + static [(() => A.x)()]; + } +}).toThrow(ReferenceError); diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/input.js b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/input.js new file mode 100644 index 000000000000..2eef66ac92a1 --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/input.js @@ -0,0 +1,6 @@ +expect(() => { + class A { + static x = 42; + static [(() => A.x)()]; + } +}).toThrow(ReferenceError); diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/options.json b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/options.json new file mode 100644 index 000000000000..717efc6a1bea --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-class-properties", "transform-classes"] +} diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/output.js b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/output.js new file mode 100644 index 000000000000..e6dd5bf5a3aa --- /dev/null +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/class-name-tdz/static-iife/output.js @@ -0,0 +1,11 @@ +expect(() => { + let _ref; + _ref = (() => (babelHelpers.classNameTDZError("A"), A).x)(); + let A = /*#__PURE__*/babelHelpers.createClass(function A() { + "use strict"; + + babelHelpers.classCallCheck(this, A); + }); + babelHelpers.defineProperty(A, "x", 42); + babelHelpers.defineProperty(A, _ref, void 0); +}).toThrow(ReferenceError);