Skip to content

Commit b62ea5d

Browse files
Updating changes to be more inline with the code review requests. Reverting all previous changes and then splitting out the browser/server metafiles and then filtering at the end when were generating the json files
1 parent f1d1a88 commit b62ea5d

File tree

4 files changed

+76
-4
lines changed

4 files changed

+76
-4
lines changed

packages/angular/build/src/builders/application/execute-build.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { extractLicenses } from '../../tools/esbuild/license-extractor';
2121
import { profileAsync } from '../../tools/esbuild/profiling';
2222
import {
2323
calculateEstimatedTransferSizes,
24+
filterMetafile,
2425
logBuildStats,
2526
transformSupportedBrowsersToTargets,
2627
} from '../../tools/esbuild/utils';
@@ -209,7 +210,7 @@ export async function executeBuild(
209210
executionResult.setExternalMetadata(implicitBrowser, implicitServer, [...explicitExternal]);
210211
}
211212

212-
const { metafile, initialFiles, outputFiles } = bundlingResult;
213+
const { metafile, browserMetafile, serverMetafile, initialFiles, outputFiles } = bundlingResult;
213214

214215
executionResult.outputFiles.push(...outputFiles);
215216

@@ -301,13 +302,34 @@ export async function executeBuild(
301302
BuildOutputFileType.Root,
302303
);
303304

304-
// Write metafile if stats option is enabled
305+
// Write metafiles if stats option is enabled, split by browser/server and initial/non-initial
305306
if (options.stats) {
307+
const filterInitialFiles = (outputPath: string) => initialFiles.has(outputPath);
308+
const filterNonInitialFiles = (outputPath: string) => !initialFiles.has(outputPath);
309+
310+
executionResult.addOutputFile(
311+
'browser-stats.json',
312+
JSON.stringify(filterMetafile(browserMetafile, filterNonInitialFiles), null, 2),
313+
BuildOutputFileType.Root,
314+
);
306315
executionResult.addOutputFile(
307-
'stats.json',
308-
JSON.stringify(metafile, null, 2),
316+
'browser-initial-stats.json',
317+
JSON.stringify(filterMetafile(browserMetafile, filterInitialFiles), null, 2),
309318
BuildOutputFileType.Root,
310319
);
320+
321+
if (serverMetafile) {
322+
executionResult.addOutputFile(
323+
'server-stats.json',
324+
JSON.stringify(filterMetafile(serverMetafile, filterNonInitialFiles), null, 2),
325+
BuildOutputFileType.Root,
326+
);
327+
executionResult.addOutputFile(
328+
'server-initial-stats.json',
329+
JSON.stringify(filterMetafile(serverMetafile, filterInitialFiles), null, 2),
330+
BuildOutputFileType.Root,
331+
);
332+
}
311333
}
312334

313335
if (!jsonLogs) {

packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ export class ComponentStylesheetBundler {
278278
contents,
279279
outputFiles,
280280
metafile,
281+
browserMetafile: metafile,
281282
referencedFiles,
282283
externalImports: result.externalImports,
283284
initialFiles: new Map(),

packages/angular/build/src/tools/esbuild/bundler-context.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export type BundleContextResult =
2929
errors: undefined;
3030
warnings: Message[];
3131
metafile: Metafile;
32+
browserMetafile: Metafile;
33+
serverMetafile?: Metafile;
3234
outputFiles: BuildOutputFile[];
3335
initialFiles: Map<string, InitialFileRecord>;
3436
externalImports: {
@@ -128,6 +130,8 @@ export class BundlerContext {
128130
let errors: Message[] | undefined;
129131
const warnings: Message[] = [];
130132
const metafile: Metafile = { inputs: {}, outputs: {} };
133+
const browserMetafile: Metafile = { inputs: {}, outputs: {} };
134+
let serverMetafile: Metafile | undefined;
131135
const initialFiles = new Map<string, InitialFileRecord>();
132136
const externalImportsBrowser = new Set<string>();
133137
const externalImportsServer = new Set<string>();
@@ -148,6 +152,17 @@ export class BundlerContext {
148152
Object.assign(metafile.outputs, result.metafile.outputs);
149153
}
150154

155+
// Keep browser and server metafiles isolated for separate stats output
156+
if (result.browserMetafile) {
157+
Object.assign(browserMetafile.inputs, result.browserMetafile.inputs);
158+
Object.assign(browserMetafile.outputs, result.browserMetafile.outputs);
159+
}
160+
if (result.serverMetafile) {
161+
serverMetafile ??= { inputs: {}, outputs: {} };
162+
Object.assign(serverMetafile.inputs, result.serverMetafile.inputs);
163+
Object.assign(serverMetafile.outputs, result.serverMetafile.outputs);
164+
}
165+
151166
result.initialFiles.forEach((value, key) => initialFiles.set(key, value));
152167

153168
outputFiles.push(...result.outputFiles);
@@ -170,6 +185,8 @@ export class BundlerContext {
170185
errors,
171186
warnings,
172187
metafile,
188+
browserMetafile,
189+
serverMetafile,
173190
initialFiles,
174191
outputFiles,
175192
externalImports: {
@@ -414,6 +431,8 @@ export class BundlerContext {
414431
[isPlatformServer ? 'server' : 'browser']: externalImports,
415432
},
416433
externalConfiguration,
434+
browserMetafile: isPlatformServer ? { inputs: {}, outputs: {} } : result.metafile,
435+
serverMetafile: isPlatformServer ? result.metafile : undefined,
417436
errors: undefined,
418437
};
419438
}

packages/angular/build/src/tools/esbuild/utils.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,36 @@ import {
2929
PrerenderedRoutesRecord,
3030
} from './bundler-execution-result';
3131

32+
/**
33+
* Filters a metafile to only include outputs matching a predicate,
34+
* along with the inputs those outputs directly reference.
35+
*/
36+
export function filterMetafile(
37+
metafile: Metafile,
38+
predicate: (outputPath: string) => boolean,
39+
): Metafile {
40+
const filteredOutputs: Metafile['outputs'] = {};
41+
const referencedInputs = new Set<string>();
42+
43+
for (const [path, output] of Object.entries(metafile.outputs)) {
44+
if (predicate(path)) {
45+
filteredOutputs[path] = output;
46+
for (const inputPath of Object.keys(output.inputs)) {
47+
referencedInputs.add(inputPath);
48+
}
49+
}
50+
}
51+
52+
const filteredInputs: Metafile['inputs'] = {};
53+
for (const [inputPath, input] of Object.entries(metafile.inputs)) {
54+
if (referencedInputs.has(inputPath)) {
55+
filteredInputs[inputPath] = input;
56+
}
57+
}
58+
59+
return { inputs: filteredInputs, outputs: filteredOutputs };
60+
}
61+
3262
export function logBuildStats(
3363
metafile: Metafile,
3464
outputFiles: BuildOutputFile[],

0 commit comments

Comments
 (0)