@angular-devkit/build-angular 14.1.0-next.2 → 14.1.0-next.3

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,26 +1,26 @@
1
1
  {
2
2
  "name": "@angular-devkit/build-angular",
3
- "version": "14.1.0-next.2",
3
+ "version": "14.1.0-next.3",
4
4
  "description": "Angular Webpack Build Facade",
5
5
  "main": "src/index.js",
6
6
  "typings": "src/index.d.ts",
7
7
  "builders": "builders.json",
8
8
  "dependencies": {
9
9
  "@ampproject/remapping": "2.2.0",
10
- "@angular-devkit/architect": "0.1401.0-next.2",
11
- "@angular-devkit/build-webpack": "0.1401.0-next.2",
12
- "@angular-devkit/core": "14.1.0-next.2",
13
- "@babel/core": "7.18.2",
14
- "@babel/generator": "7.18.2",
15
- "@babel/helper-annotate-as-pure": "7.16.7",
16
- "@babel/plugin-proposal-async-generator-functions": "7.17.12",
17
- "@babel/plugin-transform-async-to-generator": "7.17.12",
18
- "@babel/plugin-transform-runtime": "7.18.2",
19
- "@babel/preset-env": "7.18.2",
20
- "@babel/runtime": "7.18.3",
21
- "@babel/template": "7.16.7",
10
+ "@angular-devkit/architect": "0.1401.0-next.3",
11
+ "@angular-devkit/build-webpack": "0.1401.0-next.3",
12
+ "@angular-devkit/core": "14.1.0-next.3",
13
+ "@babel/core": "7.18.6",
14
+ "@babel/generator": "7.18.7",
15
+ "@babel/helper-annotate-as-pure": "7.18.6",
16
+ "@babel/plugin-proposal-async-generator-functions": "7.18.6",
17
+ "@babel/plugin-transform-async-to-generator": "7.18.6",
18
+ "@babel/plugin-transform-runtime": "7.18.6",
19
+ "@babel/preset-env": "7.18.6",
20
+ "@babel/runtime": "7.18.6",
21
+ "@babel/template": "7.18.6",
22
22
  "@discoveryjs/json-ext": "0.5.7",
23
- "@ngtools/webpack": "14.1.0-next.2",
23
+ "@ngtools/webpack": "14.1.0-next.3",
24
24
  "ansi-colors": "4.1.3",
25
25
  "babel-loader": "8.2.5",
26
26
  "babel-plugin-istanbul": "6.1.1",
@@ -29,17 +29,17 @@
29
29
  "copy-webpack-plugin": "11.0.0",
30
30
  "critters": "0.0.16",
31
31
  "css-loader": "6.7.1",
32
- "esbuild-wasm": "0.14.42",
32
+ "esbuild-wasm": "0.14.47",
33
33
  "glob": "8.0.3",
34
34
  "https-proxy-agent": "5.0.1",
35
35
  "inquirer": "8.2.4",
36
36
  "jsonc-parser": "3.0.0",
37
37
  "karma-source-map-support": "1.4.0",
38
- "less": "4.1.2",
38
+ "less": "4.1.3",
39
39
  "less-loader": "11.0.0",
40
40
  "license-webpack-plugin": "4.0.2",
41
41
  "loader-utils": "3.2.0",
42
- "mini-css-extract-plugin": "2.6.0",
42
+ "mini-css-extract-plugin": "2.6.1",
43
43
  "minimatch": "5.1.0",
44
44
  "open": "8.4.0",
45
45
  "ora": "5.4.1",
@@ -48,29 +48,29 @@
48
48
  "postcss": "8.4.14",
49
49
  "postcss-import": "14.1.0",
50
50
  "postcss-loader": "7.0.0",
51
- "postcss-preset-env": "7.7.0",
51
+ "postcss-preset-env": "7.7.2",
52
52
  "regenerator-runtime": "0.13.9",
53
53
  "resolve-url-loader": "5.0.0",
54
54
  "rxjs": "6.6.7",
55
- "sass": "1.52.2",
56
- "sass-loader": "13.0.0",
55
+ "sass": "1.53.0",
56
+ "sass-loader": "13.0.2",
57
57
  "semver": "7.3.7",
58
58
  "source-map-loader": "4.0.0",
59
59
  "source-map-support": "0.5.21",
60
60
  "stylus": "0.58.1",
61
61
  "stylus-loader": "7.0.0",
62
- "terser": "5.14.0",
62
+ "terser": "5.14.1",
63
63
  "text-table": "0.2.0",
64
64
  "tree-kill": "1.2.2",
65
65
  "tslib": "2.4.0",
66
66
  "webpack": "5.73.0",
67
67
  "webpack-dev-middleware": "5.3.3",
68
- "webpack-dev-server": "4.9.1",
68
+ "webpack-dev-server": "4.9.2",
69
69
  "webpack-merge": "5.8.0",
70
70
  "webpack-subresource-integrity": "5.1.0"
71
71
  },
72
72
  "optionalDependencies": {
73
- "esbuild": "0.14.42"
73
+ "esbuild": "0.14.47"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "@angular/compiler-cli": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
@@ -62,7 +62,7 @@ async function _renderUniversal(options, context, browserResult, serverResult, s
62
62
  deployUrl: browserOptions.deployUrl,
63
63
  })
64
64
  : undefined;
65
- for (const outputPath of browserResult.outputPaths) {
65
+ for (const { path: outputPath, baseHref } of browserResult.outputs) {
66
66
  const localeDirectory = path.relative(browserResult.baseOutputPath, outputPath);
67
67
  const browserIndexOutputPath = path.join(outputPath, 'index.html');
68
68
  const indexHtml = await fs.promises.readFile(browserIndexOutputPath, 'utf8');
@@ -96,7 +96,7 @@ async function _renderUniversal(options, context, browserResult, serverResult, s
96
96
  }
97
97
  await fs.promises.writeFile(outputIndexPath, html);
98
98
  if (browserOptions.serviceWorker) {
99
- await (0, service_worker_1.augmentAppWithServiceWorker)(projectRoot, root, outputPath, browserOptions.baseHref || '/', browserOptions.ngswConfigPath);
99
+ await (0, service_worker_1.augmentAppWithServiceWorker)(projectRoot, root, outputPath, baseHref, browserOptions.ngswConfigPath);
100
100
  }
101
101
  }
102
102
  return browserResult;
@@ -17,11 +17,19 @@ import { Schema as BrowserBuilderSchema } from './schema';
17
17
  */
18
18
  export declare type BrowserBuilderOutput = BuilderOutput & {
19
19
  baseOutputPath: string;
20
+ /**
21
+ * @deprecated in version 14. Use 'outputs' instead.
22
+ */
20
23
  outputPaths: string[];
21
24
  /**
22
- * @deprecated in version 9. Use 'outputPaths' instead.
25
+ * @deprecated in version 9. Use 'outputs' instead.
23
26
  */
24
27
  outputPath: string;
28
+ outputs: {
29
+ locale?: string;
30
+ path: string;
31
+ baseHref: string;
32
+ }[];
25
33
  };
26
34
  /**
27
35
  * Maximum time in milliseconds for single build/rebuild
@@ -118,7 +118,9 @@ function buildWebpackBrowser(options, context, transforms = {}) {
118
118
  }), (0, operators_1.switchMap)(
119
119
  // eslint-disable-next-line max-lines-per-function
120
120
  ({ config, projectRoot, projectSourceRoot, i18n, target, cacheOptions }) => {
121
+ var _a;
121
122
  const normalizedOptimization = (0, utils_1.normalizeOptimization)(options.optimization);
123
+ const defaultBaseHref = (_a = options.baseHref) !== null && _a !== void 0 ? _a : '/';
122
124
  return (0, build_webpack_1.runWebpack)(config, context, {
123
125
  webpackFactory: require('webpack'),
124
126
  logging: transforms.logging ||
@@ -128,7 +130,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
128
130
  }
129
131
  }),
130
132
  }).pipe((0, operators_1.concatMap)(async (buildEvent) => {
131
- var _a, _b, _c, _d, _e;
133
+ var _a, _b, _c, _d, _e, _f;
132
134
  const spinner = new spinner_1.Spinner();
133
135
  spinner.enabled = options.progress !== false;
134
136
  const { success, emittedFiles = [], outputPath: webpackOutputPath } = buildEvent;
@@ -218,7 +220,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
218
220
  for (const [locale, outputPath] of outputPaths.entries()) {
219
221
  try {
220
222
  const { content, warnings, errors } = await indexHtmlGenerator.process({
221
- baseHref: getLocaleBaseHref(i18n, locale) || options.baseHref,
223
+ baseHref: getLocaleBaseHref(i18n, locale) || defaultBaseHref,
222
224
  // i18nLocale is used when Ivy is disabled
223
225
  lang: locale || undefined,
224
226
  outputPath,
@@ -254,7 +256,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
254
256
  spinner.start('Generating service worker...');
255
257
  for (const [locale, outputPath] of outputPaths.entries()) {
256
258
  try {
257
- await (0, service_worker_1.augmentAppWithServiceWorker)(projectRoot, context.workspaceRoot, outputPath, getLocaleBaseHref(i18n, locale) || options.baseHref || '/', options.ngswConfigPath);
259
+ await (0, service_worker_1.augmentAppWithServiceWorker)(projectRoot, context.workspaceRoot, outputPath, (_f = getLocaleBaseHref(i18n, locale)) !== null && _f !== void 0 ? _f : defaultBaseHref, options.ngswConfigPath);
258
260
  }
259
261
  catch (error) {
260
262
  spinner.fail('Service worker generation failed.');
@@ -272,6 +274,18 @@ function buildWebpackBrowser(options, context, transforms = {}) {
272
274
  baseOutputPath,
273
275
  outputPath: baseOutputPath,
274
276
  outputPaths: (outputPaths && Array.from(outputPaths.values())) || [baseOutputPath],
277
+ outputs: (outputPaths &&
278
+ [...outputPaths.entries()].map(([locale, path]) => {
279
+ var _a;
280
+ return ({
281
+ locale,
282
+ path,
283
+ baseHref: (_a = getLocaleBaseHref(i18n, locale)) !== null && _a !== void 0 ? _a : defaultBaseHref,
284
+ });
285
+ })) || {
286
+ path: baseOutputPath,
287
+ baseHref: defaultBaseHref,
288
+ },
275
289
  })));
276
290
  }));
277
291
  function getLocaleBaseHref(i18n, locale) {
@@ -15,11 +15,18 @@ import { Schema as ServerBuilderOptions } from './schema';
15
15
  */
16
16
  export declare type ServerBuilderOutput = BuilderOutput & {
17
17
  baseOutputPath: string;
18
+ /**
19
+ * @deprecated in version 14. Use 'outputs' instead.
20
+ */
18
21
  outputPaths: string[];
19
22
  /**
20
- * @deprecated in version 9. Use 'outputPaths' instead.
23
+ * @deprecated in version 9. Use 'outputs' instead.
21
24
  */
22
25
  outputPath: string;
26
+ outputs: {
27
+ locale?: string;
28
+ path: string;
29
+ }[];
23
30
  };
24
31
  export { ServerBuilderOptions };
25
32
  /**
@@ -102,6 +102,13 @@ function execute(options, context, transforms = {}) {
102
102
  baseOutputPath,
103
103
  outputPath: baseOutputPath,
104
104
  outputPaths: outputPaths || [baseOutputPath],
105
+ outputs: (outputPaths &&
106
+ [...outputPaths.entries()].map(([locale, path]) => ({
107
+ locale,
108
+ path,
109
+ }))) || {
110
+ path: baseOutputPath,
111
+ },
105
112
  };
106
113
  }));
107
114
  }
@@ -64,7 +64,6 @@ function removeColor(text) {
64
64
  }
65
65
  exports.removeColor = removeColor;
66
66
  // Create a separate instance to prevent unintended global changes to the color configuration
67
- // Create function is not defined in the typings. See: https://github.com/doowb/ansi-colors/pull/44
68
67
  const colors = ansiColors.create();
69
68
  exports.colors = colors;
70
69
  colors.enabled = supportColor();
@@ -175,13 +175,15 @@ async function configureI18nBuild(context, options) {
175
175
  }
176
176
  // If inlining store the output in a temporary location to facilitate post-processing
177
177
  if (i18n.shouldInline) {
178
+ // TODO: we should likely save these in the .angular directory in the next major version.
179
+ // We'd need to do a migration to add the temp directory to gitignore.
178
180
  const tempPath = fs_1.default.mkdtempSync(path_1.default.join(fs_1.default.realpathSync(os_1.default.tmpdir()), 'angular-cli-i18n-'));
179
181
  buildOptions.outputPath = tempPath;
180
- process.on('exit', () => deleteTempDirectory(tempPath));
181
- process.once('SIGINT', () => {
182
- deleteTempDirectory(tempPath);
183
- // Needed due to `ora` as otherwise process will not terminate.
184
- process.kill(process.pid, 'SIGINT');
182
+ process.on('exit', () => {
183
+ try {
184
+ fs_1.default.rmSync(tempPath, { force: true, recursive: true, maxRetries: 3 });
185
+ }
186
+ catch { }
185
187
  });
186
188
  }
187
189
  return { buildOptions, i18n };
@@ -198,13 +200,6 @@ function findLocaleDataPath(locale, resolver) {
198
200
  return scrubbedLocale === 'en-US' ? findLocaleDataPath('en', resolver) : null;
199
201
  }
200
202
  }
201
- /** Remove temporary directory used for i18n processing. */
202
- function deleteTempDirectory(tempPath) {
203
- try {
204
- fs_1.default.rmSync(tempPath, { force: true, recursive: true, maxRetries: 3 });
205
- }
206
- catch { }
207
- }
208
203
  function loadTranslations(locale, desc, workspaceRoot, loader, logger, usedFormats, duplicateTranslation) {
209
204
  let translations = undefined;
210
205
  for (const file of desc.files) {
@@ -86,6 +86,10 @@ async function getDevServerConfig(wco) {
86
86
  },
87
87
  ],
88
88
  },
89
+ // When setupExitSignals is enabled webpack-dev-server will shutdown gracefully which would
90
+ // require CTRL+C to be pressed multiple times to exit.
91
+ // See: https://github.com/webpack/webpack-dev-server/blob/c76b6d11a3821436c5e20207c8a38deb6ab7e33c/lib/Server.js#L1801-L1827
92
+ setupExitSignals: false,
89
93
  compress: false,
90
94
  static: false,
91
95
  server: getServerConfig(root, wco.buildOptions),
@@ -20,7 +20,6 @@ function ensureIvy(wco) {
20
20
  '\nFor additional information or if the build fails, please see https://angular.io/guide/ivy');
21
21
  wco.tsConfig.options.enableIvy = true;
22
22
  }
23
- let es5TargetWarningsShown = false;
24
23
  function createIvyPlugin(wco, aot, tsconfig) {
25
24
  if (aot) {
26
25
  ensureIvy(wco);
@@ -40,10 +39,7 @@ function createIvyPlugin(wco, aot, tsconfig) {
40
39
  // as for third-party libraries. This greatly reduces the complexity of static analysis.
41
40
  if (wco.scriptTarget < typescript_1.ScriptTarget.ES2015) {
42
41
  compilerOptions.target = typescript_1.ScriptTarget.ES2015;
43
- if (!es5TargetWarningsShown) {
44
- wco.logger.warn('DEPRECATED: ES5 output is deprecated. Please update TypeScript `target` compiler option to ES2015 or later.');
45
- es5TargetWarningsShown = true;
46
- }
42
+ wco.logger.warn('DEPRECATED: ES5 output is deprecated. Please update TypeScript `target` compiler option to ES2015 or later.');
47
43
  }
48
44
  const fileReplacements = {};
49
45
  if (buildOptions.fileReplacements) {
@@ -16,6 +16,7 @@ export interface HashFormat {
16
16
  file: string;
17
17
  script: string;
18
18
  }
19
+ export declare type WebpackStatsOptions = Exclude<Configuration['stats'], string | boolean | undefined>;
19
20
  export declare function getOutputHashFormat(outputHashing?: OutputHashing, length?: number): HashFormat;
20
21
  export declare type NormalizedEntryPoint = Required<Exclude<ScriptElement | StyleElement, string>>;
21
22
  export declare function normalizeExtraEntryPoints(extraEntryPoints: (ScriptElement | StyleElement)[], defaultBundleName: string): NormalizedEntryPoint[];
@@ -29,7 +30,5 @@ export declare function globalScriptsByBundleName(root: string, scripts: ScriptE
29
30
  }[];
30
31
  export declare function assetPatterns(root: string, assets: AssetPatternClass[]): ObjectPattern[];
31
32
  export declare function externalizePackages(context: string, request: string | undefined, callback: (error?: Error, result?: string) => void): void;
32
- declare type WebpackStatsOptions = Exclude<Configuration['stats'], string | boolean>;
33
33
  export declare function getStatsOptions(verbose?: boolean): WebpackStatsOptions;
34
34
  export declare function getMainFieldsAndConditionNames(target: ScriptTarget, platformServer: boolean): Pick<WebpackOptionsNormalized['resolve'], 'mainFields' | 'conditionNames'>;
35
- export {};
@@ -278,6 +278,7 @@ function getStatsOptions(verbose = false) {
278
278
  version: true,
279
279
  chunkModules: true,
280
280
  errorDetails: true,
281
+ errorStack: true,
281
282
  moduleTrace: true,
282
283
  logging: 'verbose',
283
284
  modulesSpace: Infinity,
@@ -10,6 +10,7 @@ import { logging } from '@angular-devkit/core';
10
10
  import { Configuration, StatsCompilation } from 'webpack';
11
11
  import { Schema as BrowserBuilderOptions } from '../../builders/browser/schema';
12
12
  import { BudgetCalculatorResult } from '../../utils/bundle-calculator';
13
+ import { WebpackStatsOptions } from './helpers';
13
14
  export declare function formatSize(size: number): string;
14
15
  export declare type BundleStatsData = [
15
16
  files: string,
@@ -29,8 +30,8 @@ export declare function generateBundleStats(info: {
29
30
  initial?: boolean;
30
31
  rendered?: boolean;
31
32
  }): BundleStats;
32
- export declare function statsWarningsToString(json: StatsCompilation, statsConfig: any): string;
33
- export declare function statsErrorsToString(json: StatsCompilation, statsConfig: any): string;
33
+ export declare function statsWarningsToString(json: StatsCompilation, statsConfig: WebpackStatsOptions): string;
34
+ export declare function statsErrorsToString(json: StatsCompilation, statsConfig: WebpackStatsOptions): string;
34
35
  export declare function statsHasErrors(json: StatsCompilation): boolean;
35
36
  export declare function statsHasWarnings(json: StatsCompilation): boolean;
36
37
  export declare function createWebpackLoggingCallback(options: BrowserBuilderOptions, logger: logging.LoggerApi): WebpackLoggingCallback;
@@ -261,7 +261,6 @@ statsConfig, budgetFailures) {
261
261
  `));
262
262
  }
263
263
  }
264
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
265
264
  function statsWarningsToString(json, statsConfig) {
266
265
  const colors = statsConfig.colors;
267
266
  const c = (x) => (colors ? color_1.colors.reset.cyan(x) : x);
@@ -294,8 +293,8 @@ function statsWarningsToString(json, statsConfig) {
294
293
  return output ? '\n' + output : output;
295
294
  }
296
295
  exports.statsWarningsToString = statsWarningsToString;
297
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
298
296
  function statsErrorsToString(json, statsConfig) {
297
+ var _a, _b;
299
298
  const colors = statsConfig.colors;
300
299
  const c = (x) => (colors ? color_1.colors.reset.cyan(x) : x);
301
300
  const yb = (x) => (colors ? color_1.colors.reset.yellowBright(x) : x);
@@ -310,7 +309,16 @@ function statsErrorsToString(json, statsConfig) {
310
309
  output += r(`Error: ${error}\n\n`);
311
310
  }
312
311
  else {
313
- const file = error.file || error.moduleName;
312
+ let file = error.file || error.moduleName;
313
+ // Clean up error paths
314
+ // Ex: ./src/app/styles.scss.webpack[javascript/auto]!=!./node_modules/css-loader/dist/cjs.js....
315
+ // to ./src/app/styles.scss.webpack
316
+ if (file && !statsConfig.errorDetails) {
317
+ const webpackPathIndex = file.indexOf('.webpack[');
318
+ if (webpackPathIndex !== -1) {
319
+ file = file.substring(0, webpackPathIndex);
320
+ }
321
+ }
314
322
  if (file) {
315
323
  output += c(file);
316
324
  if (error.loc) {
@@ -318,10 +326,16 @@ function statsErrorsToString(json, statsConfig) {
318
326
  }
319
327
  output += ' - ';
320
328
  }
321
- if (!/^error/i.test(error.message)) {
329
+ // In most cases webpack will add stack traces to error messages.
330
+ // This below cleans up the error from stacks.
331
+ // See: https://github.com/webpack/webpack/issues/15980
332
+ const message = statsConfig.errorStack
333
+ ? error.message
334
+ : (_b = (_a = /[\s\S]+?(?=[\n\s]+at)/.exec(error.message)) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : error.message;
335
+ if (!/^error/i.test(message)) {
322
336
  output += r('Error: ');
323
337
  }
324
- output += `${error.message}\n\n`;
338
+ output += `${message}\n\n`;
325
339
  }
326
340
  }
327
341
  return output ? '\n' + output : output;
@@ -358,6 +372,9 @@ function createWebpackLoggingCallback(options, logger) {
358
372
  exports.createWebpackLoggingCallback = createWebpackLoggingCallback;
359
373
  function webpackStatsLogger(logger, json, config, budgetFailures) {
360
374
  logger.info(statsToString(json, config.stats, budgetFailures));
375
+ if (typeof config.stats !== 'object') {
376
+ throw new Error('Invalid Webpack stats configuration.');
377
+ }
361
378
  if (statsHasWarnings(json)) {
362
379
  logger.warn(statsWarningsToString(json, config.stats));
363
380
  }