Skip to content

Commit 2d4b548

Browse files
clydinalan-agius4
authored andcommitted
refactor(@angular-devkit/build-angular): add watch builder teardown to application builder
An AbortController is now automatically linked to the `application` builder's teardown context if one has not been provided. This supports reduced overhead in the unit tests by eliminating the need to manually create and use an AbortController/AbortSignal in each test that uses watch mode. Relevant tests that were previously doing this have also been updated.
1 parent bb8550e commit 2d4b548

File tree

7 files changed

+33
-45
lines changed

7 files changed

+33
-45
lines changed

packages/angular_devkit/build_angular/src/builders/application/index.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ export async function* buildApplicationInternal(
4848

4949
const normalizedOptions = await normalizeOptions(context, projectName, options, plugins);
5050

51+
// Setup an abort controller with a builder teardown if no signal is present
52+
let signal = context.signal;
53+
if (!signal) {
54+
const controller = new AbortController();
55+
signal = controller.signal;
56+
context.addTeardown(() => controller.abort('builder-teardown'));
57+
}
58+
5159
yield* runEsBuildBuildAction(
5260
async (rebuildState) => {
5361
const startTime = process.hrtime.bigint();
@@ -80,7 +88,7 @@ export async function* buildApplicationInternal(
8088
? undefined
8189
: (file) => file.type !== BuildOutputFileType.Server,
8290
logger: context.logger,
83-
signal: context.signal,
91+
signal,
8492
},
8593
);
8694
}

packages/angular_devkit/build_angular/src/builders/application/tests/behavior/rebuild-component_styles_spec.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import { concatMap, count, timeout } from 'rxjs';
9+
import { concatMap, count, take, timeout } from 'rxjs';
1010
import { buildApplication } from '../../index';
1111
import { APPLICATION_BUILDER_INFO, BASE_OPTIONS, describeBuilder } from '../setup';
1212

@@ -30,9 +30,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
3030
await harness.writeFile('src/app/app.component.scss', "@import './a';");
3131
await harness.writeFile('src/app/a.scss', '$primary: aqua;\\nh1 { color: $primary; }');
3232

33-
const builderAbort = new AbortController();
3433
const buildCount = await harness
35-
.execute({ signal: builderAbort.signal })
34+
.execute()
3635
.pipe(
3736
timeout(30000),
3837
concatMap(async ({ result }, index) => {
@@ -62,11 +61,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
6261
harness.expectFile('dist/browser/main.js').content.not.toContain('color: blue');
6362
harness.expectFile('dist/browser/main.js').content.toContain('color: green');
6463

65-
// Test complete - abort watch mode
66-
builderAbort.abort();
6764
break;
6865
}
6966
}),
67+
take(3),
7068
count(),
7169
)
7270
.toPromise();

packages/angular_devkit/build_angular/src/builders/application/tests/behavior/rebuild-errors_spec.ts

+9-17
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88

99
import { logging } from '@angular-devkit/core';
10-
import { concatMap, count, timeout } from 'rxjs';
10+
import { concatMap, count, take, timeout } from 'rxjs';
1111
import { buildApplication } from '../../index';
1212
import { APPLICATION_BUILDER_INFO, BASE_OPTIONS, describeBuilder } from '../setup';
1313

@@ -72,9 +72,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
7272
`,
7373
);
7474

75-
const builderAbort = new AbortController();
7675
const buildCount = await harness
77-
.execute({ outputLogsOnFailure: false, signal: builderAbort.signal })
76+
.execute({ outputLogsOnFailure: false })
7877
.pipe(
7978
timeout(BUILD_TIMEOUT),
8079
concatMap(async ({ result, logs }, index) => {
@@ -143,11 +142,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
143142
}),
144143
);
145144

146-
// Test complete - abort watch mode
147-
builderAbort?.abort();
148145
break;
149146
}
150147
}),
148+
take(5),
151149
count(),
152150
)
153151
.toPromise();
@@ -161,9 +159,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
161159
watch: true,
162160
});
163161

164-
const builderAbort = new AbortController();
165162
const buildCount = await harness
166-
.execute({ outputLogsOnFailure: false, signal: builderAbort.signal })
163+
.execute({ outputLogsOnFailure: false })
167164
.pipe(
168165
timeout(BUILD_TIMEOUT),
169166
concatMap(async ({ logs }, index) => {
@@ -251,11 +248,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
251248
}),
252249
);
253250

254-
// Test complete - abort watch mode
255-
builderAbort?.abort();
256251
break;
257252
}
258253
}),
254+
take(6),
259255
count(),
260256
)
261257
.toPromise();
@@ -270,9 +266,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
270266
aot: false,
271267
});
272268

273-
const builderAbort = new AbortController();
274269
const buildCount = await harness
275-
.execute({ outputLogsOnFailure: false, signal: builderAbort.signal })
270+
.execute({ outputLogsOnFailure: false })
276271
.pipe(
277272
timeout(BUILD_TIMEOUT),
278273
concatMap(async ({ result, logs }, index) => {
@@ -302,11 +297,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
302297
.expectFile('dist/browser/main.js')
303298
.content.toContain('p {\\n color: green;\\n}');
304299

305-
// Test complete - abort watch mode
306-
builderAbort?.abort();
307300
break;
308301
}
309302
}),
303+
take(3),
310304
count(),
311305
)
312306
.toPromise();
@@ -320,9 +314,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
320314
watch: true,
321315
});
322316

323-
const builderAbort = new AbortController();
324317
const buildCount = await harness
325-
.execute({ outputLogsOnFailure: true, signal: builderAbort.signal })
318+
.execute({ outputLogsOnFailure: true })
326319
.pipe(
327320
timeout(BUILD_TIMEOUT),
328321
concatMap(async ({ result, logs }, index) => {
@@ -365,11 +358,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
365358
harness.expectFile('dist/browser/main.js').content.toContain('Hello, world!');
366359
harness.expectFile('dist/browser/main.js').content.toContain('Guten Tag');
367360

368-
// Test complete - abort watch mode
369-
builderAbort?.abort();
370361
break;
371362
}
372363
}),
364+
take(4),
373365
count(),
374366
)
375367
.toPromise();

packages/angular_devkit/build_angular/src/builders/application/tests/behavior/rebuild-global_styles_spec.ts

+5-10
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import { concatMap, count, timeout } from 'rxjs';
9+
import { concatMap, count, take, timeout } from 'rxjs';
1010
import { buildApplication } from '../../index';
1111
import { APPLICATION_BUILDER_INFO, BASE_OPTIONS, describeBuilder } from '../setup';
1212

@@ -33,9 +33,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
3333
await harness.writeFile('src/styles.scss', "@import './a';");
3434
await harness.writeFile('src/a.scss', '$primary: aqua;\\nh1 { color: $primary; }');
3535

36-
const builderAbort = new AbortController();
3736
const buildCount = await harness
38-
.execute({ signal: builderAbort.signal, outputLogsOnFailure: false })
37+
.execute({ outputLogsOnFailure: false })
3938
.pipe(
4039
timeout(30000),
4140
concatMap(async ({ result }, index) => {
@@ -60,11 +59,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
6059
harness.expectFile('dist/browser/styles.css').content.not.toContain('color: aqua');
6160
harness.expectFile('dist/browser/styles.css').content.toContain('color: blue');
6261

63-
// Test complete - abort watch mode
64-
builderAbort.abort();
6562
break;
6663
}
6764
}),
65+
take(3),
6866
count(),
6967
)
7068
.toPromise();
@@ -82,9 +80,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
8280
await harness.writeFile('src/styles.scss', "@import './a';");
8381
await harness.writeFile('src/a.scss', 'invalid-invalid-invalid\\nh1 { color: $primary; }');
8482

85-
const builderAbort = new AbortController();
8683
const buildCount = await harness
87-
.execute({ signal: builderAbort.signal, outputLogsOnFailure: false })
84+
.execute({ outputLogsOnFailure: false })
8885
.pipe(
8986
timeout(30000),
9087
concatMap(async ({ result }, index) => {
@@ -105,12 +102,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
105102
expect(result?.success).toBe(true);
106103
harness.expectFile('dist/browser/styles.css').content.not.toContain('color: aqua');
107104
harness.expectFile('dist/browser/styles.css').content.toContain('color: blue');
108-
109-
// Test complete - abort watch mode
110-
builderAbort.abort();
111105
break;
112106
}
113107
}),
108+
take(3),
114109
count(),
115110
)
116111
.toPromise();

packages/angular_devkit/build_angular/src/builders/application/tests/behavior/rebuild-web-workers_spec.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
5555
`,
5656
);
5757

58-
const builderAbort = new AbortController();
5958
const buildCount = await harness
60-
.execute({ outputLogsOnFailure: false, signal: builderAbort.signal })
59+
.execute({ outputLogsOnFailure: false })
6160
.pipe(
6261
timeout(BUILD_TIMEOUT),
6362
concatMap(async ({ result, logs }, index) => {
@@ -125,11 +124,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
125124
.expectFile('dist/browser/main.js')
126125
.content.toMatch(REFERENCED_WORKER_REGEXP);
127126

128-
// Test complete - abort watch mode
129-
builderAbort?.abort();
130127
break;
131128
}
132129
}),
130+
take(5),
133131
count(),
134132
)
135133
.toPromise();

packages/angular_devkit/build_angular/src/builders/application/tests/behavior/typescript-rebuild-lazy_spec.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88

99
import type { logging } from '@angular-devkit/core';
10-
import { concatMap, count, firstValueFrom, timeout } from 'rxjs';
10+
import { concatMap, count, firstValueFrom, take, timeout } from 'rxjs';
1111
import { buildApplication } from '../../index';
1212
import { OutputHashing } from '../../schema';
1313
import { APPLICATION_BUILDER_INFO, BASE_OPTIONS, describeBuilder } from '../setup';
@@ -42,9 +42,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
4242
ssr: true,
4343
});
4444

45-
const builderAbort = new AbortController();
4645
const buildCount = await firstValueFrom(
47-
harness.execute({ outputLogsOnFailure: false, signal: builderAbort.signal }).pipe(
46+
harness.execute({ outputLogsOnFailure: false }).pipe(
4847
timeout(30_000),
4948
concatMap(async ({ result, logs }, index) => {
5049
switch (index) {
@@ -79,10 +78,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
7978
case 3:
8079
expect(result?.success).toBeTrue();
8180

82-
builderAbort.abort();
8381
break;
8482
}
8583
}),
84+
take(4),
8685
count(),
8786
),
8887
);

packages/angular_devkit/build_angular/src/builders/application/tests/options/inline-style-language_spec.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
8787
content.replace('__STYLE_MARKER__', '$primary: indianred;\\nh1 { color: $primary; }'),
8888
);
8989

90-
const builderAbort = new AbortController();
9190
const buildCount = await harness
92-
.execute({ signal: builderAbort.signal })
91+
.execute()
9392
.pipe(
9493
timeout(30000),
9594
concatMap(async ({ result }, index) => {
@@ -129,11 +128,10 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
129128
harness.expectFile('dist/browser/main.js').content.not.toContain('color: aqua');
130129
harness.expectFile('dist/browser/main.js').content.toContain('color: blue');
131130

132-
// Test complete - abort watch mode
133-
builderAbort.abort();
134131
break;
135132
}
136133
}),
134+
take(3),
137135
count(),
138136
)
139137
.toPromise();

0 commit comments

Comments
 (0)