diff --git a/.changeset/silly-seas-enjoy.md b/.changeset/silly-seas-enjoy.md new file mode 100644 index 000000000000..507bb0c172a2 --- /dev/null +++ b/.changeset/silly-seas-enjoy.md @@ -0,0 +1,6 @@ +--- +swc_core: minor +swc_ecma_transforms_base: minor +--- + +fix(es/helpers): Sync tslib `_ts_generator` implementation diff --git a/crates/swc/tests/stacktrace/issue-622/output/stacks.txt b/crates/swc/tests/stacktrace/issue-622/output/stacks.txt index 0634117dc752..8fe95a0ac08a 100644 --- a/crates/swc/tests/stacktrace/issue-622/output/stacks.txt +++ b/crates/swc/tests/stacktrace/issue-622/output/stacks.txt @@ -5,8 +5,8 @@ $DIR/tests/stacktrace/issue-622/input/index.js:3 ReferenceError: call is not defined at ($DIR/tests/stacktrace/issue-622/input/index.js:3:9) - at step ($DIR/tests/stacktrace/issue-622/input/_exec.js:109:23) - at Object.next ($DIR/tests/stacktrace/issue-622/input/_exec.js:50:20) + at step ($DIR/tests/stacktrace/issue-622/input/_exec.js:105:23) + at Object.next ($DIR/tests/stacktrace/issue-622/input/_exec.js:46:20) at asyncGeneratorStep ($DIR/tests/stacktrace/issue-622/input/_exec.js:4:28) at _next ($DIR/tests/stacktrace/issue-622/input/_exec.js:22:17) at $DIR/tests/stacktrace/issue-622/input/_exec.js:27:13 diff --git a/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js b/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js index c06c31b8926d..01f63af2c35c 100644 --- a/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js +++ b/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js @@ -1,10 +1,10 @@ function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; + var f, y, t, _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while (_) try { + while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { diff --git a/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js b/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js index ab7ec169fc52..9ee070f806ca 100644 --- a/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js +++ b/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js @@ -28,7 +28,7 @@ function _async_to_generator(fn) { }; } function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { + var f, y, t, _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; @@ -36,12 +36,8 @@ function _ts_generator(thisArg, body) { }, trys: [], ops: [] - }; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { @@ -54,7 +50,7 @@ function _ts_generator(thisArg, body) { } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while(_)try { + while(g && (g = 0, op[0] && (_ = 0)), _)try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [ op[0] & 2, diff --git a/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js b/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js index 55e9794ac9a9..3bd3d52f583d 100644 --- a/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js +++ b/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js @@ -28,7 +28,7 @@ function _async_to_generator(fn) { }; } function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { + var f, y, t, _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; @@ -36,12 +36,8 @@ function _ts_generator(thisArg, body) { }, trys: [], ops: [] - }; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { @@ -54,7 +50,7 @@ function _ts_generator(thisArg, body) { } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while(_)try { + while(g && (g = 0, op[0] && (_ = 0)), _)try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [ op[0] & 2, diff --git a/packages/core/__tests__/transform/preset-env_test.mjs b/packages/core/__tests__/transform/preset-env_test.mjs index 36f6cf70d5ee..e89959fbc61d 100644 --- a/packages/core/__tests__/transform/preset-env_test.mjs +++ b/packages/core/__tests__/transform/preset-env_test.mjs @@ -57,7 +57,7 @@ it("should respect custom transform option", async () => { }; } function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { + var f, y, t, _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; @@ -65,12 +65,8 @@ it("should respect custom transform option", async () => { }, trys: [], ops: [] - }; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { @@ -83,7 +79,7 @@ it("should respect custom transform option", async () => { } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while(_)try { + while(g && (g = 0, op[0] && (_ = 0)), _)try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [ op[0] & 2,