@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.
Files changed (90) hide show
  1. package/package.json +21 -19
  2. package/src/builders/application/build-action.js +22 -10
  3. package/src/builders/application/chunk-optimizer.js +1 -4
  4. package/src/builders/application/execute-build.js +59 -24
  5. package/src/builders/application/execute-post-bundle.js +28 -5
  6. package/src/builders/application/index.d.ts +0 -16
  7. package/src/builders/application/index.js +15 -10
  8. package/src/builders/application/options.d.ts +14 -2
  9. package/src/builders/application/options.js +25 -10
  10. package/src/builders/application/results.d.ts +5 -3
  11. package/src/builders/application/schema.d.ts +86 -0
  12. package/src/builders/application/schema.js +19 -1
  13. package/src/builders/application/schema.json +73 -4
  14. package/src/builders/application/setup-bundling.d.ts +6 -1
  15. package/src/builders/application/setup-bundling.js +47 -13
  16. package/src/builders/dev-server/options.d.ts +2 -2
  17. package/src/builders/dev-server/options.js +2 -2
  18. package/src/builders/dev-server/schema.d.ts +2 -1
  19. package/src/builders/dev-server/schema.json +1 -2
  20. package/src/builders/dev-server/vite-server.d.ts +3 -2
  21. package/src/builders/dev-server/vite-server.js +123 -61
  22. package/src/index.d.ts +1 -0
  23. package/src/tools/angular/angular-host.d.ts +1 -1
  24. package/src/tools/angular/angular-host.js +14 -6
  25. package/src/tools/angular/compilation/angular-compilation.d.ts +1 -0
  26. package/src/tools/angular/compilation/aot-compilation.d.ts +1 -0
  27. package/src/tools/angular/compilation/aot-compilation.js +39 -0
  28. package/src/tools/angular/compilation/parallel-compilation.js +2 -2
  29. package/src/tools/angular/compilation/parallel-worker.d.ts +1 -0
  30. package/src/tools/angular/compilation/parallel-worker.js +5 -2
  31. package/src/tools/esbuild/angular/compiler-plugin.d.ts +3 -4
  32. package/src/tools/esbuild/angular/compiler-plugin.js +58 -33
  33. package/src/tools/esbuild/angular/component-stylesheets.d.ts +18 -18
  34. package/src/tools/esbuild/angular/component-stylesheets.js +66 -38
  35. package/src/tools/esbuild/angular/jit-plugin-callbacks.d.ts +1 -1
  36. package/src/tools/esbuild/angular/jit-plugin-callbacks.js +11 -3
  37. package/src/tools/esbuild/angular/source-file-cache.d.ts +1 -1
  38. package/src/tools/esbuild/angular/source-file-cache.js +6 -2
  39. package/src/tools/esbuild/application-code-bundle.d.ts +7 -5
  40. package/src/tools/esbuild/application-code-bundle.js +280 -249
  41. package/src/tools/esbuild/bundler-context.d.ts +2 -1
  42. package/src/tools/esbuild/bundler-context.js +10 -12
  43. package/src/tools/esbuild/bundler-execution-result.d.ts +14 -3
  44. package/src/tools/esbuild/bundler-execution-result.js +15 -8
  45. package/src/tools/esbuild/commonjs-checker.js +2 -2
  46. package/src/tools/esbuild/compiler-plugin-options.d.ts +2 -4
  47. package/src/tools/esbuild/compiler-plugin-options.js +15 -37
  48. package/src/tools/esbuild/global-scripts.js +1 -1
  49. package/src/tools/esbuild/global-styles.js +4 -1
  50. package/src/tools/esbuild/index-html-generator.js +8 -0
  51. package/src/tools/esbuild/javascript-transformer.js +3 -0
  52. package/src/tools/esbuild/server-bundle-metadata-plugin.d.ts +22 -0
  53. package/src/tools/esbuild/server-bundle-metadata-plugin.js +36 -0
  54. package/src/tools/esbuild/stylesheets/bundle-options.d.ts +2 -0
  55. package/src/tools/esbuild/stylesheets/bundle-options.js +2 -1
  56. package/src/tools/esbuild/stylesheets/sass-language.js +4 -0
  57. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.d.ts +9 -0
  58. package/src/tools/esbuild/utils.js +13 -31
  59. package/src/tools/sass/worker.js +19 -0
  60. package/src/tools/vite/middlewares/assets-middleware.d.ts +6 -1
  61. package/src/tools/vite/middlewares/assets-middleware.js +42 -22
  62. package/src/tools/vite/middlewares/component-middleware.d.ts +9 -0
  63. package/src/tools/vite/middlewares/component-middleware.js +33 -0
  64. package/src/tools/vite/middlewares/index.d.ts +2 -1
  65. package/src/tools/vite/middlewares/index.js +3 -1
  66. package/src/tools/vite/middlewares/ssr-middleware.js +11 -8
  67. package/src/tools/vite/plugins/angular-memory-plugin.d.ts +1 -0
  68. package/src/tools/vite/plugins/angular-memory-plugin.js +5 -13
  69. package/src/tools/vite/plugins/setup-middlewares-plugin.d.ts +3 -1
  70. package/src/tools/vite/plugins/setup-middlewares-plugin.js +12 -3
  71. package/src/tools/vite/utils.d.ts +1 -0
  72. package/src/typings.d.ts +1 -1
  73. package/src/utils/environment-options.d.ts +1 -0
  74. package/src/utils/environment-options.js +4 -2
  75. package/src/utils/index-file/auto-csp.d.ts +23 -0
  76. package/src/utils/index-file/auto-csp.js +283 -0
  77. package/src/utils/index-file/html-rewriting-stream.d.ts +5 -1
  78. package/src/utils/index-file/index-html-generator.d.ts +4 -0
  79. package/src/utils/index-file/index-html-generator.js +11 -0
  80. package/src/utils/index-file/inline-critical-css.js +17 -18
  81. package/src/utils/normalize-cache.js +1 -1
  82. package/src/utils/server-rendering/esm-in-memory-loader/utils.d.ts +8 -0
  83. package/src/utils/server-rendering/esm-in-memory-loader/utils.js +13 -0
  84. package/src/utils/server-rendering/launch-server.js +5 -5
  85. package/src/utils/server-rendering/load-esm-from-memory.d.ts +1 -1
  86. package/src/utils/server-rendering/manifest.d.ts +9 -8
  87. package/src/utils/server-rendering/manifest.js +17 -23
  88. package/src/utils/server-rendering/prerender.js +30 -19
  89. package/src/utils/server-rendering/render-worker.js +4 -2
  90. 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, usedComponentStyles) {
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
- const data = outputFile.contents;
63
- if (extension === '.css') {
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 componentId = new URL(req.url, 'http://localhost').searchParams.get('ngcomp');
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
- const usedIds = usedComponentStyles.get(pathname);
69
- if (usedIds === undefined) {
70
- usedComponentStyles.set(pathname, [componentId]);
75
+ if (componentStyle.used === undefined) {
76
+ componentStyle.used = new Set([componentId]);
71
77
  }
72
78
  else {
73
- usedIds.push(componentId);
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 (/^[_.\-\p{Letter}\d]+-c\d{9}$/u.test(componentId)) {
79
- (0, load_esm_1.loadEsmModule)('@angular/compiler')
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('Invalid component stylesheet ID request: ' + componentId);
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.render(webReq);
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 { default: handler, AngularAppEngine } = (await server.ssrLoadModule('./server.mjs'));
57
- if (!(0, utils_1.isSsrNodeRequestHandler)(handler) && !(0, utils_1.isSsrRequestHandler)(handler)) {
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 default export in 'server.ts' does not provide a Node.js request handler. ` +
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)(handler)) {
77
- await handler(req, res, next);
79
+ if ((0, utils_1.isSsrNodeRequestHandler)(reqHandler)) {
80
+ await reqHandler(req, res, next);
78
81
  }
79
82
  else {
80
- const webRes = await handler(createWebRequestFromNodeRequest(req));
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
- normalizedSource = (0, node_path_1.join)((0, node_path_1.dirname)((0, node_path_1.relative)(virtualProjectRoot, importerFile)), source);
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
- return relativeFile.endsWith('/node_modules/vite/dist/client/client.mjs')
59
- ? loadViteClientCode(file)
60
- : undefined;
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
- usedComponentStyles: Map<string, string[]>;
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, usedComponentStyles, ssrMode, } = options;
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.createAngularAssetsMiddleware)(server, assets, outputFiles, usedComponentStyles));
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
@@ -7,6 +7,7 @@
7
7
  */
8
8
  export type AngularMemoryOutputFiles = Map<string, {
9
9
  contents: Uint8Array;
10
+ hash: string;
10
11
  servable: boolean;
11
12
  }>;
12
13
  export declare function pathnameWithoutBasePath(url: string, basePath: string): string;
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 `bundled_critters` causes issues with module mappings in Bazel,
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) && isEnabled(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>;