@angular/ssr 19.0.0-next.1 → 19.0.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/fesm2022/node.mjs +296 -0
- package/fesm2022/node.mjs.map +1 -0
- package/fesm2022/ssr.mjs +691 -717
- package/fesm2022/ssr.mjs.map +1 -1
- package/index.d.ts +267 -47
- package/node/index.d.ts +76 -0
- package/package.json +13 -11
- package/third_party/critters/THIRD_PARTY_LICENSES.txt +374 -0
- package/{esm2022/index.mjs → third_party/critters/index.d.ts} +3 -2
- package/third_party/critters/index.js +13155 -0
- package/third_party/critters/index.js.map +7 -0
- package/esm2022/private_export.mjs +0 -10
- package/esm2022/public_api.mjs +0 -9
- package/esm2022/src/app-engine.mjs +0 -84
- package/esm2022/src/app.mjs +0 -167
- package/esm2022/src/assets.mjs +0 -44
- package/esm2022/src/common-engine/common-engine.mjs +0 -137
- package/esm2022/src/common-engine/inline-css-processor.mjs +0 -181
- package/esm2022/src/common-engine/peformance-profiler.mjs +0 -50
- package/esm2022/src/console.mjs +0 -34
- package/esm2022/src/hooks.mjs +0 -94
- package/esm2022/src/i18n.mjs +0 -41
- package/esm2022/src/manifest.mjs +0 -59
- package/esm2022/src/request.mjs +0 -63
- package/esm2022/src/response.mjs +0 -58
- package/esm2022/src/routes/ng-routes.mjs +0 -157
- package/esm2022/src/routes/route-tree.mjs +0 -180
- package/esm2022/src/routes/router.mjs +0 -88
- package/esm2022/src/tokens.mjs +0 -20
- package/esm2022/src/utils/ng.mjs +0 -51
- package/esm2022/src/utils/url.mjs +0 -85
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { ɵSERVER_CONTEXT as _SERVER_CONTEXT, renderApplication, renderModule } from '@angular/platform-server';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import { dirname, join, normalize, resolve } from 'node:path';
|
|
4
|
+
import { URL as URL$1 } from 'node:url';
|
|
5
|
+
import { ɵInlineCriticalCssProcessor as _InlineCriticalCssProcessor } from '@angular/ssr';
|
|
6
|
+
import { readFile } from 'node:fs/promises';
|
|
7
|
+
|
|
8
|
+
class CommonEngineInlineCriticalCssProcessor {
|
|
9
|
+
resourceCache = new Map();
|
|
10
|
+
async process(html, outputPath) {
|
|
11
|
+
const critters = new _InlineCriticalCssProcessor(async (path) => {
|
|
12
|
+
let resourceContent = this.resourceCache.get(path);
|
|
13
|
+
if (resourceContent === undefined) {
|
|
14
|
+
resourceContent = await readFile(path, 'utf-8');
|
|
15
|
+
this.resourceCache.set(path, resourceContent);
|
|
16
|
+
}
|
|
17
|
+
return resourceContent;
|
|
18
|
+
}, outputPath);
|
|
19
|
+
return critters.process(html);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const PERFORMANCE_MARK_PREFIX = '🅰️';
|
|
24
|
+
function printPerformanceLogs() {
|
|
25
|
+
let maxWordLength = 0;
|
|
26
|
+
const benchmarks = [];
|
|
27
|
+
for (const { name, duration } of performance.getEntriesByType('measure')) {
|
|
28
|
+
if (!name.startsWith(PERFORMANCE_MARK_PREFIX)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// `🅰️:Retrieve SSG Page` -> `Retrieve SSG Page:`
|
|
32
|
+
const step = name.slice(PERFORMANCE_MARK_PREFIX.length + 1) + ':';
|
|
33
|
+
if (step.length > maxWordLength) {
|
|
34
|
+
maxWordLength = step.length;
|
|
35
|
+
}
|
|
36
|
+
benchmarks.push([step, `${duration.toFixed(1)}ms`]);
|
|
37
|
+
performance.clearMeasures(name);
|
|
38
|
+
}
|
|
39
|
+
/* eslint-disable no-console */
|
|
40
|
+
console.log('********** Performance results **********');
|
|
41
|
+
for (const [step, value] of benchmarks) {
|
|
42
|
+
const spaces = maxWordLength - step.length + 5;
|
|
43
|
+
console.log(step + ' '.repeat(spaces) + value);
|
|
44
|
+
}
|
|
45
|
+
console.log('*****************************************');
|
|
46
|
+
/* eslint-enable no-console */
|
|
47
|
+
}
|
|
48
|
+
async function runMethodAndMeasurePerf(label, asyncMethod) {
|
|
49
|
+
const labelName = `${PERFORMANCE_MARK_PREFIX}:${label}`;
|
|
50
|
+
const startLabel = `start:${labelName}`;
|
|
51
|
+
const endLabel = `end:${labelName}`;
|
|
52
|
+
try {
|
|
53
|
+
performance.mark(startLabel);
|
|
54
|
+
return await asyncMethod();
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
performance.mark(endLabel);
|
|
58
|
+
performance.measure(labelName, startLabel, endLabel);
|
|
59
|
+
performance.clearMarks(startLabel);
|
|
60
|
+
performance.clearMarks(endLabel);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function noopRunMethodAndMeasurePerf(label, asyncMethod) {
|
|
64
|
+
return asyncMethod();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const SSG_MARKER_REGEXP = /ng-server-context=["']\w*\|?ssg\|?\w*["']/;
|
|
68
|
+
/**
|
|
69
|
+
* A common engine to use to server render an application.
|
|
70
|
+
*/
|
|
71
|
+
class CommonEngine {
|
|
72
|
+
options;
|
|
73
|
+
templateCache = new Map();
|
|
74
|
+
inlineCriticalCssProcessor = new CommonEngineInlineCriticalCssProcessor();
|
|
75
|
+
pageIsSSG = new Map();
|
|
76
|
+
constructor(options) {
|
|
77
|
+
this.options = options;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Render an HTML document for a specific URL with specified
|
|
81
|
+
* render options
|
|
82
|
+
*/
|
|
83
|
+
async render(opts) {
|
|
84
|
+
const enablePerformanceProfiler = this.options?.enablePerformanceProfiler;
|
|
85
|
+
const runMethod = enablePerformanceProfiler
|
|
86
|
+
? runMethodAndMeasurePerf
|
|
87
|
+
: noopRunMethodAndMeasurePerf;
|
|
88
|
+
let html = await runMethod('Retrieve SSG Page', () => this.retrieveSSGPage(opts));
|
|
89
|
+
if (html === undefined) {
|
|
90
|
+
html = await runMethod('Render Page', () => this.renderApplication(opts));
|
|
91
|
+
if (opts.inlineCriticalCss !== false) {
|
|
92
|
+
const content = await runMethod('Inline Critical CSS', () =>
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
94
|
+
this.inlineCriticalCss(html, opts));
|
|
95
|
+
html = content;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (enablePerformanceProfiler) {
|
|
99
|
+
printPerformanceLogs();
|
|
100
|
+
}
|
|
101
|
+
return html;
|
|
102
|
+
}
|
|
103
|
+
inlineCriticalCss(html, opts) {
|
|
104
|
+
const outputPath = opts.publicPath ?? (opts.documentFilePath ? dirname(opts.documentFilePath) : '');
|
|
105
|
+
return this.inlineCriticalCssProcessor.process(html, outputPath);
|
|
106
|
+
}
|
|
107
|
+
async retrieveSSGPage(opts) {
|
|
108
|
+
const { publicPath, documentFilePath, url } = opts;
|
|
109
|
+
if (!publicPath || !documentFilePath || url === undefined) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const { pathname } = new URL$1(url, 'resolve://');
|
|
113
|
+
// Do not use `resolve` here as otherwise it can lead to path traversal vulnerability.
|
|
114
|
+
// See: https://portswigger.net/web-security/file-path-traversal
|
|
115
|
+
const pagePath = join(publicPath, pathname, 'index.html');
|
|
116
|
+
if (this.pageIsSSG.get(pagePath)) {
|
|
117
|
+
// Serve pre-rendered page.
|
|
118
|
+
return fs.promises.readFile(pagePath, 'utf-8');
|
|
119
|
+
}
|
|
120
|
+
if (!pagePath.startsWith(normalize(publicPath))) {
|
|
121
|
+
// Potential path traversal detected.
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
if (pagePath === resolve(documentFilePath) || !(await exists(pagePath))) {
|
|
125
|
+
// View matches with prerender path or file does not exist.
|
|
126
|
+
this.pageIsSSG.set(pagePath, false);
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
// Static file exists.
|
|
130
|
+
const content = await fs.promises.readFile(pagePath, 'utf-8');
|
|
131
|
+
const isSSG = SSG_MARKER_REGEXP.test(content);
|
|
132
|
+
this.pageIsSSG.set(pagePath, isSSG);
|
|
133
|
+
return isSSG ? content : undefined;
|
|
134
|
+
}
|
|
135
|
+
async renderApplication(opts) {
|
|
136
|
+
const moduleOrFactory = this.options?.bootstrap ?? opts.bootstrap;
|
|
137
|
+
if (!moduleOrFactory) {
|
|
138
|
+
throw new Error('A module or bootstrap option must be provided.');
|
|
139
|
+
}
|
|
140
|
+
const extraProviders = [
|
|
141
|
+
{ provide: _SERVER_CONTEXT, useValue: 'ssr' },
|
|
142
|
+
...(opts.providers ?? []),
|
|
143
|
+
...(this.options?.providers ?? []),
|
|
144
|
+
];
|
|
145
|
+
let document = opts.document;
|
|
146
|
+
if (!document && opts.documentFilePath) {
|
|
147
|
+
document = await this.getDocument(opts.documentFilePath);
|
|
148
|
+
}
|
|
149
|
+
const commonRenderingOptions = {
|
|
150
|
+
url: opts.url,
|
|
151
|
+
document,
|
|
152
|
+
};
|
|
153
|
+
return isBootstrapFn(moduleOrFactory)
|
|
154
|
+
? renderApplication(moduleOrFactory, {
|
|
155
|
+
platformProviders: extraProviders,
|
|
156
|
+
...commonRenderingOptions,
|
|
157
|
+
})
|
|
158
|
+
: renderModule(moduleOrFactory, { extraProviders, ...commonRenderingOptions });
|
|
159
|
+
}
|
|
160
|
+
/** Retrieve the document from the cache or the filesystem */
|
|
161
|
+
async getDocument(filePath) {
|
|
162
|
+
let doc = this.templateCache.get(filePath);
|
|
163
|
+
if (!doc) {
|
|
164
|
+
doc = await fs.promises.readFile(filePath, 'utf-8');
|
|
165
|
+
this.templateCache.set(filePath, doc);
|
|
166
|
+
}
|
|
167
|
+
return doc;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async function exists(path) {
|
|
171
|
+
try {
|
|
172
|
+
await fs.promises.access(path, fs.constants.F_OK);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function isBootstrapFn(value) {
|
|
180
|
+
// We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property:
|
|
181
|
+
return typeof value === 'function' && !('ɵmod' in value);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Streams a web-standard `Response` into a Node.js `ServerResponse`.
|
|
186
|
+
*
|
|
187
|
+
* @param source - The web-standard `Response` object to stream from.
|
|
188
|
+
* @param destination - The Node.js `ServerResponse` object to stream into.
|
|
189
|
+
* @returns A promise that resolves once the streaming operation is complete.
|
|
190
|
+
* @developerPreview
|
|
191
|
+
*/
|
|
192
|
+
async function writeResponseToNodeResponse(source, destination) {
|
|
193
|
+
const { status, headers, body } = source;
|
|
194
|
+
destination.statusCode = status;
|
|
195
|
+
let cookieHeaderSet = false;
|
|
196
|
+
for (const [name, value] of headers.entries()) {
|
|
197
|
+
if (name === 'set-cookie') {
|
|
198
|
+
if (cookieHeaderSet) {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
// Sets the 'set-cookie' header only once to ensure it is correctly applied.
|
|
202
|
+
// Concatenating 'set-cookie' values can lead to incorrect behavior, so we use a single value from `headers.getSetCookie()`.
|
|
203
|
+
destination.setHeader(name, headers.getSetCookie());
|
|
204
|
+
cookieHeaderSet = true;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
destination.setHeader(name, value);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (!body) {
|
|
211
|
+
destination.end();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const reader = body.getReader();
|
|
216
|
+
destination.on('close', () => {
|
|
217
|
+
reader.cancel().catch((error) => {
|
|
218
|
+
// eslint-disable-next-line no-console
|
|
219
|
+
console.error(`An error occurred while writing the response body for: ${destination.req.url}.`, error);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
// eslint-disable-next-line no-constant-condition
|
|
223
|
+
while (true) {
|
|
224
|
+
const { done, value } = await reader.read();
|
|
225
|
+
if (done) {
|
|
226
|
+
destination.end();
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
destination.write(value);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
destination.end('Internal server error.');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Converts a Node.js `IncomingMessage` into a Web Standard `Request`.
|
|
239
|
+
*
|
|
240
|
+
* @param nodeRequest - The Node.js `IncomingMessage` object to convert.
|
|
241
|
+
* @returns A Web Standard `Request` object.
|
|
242
|
+
* @developerPreview
|
|
243
|
+
*/
|
|
244
|
+
function createWebRequestFromNodeRequest(nodeRequest) {
|
|
245
|
+
const { headers, method = 'GET' } = nodeRequest;
|
|
246
|
+
const withBody = method !== 'GET' && method !== 'HEAD';
|
|
247
|
+
return new Request(createRequestUrl(nodeRequest), {
|
|
248
|
+
method,
|
|
249
|
+
headers: createRequestHeaders(headers),
|
|
250
|
+
body: withBody ? nodeRequest : undefined,
|
|
251
|
+
duplex: withBody ? 'half' : undefined,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Creates a `Headers` object from Node.js `IncomingHttpHeaders`.
|
|
256
|
+
*
|
|
257
|
+
* @param nodeHeaders - The Node.js `IncomingHttpHeaders` object to convert.
|
|
258
|
+
* @returns A `Headers` object containing the converted headers.
|
|
259
|
+
*/
|
|
260
|
+
function createRequestHeaders(nodeHeaders) {
|
|
261
|
+
const headers = new Headers();
|
|
262
|
+
for (const [name, value] of Object.entries(nodeHeaders)) {
|
|
263
|
+
if (typeof value === 'string') {
|
|
264
|
+
headers.append(name, value);
|
|
265
|
+
}
|
|
266
|
+
else if (Array.isArray(value)) {
|
|
267
|
+
for (const item of value) {
|
|
268
|
+
headers.append(name, item);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return headers;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Creates a `URL` object from a Node.js `IncomingMessage`, taking into account the protocol, host, and port.
|
|
276
|
+
*
|
|
277
|
+
* @param nodeRequest - The Node.js `IncomingMessage` object to extract URL information from.
|
|
278
|
+
* @returns A `URL` object representing the request URL.
|
|
279
|
+
*/
|
|
280
|
+
function createRequestUrl(nodeRequest) {
|
|
281
|
+
const { headers, socket, url = '' } = nodeRequest;
|
|
282
|
+
const protocol = headers['x-forwarded-proto'] ?? ('encrypted' in socket && socket.encrypted ? 'https' : 'http');
|
|
283
|
+
const hostname = headers['x-forwarded-host'] ?? headers.host ?? headers[':authority'];
|
|
284
|
+
const port = headers['x-forwarded-port'] ?? socket.localPort;
|
|
285
|
+
if (Array.isArray(hostname)) {
|
|
286
|
+
throw new Error('host value cannot be an array.');
|
|
287
|
+
}
|
|
288
|
+
let hostnameWithPort = hostname;
|
|
289
|
+
if (port && !hostname?.includes(':')) {
|
|
290
|
+
hostnameWithPort += `:${port}`;
|
|
291
|
+
}
|
|
292
|
+
return new URL(url, `${protocol}://${hostnameWithPort}`);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export { CommonEngine, createWebRequestFromNodeRequest, writeResponseToNodeResponse };
|
|
296
|
+
//# sourceMappingURL=node.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.mjs","sources":["../../../../../../darwin-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/common-engine/inline-css-processor.mjs","../../../../../../darwin-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/common-engine/peformance-profiler.mjs","../../../../../../darwin-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/common-engine/common-engine.mjs","../../../../../../darwin-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/response.mjs","../../../../../../darwin-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/request.mjs"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport { ɵInlineCriticalCssProcessor as InlineCriticalCssProcessor } from '@angular/ssr';\nimport { readFile } from 'node:fs/promises';\nexport class CommonEngineInlineCriticalCssProcessor {\n resourceCache = new Map();\n async process(html, outputPath) {\n const critters = new InlineCriticalCssProcessor(async (path) => {\n let resourceContent = this.resourceCache.get(path);\n if (resourceContent === undefined) {\n resourceContent = await readFile(path, 'utf-8');\n this.resourceCache.set(path, resourceContent);\n }\n return resourceContent;\n }, outputPath);\n return critters.process(html);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nconst PERFORMANCE_MARK_PREFIX = '🅰️';\nexport function printPerformanceLogs() {\n let maxWordLength = 0;\n const benchmarks = [];\n for (const { name, duration } of performance.getEntriesByType('measure')) {\n if (!name.startsWith(PERFORMANCE_MARK_PREFIX)) {\n continue;\n }\n // `🅰️:Retrieve SSG Page` -> `Retrieve SSG Page:`\n const step = name.slice(PERFORMANCE_MARK_PREFIX.length + 1) + ':';\n if (step.length > maxWordLength) {\n maxWordLength = step.length;\n }\n benchmarks.push([step, `${duration.toFixed(1)}ms`]);\n performance.clearMeasures(name);\n }\n /* eslint-disable no-console */\n console.log('********** Performance results **********');\n for (const [step, value] of benchmarks) {\n const spaces = maxWordLength - step.length + 5;\n console.log(step + ' '.repeat(spaces) + value);\n }\n console.log('*****************************************');\n /* eslint-enable no-console */\n}\nexport async function runMethodAndMeasurePerf(label, asyncMethod) {\n const labelName = `${PERFORMANCE_MARK_PREFIX}:${label}`;\n const startLabel = `start:${labelName}`;\n const endLabel = `end:${labelName}`;\n try {\n performance.mark(startLabel);\n return await asyncMethod();\n }\n finally {\n performance.mark(endLabel);\n performance.measure(labelName, startLabel, endLabel);\n performance.clearMarks(startLabel);\n performance.clearMarks(endLabel);\n }\n}\nexport function noopRunMethodAndMeasurePerf(label, asyncMethod) {\n return asyncMethod();\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server';\nimport * as fs from 'node:fs';\nimport { dirname, join, normalize, resolve } from 'node:path';\nimport { URL } from 'node:url';\nimport { CommonEngineInlineCriticalCssProcessor } from './inline-css-processor';\nimport { noopRunMethodAndMeasurePerf, printPerformanceLogs, runMethodAndMeasurePerf, } from './peformance-profiler';\nconst SSG_MARKER_REGEXP = /ng-server-context=[\"']\\w*\\|?ssg\\|?\\w*[\"']/;\n/**\n * A common engine to use to server render an application.\n */\nexport class CommonEngine {\n options;\n templateCache = new Map();\n inlineCriticalCssProcessor = new CommonEngineInlineCriticalCssProcessor();\n pageIsSSG = new Map();\n constructor(options) {\n this.options = options;\n }\n /**\n * Render an HTML document for a specific URL with specified\n * render options\n */\n async render(opts) {\n const enablePerformanceProfiler = this.options?.enablePerformanceProfiler;\n const runMethod = enablePerformanceProfiler\n ? runMethodAndMeasurePerf\n : noopRunMethodAndMeasurePerf;\n let html = await runMethod('Retrieve SSG Page', () => this.retrieveSSGPage(opts));\n if (html === undefined) {\n html = await runMethod('Render Page', () => this.renderApplication(opts));\n if (opts.inlineCriticalCss !== false) {\n const content = await runMethod('Inline Critical CSS', () => \n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.inlineCriticalCss(html, opts));\n html = content;\n }\n }\n if (enablePerformanceProfiler) {\n printPerformanceLogs();\n }\n return html;\n }\n inlineCriticalCss(html, opts) {\n const outputPath = opts.publicPath ?? (opts.documentFilePath ? dirname(opts.documentFilePath) : '');\n return this.inlineCriticalCssProcessor.process(html, outputPath);\n }\n async retrieveSSGPage(opts) {\n const { publicPath, documentFilePath, url } = opts;\n if (!publicPath || !documentFilePath || url === undefined) {\n return undefined;\n }\n const { pathname } = new URL(url, 'resolve://');\n // Do not use `resolve` here as otherwise it can lead to path traversal vulnerability.\n // See: https://portswigger.net/web-security/file-path-traversal\n const pagePath = join(publicPath, pathname, 'index.html');\n if (this.pageIsSSG.get(pagePath)) {\n // Serve pre-rendered page.\n return fs.promises.readFile(pagePath, 'utf-8');\n }\n if (!pagePath.startsWith(normalize(publicPath))) {\n // Potential path traversal detected.\n return undefined;\n }\n if (pagePath === resolve(documentFilePath) || !(await exists(pagePath))) {\n // View matches with prerender path or file does not exist.\n this.pageIsSSG.set(pagePath, false);\n return undefined;\n }\n // Static file exists.\n const content = await fs.promises.readFile(pagePath, 'utf-8');\n const isSSG = SSG_MARKER_REGEXP.test(content);\n this.pageIsSSG.set(pagePath, isSSG);\n return isSSG ? content : undefined;\n }\n async renderApplication(opts) {\n const moduleOrFactory = this.options?.bootstrap ?? opts.bootstrap;\n if (!moduleOrFactory) {\n throw new Error('A module or bootstrap option must be provided.');\n }\n const extraProviders = [\n { provide: ɵSERVER_CONTEXT, useValue: 'ssr' },\n ...(opts.providers ?? []),\n ...(this.options?.providers ?? []),\n ];\n let document = opts.document;\n if (!document && opts.documentFilePath) {\n document = await this.getDocument(opts.documentFilePath);\n }\n const commonRenderingOptions = {\n url: opts.url,\n document,\n };\n return isBootstrapFn(moduleOrFactory)\n ? renderApplication(moduleOrFactory, {\n platformProviders: extraProviders,\n ...commonRenderingOptions,\n })\n : renderModule(moduleOrFactory, { extraProviders, ...commonRenderingOptions });\n }\n /** Retrieve the document from the cache or the filesystem */\n async getDocument(filePath) {\n let doc = this.templateCache.get(filePath);\n if (!doc) {\n doc = await fs.promises.readFile(filePath, 'utf-8');\n this.templateCache.set(filePath, doc);\n }\n return doc;\n }\n}\nasync function exists(path) {\n try {\n await fs.promises.access(path, fs.constants.F_OK);\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isBootstrapFn(value) {\n // We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property:\n return typeof value === 'function' && !('ɵmod' in value);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n/**\n * Streams a web-standard `Response` into a Node.js `ServerResponse`.\n *\n * @param source - The web-standard `Response` object to stream from.\n * @param destination - The Node.js `ServerResponse` object to stream into.\n * @returns A promise that resolves once the streaming operation is complete.\n * @developerPreview\n */\nexport async function writeResponseToNodeResponse(source, destination) {\n const { status, headers, body } = source;\n destination.statusCode = status;\n let cookieHeaderSet = false;\n for (const [name, value] of headers.entries()) {\n if (name === 'set-cookie') {\n if (cookieHeaderSet) {\n continue;\n }\n // Sets the 'set-cookie' header only once to ensure it is correctly applied.\n // Concatenating 'set-cookie' values can lead to incorrect behavior, so we use a single value from `headers.getSetCookie()`.\n destination.setHeader(name, headers.getSetCookie());\n cookieHeaderSet = true;\n }\n else {\n destination.setHeader(name, value);\n }\n }\n if (!body) {\n destination.end();\n return;\n }\n try {\n const reader = body.getReader();\n destination.on('close', () => {\n reader.cancel().catch((error) => {\n // eslint-disable-next-line no-console\n console.error(`An error occurred while writing the response body for: ${destination.req.url}.`, error);\n });\n });\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n destination.end();\n break;\n }\n destination.write(value);\n }\n }\n catch {\n destination.end('Internal server error.');\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n/**\n * Converts a Node.js `IncomingMessage` into a Web Standard `Request`.\n *\n * @param nodeRequest - The Node.js `IncomingMessage` object to convert.\n * @returns A Web Standard `Request` object.\n * @developerPreview\n */\nexport function createWebRequestFromNodeRequest(nodeRequest) {\n const { headers, method = 'GET' } = nodeRequest;\n const withBody = method !== 'GET' && method !== 'HEAD';\n return new Request(createRequestUrl(nodeRequest), {\n method,\n headers: createRequestHeaders(headers),\n body: withBody ? nodeRequest : undefined,\n duplex: withBody ? 'half' : undefined,\n });\n}\n/**\n * Creates a `Headers` object from Node.js `IncomingHttpHeaders`.\n *\n * @param nodeHeaders - The Node.js `IncomingHttpHeaders` object to convert.\n * @returns A `Headers` object containing the converted headers.\n */\nfunction createRequestHeaders(nodeHeaders) {\n const headers = new Headers();\n for (const [name, value] of Object.entries(nodeHeaders)) {\n if (typeof value === 'string') {\n headers.append(name, value);\n }\n else if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(name, item);\n }\n }\n }\n return headers;\n}\n/**\n * Creates a `URL` object from a Node.js `IncomingMessage`, taking into account the protocol, host, and port.\n *\n * @param nodeRequest - The Node.js `IncomingMessage` object to extract URL information from.\n * @returns A `URL` object representing the request URL.\n */\nfunction createRequestUrl(nodeRequest) {\n const { headers, socket, url = '' } = nodeRequest;\n const protocol = headers['x-forwarded-proto'] ?? ('encrypted' in socket && socket.encrypted ? 'https' : 'http');\n const hostname = headers['x-forwarded-host'] ?? headers.host ?? headers[':authority'];\n const port = headers['x-forwarded-port'] ?? socket.localPort;\n if (Array.isArray(hostname)) {\n throw new Error('host value cannot be an array.');\n }\n let hostnameWithPort = hostname;\n if (port && !hostname?.includes(':')) {\n hostnameWithPort += `:${port}`;\n }\n return new URL(url, `${protocol}://${hostnameWithPort}`);\n}\n"],"names":["InlineCriticalCssProcessor","URL","ɵSERVER_CONTEXT"],"mappings":"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"}
|