Skip to content

Commit 7368122

Browse files
author
Angular Builds
committed
7af63b4 refactor(@angular-devkit/build-angular): reduce custom code in browser-esbuild implementation
1 parent 216fd4d commit 7368122

File tree

7 files changed

+40
-76
lines changed

7 files changed

+40
-76
lines changed

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
22
"name": "@angular-devkit/build-angular",
3-
"version": "18.3.0-next.0+sha-8d650d3",
3+
"version": "18.3.0-next.0+sha-7af63b4",
44
"description": "Angular Webpack Build Facade",
55
"main": "src/index.js",
66
"typings": "src/index.d.ts",
77
"builders": "builders.json",
88
"dependencies": {
99
"@ampproject/remapping": "2.3.0",
10-
"@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#8d650d3",
11-
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#8d650d3",
12-
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#8d650d3",
13-
"@angular/build": "github:angular/angular-build-builds#8d650d3",
10+
"@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#7af63b4",
11+
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#7af63b4",
12+
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#7af63b4",
13+
"@angular/build": "github:angular/angular-build-builds#7af63b4",
1414
"@babel/core": "7.25.2",
1515
"@babel/generator": "7.25.0",
1616
"@babel/helper-annotate-as-pure": "7.24.7",
@@ -21,7 +21,7 @@
2121
"@babel/preset-env": "7.25.3",
2222
"@babel/runtime": "7.25.0",
2323
"@discoveryjs/json-ext": "0.6.1",
24-
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#8d650d3",
24+
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#7af63b4",
2525
"@vitejs/plugin-basic-ssl": "1.1.0",
2626
"ansi-colors": "4.1.3",
2727
"autoprefixer": "10.4.20",

src/builders/browser-esbuild/index.d.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
* Use of this source code is governed by an MIT-style license that can be
66
* found in the LICENSE file at https://angular.dev/license
77
*/
8-
import { Result } from '@angular/build/private';
9-
import { BuilderContext } from '@angular-devkit/architect';
8+
import { type ApplicationBuilderOptions } from '@angular/build';
9+
import { BuilderContext, BuilderOutput } from '@angular-devkit/architect';
1010
import type { Plugin } from 'esbuild';
1111
import type { Schema as BrowserBuilderOptions } from './schema';
12+
export type { BrowserBuilderOptions };
13+
type OutputPathClass = Exclude<ApplicationBuilderOptions['outputPath'], string | undefined>;
1214
/**
1315
* Main execution function for the esbuild-based application builder.
1416
* The options are compatible with the Webpack-based builder.
@@ -18,9 +20,9 @@ import type { Schema as BrowserBuilderOptions } from './schema';
1820
*/
1921
export declare function buildEsbuildBrowser(userOptions: BrowserBuilderOptions, context: BuilderContext, infrastructureSettings?: {
2022
write?: boolean;
21-
}, plugins?: Plugin[]): AsyncIterable<Result>;
22-
export declare function buildEsbuildBrowserArchitect(options: BrowserBuilderOptions, context: BuilderContext): AsyncGenerator<{
23-
success: boolean;
24-
}, void, unknown>;
23+
}, plugins?: Plugin[]): AsyncIterable<BuilderOutput>;
24+
export declare function convertBrowserOptions(options: BrowserBuilderOptions): Omit<ApplicationBuilderOptions, 'outputPath'> & {
25+
outputPath: OutputPathClass;
26+
};
2527
declare const _default: import("../../../../architect/src/internal").Builder<BrowserBuilderOptions & import("../../../../core/src").JsonObject>;
2628
export default _default;

src/builders/browser-esbuild/index.js

Lines changed: 9 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,11 @@
66
* Use of this source code is governed by an MIT-style license that can be
77
* found in the LICENSE file at https://angular.dev/license
88
*/
9-
var __importDefault = (this && this.__importDefault) || function (mod) {
10-
return (mod && mod.__esModule) ? mod : { "default": mod };
11-
};
129
Object.defineProperty(exports, "__esModule", { value: true });
1310
exports.buildEsbuildBrowser = buildEsbuildBrowser;
14-
exports.buildEsbuildBrowserArchitect = buildEsbuildBrowserArchitect;
15-
const private_1 = require("@angular/build/private");
11+
exports.convertBrowserOptions = convertBrowserOptions;
12+
const build_1 = require("@angular/build");
1613
const architect_1 = require("@angular-devkit/architect");
17-
const promises_1 = __importDefault(require("node:fs/promises"));
18-
const node_path_1 = __importDefault(require("node:path"));
1914
const builder_status_warnings_1 = require("./builder-status-warnings");
2015
/**
2116
* Main execution function for the esbuild-based application builder.
@@ -27,55 +22,22 @@ const builder_status_warnings_1 = require("./builder-status-warnings");
2722
async function* buildEsbuildBrowser(userOptions, context, infrastructureSettings, plugins) {
2823
// Inform user of status of builder and options
2924
(0, builder_status_warnings_1.logBuilderStatusWarnings)(userOptions, context);
30-
const normalizedOptions = normalizeOptions(userOptions);
31-
const { deleteOutputPath, outputPath } = normalizedOptions;
32-
const fullOutputPath = node_path_1.default.join(context.workspaceRoot, outputPath.base);
33-
if (deleteOutputPath && infrastructureSettings?.write !== false) {
34-
await (0, private_1.deleteOutputDir)(context.workspaceRoot, outputPath.base);
35-
}
36-
for await (const result of (0, private_1.buildApplicationInternal)(normalizedOptions, context, plugins && { codePlugins: plugins })) {
37-
// Write the file directly from this builder to maintain webpack output compatibility
38-
// and not output browser files into '/browser'.
39-
if (infrastructureSettings?.write !== false &&
40-
(result.kind === private_1.ResultKind.Full || result.kind === private_1.ResultKind.Incremental)) {
41-
const directoryExists = new Set();
42-
// Writes the output file to disk and ensures the containing directories are present
43-
await (0, private_1.emitFilesToDisk)(Object.entries(result.files), async ([filePath, file]) => {
44-
// Ensure output subdirectories exist
45-
const basePath = node_path_1.default.dirname(filePath);
46-
if (basePath && !directoryExists.has(basePath)) {
47-
await promises_1.default.mkdir(node_path_1.default.join(fullOutputPath, basePath), { recursive: true });
48-
directoryExists.add(basePath);
49-
}
50-
if (file.origin === 'memory') {
51-
// Write file contents
52-
await promises_1.default.writeFile(node_path_1.default.join(fullOutputPath, filePath), file.contents);
53-
}
54-
else {
55-
// Copy file contents
56-
await promises_1.default.copyFile(file.inputPath, node_path_1.default.join(fullOutputPath, filePath), promises_1.default.constants.COPYFILE_FICLONE);
57-
}
58-
});
59-
}
60-
yield result;
61-
}
25+
const normalizedOptions = convertBrowserOptions(userOptions);
26+
yield* (0, build_1.buildApplication)(normalizedOptions, context, { codePlugins: plugins });
6227
}
63-
function normalizeOptions(options) {
64-
const { main: browser, outputPath, ngswConfigPath, serviceWorker, polyfills, ...otherOptions } = options;
28+
function convertBrowserOptions(options) {
29+
const { main: browser, outputPath, ngswConfigPath, serviceWorker, polyfills, resourcesOutputPath, ...otherOptions } = options;
6530
return {
6631
browser,
6732
serviceWorker: serviceWorker ? ngswConfigPath : false,
6833
polyfills: typeof polyfills === 'string' ? [polyfills] : polyfills,
6934
outputPath: {
7035
base: outputPath,
7136
browser: '',
37+
server: '',
38+
media: resourcesOutputPath ?? 'media',
7239
},
7340
...otherOptions,
7441
};
7542
}
76-
async function* buildEsbuildBrowserArchitect(options, context) {
77-
for await (const result of buildEsbuildBrowser(options, context)) {
78-
yield { success: result.kind !== private_1.ResultKind.Failure };
79-
}
80-
}
81-
exports.default = (0, architect_1.createBuilder)(buildEsbuildBrowserArchitect);
43+
exports.default = (0, architect_1.createBuilder)(buildEsbuildBrowser);

src/builders/dev-server/builder.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,12 @@ function execute(options, context, transforms = {}, extensions) {
7272
if (options.disableHostCheck) {
7373
context.logger.warn(`The "disableHostCheck" option will not be used because it is not supported by the "${builderName}" builder.`);
7474
}
75-
return (0, rxjs_1.defer)(() => Promise.all([Promise.resolve().then(() => __importStar(require('@angular/build/private'))), Promise.resolve().then(() => __importStar(require('../browser-esbuild')))])).pipe((0, rxjs_1.switchMap)(([{ serveWithVite, buildApplicationInternal }, { buildEsbuildBrowser }]) => serveWithVite(normalizedOptions, builderName, (options, context, codePlugins) => {
75+
return (0, rxjs_1.defer)(() => Promise.all([Promise.resolve().then(() => __importStar(require('@angular/build/private'))), Promise.resolve().then(() => __importStar(require('../browser-esbuild')))])).pipe((0, rxjs_1.switchMap)(([{ serveWithVite, buildApplicationInternal }, { convertBrowserOptions }]) => serveWithVite(normalizedOptions, builderName, (options, context, codePlugins) => {
7676
return builderName === '@angular-devkit/build-angular:browser-esbuild'
7777
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
78-
buildEsbuildBrowser(options, context, { write: false }, codePlugins)
78+
buildApplicationInternal(convertBrowserOptions(options), context, {
79+
codePlugins,
80+
})
7981
: buildApplicationInternal(options, context, { codePlugins });
8082
}, context, transforms, extensions)));
8183
}

src/builders/extract-i18n/application-extraction.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,23 @@ const browser_esbuild_1 = require("../browser-esbuild");
1717
async function extractMessages(options, builderName, context, extractorConstructor) {
1818
const messages = [];
1919
// Setup the build options for the application based on the buildTarget option
20-
const buildOptions = (await context.validateOptions(await context.getTargetOptions(options.buildTarget), builderName));
20+
let buildOptions;
21+
if (builderName === '@angular-devkit/build-angular:application') {
22+
buildOptions = (await context.validateOptions(await context.getTargetOptions(options.buildTarget), builderName));
23+
}
24+
else {
25+
buildOptions = (0, browser_esbuild_1.convertBrowserOptions)((await context.validateOptions(await context.getTargetOptions(options.buildTarget), builderName)));
26+
}
2127
buildOptions.optimization = false;
2228
buildOptions.sourceMap = { scripts: true, vendor: true, styles: false };
2329
buildOptions.localize = false;
2430
buildOptions.budgets = undefined;
2531
buildOptions.index = false;
2632
buildOptions.serviceWorker = false;
27-
let build;
28-
if (builderName === '@angular-devkit/build-angular:application') {
29-
build = private_1.buildApplicationInternal;
30-
buildOptions.ssr = false;
31-
buildOptions.appShell = false;
32-
buildOptions.prerender = false;
33-
}
34-
else {
35-
build = browser_esbuild_1.buildEsbuildBrowser;
36-
}
37-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
38-
const builderResult = await first(build(buildOptions, context, { write: false }));
33+
buildOptions.ssr = false;
34+
buildOptions.appShell = false;
35+
buildOptions.prerender = false;
36+
const builderResult = await first((0, private_1.buildApplicationInternal)(buildOptions, context));
3937
let success = false;
4038
if (!builderResult || builderResult.kind === private_1.ResultKind.Failure) {
4139
context.logger.error('Application build failed.');

src/utils/normalize-cache.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
1010
exports.normalizeCacheOptions = normalizeCacheOptions;
1111
const node_path_1 = require("node:path");
1212
/** Version placeholder is replaced during the build process with actual package version */
13-
const VERSION = '18.3.0-next.0+sha-8d650d3';
13+
const VERSION = '18.3.0-next.0+sha-7af63b4';
1414
function hasCacheMetadata(value) {
1515
return (!!value &&
1616
typeof value === 'object' &&

uniqueId

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Tue Aug 13 2024 09:40:19 GMT+0000 (Coordinated Universal Time)
1+
Tue Aug 13 2024 11:58:17 GMT+0000 (Coordinated Universal Time)

0 commit comments

Comments
 (0)