Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/dry-numbers-end.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
swc_core: patch
swc_ecma_compat_es2015: patch
---

fix(es/compat): Fix generator transform for compound assignments, for-in, and labeled break
10 changes: 10 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11046/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"externalHelpers": false,
"target": "es5"
},
"isModule": true
}
37 changes: 37 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11046/exec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
function* traverse(obj) {
for (let key of Object.keys(obj)) {
if (typeof obj[key] === "object") yield* traverse(obj[key]);
else yield obj[key];
}
}

const obj = {
data: [1, 2, 3],
nested: {
fieldName: "Nested",
fieldData: "Data",
},
get dataGenerator() {
return traverse(this);
},
};

function func1() {
const generator = (function () {
return obj.dataGenerator;
})();

const res = [];
for (let value of generator) {
res.push(value);
}

return res;
}

function main() {
const res = func1();
console.log(res);
}

main();
10 changes: 10 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11047/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"externalHelpers": false,
"target": "es5"
},
"isModule": true
}
22 changes: 22 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11047/exec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const timeoutPromise = (timeout) => new Promise(resolve => setTimeout(resolve, timeout));

const processArray = async (array) => {
const [first, , third = 'default', ...rest] = array;

if (!first || !third) {
return;
}
await timeoutPromise(10);
return {first, third, rest};
}

const func1 = async () => {
return await processArray(['value1', 'value2', , 'value4', 'value5', 'value6', 'value7']);
}

const main = async () => {
const res = await func1();
console.log(res);
}

main();
10 changes: 10 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11048/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"externalHelpers": false,
"target": "es5"
},
"isModule": true
}
29 changes: 29 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11048/exec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
async function fetchResource() {
let data = ["John", , 25, "Developer", "California"];
await new Promise(resolve => setTimeout(resolve, 500));
return data;
}

function func1() {
return new Promise(async (resolve, reject) => {
let resource = await fetchResource();
const [firstName, middleName = "N/A", age, ...rest] = resource;

const result = (function() {
if(firstName) {
return {firstName, middleName, age, occupation: rest[0], location: rest[1]};
} else {
return {error: "Failed to fetch resource"};
}
})();

resolve(result);
});
}

async function main() {
const res = await func1();
console.log(res);
}

main();
10 changes: 10 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11049/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"externalHelpers": false,
"target": "es5"
},
"isModule": true
}
33 changes: 33 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11049/exec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
class MyClass {
constructor(data) {
if (!(data instanceof Array))
throw new Error('Invalid instance');
this.data = data;
}
}

function fetchPromise(idx) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(idx), 10)
})
}

async function func1() {
const arr = [1, [2, 3], , 4];
let [a, [ , b], ,d] = arr;

const instance = new MyClass([a, b, d])

a = await fetchPromise(instance.data[0]) || fetchPromise(0);
b = await fetchPromise(instance.data[1]) || fetchPromise(0);
d = await fetchPromise(instance.data[2]) || fetchPromise(0);

return [a, b, d];
}

function main() {
const res = func1();
res.then(value => console.log(value));
}

main();
10 changes: 10 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11050/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"externalHelpers": false,
"target": "es5"
},
"isModule": true
}
47 changes: 47 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11050/exec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
async function complexCompute(num) {
return new Promise(resolve => {
setTimeout(() => {
resolve(num * 2);
}, 2000);
});
}

async function func1() {
let result;
let val = 1; // initial assignment
val = val || await complexCompute(5);

outer_block: {
if (!val) {
result = "No Value";
break outer_block;
}

if (val < 10) {
switch(val) {
case 1:
result = "One";
break outer_block;
case 2:
let temp = await complexCompute(2);
if (temp > val) {
result = "Two Modified";
break outer_block;
}
result = "Two";
break outer_block;
}
}

result = "Out of scope";
}

return result;
}

async function main() {
let res = await func1();
console.log(res);
}

main();
10 changes: 10 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11052/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"externalHelpers": false,
"target": "es5"
},
"isModule": true
}
41 changes: 41 additions & 0 deletions crates/swc/tests/exec/issues-11xxx/11052/exec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
class MyClass {
constructor() {
this._value = null;
}

async fetchData() {
return new Promise(resolve => {
setTimeout(() => {
resolve('Data fetched');
}, 10);
});
}

async fetchMoreData() {
return new Promise(resolve => {
setTimeout(() => {
resolve('More data fetched');
}, 10);
});
}
async initializeData() {
this._value = await this.fetchData();
this._value += ' ' + await this.fetchMoreData();
}
get value() {
return this._value;
}
set value(newValue) {
this._value = newValue;
}
}
async function func1() {
let myClass = new MyClass();
await myClass.initializeData();
return myClass.value;
}
async function main() {
let res = await func1();
console.log(res);
}
main();
10 changes: 10 additions & 0 deletions crates/swc/tests/exec/issues-5xxx/5433/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"externalHelpers": false,
"target": "es5"
},
"isModule": true
}
8 changes: 8 additions & 0 deletions crates/swc/tests/exec/issues-5xxx/5433/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
function* v0() {
try {
var v1 = yield v2();
} catch (v9) {
}
}
var v1 = ({ foo: 10 });
const v3 = JSON.stringify(v1, v0);
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"target": "es5"
}
}
37 changes: 37 additions & 0 deletions crates/swc/tests/fixture/issues-110xx/11046/es5/input/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
function* traverse(obj) {
for (let key of Object.keys(obj)) {
if (typeof obj[key] === "object") yield* traverse(obj[key]);
else yield obj[key];
}
}

const obj = {
data: [1, 2, 3],
nested: {
fieldName: "Nested",
fieldData: "Data",
},
get dataGenerator() {
return traverse(this);
},
};

function func1() {
const generator = (function () {
return obj.dataGenerator;
})();

const res = [];
for (let value of generator) {
res.push(value);
}

return res;
}

function main() {
const res = func1();
console.log(res);
}

main();
Loading
Loading