@angular/build 22.2.0-next.0 → 22.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -7
- package/src/builders/application/build-action.js +2 -2
- package/src/builders/application/build-action.js.map +1 -1
- package/src/builders/application/execute-build.js +153 -140
- package/src/builders/application/execute-build.js.map +1 -1
- package/src/private.d.ts +0 -1
- package/src/private.js +0 -2
- package/src/private.js.map +1 -1
- package/src/tools/angular/linker/oxc-ast-host.d.ts +33 -0
- package/src/tools/angular/linker/oxc-ast-host.js +204 -0
- package/src/tools/angular/linker/oxc-ast-host.js.map +1 -0
- package/src/tools/angular/linker/oxc-linker.d.ts +25 -0
- package/src/tools/angular/linker/oxc-linker.js +145 -0
- package/src/tools/angular/linker/oxc-linker.js.map +1 -0
- package/src/tools/angular/linker/string-ast-factory.d.ts +86 -0
- package/src/tools/angular/linker/string-ast-factory.js +223 -0
- package/src/tools/angular/linker/string-ast-factory.js.map +1 -0
- package/src/tools/babel/plugins/oxc-transform.js +9 -9
- package/src/tools/babel/plugins/oxc-transform.js.map +1 -1
- package/src/tools/babel/plugins/types.d.ts +8 -8
- package/src/tools/esbuild/angular/compilation-state.js +6 -6
- package/src/tools/esbuild/angular/compilation-state.js.map +1 -1
- package/src/tools/esbuild/angular/source-file-cache.d.ts +6 -0
- package/src/tools/esbuild/angular/source-file-cache.js +12 -0
- package/src/tools/esbuild/angular/source-file-cache.js.map +1 -1
- package/src/tools/esbuild/bundler-execution-result.d.ts +2 -1
- package/src/tools/esbuild/bundler-execution-result.js +15 -6
- package/src/tools/esbuild/bundler-execution-result.js.map +1 -1
- package/src/tools/esbuild/i18n-inliner.js +2 -2
- package/src/tools/esbuild/i18n-inliner.js.map +1 -1
- package/src/tools/esbuild/javascript-transformer-worker.js +78 -83
- package/src/tools/esbuild/javascript-transformer-worker.js.map +1 -1
- package/src/tools/esbuild/license-extractor.js +18 -11
- package/src/tools/esbuild/license-extractor.js.map +1 -1
- package/src/tools/esbuild/load-result-cache.d.ts +2 -1
- package/src/tools/esbuild/load-result-cache.js +22 -2
- package/src/tools/esbuild/load-result-cache.js.map +1 -1
- package/src/tools/esbuild/persistent-load-result-cache.d.ts +87 -0
- package/src/tools/esbuild/persistent-load-result-cache.js +267 -0
- package/src/tools/esbuild/persistent-load-result-cache.js.map +1 -0
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.d.ts +35 -0
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.js +68 -0
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.js.map +1 -0
- package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.js +1 -0
- package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.js.map +1 -1
- package/src/utils/environment-options.d.ts +6 -0
- package/src/utils/environment-options.js +7 -1
- package/src/utils/environment-options.js.map +1 -1
- package/src/utils/normalize-cache.js +1 -1
- package/src/tools/babel/plugins/add-code-coverage.d.ts +0 -14
- package/src/tools/babel/plugins/add-code-coverage.js +0 -44
- package/src/tools/babel/plugins/add-code-coverage.js.map +0 -1
- package/src/tools/babel/plugins/adjust-static-class-members.d.ts +0 -25
- package/src/tools/babel/plugins/adjust-static-class-members.js +0 -349
- package/src/tools/babel/plugins/adjust-static-class-members.js.map +0 -1
- package/src/tools/babel/plugins/adjust-typescript-enums.d.ts +0 -21
- package/src/tools/babel/plugins/adjust-typescript-enums.js +0 -113
- package/src/tools/babel/plugins/adjust-typescript-enums.js.map +0 -1
- package/src/tools/babel/plugins/elide-angular-metadata.d.ts +0 -23
- package/src/tools/babel/plugins/elide-angular-metadata.js +0 -110
- package/src/tools/babel/plugins/elide-angular-metadata.js.map +0 -1
- package/src/tools/babel/plugins/index.d.ts +0 -11
- package/src/tools/babel/plugins/index.js +0 -22
- package/src/tools/babel/plugins/index.js.map +0 -1
- package/src/tools/babel/plugins/pure-toplevel-functions.d.ts +0 -13
- package/src/tools/babel/plugins/pure-toplevel-functions.js +0 -128
- package/src/tools/babel/plugins/pure-toplevel-functions.js.map +0 -1
- package/src/tools/babel/typings.d.ts +0 -21
|
@@ -45,10 +45,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
exports.default = transformJavaScript;
|
|
47
47
|
const core_1 = require("@babel/core");
|
|
48
|
-
const node_fs_1 = __importDefault(require("node:fs"));
|
|
49
48
|
const node_module_1 = require("node:module");
|
|
50
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
51
49
|
const piscina_1 = __importDefault(require("piscina"));
|
|
50
|
+
const environment_options_js_1 = require("../../utils/environment-options.js");
|
|
52
51
|
const source_map_1 = require("../../utils/source-map");
|
|
53
52
|
const textDecoder = new TextDecoder();
|
|
54
53
|
const textEncoder = new TextEncoder();
|
|
@@ -59,6 +58,34 @@ const textEncoder = new TextEncoder();
|
|
|
59
58
|
* the names MUST begin with this prefix.
|
|
60
59
|
*/
|
|
61
60
|
const LINKER_DECLARATION_PREFIX = 'ɵɵngDeclare';
|
|
61
|
+
async function instrumentCoverage(filename, data, useInputSourcemap) {
|
|
62
|
+
try {
|
|
63
|
+
let resolvedPath = 'istanbul-lib-instrument';
|
|
64
|
+
try {
|
|
65
|
+
const requireFn = (0, node_module_1.createRequire)(filename);
|
|
66
|
+
resolvedPath = requireFn.resolve('istanbul-lib-instrument');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Fallback to pool worker import traversal
|
|
70
|
+
}
|
|
71
|
+
const { createInstrumenter } = (await Promise.resolve(`${resolvedPath}`).then(s => __importStar(require(s))));
|
|
72
|
+
const instrumenter = createInstrumenter({
|
|
73
|
+
produceSourceMap: useInputSourcemap,
|
|
74
|
+
esModules: true,
|
|
75
|
+
});
|
|
76
|
+
const inputSourceMap = useInputSourcemap ? (0, source_map_1.loadInputSourceMap)(filename, data) : undefined;
|
|
77
|
+
const instrumentedCode = instrumenter.instrumentSync(data, filename, inputSourceMap);
|
|
78
|
+
const lastMap = instrumenter.lastSourceMap();
|
|
79
|
+
if (useInputSourcemap && lastMap) {
|
|
80
|
+
const inlineMap = Buffer.from(JSON.stringify(lastMap)).toString('base64');
|
|
81
|
+
return instrumentedCode + `\n//# sourceMappingURL=data:application/json;base64,${inlineMap}`;
|
|
82
|
+
}
|
|
83
|
+
return (0, source_map_1.removeSourceMappingURL)(instrumentedCode);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw new Error(`The 'istanbul-lib-instrument' package is required for code coverage but was not found. Please install the package.`, { cause: error });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
62
89
|
async function transformJavaScript(request) {
|
|
63
90
|
const { filename, data, ...options } = request;
|
|
64
91
|
const textData = typeof data === 'string' ? data : textDecoder.decode(data);
|
|
@@ -67,55 +94,61 @@ async function transformJavaScript(request) {
|
|
|
67
94
|
return piscina_1.default.move(textEncoder.encode(transformedData));
|
|
68
95
|
}
|
|
69
96
|
/**
|
|
70
|
-
* Cached instance of the
|
|
97
|
+
* Cached instance of the OXC linker module.
|
|
71
98
|
*/
|
|
72
|
-
let
|
|
99
|
+
let oxcLinkerModule;
|
|
73
100
|
async function transformJavaScriptImpl(filename, data, options) {
|
|
74
|
-
const shouldLink = !options.skipLinker &&
|
|
101
|
+
const shouldLink = !options.skipLinker && requiresLinking(filename, data);
|
|
75
102
|
const useInputSourcemap = options.sourcemap &&
|
|
76
103
|
(!!options.thirdPartySourcemaps || !/[\\/]node_modules[\\/]/.test(filename));
|
|
77
|
-
|
|
104
|
+
let code = data;
|
|
78
105
|
if (options.instrumentForCoverage) {
|
|
79
|
-
|
|
80
|
-
let resolvedPath = 'istanbul-lib-instrument';
|
|
81
|
-
try {
|
|
82
|
-
const requireFn = (0, node_module_1.createRequire)(filename);
|
|
83
|
-
resolvedPath = requireFn.resolve('istanbul-lib-instrument');
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// Fallback to pool worker import traversal
|
|
87
|
-
}
|
|
88
|
-
const istanbul = await Promise.resolve(`${resolvedPath}`).then(s => __importStar(require(s)));
|
|
89
|
-
const programVisitor = istanbul.programVisitor ?? istanbul.default?.programVisitor;
|
|
90
|
-
if (!programVisitor) {
|
|
91
|
-
throw new Error('programVisitor is not available in istanbul-lib-instrument.');
|
|
92
|
-
}
|
|
93
|
-
const { default: coveragePluginFactory } = await Promise.resolve().then(() => __importStar(require('../babel/plugins/add-code-coverage.js')));
|
|
94
|
-
babelPlugins.push(coveragePluginFactory(programVisitor));
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
throw new Error(`The 'istanbul-lib-instrument' package is required for code coverage but was not found. Please install the package.`, { cause: error });
|
|
98
|
-
}
|
|
106
|
+
code = await instrumentCoverage(filename, code, useInputSourcemap);
|
|
99
107
|
}
|
|
100
108
|
if (shouldLink) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
109
|
+
if (environment_options_js_1.useBabelLinker) {
|
|
110
|
+
const { createEs2015LinkerPlugin } = await Promise.resolve().then(() => __importStar(require('@angular/compiler-cli/linker/babel')));
|
|
111
|
+
const { ConsoleLogger, LogLevel } = await Promise.resolve().then(() => __importStar(require('@angular/compiler-cli')));
|
|
112
|
+
const result = await (0, core_1.transformAsync)(code, {
|
|
113
|
+
filename,
|
|
114
|
+
inputSourceMap: (useInputSourcemap ? undefined : false),
|
|
115
|
+
sourceMaps: useInputSourcemap ? 'inline' : false,
|
|
116
|
+
compact: false,
|
|
117
|
+
configFile: false,
|
|
118
|
+
babelrc: false,
|
|
119
|
+
browserslistConfigFile: false,
|
|
120
|
+
plugins: [
|
|
121
|
+
createEs2015LinkerPlugin({
|
|
122
|
+
fileSystem: {
|
|
123
|
+
exists: () => false,
|
|
124
|
+
readFile: () => '',
|
|
125
|
+
resolve: (...paths) => paths.join('/'),
|
|
126
|
+
dirname: (path) => path.split('/').slice(0, -1).join('/'),
|
|
127
|
+
relative: (_from, to) => to,
|
|
128
|
+
},
|
|
129
|
+
logger: new ConsoleLogger(LogLevel.info),
|
|
130
|
+
linkerJitMode: options.jit,
|
|
131
|
+
// This is a workaround until https://github.com/angular/angular/issues/42769 is fixed.
|
|
132
|
+
sourceMapping: false,
|
|
133
|
+
}),
|
|
134
|
+
],
|
|
135
|
+
});
|
|
136
|
+
code = result?.code ?? code;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
oxcLinkerModule ??= await Promise.resolve().then(() => __importStar(require('../angular/linker/oxc-linker.js')));
|
|
140
|
+
const result = oxcLinkerModule.linkWithOxc(filename, code, {
|
|
141
|
+
sourcemap: useInputSourcemap,
|
|
142
|
+
jit: options.jit,
|
|
143
|
+
skipCheck: true,
|
|
144
|
+
});
|
|
145
|
+
code = result.code;
|
|
146
|
+
if (useInputSourcemap && result.map) {
|
|
147
|
+
code = (0, source_map_1.removeSourceMappingURL)(code);
|
|
148
|
+
const base64Map = Buffer.from(result.map).toString('base64');
|
|
149
|
+
code += `\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${base64Map}`;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
119
152
|
}
|
|
120
153
|
// Run advanced optimizations using our fast oxc-transform
|
|
121
154
|
if (options.advancedOptimizations) {
|
|
@@ -140,7 +173,7 @@ async function transformJavaScriptImpl(filename, data, options) {
|
|
|
140
173
|
// Strip sourcemaps if they should not be used
|
|
141
174
|
return useInputSourcemap ? code : (0, source_map_1.removeSourceMappingURL)(code);
|
|
142
175
|
}
|
|
143
|
-
|
|
176
|
+
function requiresLinking(path, source) {
|
|
144
177
|
// @angular/core and @angular/compiler will cause false positives
|
|
145
178
|
// Also, TypeScript files do not require linking
|
|
146
179
|
if (/[\\/]@angular[\\/](?:compiler|core)|\.tsx?$/.test(path)) {
|
|
@@ -151,42 +184,4 @@ async function requiresLinking(path, source) {
|
|
|
151
184
|
// and the result would be an unnecessary no-op additional plugin pass.
|
|
152
185
|
return source.includes(LINKER_DECLARATION_PREFIX);
|
|
153
186
|
}
|
|
154
|
-
async function createLinkerPlugin(options) {
|
|
155
|
-
linkerPluginCreator ??= (await Promise.resolve().then(() => __importStar(require('@angular/compiler-cli/linker/babel'))))
|
|
156
|
-
.createEs2015LinkerPlugin;
|
|
157
|
-
const linkerPlugin = linkerPluginCreator({
|
|
158
|
-
linkerJitMode: options.jit,
|
|
159
|
-
// This is a workaround until https://github.com/angular/angular/issues/42769 is fixed.
|
|
160
|
-
sourceMapping: false,
|
|
161
|
-
logger: {
|
|
162
|
-
level: 1, // Info level
|
|
163
|
-
debug(...args) {
|
|
164
|
-
// eslint-disable-next-line no-console
|
|
165
|
-
console.debug(args);
|
|
166
|
-
},
|
|
167
|
-
info(...args) {
|
|
168
|
-
// eslint-disable-next-line no-console
|
|
169
|
-
console.info(args);
|
|
170
|
-
},
|
|
171
|
-
warn(...args) {
|
|
172
|
-
// eslint-disable-next-line no-console
|
|
173
|
-
console.warn(args);
|
|
174
|
-
},
|
|
175
|
-
error(...args) {
|
|
176
|
-
// eslint-disable-next-line no-console
|
|
177
|
-
console.error(args);
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
fileSystem: {
|
|
181
|
-
resolve: node_path_1.default.resolve,
|
|
182
|
-
exists: node_fs_1.default.existsSync,
|
|
183
|
-
dirname: node_path_1.default.dirname,
|
|
184
|
-
relative: node_path_1.default.relative,
|
|
185
|
-
readFile: node_fs_1.default.readFileSync,
|
|
186
|
-
// Node.JS types don't overlap the Compiler types.
|
|
187
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
188
|
-
},
|
|
189
|
-
});
|
|
190
|
-
return linkerPlugin;
|
|
191
|
-
}
|
|
192
187
|
//# sourceMappingURL=javascript-transformer-worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"javascript-transformer-worker.js","sourceRoot":"","sources":["javascript-transformer-worker.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"javascript-transformer-worker.js","sourceRoot":"","sources":["javascript-transformer-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,9 +31,9 @@ const NODE_MODULE_SEGMENT = 'node_modules';
|
|
|
31
31
|
*/
|
|
32
32
|
const CUSTOM_LICENSE_TEXT = 'SEE LICENSE IN ';
|
|
33
33
|
/**
|
|
34
|
-
* A
|
|
34
|
+
* A regular expression for commonly named license files found within packages.
|
|
35
35
|
*/
|
|
36
|
-
const
|
|
36
|
+
const LICENSE_FILE_REGEXP = /^(?:mit-)?licen[cs]e(?:$|[-._])/i;
|
|
37
37
|
/**
|
|
38
38
|
* Header text that will be added to the top of the output license extraction file.
|
|
39
39
|
*/
|
|
@@ -61,6 +61,7 @@ const EXTRACTION_FILE_SEPARATOR = '-'.repeat(80) + '\n';
|
|
|
61
61
|
async function extractLicenses(metafile, rootDirectory) {
|
|
62
62
|
let extractedLicenseContent = `${EXTRACTION_FILE_HEADER}\n${EXTRACTION_FILE_SEPARATOR}`;
|
|
63
63
|
const seenPaths = new Set();
|
|
64
|
+
const seenPackageDirectories = new Set();
|
|
64
65
|
const seenPackages = new Set();
|
|
65
66
|
for (const entry of Object.values(metafile.outputs)) {
|
|
66
67
|
for (const [inputPath, { bytesInOutput }] of Object.entries(entry.inputs)) {
|
|
@@ -99,6 +100,10 @@ async function extractLicenses(metafile, rootDirectory) {
|
|
|
99
100
|
? `${nameOrScope}/${nameOrFile}`
|
|
100
101
|
: nameOrScope;
|
|
101
102
|
const packageDirectory = node_path_1.default.join(baseDirectory, packageName);
|
|
103
|
+
if (seenPackageDirectories.has(packageDirectory)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
seenPackageDirectories.add(packageDirectory);
|
|
102
107
|
// Load the package's metadata to find the package's name, version, and license type
|
|
103
108
|
const packageJsonPath = node_path_1.default.join(packageDirectory, 'package.json');
|
|
104
109
|
let packageJson;
|
|
@@ -118,10 +123,10 @@ async function extractLicenses(metafile, rootDirectory) {
|
|
|
118
123
|
// Attempt to find license text inside package
|
|
119
124
|
let licenseText = '';
|
|
120
125
|
if (typeof packageJson.license === 'string' &&
|
|
121
|
-
packageJson.license.
|
|
126
|
+
packageJson.license.toUpperCase().startsWith(CUSTOM_LICENSE_TEXT)) {
|
|
122
127
|
// Attempt to load the package's custom license
|
|
123
128
|
let customLicensePath;
|
|
124
|
-
const customLicenseFile = node_path_1.default.normalize(packageJson.license.slice(CUSTOM_LICENSE_TEXT.length
|
|
129
|
+
const customLicenseFile = node_path_1.default.normalize(packageJson.license.slice(CUSTOM_LICENSE_TEXT.length).trim());
|
|
125
130
|
if (customLicenseFile.startsWith('..') || node_path_1.default.isAbsolute(customLicenseFile)) {
|
|
126
131
|
// Path is attempting to access files outside of the package
|
|
127
132
|
// TODO: Issue warning?
|
|
@@ -130,20 +135,22 @@ async function extractLicenses(metafile, rootDirectory) {
|
|
|
130
135
|
customLicensePath = node_path_1.default.join(packageDirectory, customLicenseFile);
|
|
131
136
|
try {
|
|
132
137
|
licenseText = await (0, promises_1.readFile)(customLicensePath, 'utf-8');
|
|
133
|
-
break;
|
|
134
138
|
}
|
|
135
139
|
catch { }
|
|
136
140
|
}
|
|
137
141
|
}
|
|
138
142
|
else {
|
|
139
143
|
// Search for a license file within the root of the package
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
144
|
+
const entries = await (0, promises_1.readdir)(packageDirectory, { withFileTypes: true }).catch(() => []);
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
if ((entry.isFile() || entry.isSymbolicLink()) && LICENSE_FILE_REGEXP.test(entry.name)) {
|
|
147
|
+
const packageLicensePath = node_path_1.default.join(packageDirectory, entry.name);
|
|
148
|
+
try {
|
|
149
|
+
licenseText = await (0, promises_1.readFile)(packageLicensePath, 'utf-8');
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
catch { }
|
|
145
153
|
}
|
|
146
|
-
catch { }
|
|
147
154
|
}
|
|
148
155
|
}
|
|
149
156
|
// Generate the package's license entry in the output content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license-extractor.js","sourceRoot":"","sources":["license-extractor.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;AAwDH,
|
|
1
|
+
{"version":3,"file":"license-extractor.js","sourceRoot":"","sources":["license-extractor.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;AAwDH,0CA0HC;AA/KD,+CAAqD;AACrD,0DAA6B;AAE7B;;GAEG;AACH,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C;;GAEG;AACH,MAAM,mBAAmB,GAAG,kCAAkC,CAAC;AAE/D;;GAEG;AACH,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC;;GAEG;AACH,MAAM,yBAAyB,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AAExD;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,aAAqB;IAC7E,IAAI,uBAAuB,GAAG,GAAG,sBAAsB,KAAK,yBAAyB,EAAE,CAAC;IAExF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,KAAK,MAAM,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1E,iCAAiC;YACjC,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,+BAA+B;YAC/B,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEzB,yBAAyB;YACzB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,yCAAyC;YACzC,IAAI,aAAa,GAAG,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,WAAW,EAAE,UAAU,CAAC;YAC5B,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,OAAO,aAAa,KAAK,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACrD,MAAM,OAAO,GAAG,mBAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAC7C,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;oBACpC,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM;gBACR,CAAC;gBAED,UAAU,GAAG,WAAW,CAAC;gBACzB,WAAW,GAAG,OAAO,CAAC;gBACtB,aAAa,GAAG,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC9C,CAAC;YAED,mFAAmF;YACnF,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC7C,CAAC,CAAC,GAAG,WAAW,IAAI,UAAU,EAAE;gBAChC,CAAC,CAAC,WAAW,CAAC;YAChB,MAAM,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAE/D,IAAI,sBAAsB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACjD,SAAS;YACX,CAAC;YACD,sBAAsB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAE7C,oFAAoF;YACpF,MAAM,eAAe,GAAG,mBAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YACpE,IAAI,WAAW,CAAC;YAChB,IAAI,CAAC;gBACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,eAAe,EAAE,OAAO,CAAC,CAKhE,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;gBAClB,SAAS;YACX,CAAC;YAED,kCAAkC;YAClC,MAAM,SAAS,GAAG,GAAG,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,SAAS;YACX,CAAC;YACD,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE5B,8CAA8C;YAC9C,IAAI,WAAW,GAAG,EAAE,CAAC;YACrB,IACE,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;gBACvC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EACjE,CAAC;gBACD,+CAA+C;gBAC/C,IAAI,iBAAiB,CAAC;gBACtB,MAAM,iBAAiB,GAAG,mBAAI,CAAC,SAAS,CACtC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAC7D,CAAC;gBACF,IAAI,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,mBAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAC7E,4DAA4D;oBAC5D,uBAAuB;gBACzB,CAAC;qBAAM,CAAC;oBACN,iBAAiB,GAAG,mBAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;oBACnE,IAAI,CAAC;wBACH,WAAW,GAAG,MAAM,IAAA,mBAAQ,EAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;oBAC3D,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,2DAA2D;gBAC3D,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAEzF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvF,MAAM,kBAAkB,GAAG,mBAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;wBACnE,IAAI,CAAC;4BACH,WAAW,GAAG,MAAM,IAAA,mBAAQ,EAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;4BAC1D,MAAM;wBACR,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;oBACZ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,6DAA6D;YAC7D,uBAAuB,IAAI,YAAY,WAAW,CAAC,IAAI,IAAI,CAAC;YAC5D,uBAAuB,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YACxF,uBAAuB,IAAI,KAAK,WAAW,IAAI,CAAC;YAChD,uBAAuB,IAAI,yBAAyB,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,uBAAuB,CAAC;AACjC,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { OnLoadResult, PluginBuild } from 'esbuild';
|
|
9
9
|
export interface LoadResultCache {
|
|
10
|
-
get(path: string): OnLoadResult | undefined;
|
|
10
|
+
get(path: string): OnLoadResult | Promise<OnLoadResult | undefined> | undefined;
|
|
11
11
|
put(path: string, result: OnLoadResult): Promise<void>;
|
|
12
12
|
readonly watchFiles: ReadonlyArray<string>;
|
|
13
13
|
}
|
|
@@ -18,4 +18,5 @@ export declare class MemoryLoadResultCache implements LoadResultCache {
|
|
|
18
18
|
put(path: string, result: OnLoadResult): Promise<void>;
|
|
19
19
|
invalidate(path: string): boolean;
|
|
20
20
|
get watchFiles(): string[];
|
|
21
|
+
clear(): void;
|
|
21
22
|
}
|
|
@@ -16,7 +16,7 @@ function createCachedLoad(cache, callback) {
|
|
|
16
16
|
}
|
|
17
17
|
return async (args) => {
|
|
18
18
|
const loadCacheKey = `${args.namespace}:${args.path}`;
|
|
19
|
-
let result = cache.get(loadCacheKey);
|
|
19
|
+
let result = await cache.get(loadCacheKey);
|
|
20
20
|
if (result === undefined) {
|
|
21
21
|
result = await callback(args);
|
|
22
22
|
// Do not cache null or undefined
|
|
@@ -24,7 +24,9 @@ function createCachedLoad(cache, callback) {
|
|
|
24
24
|
// Ensure requested path is included if it was a resolved file
|
|
25
25
|
if (args.namespace === 'file') {
|
|
26
26
|
result.watchFiles ??= [];
|
|
27
|
-
result.watchFiles.
|
|
27
|
+
if (!result.watchFiles.includes(args.path)) {
|
|
28
|
+
result.watchFiles.push(args.path);
|
|
29
|
+
}
|
|
28
30
|
}
|
|
29
31
|
await cache.put(loadCacheKey, result);
|
|
30
32
|
}
|
|
@@ -35,10 +37,23 @@ function createCachedLoad(cache, callback) {
|
|
|
35
37
|
class MemoryLoadResultCache {
|
|
36
38
|
#loadResults = new Map();
|
|
37
39
|
#fileDependencies = new Map();
|
|
40
|
+
#watchFilesPerKey = new Map();
|
|
38
41
|
get(path) {
|
|
39
42
|
return this.#loadResults.get(path);
|
|
40
43
|
}
|
|
41
44
|
async put(path, result) {
|
|
45
|
+
if (result.errors && result.errors.length > 0) {
|
|
46
|
+
const previousWatchFiles = this.#watchFilesPerKey.get(path);
|
|
47
|
+
if (previousWatchFiles) {
|
|
48
|
+
result.watchFiles = Array.from(new Set([...(result.watchFiles ?? []), ...previousWatchFiles]));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (result.watchFiles && result.watchFiles.length > 0) {
|
|
52
|
+
this.#watchFilesPerKey.set(path, [...result.watchFiles]);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.#watchFilesPerKey.delete(path);
|
|
56
|
+
}
|
|
42
57
|
this.#loadResults.set(path, result);
|
|
43
58
|
if (result.watchFiles) {
|
|
44
59
|
for (const watchFile of result.watchFiles) {
|
|
@@ -71,6 +86,11 @@ class MemoryLoadResultCache {
|
|
|
71
86
|
// are namespaced request paths and not disk-based file paths.
|
|
72
87
|
return [...this.#fileDependencies.keys()];
|
|
73
88
|
}
|
|
89
|
+
clear() {
|
|
90
|
+
this.#loadResults.clear();
|
|
91
|
+
this.#fileDependencies.clear();
|
|
92
|
+
this.#watchFilesPerKey.clear();
|
|
93
|
+
}
|
|
74
94
|
}
|
|
75
95
|
exports.MemoryLoadResultCache = MemoryLoadResultCache;
|
|
76
96
|
//# sourceMappingURL=load-result-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-result-cache.js","sourceRoot":"","sources":["load-result-cache.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAWH,
|
|
1
|
+
{"version":3,"file":"load-result-cache.js","sourceRoot":"","sources":["load-result-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @fileoverview
|
|
10
|
+
* Implements a generic, two-tier (L1 memory + L2 persistent disk store) caching system for
|
|
11
|
+
* esbuild plugin `OnLoadResult` outcomes across the `@angular/build` compiler pipeline.
|
|
12
|
+
*
|
|
13
|
+
* Supported Module Types:
|
|
14
|
+
* 1. **Disk File Modules** (`file:` namespace): Standard disk-based source files (TS, JS, CSS, Sass, Less).
|
|
15
|
+
* Cache keys are computed using the root `globalConfigHash`, file path, and file content. Validity is
|
|
16
|
+
* verified via fast-path metadata (`mtimeMs` + `size`) with fallback to content hashing (`sha256`).
|
|
17
|
+
* 2. **Custom Plugin Namespace Modules** (e.g. `angular:script/global`, `sass:`): Modules loaded through
|
|
18
|
+
* custom esbuild namespaces that resolve to disk source files.
|
|
19
|
+
* 3. **Virtual Modules & Remote Resources** (e.g. `angular:styles/component`, `css-inline-fonts`): Synthetic
|
|
20
|
+
* in-memory modules or remote asset declarations whose compiled outcomes depend on parent source file
|
|
21
|
+
* dependencies (`watchFiles`) or global configuration options (`globalConfigHash`).
|
|
22
|
+
*
|
|
23
|
+
* Key Exported Types:
|
|
24
|
+
* - {@link PersistentLoadResultCache}: Primary two-tier cache manager implementing `LoadResultCache`.
|
|
25
|
+
* - {@link CachedLoadResultEntry}: Serialized structure persisted to disk for cached esbuild `OnLoadResult` items.
|
|
26
|
+
* - {@link CachedDependencyMetadata}: Per-dependency file metadata (`hash`, `mtimeMs`, `size`) used for cache validation and healing.
|
|
27
|
+
*/
|
|
28
|
+
import type { Loader, OnLoadResult, PartialMessage } from 'esbuild';
|
|
29
|
+
import type { Cache as PersistentCacheStore } from './cache';
|
|
30
|
+
import { LoadResultCache } from './load-result-cache';
|
|
31
|
+
/**
|
|
32
|
+
* Metadata for a single watch file dependency.
|
|
33
|
+
*/
|
|
34
|
+
export interface CachedDependencyMetadata {
|
|
35
|
+
hash: string;
|
|
36
|
+
mtimeMs: number;
|
|
37
|
+
size: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Serialized representation of any esbuild load result stored in persistent cache.
|
|
41
|
+
*/
|
|
42
|
+
export interface CachedLoadResultEntry {
|
|
43
|
+
/** Compiled output string or binary data */
|
|
44
|
+
contents: string | Uint8Array;
|
|
45
|
+
/** esbuild loader type */
|
|
46
|
+
loader?: Loader;
|
|
47
|
+
/** Absolute paths of all imported/watched dependency files */
|
|
48
|
+
watchFiles: string[];
|
|
49
|
+
/** Absolute paths of all watched directories */
|
|
50
|
+
watchDirs?: string[];
|
|
51
|
+
/** Map of watchFile absolute paths to dependency metadata */
|
|
52
|
+
watchFilesMetadata: Record<string, CachedDependencyMetadata>;
|
|
53
|
+
/** Warnings emitted during load processing */
|
|
54
|
+
warnings?: PartialMessage[];
|
|
55
|
+
/** Errors emitted during load processing */
|
|
56
|
+
errors?: PartialMessage[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Normalizes a namespaced cache key into a valid disk file path if one exists.
|
|
60
|
+
* Handles 'file:' URIs, OS platform differences, and custom plugin namespaces.
|
|
61
|
+
*/
|
|
62
|
+
export declare function extractDiskFilePath(path: string): string | undefined;
|
|
63
|
+
export declare class PersistentLoadResultCache implements LoadResultCache {
|
|
64
|
+
private readonly persistentStore?;
|
|
65
|
+
private readonly globalConfigHash;
|
|
66
|
+
private readonly memoryCache;
|
|
67
|
+
constructor(persistentStore?: PersistentCacheStore<CachedLoadResultEntry> | undefined, globalConfigHash?: string);
|
|
68
|
+
/**
|
|
69
|
+
* Retrieves a load result from cache.
|
|
70
|
+
* Checks L1 memory cache first for immediate watch-mode speed, falling back to L2 persistent disk
|
|
71
|
+
* store on L1 cache miss. L2 persistent cache entries are validated against dependency metadata.
|
|
72
|
+
*/
|
|
73
|
+
get(path: string): Promise<OnLoadResult | undefined>;
|
|
74
|
+
/**
|
|
75
|
+
* Stores a load result in both L1 memory cache and L2 persistent disk store.
|
|
76
|
+
*/
|
|
77
|
+
put(path: string, result: OnLoadResult): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Invalidates cached entries affected by a modified dependency file during watch mode.
|
|
80
|
+
*
|
|
81
|
+
* Note: Invalidation of L1 memory cache is sufficient for active watch mode.
|
|
82
|
+
* Cross-process/cold start stale entries in L2 persistent store are automatically handled
|
|
83
|
+
* during `get()` via dependency metadata verification (`validateAndHealCacheEntry`).
|
|
84
|
+
*/
|
|
85
|
+
invalidate(path: string): boolean;
|
|
86
|
+
get watchFiles(): ReadonlyArray<string>;
|
|
87
|
+
}
|