@angular/build 19.0.0-next.8 → 19.0.0-rc.0

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 (97) hide show
  1. package/LICENSE +5 -5
  2. package/package.json +22 -19
  3. package/src/builders/application/build-action.js +9 -9
  4. package/src/builders/application/chunk-optimizer.js +1 -4
  5. package/src/builders/application/execute-build.js +34 -6
  6. package/src/builders/application/execute-post-bundle.js +9 -1
  7. package/src/builders/application/index.d.ts +0 -16
  8. package/src/builders/application/index.js +15 -10
  9. package/src/builders/application/options.d.ts +11 -1
  10. package/src/builders/application/options.js +17 -10
  11. package/src/builders/application/results.d.ts +5 -3
  12. package/src/builders/application/schema.d.ts +86 -0
  13. package/src/builders/application/schema.js +19 -1
  14. package/src/builders/application/schema.json +73 -4
  15. package/src/builders/application/setup-bundling.d.ts +3 -1
  16. package/src/builders/application/setup-bundling.js +33 -6
  17. package/src/builders/dev-server/vite-server.d.ts +2 -2
  18. package/src/builders/dev-server/vite-server.js +46 -16
  19. package/src/index.d.ts +1 -0
  20. package/src/tools/angular/angular-host.d.ts +1 -1
  21. package/src/tools/angular/angular-host.js +1 -4
  22. package/src/tools/angular/compilation/angular-compilation.d.ts +1 -0
  23. package/src/tools/angular/compilation/aot-compilation.d.ts +1 -0
  24. package/src/tools/angular/compilation/aot-compilation.js +39 -0
  25. package/src/tools/angular/compilation/parallel-compilation.js +2 -2
  26. package/src/tools/angular/compilation/parallel-worker.d.ts +1 -0
  27. package/src/tools/angular/compilation/parallel-worker.js +5 -2
  28. package/src/tools/babel/plugins/add-code-coverage.d.ts +14 -0
  29. package/src/tools/babel/plugins/add-code-coverage.js +44 -0
  30. package/src/tools/babel/plugins/types.d.ts +20 -0
  31. package/src/tools/esbuild/angular/compiler-plugin.d.ts +3 -4
  32. package/src/tools/esbuild/angular/compiler-plugin.js +55 -34
  33. package/src/tools/esbuild/angular/component-stylesheets.d.ts +17 -18
  34. package/src/tools/esbuild/angular/component-stylesheets.js +63 -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/application-code-bundle.d.ts +5 -4
  38. package/src/tools/esbuild/application-code-bundle.js +66 -41
  39. package/src/tools/esbuild/bundler-context.d.ts +2 -1
  40. package/src/tools/esbuild/bundler-context.js +10 -12
  41. package/src/tools/esbuild/bundler-execution-result.d.ts +5 -2
  42. package/src/tools/esbuild/bundler-execution-result.js +5 -1
  43. package/src/tools/esbuild/commonjs-checker.js +2 -2
  44. package/src/tools/esbuild/compiler-plugin-options.d.ts +1 -4
  45. package/src/tools/esbuild/compiler-plugin-options.js +14 -36
  46. package/src/tools/esbuild/global-scripts.js +1 -1
  47. package/src/tools/esbuild/global-styles.js +4 -1
  48. package/src/tools/esbuild/index-html-generator.js +8 -0
  49. package/src/tools/esbuild/javascript-transformer-worker.d.ts +1 -0
  50. package/src/tools/esbuild/javascript-transformer-worker.js +5 -1
  51. package/src/tools/esbuild/javascript-transformer.d.ts +2 -2
  52. package/src/tools/esbuild/javascript-transformer.js +7 -3
  53. package/src/tools/esbuild/server-bundle-metadata-plugin.d.ts +22 -0
  54. package/src/tools/esbuild/server-bundle-metadata-plugin.js +36 -0
  55. package/src/tools/esbuild/stylesheets/bundle-options.d.ts +2 -0
  56. package/src/tools/esbuild/stylesheets/bundle-options.js +2 -1
  57. package/src/tools/esbuild/stylesheets/sass-language.js +4 -0
  58. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.d.ts +9 -0
  59. package/src/tools/esbuild/utils.js +13 -31
  60. package/src/tools/sass/worker.js +19 -0
  61. package/src/tools/vite/middlewares/assets-middleware.d.ts +1 -1
  62. package/src/tools/vite/middlewares/assets-middleware.js +19 -3
  63. package/src/tools/vite/middlewares/component-middleware.d.ts +9 -0
  64. package/src/tools/vite/middlewares/component-middleware.js +33 -0
  65. package/src/tools/vite/middlewares/index.d.ts +1 -0
  66. package/src/tools/vite/middlewares/index.js +3 -1
  67. package/src/tools/vite/middlewares/ssr-middleware.js +13 -12
  68. package/src/tools/vite/plugins/setup-middlewares-plugin.d.ts +2 -1
  69. package/src/tools/vite/plugins/setup-middlewares-plugin.js +2 -1
  70. package/src/tools/vite/utils.d.ts +1 -0
  71. package/src/typings.d.ts +1 -1
  72. package/src/utils/environment-options.js +1 -1
  73. package/src/utils/index-file/auto-csp.d.ts +23 -0
  74. package/src/utils/index-file/auto-csp.js +283 -0
  75. package/src/utils/index-file/html-rewriting-stream.d.ts +5 -1
  76. package/src/utils/index-file/index-html-generator.d.ts +4 -0
  77. package/src/utils/index-file/index-html-generator.js +16 -0
  78. package/src/utils/index-file/inline-critical-css.js +17 -18
  79. package/src/utils/index-file/ngcm-attribute.d.ts +15 -0
  80. package/src/utils/index-file/ngcm-attribute.js +37 -0
  81. package/src/utils/index-file/valid-self-closing-tags.js +27 -0
  82. package/src/utils/normalize-cache.js +1 -1
  83. package/src/utils/server-rendering/fetch-patch.d.ts +1 -1
  84. package/src/utils/server-rendering/fetch-patch.js +2 -2
  85. package/src/utils/server-rendering/launch-server.d.ts +14 -0
  86. package/src/utils/server-rendering/launch-server.js +63 -0
  87. package/src/utils/server-rendering/load-esm-from-memory.d.ts +7 -0
  88. package/src/utils/server-rendering/manifest.d.ts +1 -1
  89. package/src/utils/server-rendering/manifest.js +4 -13
  90. package/src/utils/server-rendering/prerender.js +10 -6
  91. package/src/utils/server-rendering/render-worker.d.ts +4 -1
  92. package/src/utils/server-rendering/render-worker.js +13 -3
  93. package/src/utils/server-rendering/routes-extractor-worker.d.ts +5 -4
  94. package/src/utils/server-rendering/routes-extractor-worker.js +14 -4
  95. package/src/utils/server-rendering/utils.d.ts +11 -0
  96. package/src/utils/server-rendering/utils.js +17 -0
  97. package/src/utils/supported-browsers.js +1 -0
@@ -15,5 +15,12 @@ interface MainServerBundleExports {
15
15
  ɵextractRoutesAndCreateRouteTree: typeof ɵextractRoutesAndCreateRouteTree;
16
16
  ɵgetOrCreateAngularServerApp: typeof ɵgetOrCreateAngularServerApp;
17
17
  }
18
+ /**
19
+ * Represents the exports available from the server bundle.
20
+ */
21
+ interface ServerBundleExports {
22
+ reqHandler?: unknown;
23
+ }
18
24
  export declare function loadEsmModuleFromMemory(path: './main.server.mjs'): Promise<MainServerBundleExports>;
25
+ export declare function loadEsmModuleFromMemory(path: './server.mjs'): Promise<ServerBundleExports>;
19
26
  export {};
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { NormalizedApplicationBuildOptions } from '../../builders/application/options';
9
9
  import type { BuildOutputFile } from '../../tools/esbuild/bundler-context';
10
- import { PrerenderedRoutesRecord } from '../../tools/esbuild/bundler-execution-result';
10
+ import type { PrerenderedRoutesRecord } from '../../tools/esbuild/bundler-execution-result';
11
11
  export declare const SERVER_APP_MANIFEST_FILENAME = "angular-app-manifest.mjs";
12
12
  export declare const SERVER_APP_ENGINE_MANIFEST_FILENAME = "angular-app-engine-manifest.mjs";
13
13
  /**
@@ -18,18 +18,9 @@ const MAIN_SERVER_OUTPUT_FILENAME = 'main.server.mjs';
18
18
  * A mapping of unsafe characters to their escaped Unicode equivalents.
19
19
  */
20
20
  const UNSAFE_CHAR_MAP = {
21
- '<': '\\u003C',
22
- '>': '\\u003E',
23
- '/': '\\u002F',
21
+ '`': '\\`',
22
+ '$': '\\$',
24
23
  '\\': '\\\\',
25
- '\b': '\\b',
26
- '\f': '\\f',
27
- '\n': '\\n',
28
- '\r': '\\r',
29
- '\t': '\\t',
30
- '\0': '\\0',
31
- '\u2028': '\\u2028',
32
- '\u2029': '\\u2029',
33
24
  };
34
25
  /**
35
26
  * Escapes unsafe characters in a given string by replacing them with
@@ -39,7 +30,7 @@ const UNSAFE_CHAR_MAP = {
39
30
  * @returns The escaped string where unsafe characters are replaced.
40
31
  */
41
32
  function escapeUnsafeChars(str) {
42
- return str.replace(/[<>\b\f\n\r\t\0\u2028\u2029]/g, (c) => UNSAFE_CHAR_MAP[c]);
33
+ return str.replace(/[$`\\]/g, (c) => UNSAFE_CHAR_MAP[c]);
43
34
  }
44
35
  /**
45
36
  * Generates the server manifest for the App Engine environment.
@@ -119,7 +110,7 @@ function generateAngularServerAppManifest(additionalHtmlOutputFiles, outputFiles
119
110
  if (file.path === options_1.INDEX_HTML_SERVER ||
120
111
  file.path === options_1.INDEX_HTML_CSR ||
121
112
  (inlineCriticalCss && file.path.endsWith('.css'))) {
122
- serverAssetsContent.push(`['${file.path}', async () => ${escapeUnsafeChars(JSON.stringify(file.text))}]`);
113
+ serverAssetsContent.push(`['${file.path}', async () => \`${escapeUnsafeChars(file.text)}\`]`);
123
114
  }
124
115
  }
125
116
  const manifestContent = `
@@ -92,7 +92,7 @@ async function prerenderPages(workspaceRoot, baseHref, appShellOptions, prerende
92
92
  };
93
93
  }
94
94
  // Render routes
95
- const { errors: renderingErrors, output } = await renderPages(baseHref, sourcemap, serializableRouteTreeNodeForPrerender, maxThreads, workspaceRoot, outputFilesForWorker, assetsReversed, appShellOptions);
95
+ const { errors: renderingErrors, output } = await renderPages(baseHref, sourcemap, serializableRouteTreeNodeForPrerender, maxThreads, workspaceRoot, outputFilesForWorker, assetsReversed, appShellOptions, outputMode);
96
96
  errors.push(...renderingErrors);
97
97
  return {
98
98
  errors,
@@ -101,7 +101,7 @@ async function prerenderPages(workspaceRoot, baseHref, appShellOptions, prerende
101
101
  serializableRouteTreeNode,
102
102
  };
103
103
  }
104
- async function renderPages(baseHref, sourcemap, serializableRouteTreeNode, maxThreads, workspaceRoot, outputFilesForWorker, assetFilesForWorker, appShellOptions) {
104
+ async function renderPages(baseHref, sourcemap, serializableRouteTreeNode, maxThreads, workspaceRoot, outputFilesForWorker, assetFilesForWorker, appShellOptions, outputMode) {
105
105
  const output = {};
106
106
  const errors = [];
107
107
  const workerExecArgv = [
@@ -119,6 +119,8 @@ async function renderPages(baseHref, sourcemap, serializableRouteTreeNode, maxTh
119
119
  workspaceRoot,
120
120
  outputFiles: outputFilesForWorker,
121
121
  assetFiles: assetFilesForWorker,
122
+ outputMode,
123
+ hasSsrEntry: !!outputFilesForWorker['server.mjs'],
122
124
  },
123
125
  execArgv: workerExecArgv,
124
126
  });
@@ -194,19 +196,21 @@ async function getAllRoutes(workspaceRoot, baseHref, outputFilesForWorker, asset
194
196
  workspaceRoot,
195
197
  outputFiles: outputFilesForWorker,
196
198
  assetFiles: assetFilesForWorker,
199
+ outputMode,
200
+ hasSsrEntry: !!outputFilesForWorker['server.mjs'],
197
201
  },
198
202
  execArgv: workerExecArgv,
199
203
  });
200
204
  try {
201
- const { serializedRouteTree, errors } = await renderWorker.run({
202
- outputMode,
203
- });
205
+ const { serializedRouteTree, errors } = await renderWorker.run({});
204
206
  return { errors, serializedRouteTree: [...routes, ...serializedRouteTree] };
205
207
  }
206
208
  catch (err) {
207
209
  (0, error_1.assertIsError)(err);
208
210
  return {
209
- errors: [`An error occurred while extracting routes.\n\n${err.stack}`],
211
+ errors: [
212
+ `An error occurred while extracting routes.\n\n${err.stack ?? err.message ?? err.code ?? err}`,
213
+ ],
210
214
  serializedRouteTree: [],
211
215
  };
212
216
  }
@@ -5,9 +5,12 @@
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
+ import type { OutputMode } from '../../builders/application/schema';
8
9
  import type { ESMInMemoryFileLoaderWorkerData } from './esm-in-memory-loader/loader-hooks';
9
10
  export interface RenderWorkerData extends ESMInMemoryFileLoaderWorkerData {
10
11
  assetFiles: Record</** Destination */ string, /** Source */ string>;
12
+ outputMode: OutputMode | undefined;
13
+ hasSsrEntry: boolean;
11
14
  }
12
15
  export interface RenderOptions {
13
16
  url: string;
@@ -16,5 +19,5 @@ export interface RenderOptions {
16
19
  * Renders each route in routes and writes them to <outputPath>/<route>/index.html.
17
20
  */
18
21
  declare function renderPage({ url }: RenderOptions): Promise<string | null>;
19
- declare const _default: typeof renderPage;
22
+ declare const _default: Promise<typeof renderPage>;
20
23
  export default _default;
@@ -7,19 +7,29 @@
7
7
  * found in the LICENSE file at https://angular.dev/license
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ const worker_threads_1 = require("worker_threads");
10
11
  const fetch_patch_1 = require("./fetch-patch");
12
+ const launch_server_1 = require("./launch-server");
11
13
  const load_esm_from_memory_1 = require("./load-esm-from-memory");
14
+ /**
15
+ * This is passed as workerData when setting up the worker via the `piscina` package.
16
+ */
17
+ const { outputMode, hasSsrEntry } = worker_threads_1.workerData;
18
+ let serverURL = launch_server_1.DEFAULT_URL;
12
19
  /**
13
20
  * Renders each route in routes and writes them to <outputPath>/<route>/index.html.
14
21
  */
15
22
  async function renderPage({ url }) {
16
23
  const { ɵgetOrCreateAngularServerApp: getOrCreateAngularServerApp } = await (0, load_esm_from_memory_1.loadEsmModuleFromMemory)('./main.server.mjs');
17
24
  const angularServerApp = getOrCreateAngularServerApp();
18
- const response = await angularServerApp.renderStatic(new URL(url, 'http://local-angular-prerender'), AbortSignal.timeout(30_000));
25
+ const response = await angularServerApp.renderStatic(new URL(url, serverURL), AbortSignal.timeout(30_000));
19
26
  return response ? response.text() : null;
20
27
  }
21
- function initialize() {
22
- (0, fetch_patch_1.patchFetchToLoadInMemoryAssets)();
28
+ async function initialize() {
29
+ if (outputMode !== undefined && hasSsrEntry) {
30
+ serverURL = await (0, launch_server_1.launchServer)();
31
+ }
32
+ (0, fetch_patch_1.patchFetchToLoadInMemoryAssets)(serverURL);
23
33
  return renderPage;
24
34
  }
25
35
  exports.default = initialize();
@@ -6,11 +6,12 @@
6
6
  * found in the LICENSE file at https://angular.dev/license
7
7
  */
8
8
  import { OutputMode } from '../../builders/application/schema';
9
+ import { ESMInMemoryFileLoaderWorkerData } from './esm-in-memory-loader/loader-hooks';
9
10
  import { RoutersExtractorWorkerResult } from './models';
10
- export interface ExtractRoutesOptions {
11
- outputMode?: OutputMode;
11
+ export interface ExtractRoutesWorkerData extends ESMInMemoryFileLoaderWorkerData {
12
+ outputMode: OutputMode | undefined;
12
13
  }
13
14
  /** Renders an application based on a provided options. */
14
- declare function extractRoutes({ outputMode, }: ExtractRoutesOptions): Promise<RoutersExtractorWorkerResult>;
15
- declare const _default: typeof extractRoutes;
15
+ declare function extractRoutes(): Promise<RoutersExtractorWorkerResult>;
16
+ declare const _default: Promise<typeof extractRoutes>;
16
17
  export default _default;
@@ -7,20 +7,30 @@
7
7
  * found in the LICENSE file at https://angular.dev/license
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ const worker_threads_1 = require("worker_threads");
10
11
  const schema_1 = require("../../builders/application/schema");
11
12
  const fetch_patch_1 = require("./fetch-patch");
13
+ const launch_server_1 = require("./launch-server");
12
14
  const load_esm_from_memory_1 = require("./load-esm-from-memory");
15
+ /**
16
+ * This is passed as workerData when setting up the worker via the `piscina` package.
17
+ */
18
+ const { outputMode, hasSsrEntry } = worker_threads_1.workerData;
19
+ let serverURL = launch_server_1.DEFAULT_URL;
13
20
  /** Renders an application based on a provided options. */
14
- async function extractRoutes({ outputMode, }) {
21
+ async function extractRoutes() {
15
22
  const { ɵextractRoutesAndCreateRouteTree: extractRoutesAndCreateRouteTree } = await (0, load_esm_from_memory_1.loadEsmModuleFromMemory)('./main.server.mjs');
16
- const { routeTree, errors } = await extractRoutesAndCreateRouteTree(new URL('http://local-angular-prerender/'), undefined /** manifest */, true /** invokeGetPrerenderParams */, outputMode === schema_1.OutputMode.Server /** includePrerenderFallbackRoutes */);
23
+ const { routeTree, errors } = await extractRoutesAndCreateRouteTree(serverURL, undefined /** manifest */, true /** invokeGetPrerenderParams */, outputMode === schema_1.OutputMode.Server /** includePrerenderFallbackRoutes */);
17
24
  return {
18
25
  errors,
19
26
  serializedRouteTree: routeTree.toObject(),
20
27
  };
21
28
  }
22
- function initialize() {
23
- (0, fetch_patch_1.patchFetchToLoadInMemoryAssets)();
29
+ async function initialize() {
30
+ if (outputMode !== undefined && hasSsrEntry) {
31
+ serverURL = await (0, launch_server_1.launchServer)();
32
+ }
33
+ (0, fetch_patch_1.patchFetchToLoadInMemoryAssets)(serverURL);
24
34
  return extractRoutes;
25
35
  }
26
36
  exports.default = initialize();
@@ -0,0 +1,11 @@
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 { createRequestHandler } from '@angular/ssr';
9
+ import type { createNodeRequestHandler } from '@angular/ssr/node';
10
+ export declare function isSsrNodeRequestHandler(value: unknown): value is ReturnType<typeof createNodeRequestHandler>;
11
+ export declare function isSsrRequestHandler(value: unknown): value is ReturnType<typeof createRequestHandler>;
@@ -0,0 +1,17 @@
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.isSsrNodeRequestHandler = isSsrNodeRequestHandler;
11
+ exports.isSsrRequestHandler = isSsrRequestHandler;
12
+ function isSsrNodeRequestHandler(value) {
13
+ return typeof value === 'function' && '__ng_node_request_handler__' in value;
14
+ }
15
+ function isSsrRequestHandler(value) {
16
+ return typeof value === 'function' && '__ng_request_handler__' in value;
17
+ }
@@ -19,6 +19,7 @@ function getSupportedBrowsers(projectRoot, logger) {
19
19
  'last 2 Edge major versions',
20
20
  'last 2 Safari major versions',
21
21
  'last 2 iOS major versions',
22
+ 'last 2 Android major versions',
22
23
  'Firefox ESR',
23
24
  ];
24
25
  // Get browsers from config or default.