@angular/build 19.0.0-next.9 → 19.0.0-rc.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 +21 -19
- package/src/builders/application/build-action.js +22 -10
- package/src/builders/application/chunk-optimizer.js +1 -4
- package/src/builders/application/execute-build.js +59 -24
- package/src/builders/application/execute-post-bundle.js +28 -5
- package/src/builders/application/index.d.ts +0 -16
- package/src/builders/application/index.js +15 -10
- package/src/builders/application/options.d.ts +14 -2
- package/src/builders/application/options.js +25 -10
- package/src/builders/application/results.d.ts +5 -3
- package/src/builders/application/schema.d.ts +86 -0
- package/src/builders/application/schema.js +19 -1
- package/src/builders/application/schema.json +73 -4
- package/src/builders/application/setup-bundling.d.ts +6 -1
- package/src/builders/application/setup-bundling.js +47 -13
- package/src/builders/dev-server/options.d.ts +2 -2
- package/src/builders/dev-server/options.js +2 -2
- package/src/builders/dev-server/schema.d.ts +2 -1
- package/src/builders/dev-server/schema.json +1 -2
- package/src/builders/dev-server/vite-server.d.ts +3 -2
- package/src/builders/dev-server/vite-server.js +123 -61
- package/src/index.d.ts +1 -0
- package/src/tools/angular/angular-host.d.ts +1 -1
- package/src/tools/angular/angular-host.js +14 -6
- package/src/tools/angular/compilation/angular-compilation.d.ts +1 -0
- package/src/tools/angular/compilation/aot-compilation.d.ts +1 -0
- package/src/tools/angular/compilation/aot-compilation.js +39 -0
- package/src/tools/angular/compilation/parallel-compilation.js +2 -2
- package/src/tools/angular/compilation/parallel-worker.d.ts +1 -0
- package/src/tools/angular/compilation/parallel-worker.js +5 -2
- package/src/tools/esbuild/angular/compiler-plugin.d.ts +3 -4
- package/src/tools/esbuild/angular/compiler-plugin.js +58 -33
- package/src/tools/esbuild/angular/component-stylesheets.d.ts +18 -18
- package/src/tools/esbuild/angular/component-stylesheets.js +66 -38
- package/src/tools/esbuild/angular/jit-plugin-callbacks.d.ts +1 -1
- package/src/tools/esbuild/angular/jit-plugin-callbacks.js +11 -3
- package/src/tools/esbuild/angular/source-file-cache.d.ts +1 -1
- package/src/tools/esbuild/angular/source-file-cache.js +6 -2
- package/src/tools/esbuild/application-code-bundle.d.ts +7 -5
- package/src/tools/esbuild/application-code-bundle.js +280 -249
- package/src/tools/esbuild/bundler-context.d.ts +2 -1
- package/src/tools/esbuild/bundler-context.js +10 -12
- package/src/tools/esbuild/bundler-execution-result.d.ts +14 -3
- package/src/tools/esbuild/bundler-execution-result.js +15 -8
- package/src/tools/esbuild/commonjs-checker.js +2 -2
- package/src/tools/esbuild/compiler-plugin-options.d.ts +2 -4
- package/src/tools/esbuild/compiler-plugin-options.js +15 -37
- package/src/tools/esbuild/global-scripts.js +1 -1
- package/src/tools/esbuild/global-styles.js +4 -1
- package/src/tools/esbuild/index-html-generator.js +8 -0
- package/src/tools/esbuild/javascript-transformer.js +3 -0
- package/src/tools/esbuild/server-bundle-metadata-plugin.d.ts +22 -0
- package/src/tools/esbuild/server-bundle-metadata-plugin.js +36 -0
- package/src/tools/esbuild/stylesheets/bundle-options.d.ts +2 -0
- package/src/tools/esbuild/stylesheets/bundle-options.js +2 -1
- package/src/tools/esbuild/stylesheets/sass-language.js +4 -0
- package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.d.ts +9 -0
- package/src/tools/esbuild/utils.js +13 -31
- package/src/tools/sass/worker.js +19 -0
- package/src/tools/vite/middlewares/assets-middleware.d.ts +6 -1
- package/src/tools/vite/middlewares/assets-middleware.js +42 -22
- package/src/tools/vite/middlewares/component-middleware.d.ts +9 -0
- package/src/tools/vite/middlewares/component-middleware.js +33 -0
- package/src/tools/vite/middlewares/index.d.ts +2 -1
- package/src/tools/vite/middlewares/index.js +3 -1
- package/src/tools/vite/middlewares/ssr-middleware.js +11 -8
- package/src/tools/vite/plugins/angular-memory-plugin.d.ts +1 -0
- package/src/tools/vite/plugins/angular-memory-plugin.js +5 -13
- package/src/tools/vite/plugins/setup-middlewares-plugin.d.ts +3 -1
- package/src/tools/vite/plugins/setup-middlewares-plugin.js +12 -3
- package/src/tools/vite/utils.d.ts +1 -0
- package/src/typings.d.ts +1 -1
- package/src/utils/environment-options.d.ts +1 -0
- package/src/utils/environment-options.js +4 -2
- package/src/utils/index-file/auto-csp.d.ts +23 -0
- package/src/utils/index-file/auto-csp.js +283 -0
- package/src/utils/index-file/html-rewriting-stream.d.ts +5 -1
- package/src/utils/index-file/index-html-generator.d.ts +4 -0
- package/src/utils/index-file/index-html-generator.js +11 -0
- package/src/utils/index-file/inline-critical-css.js +17 -18
- package/src/utils/normalize-cache.js +1 -1
- package/src/utils/server-rendering/esm-in-memory-loader/utils.d.ts +8 -0
- package/src/utils/server-rendering/esm-in-memory-loader/utils.js +13 -0
- package/src/utils/server-rendering/launch-server.js +5 -5
- package/src/utils/server-rendering/load-esm-from-memory.d.ts +1 -1
- package/src/utils/server-rendering/manifest.d.ts +9 -8
- package/src/utils/server-rendering/manifest.js +17 -23
- package/src/utils/server-rendering/prerender.js +30 -19
- package/src/utils/server-rendering/render-worker.js +4 -2
- package/src/utils/supported-browsers.js +1 -0
|
@@ -10,9 +10,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.createAngularAssetsMiddleware = createAngularAssetsMiddleware;
|
|
11
11
|
const mrmime_1 = require("mrmime");
|
|
12
12
|
const node_path_1 = require("node:path");
|
|
13
|
-
const load_esm_1 = require("../../../utils/load-esm");
|
|
14
13
|
const utils_1 = require("../utils");
|
|
15
|
-
function createAngularAssetsMiddleware(server, assets, outputFiles,
|
|
14
|
+
function createAngularAssetsMiddleware(server, assets, outputFiles, componentStyles, encapsulateStyle) {
|
|
16
15
|
return function angularAssetsMiddleware(req, res, next) {
|
|
17
16
|
if (req.url === undefined || res.writableEnded) {
|
|
18
17
|
return;
|
|
@@ -59,45 +58,66 @@ function createAngularAssetsMiddleware(server, assets, outputFiles, usedComponen
|
|
|
59
58
|
if (extension !== '.js' && extension !== '.html') {
|
|
60
59
|
const outputFile = outputFiles.get(pathname);
|
|
61
60
|
if (outputFile?.servable) {
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
let data = outputFile.contents;
|
|
62
|
+
const componentStyle = componentStyles.get(pathname);
|
|
63
|
+
if (componentStyle) {
|
|
64
64
|
// Inject component ID for view encapsulation if requested
|
|
65
|
-
const
|
|
65
|
+
const searchParams = new URL(req.url, 'http://localhost').searchParams;
|
|
66
|
+
const componentId = searchParams.get('ngcomp');
|
|
66
67
|
if (componentId !== null) {
|
|
68
|
+
// Track if the component uses ShadowDOM encapsulation (3 = ViewEncapsulation.ShadowDom)
|
|
69
|
+
// Shadow DOM components currently require a full reload.
|
|
70
|
+
// Vite's CSS hot replacement does not support shadow root searching.
|
|
71
|
+
if (searchParams.get('e') === '3') {
|
|
72
|
+
componentStyle.reload = true;
|
|
73
|
+
}
|
|
67
74
|
// Record the component style usage for HMR updates
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
usedComponentStyles.set(pathname, [componentId]);
|
|
75
|
+
if (componentStyle.used === undefined) {
|
|
76
|
+
componentStyle.used = new Set([componentId]);
|
|
71
77
|
}
|
|
72
78
|
else {
|
|
73
|
-
|
|
79
|
+
componentStyle.used.add(componentId);
|
|
80
|
+
}
|
|
81
|
+
// Report if there are no changes to avoid reprocessing
|
|
82
|
+
const etag = `W/"${outputFile.contents.byteLength}-${outputFile.hash}-${componentId}"`;
|
|
83
|
+
if (req.headers['if-none-match'] === etag) {
|
|
84
|
+
res.statusCode = 304;
|
|
85
|
+
res.end();
|
|
86
|
+
return;
|
|
74
87
|
}
|
|
75
88
|
// Shim the stylesheet if a component ID is provided
|
|
76
89
|
if (componentId.length > 0) {
|
|
77
90
|
// Validate component ID
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
.then((compilerModule) => {
|
|
81
|
-
const encapsulatedData = compilerModule.encapsulateStyle(new TextDecoder().decode(data), componentId);
|
|
82
|
-
res.setHeader('Content-Type', 'text/css');
|
|
83
|
-
res.setHeader('Cache-Control', 'no-cache');
|
|
84
|
-
res.end(encapsulatedData);
|
|
85
|
-
})
|
|
86
|
-
.catch((e) => next(e));
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
91
|
+
if (!/^[_.\-\p{Letter}\d]+-c\d+$/u.test(componentId)) {
|
|
92
|
+
const message = 'Invalid component stylesheet ID request: ' + componentId;
|
|
90
93
|
// eslint-disable-next-line no-console
|
|
91
|
-
console.error(
|
|
94
|
+
console.error(message);
|
|
95
|
+
res.statusCode = 400;
|
|
96
|
+
res.end(message);
|
|
97
|
+
return;
|
|
92
98
|
}
|
|
99
|
+
data = encapsulateStyle(data, componentId);
|
|
93
100
|
}
|
|
101
|
+
res.setHeader('Content-Type', 'text/css');
|
|
102
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
103
|
+
res.setHeader('ETag', etag);
|
|
104
|
+
res.end(data);
|
|
105
|
+
return;
|
|
94
106
|
}
|
|
95
107
|
}
|
|
108
|
+
// Avoid resending the content if it has not changed since last request
|
|
109
|
+
const etag = `W/"${outputFile.contents.byteLength}-${outputFile.hash}"`;
|
|
110
|
+
if (req.headers['if-none-match'] === etag) {
|
|
111
|
+
res.statusCode = 304;
|
|
112
|
+
res.end();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
96
115
|
const mimeType = (0, mrmime_1.lookup)(extension);
|
|
97
116
|
if (mimeType) {
|
|
98
117
|
res.setHeader('Content-Type', mimeType);
|
|
99
118
|
}
|
|
100
119
|
res.setHeader('Cache-Control', 'no-cache');
|
|
120
|
+
res.setHeader('ETag', etag);
|
|
101
121
|
res.end(data);
|
|
102
122
|
return;
|
|
103
123
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
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 type { Connect } from 'vite';
|
|
9
|
+
export declare function createAngularComponentMiddleware(templateUpdates: ReadonlyMap<string, string>): Connect.NextHandleFunction;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createAngularComponentMiddleware = createAngularComponentMiddleware;
|
|
11
|
+
const ANGULAR_COMPONENT_PREFIX = '/@ng/component';
|
|
12
|
+
function createAngularComponentMiddleware(templateUpdates) {
|
|
13
|
+
return function angularComponentMiddleware(req, res, next) {
|
|
14
|
+
if (req.url === undefined || res.writableEnded) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (!req.url.startsWith(ANGULAR_COMPONENT_PREFIX)) {
|
|
18
|
+
next();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const requestUrl = new URL(req.url, 'http://localhost');
|
|
22
|
+
const componentId = requestUrl.searchParams.get('c');
|
|
23
|
+
if (!componentId) {
|
|
24
|
+
res.statusCode = 400;
|
|
25
|
+
res.end();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const updateCode = templateUpdates.get(encodeURIComponent(componentId)) ?? '';
|
|
29
|
+
res.setHeader('Content-Type', 'text/javascript');
|
|
30
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
31
|
+
res.end(updateCode);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
|
-
export { createAngularAssetsMiddleware } from './assets-middleware';
|
|
8
|
+
export { type ComponentStyleRecord, createAngularAssetsMiddleware } from './assets-middleware';
|
|
9
9
|
export { angularHtmlFallbackMiddleware } from './html-fallback-middleware';
|
|
10
10
|
export { createAngularIndexHtmlMiddleware } from './index-html-middleware';
|
|
11
11
|
export { createAngularSsrExternalMiddleware, createAngularSsrInternalMiddleware, } from './ssr-middleware';
|
|
12
12
|
export { createAngularHeadersMiddleware } from './headers-middleware';
|
|
13
|
+
export { createAngularComponentMiddleware } from './component-middleware';
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* found in the LICENSE file at https://angular.dev/license
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.createAngularHeadersMiddleware = exports.createAngularSsrInternalMiddleware = exports.createAngularSsrExternalMiddleware = exports.createAngularIndexHtmlMiddleware = exports.angularHtmlFallbackMiddleware = exports.createAngularAssetsMiddleware = void 0;
|
|
10
|
+
exports.createAngularComponentMiddleware = exports.createAngularHeadersMiddleware = exports.createAngularSsrInternalMiddleware = exports.createAngularSsrExternalMiddleware = exports.createAngularIndexHtmlMiddleware = exports.angularHtmlFallbackMiddleware = exports.createAngularAssetsMiddleware = void 0;
|
|
11
11
|
var assets_middleware_1 = require("./assets-middleware");
|
|
12
12
|
Object.defineProperty(exports, "createAngularAssetsMiddleware", { enumerable: true, get: function () { return assets_middleware_1.createAngularAssetsMiddleware; } });
|
|
13
13
|
var html_fallback_middleware_1 = require("./html-fallback-middleware");
|
|
@@ -19,3 +19,5 @@ Object.defineProperty(exports, "createAngularSsrExternalMiddleware", { enumerabl
|
|
|
19
19
|
Object.defineProperty(exports, "createAngularSsrInternalMiddleware", { enumerable: true, get: function () { return ssr_middleware_1.createAngularSsrInternalMiddleware; } });
|
|
20
20
|
var headers_middleware_1 = require("./headers-middleware");
|
|
21
21
|
Object.defineProperty(exports, "createAngularHeadersMiddleware", { enumerable: true, get: function () { return headers_middleware_1.createAngularHeadersMiddleware; } });
|
|
22
|
+
var component_middleware_1 = require("./component-middleware");
|
|
23
|
+
Object.defineProperty(exports, "createAngularComponentMiddleware", { enumerable: true, get: function () { return component_middleware_1.createAngularComponentMiddleware; } });
|
|
@@ -23,7 +23,9 @@ function createAngularSsrInternalMiddleware(server, indexHtmlTransformer) {
|
|
|
23
23
|
await (0, load_esm_1.loadEsmModule)('@angular/compiler');
|
|
24
24
|
const { writeResponseToNodeResponse, createWebRequestFromNodeRequest } = await (0, load_esm_1.loadEsmModule)('@angular/ssr/node');
|
|
25
25
|
const { ɵgetOrCreateAngularServerApp } = (await server.ssrLoadModule('/main.server.mjs'));
|
|
26
|
-
const angularServerApp = ɵgetOrCreateAngularServerApp(
|
|
26
|
+
const angularServerApp = ɵgetOrCreateAngularServerApp({
|
|
27
|
+
allowStaticRouteRender: true,
|
|
28
|
+
});
|
|
27
29
|
// Only Add the transform hook only if it's a different instance.
|
|
28
30
|
if (cachedAngularServerApp !== angularServerApp) {
|
|
29
31
|
angularServerApp.hooks.on('html:transform:pre', async ({ html, url }) => {
|
|
@@ -35,7 +37,7 @@ function createAngularSsrInternalMiddleware(server, indexHtmlTransformer) {
|
|
|
35
37
|
const webReq = new Request(createWebRequestFromNodeRequest(req), {
|
|
36
38
|
signal: AbortSignal.timeout(30_000),
|
|
37
39
|
});
|
|
38
|
-
const webRes = await angularServerApp.
|
|
40
|
+
const webRes = await angularServerApp.handle(webReq);
|
|
39
41
|
if (!webRes) {
|
|
40
42
|
return next();
|
|
41
43
|
}
|
|
@@ -53,11 +55,11 @@ async function createAngularSsrExternalMiddleware(server, indexHtmlTransformer)
|
|
|
53
55
|
const { createWebRequestFromNodeRequest, writeResponseToNodeResponse } = await (0, load_esm_1.loadEsmModule)('@angular/ssr/node');
|
|
54
56
|
return function angularSsrExternalMiddleware(req, res, next) {
|
|
55
57
|
(async () => {
|
|
56
|
-
const {
|
|
57
|
-
if (!(0, utils_1.isSsrNodeRequestHandler)(
|
|
58
|
+
const { reqHandler, AngularAppEngine } = (await server.ssrLoadModule('./server.mjs'));
|
|
59
|
+
if (!(0, utils_1.isSsrNodeRequestHandler)(reqHandler) && !(0, utils_1.isSsrRequestHandler)(reqHandler)) {
|
|
58
60
|
if (!fallbackWarningShown) {
|
|
59
61
|
// eslint-disable-next-line no-console
|
|
60
|
-
console.warn(`The
|
|
62
|
+
console.warn(`The 'reqHandler' export in 'server.ts' is either undefined or does not provide a recognized request handler. ` +
|
|
61
63
|
'Using the internal SSR middleware instead.');
|
|
62
64
|
fallbackWarningShown = true;
|
|
63
65
|
}
|
|
@@ -66,6 +68,7 @@ async function createAngularSsrExternalMiddleware(server, indexHtmlTransformer)
|
|
|
66
68
|
return;
|
|
67
69
|
}
|
|
68
70
|
if (cachedAngularAppEngine !== AngularAppEngine) {
|
|
71
|
+
AngularAppEngine.ɵallowStaticRouteRender = true;
|
|
69
72
|
AngularAppEngine.ɵhooks.on('html:transform:pre', async ({ html, url }) => {
|
|
70
73
|
const processedHtml = await server.transformIndexHtml(url.pathname, html);
|
|
71
74
|
return indexHtmlTransformer?.(processedHtml) ?? processedHtml;
|
|
@@ -73,11 +76,11 @@ async function createAngularSsrExternalMiddleware(server, indexHtmlTransformer)
|
|
|
73
76
|
cachedAngularAppEngine = AngularAppEngine;
|
|
74
77
|
}
|
|
75
78
|
// Forward the request to the middleware in server.ts
|
|
76
|
-
if ((0, utils_1.isSsrNodeRequestHandler)(
|
|
77
|
-
await
|
|
79
|
+
if ((0, utils_1.isSsrNodeRequestHandler)(reqHandler)) {
|
|
80
|
+
await reqHandler(req, res, next);
|
|
78
81
|
}
|
|
79
82
|
else {
|
|
80
|
-
const webRes = await
|
|
83
|
+
const webRes = await reqHandler(createWebRequestFromNodeRequest(req));
|
|
81
84
|
if (!webRes) {
|
|
82
85
|
next();
|
|
83
86
|
return;
|
|
@@ -11,6 +11,7 @@ interface AngularMemoryPluginOptions {
|
|
|
11
11
|
virtualProjectRoot: string;
|
|
12
12
|
outputFiles: AngularMemoryOutputFiles;
|
|
13
13
|
external?: string[];
|
|
14
|
+
skipViteClient?: boolean;
|
|
14
15
|
}
|
|
15
16
|
export declare function createAngularMemoryPlugin(options: AngularMemoryPluginOptions): Promise<Plugin>;
|
|
16
17
|
export {};
|
|
@@ -18,8 +18,6 @@ const load_esm_1 = require("../../../utils/load-esm");
|
|
|
18
18
|
async function createAngularMemoryPlugin(options) {
|
|
19
19
|
const { virtualProjectRoot, outputFiles, external } = options;
|
|
20
20
|
const { normalizePath } = await (0, load_esm_1.loadEsmModule)('vite');
|
|
21
|
-
// See: https://github.com/vitejs/vite/blob/a34a73a3ad8feeacc98632c0f4c643b6820bbfda/packages/vite/src/node/server/pluginContainer.ts#L331-L334
|
|
22
|
-
const defaultImporter = (0, node_path_1.join)(virtualProjectRoot, 'index.html');
|
|
23
21
|
return {
|
|
24
22
|
name: 'vite:angular-memory',
|
|
25
23
|
// Ensures plugin hooks run before built-in Vite hooks
|
|
@@ -32,17 +30,10 @@ async function createAngularMemoryPlugin(options) {
|
|
|
32
30
|
return source;
|
|
33
31
|
}
|
|
34
32
|
if (importer) {
|
|
35
|
-
let normalizedSource;
|
|
36
33
|
if (source[0] === '.' && normalizePath(importer).startsWith(virtualProjectRoot)) {
|
|
37
34
|
// Remove query if present
|
|
38
35
|
const [importerFile] = importer.split('?', 1);
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
else if (source[0] === '/' && importer === defaultImporter) {
|
|
42
|
-
normalizedSource = (0, node_path_1.basename)(source);
|
|
43
|
-
}
|
|
44
|
-
if (normalizedSource) {
|
|
45
|
-
source = '/' + normalizePath(normalizedSource);
|
|
36
|
+
source = '/' + (0, node_path_1.join)((0, node_path_1.dirname)((0, node_path_1.relative)(virtualProjectRoot, importerFile)), source);
|
|
46
37
|
}
|
|
47
38
|
}
|
|
48
39
|
const [file] = source.split('?', 1);
|
|
@@ -55,9 +46,10 @@ async function createAngularMemoryPlugin(options) {
|
|
|
55
46
|
const relativeFile = '/' + normalizePath((0, node_path_1.relative)(virtualProjectRoot, file));
|
|
56
47
|
const codeContents = outputFiles.get(relativeFile)?.contents;
|
|
57
48
|
if (codeContents === undefined) {
|
|
58
|
-
|
|
59
|
-
? loadViteClientCode(file)
|
|
60
|
-
|
|
49
|
+
if (relativeFile.endsWith('/node_modules/vite/dist/client/client.mjs')) {
|
|
50
|
+
return options.skipViteClient ? '' : loadViteClientCode(file);
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
61
53
|
}
|
|
62
54
|
const code = Buffer.from(codeContents).toString('utf-8');
|
|
63
55
|
const mapContents = outputFiles.get(relativeFile + '.map')?.contents;
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
8
|
import type { Connect, Plugin } from 'vite';
|
|
9
|
+
import { ComponentStyleRecord } from '../middlewares';
|
|
9
10
|
import { AngularMemoryOutputFiles } from '../utils';
|
|
10
11
|
export declare enum ServerSsrMode {
|
|
11
12
|
/**
|
|
@@ -34,7 +35,8 @@ interface AngularSetupMiddlewaresPluginOptions {
|
|
|
34
35
|
assets: Map<string, string>;
|
|
35
36
|
extensionMiddleware?: Connect.NextHandleFunction[];
|
|
36
37
|
indexHtmlTransformer?: (content: string) => Promise<string>;
|
|
37
|
-
|
|
38
|
+
componentStyles: Map<string, ComponentStyleRecord>;
|
|
39
|
+
templateUpdates: Map<string, string>;
|
|
38
40
|
ssrMode: ServerSsrMode;
|
|
39
41
|
}
|
|
40
42
|
export declare function createAngularSetupMiddlewaresPlugin(options: AngularSetupMiddlewaresPluginOptions): Plugin;
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.ServerSsrMode = void 0;
|
|
11
11
|
exports.createAngularSetupMiddlewaresPlugin = createAngularSetupMiddlewaresPlugin;
|
|
12
|
+
const load_esm_1 = require("../../../utils/load-esm");
|
|
12
13
|
const middlewares_1 = require("../middlewares");
|
|
13
14
|
var ServerSsrMode;
|
|
14
15
|
(function (ServerSsrMode) {
|
|
@@ -33,15 +34,23 @@ var ServerSsrMode;
|
|
|
33
34
|
*/
|
|
34
35
|
ServerSsrMode[ServerSsrMode["ExternalSsrMiddleware"] = 2] = "ExternalSsrMiddleware";
|
|
35
36
|
})(ServerSsrMode || (exports.ServerSsrMode = ServerSsrMode = {}));
|
|
37
|
+
async function createEncapsulateStyle() {
|
|
38
|
+
const { encapsulateStyle } = await (0, load_esm_1.loadEsmModule)('@angular/compiler');
|
|
39
|
+
const decoder = new TextDecoder('utf-8');
|
|
40
|
+
return (style, componentId) => {
|
|
41
|
+
return encapsulateStyle(decoder.decode(style), componentId);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
36
44
|
function createAngularSetupMiddlewaresPlugin(options) {
|
|
37
45
|
return {
|
|
38
46
|
name: 'vite:angular-setup-middlewares',
|
|
39
47
|
enforce: 'pre',
|
|
40
|
-
configureServer(server) {
|
|
41
|
-
const { indexHtmlTransformer, outputFiles, extensionMiddleware, assets,
|
|
48
|
+
async configureServer(server) {
|
|
49
|
+
const { indexHtmlTransformer, outputFiles, extensionMiddleware, assets, componentStyles, templateUpdates, ssrMode, } = options;
|
|
42
50
|
// Headers, assets and resources get handled first
|
|
43
51
|
server.middlewares.use((0, middlewares_1.createAngularHeadersMiddleware)(server));
|
|
44
|
-
server.middlewares.use((0, middlewares_1.
|
|
52
|
+
server.middlewares.use((0, middlewares_1.createAngularComponentMiddleware)(templateUpdates));
|
|
53
|
+
server.middlewares.use((0, middlewares_1.createAngularAssetsMiddleware)(server, assets, outputFiles, componentStyles, await createEncapsulateStyle()));
|
|
45
54
|
extensionMiddleware?.forEach((middleware) => server.middlewares.use(middleware));
|
|
46
55
|
// Returning a function, installs middleware after the main transform middleware but
|
|
47
56
|
// before the built-in HTML middleware
|
package/src/typings.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
// The `
|
|
9
|
+
// The `bundled_beasties` causes issues with module mappings in Bazel,
|
|
10
10
|
// leading to unexpected behavior with esbuild. Specifically, the problem occurs
|
|
11
11
|
// when esbuild resolves to a different module or version than expected, due to
|
|
12
12
|
// how Bazel handles module mappings.
|
|
@@ -16,4 +16,5 @@ export declare const useTypeChecking: boolean;
|
|
|
16
16
|
export declare const useJSONBuildLogs: boolean;
|
|
17
17
|
export declare const shouldOptimizeChunks: boolean;
|
|
18
18
|
export declare const useComponentStyleHmr: boolean;
|
|
19
|
+
export declare const useComponentTemplateHmr: boolean;
|
|
19
20
|
export declare const usePartialSsrBuild: boolean;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* found in the LICENSE file at https://angular.dev/license
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.usePartialSsrBuild = exports.useComponentStyleHmr = exports.shouldOptimizeChunks = exports.useJSONBuildLogs = exports.useTypeChecking = exports.shouldWatchRoot = exports.debugPerformance = exports.useParallelTs = exports.maxWorkers = exports.allowMinify = exports.shouldBeautify = exports.allowMangle = void 0;
|
|
10
|
+
exports.usePartialSsrBuild = exports.useComponentTemplateHmr = exports.useComponentStyleHmr = exports.shouldOptimizeChunks = exports.useJSONBuildLogs = exports.useTypeChecking = exports.shouldWatchRoot = exports.debugPerformance = exports.useParallelTs = exports.maxWorkers = exports.allowMinify = exports.shouldBeautify = exports.allowMangle = void 0;
|
|
11
11
|
const node_os_1 = require("node:os");
|
|
12
12
|
function isDisabled(variable) {
|
|
13
13
|
return variable === '0' || variable.toLowerCase() === 'false';
|
|
@@ -83,6 +83,8 @@ exports.useJSONBuildLogs = isPresent(buildLogsJsonVariable) && isEnabled(buildLo
|
|
|
83
83
|
const optimizeChunksVariable = process.env['NG_BUILD_OPTIMIZE_CHUNKS'];
|
|
84
84
|
exports.shouldOptimizeChunks = isPresent(optimizeChunksVariable) && isEnabled(optimizeChunksVariable);
|
|
85
85
|
const hmrComponentStylesVariable = process.env['NG_HMR_CSTYLES'];
|
|
86
|
-
exports.useComponentStyleHmr = isPresent(hmrComponentStylesVariable)
|
|
86
|
+
exports.useComponentStyleHmr = !isPresent(hmrComponentStylesVariable) || !isDisabled(hmrComponentStylesVariable);
|
|
87
|
+
const hmrComponentTemplateVariable = process.env['NG_HMR_TEMPLATES'];
|
|
88
|
+
exports.useComponentTemplateHmr = isPresent(hmrComponentTemplateVariable) && isEnabled(hmrComponentTemplateVariable);
|
|
87
89
|
const partialSsrBuildVariable = process.env['NG_BUILD_PARTIAL_SSR'];
|
|
88
90
|
exports.usePartialSsrBuild = isPresent(partialSsrBuildVariable) && isEnabled(partialSsrBuildVariable);
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
* Calculates a CSP compatible hash of an inline script.
|
|
10
|
+
* @param scriptText Text between opening and closing script tag. Has to
|
|
11
|
+
* include whitespaces and newlines!
|
|
12
|
+
* @returns The hash of the text formatted appropriately for CSP.
|
|
13
|
+
*/
|
|
14
|
+
export declare function hashTextContent(scriptText: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Finds all `<script>` tags and creates a dynamic script loading block for consecutive `<script>` with `src` attributes.
|
|
17
|
+
* Hashes all scripts, both inline and generated dynamic script loading blocks.
|
|
18
|
+
* Inserts a `<meta>` tag at the end of the `<head>` of the document with the generated hash-based CSP.
|
|
19
|
+
*
|
|
20
|
+
* @param html Markup that should be processed.
|
|
21
|
+
* @returns The transformed HTML that contains the `<meta>` tag CSP and dynamic loader scripts.
|
|
22
|
+
*/
|
|
23
|
+
export declare function autoCsp(html: string, unsafeEval?: boolean): Promise<string>;
|