@angular/build 20.1.0-next.2 → 20.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/build",
3
- "version": "20.1.0-next.2",
3
+ "version": "20.1.0-rc.0",
4
4
  "description": "Official build system for Angular",
5
5
  "keywords": [
6
6
  "Angular CLI",
@@ -23,12 +23,12 @@
23
23
  "builders": "builders.json",
24
24
  "dependencies": {
25
25
  "@ampproject/remapping": "2.3.0",
26
- "@angular-devkit/architect": "0.2001.0-next.2",
27
- "@babel/core": "7.27.4",
26
+ "@angular-devkit/architect": "0.2001.0-rc.0",
27
+ "@babel/core": "7.27.7",
28
28
  "@babel/helper-annotate-as-pure": "7.27.3",
29
29
  "@babel/helper-split-export-declaration": "7.24.7",
30
- "@inquirer/confirm": "5.1.12",
31
- "@vitejs/plugin-basic-ssl": "2.0.0",
30
+ "@inquirer/confirm": "5.1.13",
31
+ "@vitejs/plugin-basic-ssl": "2.1.0",
32
32
  "beasties": "0.3.4",
33
33
  "browserslist": "^4.23.0",
34
34
  "esbuild": "0.25.5",
@@ -40,17 +40,17 @@
40
40
  "mrmime": "2.0.1",
41
41
  "parse5-html-rewriting-stream": "7.1.0",
42
42
  "picomatch": "4.0.2",
43
- "piscina": "5.0.0",
44
- "rollup": "4.43.0",
43
+ "piscina": "5.1.2",
44
+ "rollup": "4.44.1",
45
45
  "sass": "1.89.2",
46
46
  "semver": "7.7.2",
47
47
  "source-map-support": "0.5.21",
48
48
  "tinyglobby": "0.2.14",
49
- "vite": "6.3.5",
49
+ "vite": "7.0.0",
50
50
  "watchpack": "2.4.4"
51
51
  },
52
52
  "optionalDependencies": {
53
- "lmdb": "3.4.0"
53
+ "lmdb": "3.4.1"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "@angular/core": "^20.0.0 || ^20.1.0-next.0",
@@ -60,7 +60,7 @@
60
60
  "@angular/platform-browser": "^20.0.0 || ^20.1.0-next.0",
61
61
  "@angular/platform-server": "^20.0.0 || ^20.1.0-next.0",
62
62
  "@angular/service-worker": "^20.0.0 || ^20.1.0-next.0",
63
- "@angular/ssr": "^20.1.0-next.2",
63
+ "@angular/ssr": "^20.1.0-rc.0",
64
64
  "karma": "^6.4.0",
65
65
  "less": "^4.2.0",
66
66
  "ng-packagr": "^20.0.0 || ^20.1.0-next.0",
@@ -99,6 +99,7 @@ function getBuiltInKarmaConfig(workspaceRoot, projectName) {
99
99
  // Any changes to the config here need to be synced to: packages/schematics/angular/config/files/karma.conf.js.template
100
100
  return {
101
101
  basePath: '',
102
+ rootUrl: '/',
102
103
  frameworks: ['jasmine'],
103
104
  plugins: [
104
105
  'karma-jasmine',
@@ -106,6 +107,9 @@ function getBuiltInKarmaConfig(workspaceRoot, projectName) {
106
107
  'karma-jasmine-html-reporter',
107
108
  'karma-coverage',
108
109
  ].map((p) => workspaceRootRequire(p)),
110
+ proxies: {
111
+ '/': '/base/',
112
+ },
109
113
  jasmineHtmlReporter: {
110
114
  suppressAll: true, // removes the duplicated traces
111
115
  },
@@ -72,9 +72,7 @@ async function* execute(options, context, extensions = {}) {
72
72
  const { startVitest } = vitestNodeModule;
73
73
  // Setup test file build options based on application build target options
74
74
  const buildTargetOptions = (await context.validateOptions(await context.getTargetOptions(normalizedOptions.buildTarget), await context.getBuilderNameForTarget(normalizedOptions.buildTarget)));
75
- if (buildTargetOptions.polyfills?.includes('zone.js')) {
76
- buildTargetOptions.polyfills.push('zone.js/testing');
77
- }
75
+ buildTargetOptions.polyfills = (0, options_1.injectTestingPolyfills)(buildTargetOptions.polyfills);
78
76
  const outputPath = node_path_1.default.join(context.workspaceRoot, generateOutputPath());
79
77
  const buildOptions = {
80
78
  ...buildTargetOptions,
@@ -176,15 +174,7 @@ async function* execute(options, context, extensions = {}) {
176
174
  include: [],
177
175
  reporters: normalizedOptions.reporters ?? ['default'],
178
176
  watch: normalizedOptions.watch,
179
- coverage: {
180
- enabled: !!normalizedOptions.codeCoverage,
181
- excludeAfterRemap: true,
182
- exclude: normalizedOptions.codeCoverage?.exclude ?? [],
183
- // Special handling for `reporter` due to an undefined value causing upstream failures
184
- ...(normalizedOptions.codeCoverage?.reporters
185
- ? { reporter: normalizedOptions.codeCoverage.reporters }
186
- : {}),
187
- },
177
+ coverage: generateCoverageOption(normalizedOptions.codeCoverage, workspaceRoot, outputPath),
188
178
  ...debugOptions,
189
179
  }, {
190
180
  plugins: [
@@ -194,7 +184,7 @@ async function* execute(options, context, extensions = {}) {
194
184
  // Create a subproject that can be configured with plugins for browser mode.
195
185
  // Plugins defined directly in the vite overrides will not be present in the
196
186
  // browser specific Vite instance.
197
- await context.injectTestProjects({
187
+ const [project] = await context.injectTestProjects({
198
188
  test: {
199
189
  name: projectName,
200
190
  root: outputPath,
@@ -225,6 +215,14 @@ async function* execute(options, context, extensions = {}) {
225
215
  },
226
216
  ],
227
217
  });
218
+ // Adjust coverage excludes to not include the otherwise automatically inserted included unit tests.
219
+ // Vite does this as a convenience but is problematic for the bundling strategy employed by the
220
+ // builder's test setup. To workaround this, the excludes are adjusted here to only automaticallyAdd commentMore actions
221
+ // exclude the TypeScript source test files.
222
+ project.config.coverage.exclude = [
223
+ ...(normalizedOptions.codeCoverage?.exclude ?? []),
224
+ '**/*.{test,spec}.?(c|m)ts',
225
+ ];
228
226
  },
229
227
  },
230
228
  ],
@@ -295,3 +293,19 @@ function generateOutputPath() {
295
293
  const uuidSuffix = (0, node_crypto_1.randomUUID)().slice(0, 8);
296
294
  return node_path_1.default.join('dist', 'test-out', `${datePrefix}-${uuidSuffix}`);
297
295
  }
296
+ function generateCoverageOption(codeCoverage, workspaceRoot, outputPath) {
297
+ if (!codeCoverage) {
298
+ return {
299
+ enabled: false,
300
+ };
301
+ }
302
+ return {
303
+ enabled: true,
304
+ excludeAfterRemap: true,
305
+ include: [`${node_path_1.default.relative(workspaceRoot, outputPath)}/**`],
306
+ // Special handling for `reporter` due to an undefined value causing upstream failures
307
+ ...(codeCoverage.reporters
308
+ ? { reporter: codeCoverage.reporters }
309
+ : {}),
310
+ };
311
+ }
@@ -6,5 +6,5 @@
6
6
  * found in the LICENSE file at https://angular.dev/license
7
7
  */
8
8
  import type { BuilderContext, BuilderOutput } from '@angular-devkit/architect';
9
- import type { NormalizedUnitTestOptions } from './options';
9
+ import { type NormalizedUnitTestOptions } from './options';
10
10
  export declare function useKarmaBuilder(context: BuilderContext, unitTestOptions: NormalizedUnitTestOptions): Promise<AsyncIterable<BuilderOutput>>;
@@ -41,11 +41,13 @@ var __importStar = (this && this.__importStar) || (function () {
41
41
  })();
42
42
  Object.defineProperty(exports, "__esModule", { value: true });
43
43
  exports.useKarmaBuilder = useKarmaBuilder;
44
+ const options_1 = require("./options");
44
45
  async function useKarmaBuilder(context, unitTestOptions) {
45
46
  if (unitTestOptions.debug) {
46
47
  context.logger.warn('The "karma" test runner does not support the "debug" option. The option will be ignored.');
47
48
  }
48
49
  const buildTargetOptions = (await context.validateOptions(await context.getTargetOptions(unitTestOptions.buildTarget), await context.getBuilderNameForTarget(unitTestOptions.buildTarget)));
50
+ buildTargetOptions.polyfills = (0, options_1.injectTestingPolyfills)(buildTargetOptions.polyfills);
49
51
  const options = {
50
52
  tsConfig: unitTestOptions.tsConfig,
51
53
  polyfills: buildTargetOptions.polyfills,
@@ -28,3 +28,4 @@ export declare function normalizeOptions(context: BuilderContext, projectName: s
28
28
  debug: boolean;
29
29
  providersFile: string | undefined;
30
30
  }>;
31
+ export declare function injectTestingPolyfills(polyfills?: string[]): string[];
@@ -11,6 +11,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.normalizeOptions = normalizeOptions;
14
+ exports.injectTestingPolyfills = injectTestingPolyfills;
14
15
  const architect_1 = require("@angular-devkit/architect");
15
16
  const node_path_1 = __importDefault(require("node:path"));
16
17
  const normalize_cache_1 = require("../../utils/normalize-cache");
@@ -55,3 +56,6 @@ async function normalizeOptions(context, projectName, options) {
55
56
  providersFile: options.providersFile && node_path_1.default.join(workspaceRoot, options.providersFile),
56
57
  };
57
58
  }
59
+ function injectTestingPolyfills(polyfills = []) {
60
+ return polyfills.includes('zone.js') ? [...polyfills, 'zone.js/testing'] : polyfills;
61
+ }
package/src/private.d.ts CHANGED
@@ -41,3 +41,4 @@ export { type BundleStats, generateBuildStatsTable } from './utils/stats-table';
41
41
  export { getSupportedBrowsers } from './utils/supported-browsers';
42
42
  export { assertCompatibleAngularVersion } from './utils/version';
43
43
  export { findTests, getTestEntrypoints } from './builders/karma/find-tests';
44
+ export { findTailwindConfiguration, generateSearchDirectories, loadPostcssConfiguration, } from './utils/postcss-configuration';
package/src/private.js CHANGED
@@ -21,7 +21,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
21
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
22
  };
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.getTestEntrypoints = exports.findTests = exports.assertCompatibleAngularVersion = exports.getSupportedBrowsers = exports.generateBuildStatsTable = exports.augmentAppWithServiceWorker = exports.purgeStaleBuildCache = exports.createTranslationLoader = exports.loadProxyConfiguration = exports.InlineCriticalCssProcessor = exports.IndexHtmlGenerator = exports.loadTranslations = exports.createI18nOptions = exports.deleteOutputDir = exports.checkPort = exports.JavaScriptTransformer = exports.createJitResourceTransformer = exports.SourceFileCache = exports.SassWorkerImplementation = exports.transformSupportedBrowsersToTargets = exports.emitFilesToDisk = exports.executeKarmaInternal = exports.serveWithVite = exports.ResultKind = exports.buildApplicationInternal = void 0;
24
+ exports.loadPostcssConfiguration = exports.generateSearchDirectories = exports.findTailwindConfiguration = exports.getTestEntrypoints = exports.findTests = exports.assertCompatibleAngularVersion = exports.getSupportedBrowsers = exports.generateBuildStatsTable = exports.augmentAppWithServiceWorker = exports.purgeStaleBuildCache = exports.createTranslationLoader = exports.loadProxyConfiguration = exports.InlineCriticalCssProcessor = exports.IndexHtmlGenerator = exports.loadTranslations = exports.createI18nOptions = exports.deleteOutputDir = exports.checkPort = exports.JavaScriptTransformer = exports.createJitResourceTransformer = exports.SourceFileCache = exports.SassWorkerImplementation = exports.transformSupportedBrowsersToTargets = exports.emitFilesToDisk = exports.executeKarmaInternal = exports.serveWithVite = exports.ResultKind = exports.buildApplicationInternal = void 0;
25
25
  exports.createCompilerPlugin = createCompilerPlugin;
26
26
  /**
27
27
  * @fileoverview
@@ -90,3 +90,7 @@ Object.defineProperty(exports, "assertCompatibleAngularVersion", { enumerable: t
90
90
  var find_tests_1 = require("./builders/karma/find-tests");
91
91
  Object.defineProperty(exports, "findTests", { enumerable: true, get: function () { return find_tests_1.findTests; } });
92
92
  Object.defineProperty(exports, "getTestEntrypoints", { enumerable: true, get: function () { return find_tests_1.getTestEntrypoints; } });
93
+ var postcss_configuration_1 = require("./utils/postcss-configuration");
94
+ Object.defineProperty(exports, "findTailwindConfiguration", { enumerable: true, get: function () { return postcss_configuration_1.findTailwindConfiguration; } });
95
+ Object.defineProperty(exports, "generateSearchDirectories", { enumerable: true, get: function () { return postcss_configuration_1.generateSearchDirectories; } });
96
+ Object.defineProperty(exports, "loadPostcssConfiguration", { enumerable: true, get: function () { return postcss_configuration_1.loadPostcssConfiguration; } });
@@ -98,13 +98,13 @@ async function createAngularMemoryPlugin(options) {
98
98
  */
99
99
  async function loadViteClientCode(file, disableViteTransport = false) {
100
100
  const originalContents = await (0, promises_1.readFile)(file, 'utf-8');
101
- let updatedContents = originalContents.replace(`"You can also disable this overlay by setting ",
102
- h("code", { part: "config-option-name" }, "server.hmr.overlay"),
103
- " to ",
104
- h("code", { part: "config-option-value" }, "false"),
105
- " in ",
106
- h("code", { part: "config-file-name" }, hmrConfigName),
107
- "."`, '');
101
+ let updatedContents = originalContents.replace('"You can also disable this overlay by setting ", ' +
102
+ 'h("code", { part: "config-option-name" }, "server.hmr.overlay"), ' +
103
+ '" to ", ' +
104
+ 'h("code", { part: "config-option-value" }, "false"), ' +
105
+ '" in ", ' +
106
+ 'h("code", { part: "config-file-name" }, hmrConfigName), ' +
107
+ '"."', '');
108
108
  (0, node_assert_1.default)(originalContents !== updatedContents, 'Failed to update Vite client error overlay text.');
109
109
  if (disableViteTransport) {
110
110
  const previousUpdatedContents = updatedContents;
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.normalizeCacheOptions = normalizeCacheOptions;
11
11
  const node_path_1 = require("node:path");
12
12
  /** Version placeholder is replaced during the build process with actual package version */
13
- const VERSION = '20.1.0-next.2';
13
+ const VERSION = '20.1.0-rc.0';
14
14
  function hasCacheMetadata(value) {
15
15
  return (!!value &&
16
16
  typeof value === 'object' &&
@@ -161,22 +161,12 @@ function generateLazyLoadedFilesMappings(metafile, initialFiles, publicPath = ''
161
161
  if (!entryPoint || exports?.length < 1 || !fileName.endsWith('.js')) {
162
162
  continue;
163
163
  }
164
- const importedPaths = [
165
- {
166
- path: `${publicPath}${fileName}`,
167
- dynamicImport: false,
168
- },
169
- ];
164
+ const importedPaths = [`${publicPath}${fileName}`];
170
165
  for (const { kind, external, path } of imports) {
171
- if (external ||
172
- initialFiles.has(path) ||
173
- (kind !== 'dynamic-import' && kind !== 'import-statement')) {
166
+ if (external || initialFiles.has(path) || kind !== 'import-statement') {
174
167
  continue;
175
168
  }
176
- importedPaths.push({
177
- path: `${publicPath}${path}`,
178
- dynamicImport: kind === 'dynamic-import',
179
- });
169
+ importedPaths.push(`${publicPath}${path}`);
180
170
  }
181
171
  entryPointToBundles[entryPoint] = importedPaths;
182
172
  }
@@ -14,8 +14,7 @@ class WorkerPool extends piscina_1.Piscina {
14
14
  constructor(options) {
15
15
  const piscinaOptions = {
16
16
  minThreads: 1,
17
- // Workaround for https://github.com/piscinajs/piscina/issues/816
18
- idleTimeout: 10_000,
17
+ idleTimeout: 4_000,
19
18
  // Web containers do not support transferable objects with receiveOnMessagePort which
20
19
  // is used when the Atomics based wait loop is enable.
21
20
  atomics: process.versions.webcontainer ? 'disabled' : 'sync',