@angular/ssr 19.0.0-next.1 → 19.0.0-next.2
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/{esm2022/src/common-engine/common-engine.mjs → fesm2022/node.mjs} +72 -24
- package/fesm2022/node.mjs.map +1 -0
- package/fesm2022/ssr.mjs +353 -389
- package/fesm2022/ssr.mjs.map +1 -1
- package/index.d.ts +152 -47
- package/node/index.d.ts +55 -0
- package/package.json +7 -4
- package/third_party/critters/THIRD_PARTY_LICENSES.txt +350 -0
- package/{esm2022/index.mjs → third_party/critters/index.d.ts} +3 -2
- package/third_party/critters/index.js +13142 -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/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
|
@@ -1,30 +1,80 @@
|
|
|
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
|
-
import { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server';
|
|
1
|
+
import { ɵSERVER_CONTEXT as _SERVER_CONTEXT, renderApplication, renderModule } from '@angular/platform-server';
|
|
9
2
|
import * as fs from 'node:fs';
|
|
10
3
|
import { dirname, join, normalize, resolve } from 'node:path';
|
|
11
4
|
import { URL } from 'node:url';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
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
|
+
|
|
14
67
|
const SSG_MARKER_REGEXP = /ng-server-context=["']\w*\|?ssg\|?\w*["']/;
|
|
15
68
|
/**
|
|
16
69
|
* A common engine to use to server render an application.
|
|
17
70
|
*/
|
|
18
|
-
|
|
71
|
+
class CommonEngine {
|
|
19
72
|
options;
|
|
20
73
|
templateCache = new Map();
|
|
21
|
-
inlineCriticalCssProcessor;
|
|
74
|
+
inlineCriticalCssProcessor = new CommonEngineInlineCriticalCssProcessor();
|
|
22
75
|
pageIsSSG = new Map();
|
|
23
76
|
constructor(options) {
|
|
24
77
|
this.options = options;
|
|
25
|
-
this.inlineCriticalCssProcessor = new InlineCriticalCssProcessor({
|
|
26
|
-
minify: false,
|
|
27
|
-
});
|
|
28
78
|
}
|
|
29
79
|
/**
|
|
30
80
|
* Render an HTML document for a specific URL with specified
|
|
@@ -39,14 +89,10 @@ export class CommonEngine {
|
|
|
39
89
|
if (html === undefined) {
|
|
40
90
|
html = await runMethod('Render Page', () => this.renderApplication(opts));
|
|
41
91
|
if (opts.inlineCriticalCss !== false) {
|
|
42
|
-
const
|
|
92
|
+
const content = await runMethod('Inline Critical CSS', () =>
|
|
43
93
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
44
94
|
this.inlineCriticalCss(html, opts));
|
|
45
95
|
html = content;
|
|
46
|
-
// eslint-disable-next-line no-console
|
|
47
|
-
warnings?.forEach((m) => console.warn(m));
|
|
48
|
-
// eslint-disable-next-line no-console
|
|
49
|
-
errors?.forEach((m) => console.error(m));
|
|
50
96
|
}
|
|
51
97
|
}
|
|
52
98
|
if (enablePerformanceProfiler) {
|
|
@@ -55,9 +101,8 @@ export class CommonEngine {
|
|
|
55
101
|
return html;
|
|
56
102
|
}
|
|
57
103
|
inlineCriticalCss(html, opts) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
});
|
|
104
|
+
const outputPath = opts.publicPath ?? (opts.documentFilePath ? dirname(opts.documentFilePath) : '');
|
|
105
|
+
return this.inlineCriticalCssProcessor.process(html, outputPath);
|
|
61
106
|
}
|
|
62
107
|
async retrieveSSGPage(opts) {
|
|
63
108
|
const { publicPath, documentFilePath, url } = opts;
|
|
@@ -93,7 +138,7 @@ export class CommonEngine {
|
|
|
93
138
|
throw new Error('A module or bootstrap option must be provided.');
|
|
94
139
|
}
|
|
95
140
|
const extraProviders = [
|
|
96
|
-
{ provide:
|
|
141
|
+
{ provide: _SERVER_CONTEXT, useValue: 'ssr' },
|
|
97
142
|
...(opts.providers ?? []),
|
|
98
143
|
...(this.options?.providers ?? []),
|
|
99
144
|
];
|
|
@@ -135,3 +180,6 @@ function isBootstrapFn(value) {
|
|
|
135
180
|
// We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property:
|
|
136
181
|
return typeof value === 'function' && !('ɵmod' in value);
|
|
137
182
|
}
|
|
183
|
+
|
|
184
|
+
export { CommonEngine };
|
|
185
|
+
//# sourceMappingURL=node.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.mjs","sources":["../../../../../../k8-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/common-engine/inline-css-processor.mjs","../../../../../../k8-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/common-engine/peformance-profiler.mjs","../../../../../../k8-fastbuild-ST-70f2edae98f4/bin/packages/angular/ssr/node/src/common-engine/common-engine.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"],"names":["InlineCriticalCssProcessor","ɵSERVER_CONTEXT"],"mappings":"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"}
|