Skip to content

Commit dd60228

Browse files
committed
fix(@angular-devkit/build-angular): downlevel for await...of when targetting ES2018+
Closes #21196 (cherry picked from commit 367de35)
1 parent 81c7cf2 commit dd60228

File tree

5 files changed

+46
-18
lines changed

5 files changed

+46
-18
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"@babel/core": "7.14.6",
8585
"@babel/generator": "7.14.5",
8686
"@babel/helper-annotate-as-pure": "7.14.5",
87+
"@babel/plugin-proposal-async-generator-functions": "7.14.7",
8788
"@babel/plugin-transform-runtime": "7.14.5",
8889
"@babel/preset-env": "7.14.7",
8990
"@babel/runtime": "7.14.6",

packages/angular_devkit/build_angular/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"@babel/core": "7.14.6",
1414
"@babel/generator": "7.14.5",
1515
"@babel/helper-annotate-as-pure": "7.14.5",
16+
"@babel/plugin-proposal-async-generator-functions": "7.14.7",
1617
"@babel/plugin-transform-async-to-generator": "7.14.5",
1718
"@babel/plugin-transform-runtime": "7.14.5",
1819
"@babel/preset-env": "7.14.7",

packages/angular_devkit/build_angular/src/babel/presets/application.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,10 @@ export default function (api: unknown, options: ApplicationPresetOptions) {
181181

182182
if (options.forceAsyncTransformation) {
183183
// Always transform async/await to support Zone.js
184-
plugins.push(require('@babel/plugin-transform-async-to-generator').default);
184+
plugins.push(
185+
require('@babel/plugin-transform-async-to-generator').default,
186+
require('@babel/plugin-proposal-async-generator-functions').default,
187+
);
185188
needRuntimeTransform = true;
186189
}
187190

packages/angular_devkit/build_angular/src/browser/tests/behavior/typescript-target_spec.ts

+37-14
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,9 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
4343
vendorChunk: true,
4444
});
4545

46-
const { result, logs } = await harness.executeOnce();
46+
const { result } = await harness.executeOnce();
4747

4848
expect(result?.success).toBe(true);
49-
expect(logs).not.toContain(
50-
jasmine.objectContaining({
51-
message: jasmine.stringMatching('Zone.js does not support native async/await in ES2017+'),
52-
}),
53-
);
54-
5549
harness.expectFile('dist/main.js').content.not.toMatch(/\sasync\s/);
5650
harness.expectFile('dist/main.js').content.toContain('"from-async-app-function"');
5751
harness.expectFile('dist/main.js').content.toContain('"from-async-js-function"');
@@ -125,17 +119,46 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
125119
vendorChunk: true,
126120
});
127121

128-
const { result, logs } = await harness.executeOnce();
122+
const { result } = await harness.executeOnce();
129123

130124
expect(result?.success).toBe(true);
131-
expect(logs).not.toContain(
132-
jasmine.objectContaining({
133-
message: jasmine.stringMatching('Zone.js does not support native async/await in ES2017+'),
134-
}),
135-
);
136-
137125
harness.expectFile('dist/main.js').content.not.toMatch(/\sasync\s/);
138126
harness.expectFile('dist/main.js').content.toContain('"from-async-function"');
139127
});
128+
129+
it('downlevels "for await...of" when targetting ES2018+', async () => {
130+
await harness.modifyFile('src/tsconfig.app.json', (content) => {
131+
const tsconfig = JSON.parse(content);
132+
if (!tsconfig.compilerOptions) {
133+
tsconfig.compilerOptions = {};
134+
}
135+
tsconfig.compilerOptions.target = 'es2020';
136+
137+
return JSON.stringify(tsconfig);
138+
});
139+
140+
// Add an async function to the project
141+
await harness.writeFile(
142+
'src/main.ts',
143+
`
144+
(async () => {
145+
for await (const o of [1, 2, 3]) {
146+
console.log("for await...of");
147+
}
148+
})();
149+
`,
150+
);
151+
152+
harness.useTarget('build', {
153+
...BASE_OPTIONS,
154+
vendorChunk: true,
155+
});
156+
157+
const { result } = await harness.executeOnce();
158+
159+
expect(result?.success).toBe(true);
160+
harness.expectFile('dist/main.js').content.not.toMatch(/\sawait\s/);
161+
harness.expectFile('dist/main.js').content.toContain('"for await...of"');
162+
});
140163
});
141164
});

yarn.lock

+3-3
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686

8787
"@angular/dev-infra-private@https://github.com/angular/dev-infra-private-builds.git#a1442a839401cb9a09285fbf1cd925cf51390ca3":
8888
version "0.0.0"
89-
resolved "https://github.com/angular/dev-infra-private-builds.git#6707d0f4cf98242af0b5635a0cf40cdeba300c9c"
89+
resolved "https://github.com/angular/dev-infra-private-builds.git#5879ecd963467fef55d090c45ebaddc80088107c"
9090
dependencies:
9191
"@angular/benchpress" "0.2.1"
9292
"@bazel/buildifier" "^4.0.1"
@@ -114,7 +114,7 @@
114114
ts-node "^10.0.0"
115115
tslib "^2.2.0"
116116
typed-graphqlify "^3.1.1"
117-
typescript "~4.3.2"
117+
typescript "~4.3.4"
118118
yaml "^1.10.0"
119119
yargs "^17.0.0"
120120

@@ -474,7 +474,7 @@
474474
"@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
475475
"@babel/plugin-proposal-optional-chaining" "^7.14.5"
476476

477-
"@babel/plugin-proposal-async-generator-functions@^7.14.7":
477+
"@babel/plugin-proposal-async-generator-functions@7.14.7", "@babel/plugin-proposal-async-generator-functions@^7.14.7":
478478
version "7.14.7"
479479
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace"
480480
integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==

0 commit comments

Comments
 (0)