@angular/build 22.2.0-next.1 → 22.2.0-next.3
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 +10 -8
- package/src/builders/application/build-action.js +14 -3
- package/src/builders/application/build-action.js.map +1 -1
- package/src/builders/application/chunk-optimizer.js +1 -0
- package/src/builders/application/chunk-optimizer.js.map +1 -1
- package/src/builders/application/execute-build.js +2 -1
- package/src/builders/application/execute-build.js.map +1 -1
- package/src/builders/application/setup-bundling.js +2 -2
- package/src/builders/application/setup-bundling.js.map +1 -1
- package/src/builders/dev-server/internal.d.ts +1 -1
- package/src/builders/dev-server/internal.js +2 -2
- package/src/builders/dev-server/internal.js.map +1 -1
- package/src/builders/dev-server/vite/server.js +6 -2
- package/src/builders/dev-server/vite/server.js.map +1 -1
- package/src/builders/unit-test/options.js +1 -1
- package/src/builders/unit-test/options.js.map +1 -1
- package/src/builders/unit-test/test-discovery.js +3 -2
- package/src/builders/unit-test/test-discovery.js.map +1 -1
- package/src/private.d.ts +1 -1
- package/src/private.js +2 -2
- package/src/private.js.map +1 -1
- package/src/tools/angular/angular-host.js +3 -3
- package/src/tools/angular/angular-host.js.map +1 -1
- package/src/tools/angular/compilation/parallel-worker.js +2 -0
- package/src/tools/angular/compilation/parallel-worker.js.map +1 -1
- package/src/tools/angular/linker/oxc-linker.d.ts +2 -1
- package/src/tools/angular/linker/oxc-linker.js +3 -11
- package/src/tools/angular/linker/oxc-linker.js.map +1 -1
- package/src/tools/angular/linker/string-ast-factory.js +17 -6
- package/src/tools/angular/linker/string-ast-factory.js.map +1 -1
- package/src/tools/esbuild/angular/compiler-plugin.js +4 -7
- package/src/tools/esbuild/angular/compiler-plugin.js.map +1 -1
- package/src/tools/esbuild/angular/component-stylesheets.js +5 -6
- package/src/tools/esbuild/angular/component-stylesheets.js.map +1 -1
- package/src/tools/esbuild/application-code-bundle.js +2 -2
- package/src/tools/esbuild/application-code-bundle.js.map +1 -1
- package/src/tools/esbuild/bundler-files.js +3 -5
- package/src/tools/esbuild/bundler-files.js.map +1 -1
- package/src/tools/esbuild/i18n-inliner-worker.d.ts +8 -4
- package/src/tools/esbuild/i18n-inliner-worker.js +40 -7
- package/src/tools/esbuild/i18n-inliner-worker.js.map +1 -1
- package/src/tools/esbuild/i18n-inliner.js +37 -10
- package/src/tools/esbuild/i18n-inliner.js.map +1 -1
- package/src/tools/esbuild/javascript-transformer-worker.d.ts +0 -4
- package/src/tools/esbuild/javascript-transformer-worker.js +105 -55
- package/src/tools/esbuild/javascript-transformer-worker.js.map +1 -1
- package/src/tools/esbuild/javascript-transformer.d.ts +1 -1
- package/src/tools/esbuild/javascript-transformer.js +63 -37
- package/src/tools/esbuild/javascript-transformer.js.map +1 -1
- package/src/tools/esbuild/persistent-load-result-cache.js +11 -13
- package/src/tools/esbuild/persistent-load-result-cache.js.map +1 -1
- package/src/tools/esbuild/sqlite-cache-store.js +51 -1
- package/src/tools/esbuild/sqlite-cache-store.js.map +1 -1
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.js +4 -8
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.js.map +1 -1
- package/src/tools/esbuild/target.d.ts +29 -0
- package/src/tools/esbuild/target.js +105 -0
- package/src/tools/esbuild/target.js.map +1 -0
- package/src/tools/esbuild/utils.d.ts +0 -10
- package/src/tools/esbuild/utils.js +0 -58
- package/src/tools/esbuild/utils.js.map +1 -1
- package/src/tools/esbuild/watcher.d.ts +21 -2
- package/src/tools/esbuild/watcher.js +483 -60
- package/src/tools/esbuild/watcher.js.map +1 -1
- package/src/tools/{babel/plugins → oxc}/oxc-transform.d.ts +2 -2
- package/src/tools/{babel/plugins → oxc}/oxc-transform.js +10 -18
- package/src/tools/oxc/oxc-transform.js.map +1 -0
- package/src/tools/sass/rebasing-importer.d.ts +5 -5
- package/src/tools/sass/rebasing-importer.js +5 -2
- package/src/tools/sass/rebasing-importer.js.map +1 -1
- package/src/tools/sass/worker.d.ts +1 -1
- package/src/tools/sass/worker.js.map +1 -1
- package/src/tools/vite/middlewares/assets-middleware.js +3 -3
- package/src/tools/vite/middlewares/assets-middleware.js.map +1 -1
- package/src/tools/vite/utils.d.ts +2 -1
- package/src/tools/vite/utils.js +2 -1
- package/src/tools/vite/utils.js.map +1 -1
- package/src/utils/bundle-calculator.js +12 -3
- package/src/utils/bundle-calculator.js.map +1 -1
- package/src/utils/hash.d.ts +24 -0
- package/src/utils/hash.js +94 -0
- package/src/utils/hash.js.map +1 -0
- package/src/utils/index-file/inline-critical-css.js +153 -109
- package/src/utils/index-file/inline-critical-css.js.map +1 -1
- package/src/utils/normalize-cache.js +1 -1
- package/src/utils/server-rendering/manifest.js +9 -4
- package/src/utils/server-rendering/manifest.js.map +1 -1
- package/src/utils/source-map.d.ts +26 -2
- package/src/utils/source-map.js +172 -85
- package/src/utils/source-map.js.map +1 -1
- package/src/tools/babel/plugins/oxc-transform.js.map +0 -1
- /package/src/tools/{babel/plugins → oxc}/types.d.ts +0 -0
|
@@ -6,12 +6,41 @@
|
|
|
6
6
|
* Use of this source code is governed by an MIT-style license that can be
|
|
7
7
|
* found in the LICENSE file at https://angular.dev/license
|
|
8
8
|
*/
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
12
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
43
|
exports.InlineCriticalCssProcessor = void 0;
|
|
14
|
-
const beasties_1 = __importDefault(require("beasties"));
|
|
15
44
|
const promises_1 = require("node:fs/promises");
|
|
16
45
|
/**
|
|
17
46
|
* Pattern used to extract the media query set by Beasties in an `onload` handler.
|
|
@@ -61,115 +90,129 @@ const LINK_LOAD_SCRIPT_CONTENT = `
|
|
|
61
90
|
|
|
62
91
|
documentElement.addEventListener('load', listener, true);
|
|
63
92
|
})();`;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
optionsExtended;
|
|
69
|
-
warnings = [];
|
|
70
|
-
errors = [];
|
|
71
|
-
addedCspScriptsDocuments = new WeakSet();
|
|
72
|
-
documentNonces = new WeakMap();
|
|
73
|
-
constructor(optionsExtended) {
|
|
74
|
-
super({
|
|
75
|
-
logger: {
|
|
76
|
-
warn: (s) => this.warnings.push(s),
|
|
77
|
-
error: (s) => this.errors.push(s),
|
|
78
|
-
info: () => { },
|
|
79
|
-
},
|
|
80
|
-
logLevel: 'warn',
|
|
81
|
-
path: optionsExtended.outputPath,
|
|
82
|
-
publicPath: optionsExtended.deployUrl,
|
|
83
|
-
compress: !!optionsExtended.minify,
|
|
84
|
-
pruneSource: false,
|
|
85
|
-
reduceInlineStyles: false,
|
|
86
|
-
mergeStylesheets: false,
|
|
87
|
-
// Note: if `preload` changes to anything other than `media`, the logic in
|
|
88
|
-
// `embedLinkedStylesheet` will have to be updated.
|
|
89
|
-
preload: 'media',
|
|
90
|
-
noscriptFallback: true,
|
|
91
|
-
inlineFonts: true,
|
|
92
|
-
});
|
|
93
|
-
this.optionsExtended = optionsExtended;
|
|
94
|
-
}
|
|
95
|
-
readFile(path) {
|
|
96
|
-
const readAsset = this.optionsExtended.readAsset;
|
|
97
|
-
return readAsset ? readAsset(path) : (0, promises_1.readFile)(path, 'utf-8');
|
|
93
|
+
let beastiesClassPromise;
|
|
94
|
+
async function getBeastiesClass() {
|
|
95
|
+
if (beastiesClassPromise) {
|
|
96
|
+
return beastiesClassPromise;
|
|
98
97
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// NB: this is only needed for the webpack based builders.
|
|
107
|
-
const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
108
|
-
if (media) {
|
|
109
|
-
link.removeAttribute('onload');
|
|
110
|
-
link.setAttribute('media', media[1]);
|
|
111
|
-
link?.next?.remove();
|
|
98
|
+
beastiesClassPromise = Promise.resolve().then(() => __importStar(require('beasties'))).then(({ default: Beasties }) => {
|
|
99
|
+
return class BeastiesExtended extends Beasties {
|
|
100
|
+
optionsExtended;
|
|
101
|
+
_warnings;
|
|
102
|
+
_errors;
|
|
103
|
+
get warnings() {
|
|
104
|
+
return (this._warnings ??= []);
|
|
112
105
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const cspNonce = this.findCspNonce(document);
|
|
116
|
-
if (cspNonce || this.optionsExtended.autoCsp) {
|
|
117
|
-
const beastiesMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
118
|
-
if (beastiesMedia) {
|
|
119
|
-
// If there's a Beasties-generated `onload` handler and the file has an Angular CSP nonce,
|
|
120
|
-
// we have to remove the handler, because it's incompatible with CSP. We save the value
|
|
121
|
-
// in a different attribute and we generate a script tag with the nonce that uses
|
|
122
|
-
// `addEventListener` to apply the media query instead.
|
|
123
|
-
link.removeAttribute('onload');
|
|
124
|
-
link.setAttribute(CSP_MEDIA_ATTR, beastiesMedia[1]);
|
|
125
|
-
this.conditionallyInsertCspLoadingScript(document, cspNonce, link);
|
|
106
|
+
get errors() {
|
|
107
|
+
return (this._errors ??= []);
|
|
126
108
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
109
|
+
addedCspScriptsDocuments = new WeakSet();
|
|
110
|
+
documentNonces = new WeakMap();
|
|
111
|
+
constructor(optionsExtended) {
|
|
112
|
+
super({
|
|
113
|
+
logger: {
|
|
114
|
+
warn: (s) => this.warnings.push(s),
|
|
115
|
+
error: (s) => this.errors.push(s),
|
|
116
|
+
info: () => { },
|
|
117
|
+
},
|
|
118
|
+
logLevel: 'warn',
|
|
119
|
+
path: optionsExtended.outputPath,
|
|
120
|
+
publicPath: optionsExtended.deployUrl,
|
|
121
|
+
compress: !!optionsExtended.minify,
|
|
122
|
+
pruneSource: false,
|
|
123
|
+
reduceInlineStyles: false,
|
|
124
|
+
mergeStylesheets: false,
|
|
125
|
+
// Note: if `preload` changes to anything other than `media`, the logic in
|
|
126
|
+
// `embedLinkedStylesheet` will have to be updated.
|
|
127
|
+
preload: 'media',
|
|
128
|
+
noscriptFallback: true,
|
|
129
|
+
inlineFonts: true,
|
|
136
130
|
});
|
|
131
|
+
this.optionsExtended = optionsExtended;
|
|
137
132
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
133
|
+
readFile(path) {
|
|
134
|
+
const readAsset = this.optionsExtended.readAsset;
|
|
135
|
+
return readAsset ? readAsset(path) : (0, promises_1.readFile)(path, 'utf-8');
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Override of the Beasties `embedLinkedStylesheet` method
|
|
139
|
+
* that makes it work with Angular's CSP APIs.
|
|
140
|
+
*/
|
|
141
|
+
async embedLinkedStylesheet(link, document) {
|
|
142
|
+
if (link.getAttribute('media') === 'print' && link.next?.name === 'noscript') {
|
|
143
|
+
// Workaround for https://github.com/GoogleChromeLabs/critters/issues/64
|
|
144
|
+
// NB: this is only needed for the webpack based builders.
|
|
145
|
+
const media = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
146
|
+
if (media) {
|
|
147
|
+
link.removeAttribute('onload');
|
|
148
|
+
link.setAttribute('media', media[1]);
|
|
149
|
+
link?.next?.remove();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const returnValue = await super.embedLinkedStylesheet(link, document);
|
|
153
|
+
const cspNonce = this.findCspNonce(document);
|
|
154
|
+
if (cspNonce || this.optionsExtended.autoCsp) {
|
|
155
|
+
const beastiesMedia = link.getAttribute('onload')?.match(MEDIA_SET_HANDLER_PATTERN);
|
|
156
|
+
if (beastiesMedia) {
|
|
157
|
+
// If there's a Beasties-generated `onload` handler and the file has an Angular CSP nonce,
|
|
158
|
+
// we have to remove the handler, because it's incompatible with CSP. We save the value
|
|
159
|
+
// in a different attribute and we generate a script tag with the nonce that uses
|
|
160
|
+
// `addEventListener` to apply the media query instead.
|
|
161
|
+
link.removeAttribute('onload');
|
|
162
|
+
link.setAttribute(CSP_MEDIA_ATTR, beastiesMedia[1]);
|
|
163
|
+
this.conditionallyInsertCspLoadingScript(document, cspNonce, link);
|
|
164
|
+
}
|
|
165
|
+
// Ideally we would hook in at the time Beasties inserts the `style` tags, but there isn't
|
|
166
|
+
// a way of doing that at the moment so we fall back to doing it any time a `link` tag is
|
|
167
|
+
// inserted. We mitigate it by only iterating the direct children of the `<head>` which
|
|
168
|
+
// should be pretty shallow.
|
|
169
|
+
if (cspNonce) {
|
|
170
|
+
document.head.children.forEach((child) => {
|
|
171
|
+
if (child.tagName === 'style' && !child.hasAttribute('nonce')) {
|
|
172
|
+
child.setAttribute('nonce', cspNonce);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return returnValue;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Finds the CSP nonce for a specific document.
|
|
181
|
+
*/
|
|
182
|
+
findCspNonce(document) {
|
|
183
|
+
if (this.documentNonces.has(document)) {
|
|
184
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
185
|
+
return this.documentNonces.get(document);
|
|
186
|
+
}
|
|
187
|
+
// HTML attribute are case-insensitive, but the parser used by Beasties is case-sensitive.
|
|
188
|
+
const nonceElement = document.querySelector('[ngCspNonce], [ngcspnonce]');
|
|
189
|
+
const cspNonce = nonceElement?.getAttribute('ngCspNonce') ||
|
|
190
|
+
nonceElement?.getAttribute('ngcspnonce') ||
|
|
191
|
+
null;
|
|
192
|
+
this.documentNonces.set(document, cspNonce);
|
|
193
|
+
return cspNonce;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Inserts the `script` tag that swaps the critical CSS at runtime,
|
|
197
|
+
* if one hasn't been inserted into the document already.
|
|
198
|
+
*/
|
|
199
|
+
conditionallyInsertCspLoadingScript(document, nonce, link) {
|
|
200
|
+
if (this.addedCspScriptsDocuments.has(document)) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const script = document.createElement('script');
|
|
204
|
+
script.textContent = LINK_LOAD_SCRIPT_CONTENT;
|
|
205
|
+
if (nonce) {
|
|
206
|
+
script.setAttribute('nonce', nonce);
|
|
207
|
+
}
|
|
208
|
+
// Prepend the script to the head since it needs to
|
|
209
|
+
// run as early as possible, before the `link` tags.
|
|
210
|
+
document.head.insertBefore(script, link);
|
|
211
|
+
this.addedCspScriptsDocuments.add(document);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
return beastiesClassPromise;
|
|
173
216
|
}
|
|
174
217
|
class InlineCriticalCssProcessor {
|
|
175
218
|
options;
|
|
@@ -177,7 +220,8 @@ class InlineCriticalCssProcessor {
|
|
|
177
220
|
this.options = options;
|
|
178
221
|
}
|
|
179
222
|
async process(html, options) {
|
|
180
|
-
const
|
|
223
|
+
const BeastiesClass = await getBeastiesClass();
|
|
224
|
+
const beasties = new BeastiesClass({ ...this.options, ...options });
|
|
181
225
|
const content = await beasties.process(html);
|
|
182
226
|
return {
|
|
183
227
|
// Clean up value from value less attributes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-critical-css.js","sourceRoot":"","sources":["inline-critical-css.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG
|
|
1
|
+
{"version":3,"file":"inline-critical-css.js","sourceRoot":"","sources":["inline-critical-css.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,+CAA4C;AAE5C;;GAEG;AACH,MAAM,yBAAyB,GAAG,8BAA8B,CAAC;AAEjE;;GAEG;AACH,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AACH,MAAM,wBAAwB,GAAG;;4BAEL,cAAc;;;;;;;;;;;;;;;;;;;;;;;MAuBpC,CAAC;AAiDP,IAAI,oBAMS,CAAC;AAEd,KAAK,UAAU,gBAAgB;IAK7B,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,oBAAoB,GAAG,kDAAO,UAAU,IAAE,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvE,OAAO,MAAM,gBACX,SAAS,QAA8D;YAiBpD;YAdX,SAAS,CAAY;YACrB,OAAO,CAAY;YAE3B,IAAI,QAAQ;gBACV,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,MAAM;gBACR,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YAC/B,CAAC;YACO,wBAAwB,GAAG,IAAI,OAAO,EAAmB,CAAC;YAC1D,cAAc,GAAG,IAAI,OAAO,EAAkC,CAAC;YAEvE,YACmB,eACgB;gBAEjC,KAAK,CAAC;oBACJ,MAAM,EAAE;wBACN,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC1C,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;wBACzC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;qBACf;oBACD,QAAQ,EAAE,MAAM;oBAChB,IAAI,EAAE,eAAe,CAAC,UAAU;oBAChC,UAAU,EAAE,eAAe,CAAC,SAAS;oBACrC,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM;oBAClC,WAAW,EAAE,KAAK;oBAClB,kBAAkB,EAAE,KAAK;oBACzB,gBAAgB,EAAE,KAAK;oBACvB,0EAA0E;oBAC1E,mDAAmD;oBACnD,OAAO,EAAE,OAAO;oBAChB,gBAAgB,EAAE,IAAI;oBACtB,WAAW,EAAE,IAAI;iBAClB,CAAC,CAAC;gBArBc,oBAAe,GAAf,eAAe,CACC;YAqBnC,CAAC;YAEe,QAAQ,CAAC,IAAY;gBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;gBAEjD,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;YAED;;;eAGG;YACM,KAAK,CAAC,qBAAqB,CAClC,IAAwB,EACxB,QAAyB;gBAEzB,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC7E,wEAAwE;oBACxE,0DAA0D;oBAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC5E,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;wBAC/B,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBACvB,CAAC;gBACH,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAE7C,IAAI,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;oBAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAEpF,IAAI,aAAa,EAAE,CAAC;wBAClB,0FAA0F;wBAC1F,uFAAuF;wBACvF,iFAAiF;wBACjF,uDAAuD;wBACvD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;wBAC/B,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpD,IAAI,CAAC,mCAAmC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;oBACrE,CAAC;oBAED,0FAA0F;oBAC1F,yFAAyF;oBACzF,uFAAuF;oBACvF,4BAA4B;oBAC5B,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;4BACvC,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gCAC9D,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;4BACxC,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,OAAO,WAAW,CAAC;YACrB,CAAC;YAED;;eAEG;YACK,YAAY,CAAC,QAAyB;gBAC5C,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACtC,oEAAoE;oBACpE,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;gBAC5C,CAAC;gBAED,0FAA0F;gBAC1F,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC;gBAC1E,MAAM,QAAQ,GACZ,YAAY,EAAE,YAAY,CAAC,YAAY,CAAC;oBACxC,YAAY,EAAE,YAAY,CAAC,YAAY,CAAC;oBACxC,IAAI,CAAC;gBAEP,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAE5C,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED;;;eAGG;YACK,mCAAmC,CACzC,QAAyB,EACzB,KAAoB,EACpB,IAAwB;gBAExB,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChD,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,GAAG,wBAAwB,CAAC;gBAC9C,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACtC,CAAC;gBAED,mDAAmD;gBACnD,oDAAoD;gBACpD,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACzC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAa,0BAA0B;IACN;IAA/B,YAA+B,OAA0C;QAA1C,YAAO,GAAP,OAAO,CAAmC;IAAG,CAAC;IAE7E,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,OAAwC;QAExC,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO;YACL,6CAA6C;YAC7C,mFAAmF;YACnF,0CAA0C;YAC1C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,4BAA4B,EAAE,IAAI,CAAC;YAC5D,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC;IACJ,CAAC;CACF;AApBD,gEAoBC"}
|
|
@@ -11,7 +11,7 @@ exports.normalizeCacheOptions = normalizeCacheOptions;
|
|
|
11
11
|
const node_fs_1 = require("node:fs");
|
|
12
12
|
const node_path_1 = require("node:path");
|
|
13
13
|
/** Version placeholder is replaced during the build process with actual package version */
|
|
14
|
-
const VERSION = '22.2.0-next.
|
|
14
|
+
const VERSION = '22.2.0-next.3';
|
|
15
15
|
function hasCacheMetadata(value) {
|
|
16
16
|
return (!!value &&
|
|
17
17
|
typeof value === 'object' &&
|
|
@@ -10,8 +10,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.SERVER_GENERATED_EXTERNALS = exports.SERVER_APP_ENGINE_MANIFEST_FILENAME = exports.SERVER_APP_MANIFEST_FILENAME = void 0;
|
|
11
11
|
exports.generateAngularServerAppEngineManifest = generateAngularServerAppEngineManifest;
|
|
12
12
|
exports.generateAngularServerAppManifest = generateAngularServerAppManifest;
|
|
13
|
+
const node_buffer_1 = require("node:buffer");
|
|
13
14
|
const node_path_1 = require("node:path");
|
|
14
|
-
const node_vm_1 = require("node:vm");
|
|
15
15
|
const bundler_files_1 = require("../../tools/esbuild/bundler-files");
|
|
16
16
|
exports.SERVER_APP_MANIFEST_FILENAME = 'angular-app-manifest.mjs';
|
|
17
17
|
exports.SERVER_APP_ENGINE_MANIFEST_FILENAME = 'angular-app-engine-manifest.mjs';
|
|
@@ -131,9 +131,14 @@ function generateAngularServerAppManifest(additionalHtmlOutputFiles, outputFiles
|
|
|
131
131
|
const jsChunkFilePath = `assets-chunks/${file.path.replace(/[./]/g, '_')}.mjs`;
|
|
132
132
|
const escapedContent = escapeUnsafeChars(file.text);
|
|
133
133
|
serverAssetsChunks.push((0, bundler_files_1.createOutputFile)(jsChunkFilePath, `export default \`${escapedContent}\`;`, bundler_files_1.BuildOutputFileType.ServerApplication));
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
|
|
134
|
+
// JavaScript engine script parsers normalize `\r\n` (2 bytes in UTF-8) to `\n` (1 byte in UTF-8) in template literals.
|
|
135
|
+
// Subtracting the count of `\r\n` occurrences avoids allocating any temporary strings or match arrays for large assets.
|
|
136
|
+
let size = node_buffer_1.Buffer.byteLength(file.text);
|
|
137
|
+
let pos = file.text.indexOf('\r\n');
|
|
138
|
+
while (pos !== -1) {
|
|
139
|
+
size--;
|
|
140
|
+
pos = file.text.indexOf('\r\n', pos + 2);
|
|
141
|
+
}
|
|
137
142
|
serverAssets[file.path] =
|
|
138
143
|
`{size: ${size}, hash: '${file.hash}', text: () => import('./${jsChunkFilePath}').then(m => m.default)}`;
|
|
139
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["manifest.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAqEH,wFAwCC;AA8BD,
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,16 +6,40 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
8
|
import type { EncodedSourceMap } from '@ampproject/remapping';
|
|
9
|
+
export declare const SOURCEMAP_COMMENT_PREFIX = "//# sourceMappingURL=";
|
|
10
|
+
export declare const SOURCEMAP_COMMENT_BYTES: Buffer<ArrayBuffer>;
|
|
11
|
+
/**
|
|
12
|
+
* Checks for a single trailing `//# sourceMappingURL=` comment on a raw buffer.
|
|
13
|
+
*
|
|
14
|
+
* @param data The raw byte buffer to inspect.
|
|
15
|
+
* @returns An object containing the sliced code buffer and URL snippet if a single trailing comment exists,
|
|
16
|
+
* `null` if no sourcemap comment exists in the buffer, or `undefined` if multiple/non-trailing comments exist.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findTrailingSourceMapComment(data: Uint8Array): {
|
|
19
|
+
code: Uint8Array;
|
|
20
|
+
urlLine: string;
|
|
21
|
+
} | null | undefined;
|
|
9
22
|
/**
|
|
10
23
|
* Removes `//# sourceMappingURL=` comments safely from the given JavaScript code,
|
|
11
24
|
* ignoring any occurrences that are inside string literals, template literals, or block comments.
|
|
12
25
|
*
|
|
13
|
-
*
|
|
26
|
+
* For raw Uint8Array / Buffer inputs, it optimizes performance by inspecting trailing byte sequences
|
|
27
|
+
* to slice the buffer directly without full string decoding.
|
|
14
28
|
*
|
|
15
|
-
* @param code The JavaScript source code.
|
|
29
|
+
* @param code The JavaScript source code as a string or Uint8Array.
|
|
16
30
|
* @returns The code with top-level sourcemap comments removed.
|
|
17
31
|
*/
|
|
18
32
|
export declare function removeSourceMappingURL(code: string): string;
|
|
33
|
+
export declare function removeSourceMappingURL(code: Uint8Array): Uint8Array;
|
|
34
|
+
/**
|
|
35
|
+
* Checks whether a `//# sourceMappingURL=` URL line snippet represents a valid trailing comment at the end of the file.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isTrailingSourceMapComment(urlLine: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Resolves and loads the input sourcemap referenced in a `//# sourceMappingURL=` URL line snippet.
|
|
40
|
+
* Supports inline base64 data URIs, local absolute file URLs, and relative/absolute filesystem paths.
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadInputSourceMapFromUrl(filename: string, urlLine: string): EncodedSourceMap | undefined;
|
|
19
43
|
/**
|
|
20
44
|
* Finds, resolves, and loads the input sourcemap referenced in the code's trailing
|
|
21
45
|
* sourceMappingURL comment, if present. Supports inline base64 data URIs, local absolute
|