Skip to content

Commit e02d718

Browse files
committed
refactor(@angular-devkit/build-angular): use single normalized options object in esbuild builder
A single options object is now used within the experimental esbuild-based browser application builder. This removes the need to pass around two different options objects with potentially overlapping properties throughout the build process.
1 parent fc1164b commit e02d718

File tree

2 files changed

+67
-62
lines changed

2 files changed

+67
-62
lines changed

packages/angular_devkit/build_angular/src/builders/browser-esbuild/index.ts

Lines changed: 44 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import * as assert from 'assert';
1111
import type { Message, OutputFile } from 'esbuild';
1212
import * as fs from 'fs/promises';
1313
import * as path from 'path';
14-
import { NormalizedOptimizationOptions, deleteOutputDir } from '../../utils';
14+
import { deleteOutputDir } from '../../utils';
1515
import { copyAssets } from '../../utils/copy-assets';
1616
import { assertIsError } from '../../utils/error';
1717
import { transformSupportedBrowsersToTargets } from '../../utils/esbuild-targets';
@@ -22,61 +22,36 @@ import { getSupportedBrowsers } from '../../utils/supported-browsers';
2222
import { createCompilerPlugin } from './compiler-plugin';
2323
import { bundle, logMessages } from './esbuild';
2424
import { logExperimentalWarnings } from './experimental-warnings';
25-
import { normalizeOptions } from './options';
26-
import { Schema as BrowserBuilderOptions, SourceMapClass } from './schema';
25+
import { NormalizedBrowserOptions, normalizeOptions } from './options';
26+
import { Schema as BrowserBuilderOptions } from './schema';
2727
import { bundleStylesheetText } from './stylesheets';
2828
import { createWatcher } from './watcher';
2929

3030
async function execute(
31-
options: BrowserBuilderOptions,
32-
normalizedOptions: Awaited<ReturnType<typeof normalizeOptions>>,
31+
options: NormalizedBrowserOptions,
3332
context: BuilderContext,
3433
): Promise<BuilderOutput> {
3534
const startTime = Date.now();
3635

3736
const {
3837
projectRoot,
3938
workspaceRoot,
40-
entryPoints,
4139
optimizationOptions,
4240
outputPath,
43-
sourcemapOptions,
44-
tsconfig,
4541
assets,
46-
outputNames,
47-
fileReplacements,
48-
globalStyles,
4942
serviceWorkerOptions,
5043
indexHtmlOptions,
51-
} = normalizedOptions;
44+
} = options;
5245

5346
const target = transformSupportedBrowsersToTargets(
5447
getSupportedBrowsers(projectRoot, context.logger),
5548
);
5649

5750
const [codeResults, styleResults] = await Promise.all([
5851
// Execute esbuild to bundle the application code
59-
bundleCode(
60-
workspaceRoot,
61-
entryPoints,
62-
outputNames,
63-
options,
64-
optimizationOptions,
65-
sourcemapOptions,
66-
tsconfig,
67-
fileReplacements,
68-
target,
69-
),
52+
bundleCode(options, target),
7053
// Execute esbuild to bundle the global stylesheets
71-
bundleGlobalStylesheets(
72-
workspaceRoot,
73-
outputNames,
74-
globalStyles,
75-
options,
76-
optimizationOptions,
77-
sourcemapOptions,
78-
target,
79-
),
54+
bundleGlobalStylesheets(options, target),
8055
]);
8156

8257
// Log all warnings and errors generated during bundling
@@ -204,17 +179,21 @@ function createOutputFileFromText(path: string, text: string): OutputFile {
204179
};
205180
}
206181

207-
async function bundleCode(
208-
workspaceRoot: string,
209-
entryPoints: Record<string, string>,
210-
outputNames: { bundles: string; media: string },
211-
options: BrowserBuilderOptions,
212-
optimizationOptions: NormalizedOptimizationOptions,
213-
sourcemapOptions: SourceMapClass,
214-
tsconfig: string,
215-
fileReplacements: Record<string, string> | undefined,
216-
target: string[],
217-
) {
182+
async function bundleCode(options: NormalizedBrowserOptions, target: string[]) {
183+
const {
184+
workspaceRoot,
185+
entryPoints,
186+
optimizationOptions,
187+
sourcemapOptions,
188+
tsconfig,
189+
outputNames,
190+
fileReplacements,
191+
externalDependencies,
192+
preserveSymlinks,
193+
stylePreprocessorOptions,
194+
advancedOptimizations,
195+
} = options;
196+
218197
return bundle({
219198
absWorkingDir: workspaceRoot,
220199
bundle: true,
@@ -242,18 +221,18 @@ async function bundleCode(
242221
sourcemap: sourcemapOptions.scripts && (sourcemapOptions.hidden ? 'external' : true),
243222
splitting: true,
244223
tsconfig,
245-
external: options.externalDependencies,
224+
external: externalDependencies,
246225
write: false,
247226
platform: 'browser',
248-
preserveSymlinks: options.preserveSymlinks,
227+
preserveSymlinks,
249228
plugins: [
250229
createCompilerPlugin(
251230
// JS/TS options
252231
{
253232
sourcemap: !!sourcemapOptions.scripts,
254233
thirdPartySourcemaps: sourcemapOptions.vendor,
255234
tsconfig,
256-
advancedOptimizations: options.buildOptimizer,
235+
advancedOptimizations,
257236
fileReplacements,
258237
},
259238
// Component stylesheet options
@@ -266,8 +245,8 @@ async function bundleCode(
266245
// of sourcemap processing.
267246
!!sourcemapOptions.styles && (sourcemapOptions.hidden ? false : 'inline'),
268247
outputNames,
269-
includePaths: options.stylePreprocessorOptions?.includePaths,
270-
externalDependencies: options.externalDependencies,
248+
includePaths: stylePreprocessorOptions?.includePaths,
249+
externalDependencies,
271250
target,
272251
},
273252
),
@@ -279,15 +258,18 @@ async function bundleCode(
279258
});
280259
}
281260

282-
async function bundleGlobalStylesheets(
283-
workspaceRoot: string,
284-
outputNames: { bundles: string; media: string },
285-
globalStyles: { name: string; files: string[]; initial: boolean }[],
286-
options: BrowserBuilderOptions,
287-
optimizationOptions: NormalizedOptimizationOptions,
288-
sourcemapOptions: SourceMapClass,
289-
target: string[],
290-
) {
261+
async function bundleGlobalStylesheets(options: NormalizedBrowserOptions, target: string[]) {
262+
const {
263+
workspaceRoot,
264+
optimizationOptions,
265+
sourcemapOptions,
266+
outputNames,
267+
globalStyles,
268+
preserveSymlinks,
269+
externalDependencies,
270+
stylePreprocessorOptions,
271+
} = options;
272+
291273
const outputFiles: OutputFile[] = [];
292274
const initialFiles: FileInfo[] = [];
293275
const errors: Message[] = [];
@@ -305,9 +287,9 @@ async function bundleGlobalStylesheets(
305287
optimization: !!optimizationOptions.styles.minify,
306288
sourcemap: !!sourcemapOptions.styles && (sourcemapOptions.hidden ? 'external' : true),
307289
outputNames: initial ? outputNames : { media: outputNames.media },
308-
includePaths: options.stylePreprocessorOptions?.includePaths,
309-
preserveSymlinks: options.preserveSymlinks,
310-
externalDependencies: options.externalDependencies,
290+
includePaths: stylePreprocessorOptions?.includePaths,
291+
preserveSymlinks,
292+
externalDependencies,
311293
target,
312294
},
313295
);
@@ -401,7 +383,7 @@ export async function* buildEsbuildBrowser(
401383
}
402384

403385
// Initial build
404-
yield await execute(initialOptions, normalizedOptions, context);
386+
yield await execute(normalizedOptions, context);
405387

406388
// Finish if watch mode is not enabled
407389
if (!initialOptions.watch) {
@@ -434,7 +416,7 @@ export async function* buildEsbuildBrowser(
434416
context.logger.info(changes.toDebugString());
435417
}
436418

437-
yield await execute(initialOptions, normalizedOptions, context);
419+
yield await execute(normalizedOptions, context);
438420
}
439421
} finally {
440422
await watcher.close();

packages/angular_devkit/build_angular/src/builders/browser-esbuild/options.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { getIndexInputFile, getIndexOutputFile } from '../../utils/webpack-brows
1515
import { normalizeGlobalStyles } from '../../webpack/utils/helpers';
1616
import { Schema as BrowserBuilderOptions, OutputHashing } from './schema';
1717

18+
export type NormalizedBrowserOptions = Awaited<ReturnType<typeof normalizeOptions>>;
19+
1820
/**
1921
* Normalize the user provided options by creating full paths for all path based options
2022
* and converting multi-form options into a single form that can be directly used
@@ -125,7 +127,28 @@ export async function normalizeOptions(
125127
};
126128
}
127129

130+
// Initial options to keep
131+
const {
132+
baseHref,
133+
buildOptimizer,
134+
crossOrigin,
135+
externalDependencies,
136+
preserveSymlinks,
137+
stylePreprocessorOptions,
138+
subresourceIntegrity,
139+
verbose,
140+
} = options;
141+
142+
// Return all the normalized options
128143
return {
144+
advancedOptimizations: buildOptimizer,
145+
baseHref,
146+
crossOrigin,
147+
externalDependencies,
148+
preserveSymlinks,
149+
stylePreprocessorOptions,
150+
subresourceIntegrity,
151+
verbose,
129152
workspaceRoot,
130153
entryPoints,
131154
optimizationOptions,

0 commit comments

Comments
 (0)