From bcc4659c180b4bd6fa6af5de1211c15419cf4226 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 4 Apr 2023 09:59:05 -0400 Subject: [PATCH 1/3] fix(@angular-devkit/build-angular): pass listening port in result for esbuild dev server The deprecated protractor builder requires that the result object from a development server provide the port used to access the application if the port is not the default (4200). The newly introduced esbuild development server will now provide the port when available. --- .../build_angular/src/builders/dev-server/vite-server.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts index 9114ffb7eef0..53d6dc8a4d4e 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts @@ -10,6 +10,7 @@ import type { BuilderContext } from '@angular-devkit/architect'; import type { json } from '@angular-devkit/core'; import assert from 'node:assert'; import { BinaryLike, createHash } from 'node:crypto'; +import type { AddressInfo } from 'node:net'; import path from 'node:path'; import { InlineConfig, ViteDevServer, createServer, normalizePath } from 'vite'; import { buildEsbuildBrowser } from '../browser-esbuild'; @@ -51,6 +52,7 @@ export async function* serveWithVite( )) as json.JsonObject & BrowserBuilderOptions; let server: ViteDevServer | undefined; + let listeningAddress: AddressInfo | undefined; const outputFiles = new Map(); const assets = new Map(); // TODO: Switch this to an architect schedule call when infrastructure settings are supported @@ -136,13 +138,14 @@ export async function* serveWithVite( server = await setupServer(serverOptions, outputFiles, assets); await server.listen(); + listeningAddress = server.httpServer?.address() as AddressInfo; // log connection information server.printUrls(); } // TODO: adjust output typings to reflect both development servers - yield { success: true } as unknown as DevServerBuilderOutput; + yield { success: true, port: listeningAddress?.port } as unknown as DevServerBuilderOutput; } await server?.close(); From ce05fc8f172e3002704a3415502b1c8473b30ad9 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 4 Apr 2023 12:35:01 -0400 Subject: [PATCH 2/3] fix(@angular-devkit/architect): allow registered builder teardowns to execute Previously, the base job handler was completing the entire job before any teardowns could attempt to execute. --- .../angular_devkit/architect/index.md | 2 ++ .../architect/src/create-builder.ts | 19 +++------------ .../architect/src/jobs/create-job-handler.ts | 23 +++++++++++++++---- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/goldens/public-api/angular_devkit/architect/index.md b/goldens/public-api/angular_devkit/architect/index.md index 70cdd28738ab..1dc0c183e10e 100644 --- a/goldens/public-api/angular_devkit/architect/index.md +++ b/goldens/public-api/angular_devkit/architect/index.md @@ -451,6 +451,8 @@ export function scheduleTargetAndForget(context: BuilderContext, target: Target, // @public interface SimpleJobHandlerContext extends JobHandlerContext { + // (undocumented) + addTeardown(teardown: () => Promise | void): void; // (undocumented) createChannel: (name: string) => Observer; // (undocumented) diff --git a/packages/angular_devkit/architect/src/create-builder.ts b/packages/angular_devkit/architect/src/create-builder.ts index 2f7f8c85d9df..d832c7e67755 100644 --- a/packages/angular_devkit/architect/src/create-builder.ts +++ b/packages/angular_devkit/architect/src/create-builder.ts @@ -47,9 +47,8 @@ export function createBuilder PromiseLike | void> = []; - let tearingDown = false; let current = 0; let status = ''; let total = 1; @@ -83,18 +82,8 @@ export function createBuilder { switch (i.kind) { - case JobInboundMessageKind.Stop: - // Run teardown logic then complete. - tearingDown = true; - Promise.all(teardownLogics.map((fn) => fn() || Promise.resolve())).then( - () => observer.complete(), - (err) => observer.error(err), - ); - break; case JobInboundMessageKind.Input: - if (!tearingDown) { - onInput(i.value); - } + onInput(i.value); break; } }); @@ -209,9 +198,7 @@ export function createBuilder Promise | void): void { - teardownLogics.push(teardown); - }, + addTeardown, }; context.reportRunning(); diff --git a/packages/angular_devkit/architect/src/jobs/create-job-handler.ts b/packages/angular_devkit/architect/src/jobs/create-job-handler.ts index 36952e56a2ff..531c21e5fdc5 100644 --- a/packages/angular_devkit/architect/src/jobs/create-job-handler.ts +++ b/packages/angular_devkit/architect/src/jobs/create-job-handler.ts @@ -44,6 +44,7 @@ export interface SimpleJobHandlerContext< > extends JobHandlerContext { createChannel: (name: string) => Observer; input: Observable; + addTeardown(teardown: () => Promise | void): void; } /** @@ -72,6 +73,8 @@ export function createJobHandler(); let subscription: Subscription; + const teardownLogics: Array<() => PromiseLike | void> = []; + let tearingDown = false; return new Observable>((subject) => { function complete() { @@ -91,13 +94,22 @@ export function createJobHandler fn())).then( + () => complete(), + () => complete(), + ); + } else { + complete(); + } break; case JobInboundMessageKind.Input: - inputChannel.next(message.value); + if (!tearingDown) { + inputChannel.next(message.value); + } break; } }); @@ -108,6 +120,9 @@ export function createJobHandler = { ...context, input: inputChannel.asObservable(), + addTeardown(teardown: () => Promise | void): void { + teardownLogics.push(teardown); + }, createChannel(name: string) { if (channels.has(name)) { throw new ChannelAlreadyExistException(name); From 71dc5cd31bc4284077f8c339d08356096e32dfd3 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 4 Apr 2023 12:37:16 -0400 Subject: [PATCH 3/3] fix(@angular-devkit/build-angular): keep esbuild server active until builder fully stops Use the now working builder teardown functionality to ensure that the development server is properly closed when the builder is stopped. --- packages/angular_devkit/build_angular/BUILD.bazel | 1 + .../build_angular/src/builders/dev-server/vite-server.ts | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel index 43d70d4bc2eb..3428cb23d4d9 100644 --- a/packages/angular_devkit/build_angular/BUILD.bazel +++ b/packages/angular_devkit/build_angular/BUILD.bazel @@ -340,6 +340,7 @@ LARGE_SPECS = { ], }, "browser-esbuild": { + "shards": 10, "extra_deps": [ "@npm//buffer", ], diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts index 53d6dc8a4d4e..3a07f9004671 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts @@ -148,7 +148,14 @@ export async function* serveWithVite( yield { success: true, port: listeningAddress?.port } as unknown as DevServerBuilderOutput; } - await server?.close(); + if (server) { + let deferred: () => void; + context.addTeardown(async () => { + await server?.close(); + deferred?.(); + }); + await new Promise((resolve) => (deferred = resolve)); + } } async function setupServer(