@angular-devkit/build-angular 14.1.0-next.3 → 14.1.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,15 +1,15 @@
1
1
  {
2
2
  "name": "@angular-devkit/build-angular",
3
- "version": "14.1.0-next.3",
3
+ "version": "14.1.0",
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.3",
11
- "@angular-devkit/build-webpack": "0.1401.0-next.3",
12
- "@angular-devkit/core": "14.1.0-next.3",
10
+ "@angular-devkit/architect": "0.1401.0",
11
+ "@angular-devkit/build-webpack": "0.1401.0",
12
+ "@angular-devkit/core": "14.1.0",
13
13
  "@babel/core": "7.18.6",
14
14
  "@babel/generator": "7.18.7",
15
15
  "@babel/helper-annotate-as-pure": "7.18.6",
@@ -20,7 +20,7 @@
20
20
  "@babel/runtime": "7.18.6",
21
21
  "@babel/template": "7.18.6",
22
22
  "@discoveryjs/json-ext": "0.5.7",
23
- "@ngtools/webpack": "14.1.0-next.3",
23
+ "@ngtools/webpack": "14.1.0",
24
24
  "ansi-colors": "4.1.3",
25
25
  "babel-loader": "8.2.5",
26
26
  "babel-plugin-istanbul": "6.1.1",
@@ -29,11 +29,11 @@
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.47",
32
+ "esbuild-wasm": "0.14.49",
33
33
  "glob": "8.0.3",
34
34
  "https-proxy-agent": "5.0.1",
35
35
  "inquirer": "8.2.4",
36
- "jsonc-parser": "3.0.0",
36
+ "jsonc-parser": "3.1.0",
37
37
  "karma-source-map-support": "1.4.0",
38
38
  "less": "4.1.3",
39
39
  "less-loader": "11.0.0",
@@ -47,7 +47,7 @@
47
47
  "piscina": "3.2.0",
48
48
  "postcss": "8.4.14",
49
49
  "postcss-import": "14.1.0",
50
- "postcss-loader": "7.0.0",
50
+ "postcss-loader": "7.0.1",
51
51
  "postcss-preset-env": "7.7.2",
52
52
  "regenerator-runtime": "0.13.9",
53
53
  "resolve-url-loader": "5.0.0",
@@ -59,25 +59,25 @@
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.1",
62
+ "terser": "5.14.2",
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.2",
68
+ "webpack-dev-server": "4.9.3",
69
69
  "webpack-merge": "5.8.0",
70
70
  "webpack-subresource-integrity": "5.1.0"
71
71
  },
72
72
  "optionalDependencies": {
73
- "esbuild": "0.14.47"
73
+ "esbuild": "0.14.49"
74
74
  },
75
75
  "peerDependencies": {
76
- "@angular/compiler-cli": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
77
- "@angular/localize": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
78
- "@angular/service-worker": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
76
+ "@angular/compiler-cli": "^14.0.0",
77
+ "@angular/localize": "^14.0.0",
78
+ "@angular/service-worker": "^14.0.0",
79
79
  "karma": "^6.3.0",
80
- "ng-packagr": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
80
+ "ng-packagr": "^14.0.0",
81
81
  "protractor": "^7.0.0",
82
82
  "tailwindcss": "^2.0.0 || ^3.0.0",
83
83
  "typescript": ">=4.6.2 <4.8"
@@ -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, baseHref, browserOptions.ngswConfigPath);
99
+ await (0, service_worker_1.augmentAppWithServiceWorker)(projectRoot, root, outputPath, baseHref !== null && baseHref !== void 0 ? baseHref : '/', browserOptions.ngswConfigPath);
100
100
  }
101
101
  }
102
102
  return browserResult;
@@ -28,7 +28,7 @@ export declare type BrowserBuilderOutput = BuilderOutput & {
28
28
  outputs: {
29
29
  locale?: string;
30
30
  path: string;
31
- baseHref: string;
31
+ baseHref?: string;
32
32
  }[];
33
33
  };
34
34
  /**
@@ -118,9 +118,7 @@ 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;
122
121
  const normalizedOptimization = (0, utils_1.normalizeOptimization)(options.optimization);
123
- const defaultBaseHref = (_a = options.baseHref) !== null && _a !== void 0 ? _a : '/';
124
122
  return (0, build_webpack_1.runWebpack)(config, context, {
125
123
  webpackFactory: require('webpack'),
126
124
  logging: transforms.logging ||
@@ -130,7 +128,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
130
128
  }
131
129
  }),
132
130
  }).pipe((0, operators_1.concatMap)(async (buildEvent) => {
133
- var _a, _b, _c, _d, _e, _f;
131
+ var _a, _b, _c, _d, _e, _f, _g, _h;
134
132
  const spinner = new spinner_1.Spinner();
135
133
  spinner.enabled = options.progress !== false;
136
134
  const { success, emittedFiles = [], outputPath: webpackOutputPath } = buildEvent;
@@ -220,7 +218,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
220
218
  for (const [locale, outputPath] of outputPaths.entries()) {
221
219
  try {
222
220
  const { content, warnings, errors } = await indexHtmlGenerator.process({
223
- baseHref: getLocaleBaseHref(i18n, locale) || defaultBaseHref,
221
+ baseHref: (_f = getLocaleBaseHref(i18n, locale)) !== null && _f !== void 0 ? _f : options.baseHref,
224
222
  // i18nLocale is used when Ivy is disabled
225
223
  lang: locale || undefined,
226
224
  outputPath,
@@ -256,7 +254,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
256
254
  spinner.start('Generating service worker...');
257
255
  for (const [locale, outputPath] of outputPaths.entries()) {
258
256
  try {
259
- await (0, service_worker_1.augmentAppWithServiceWorker)(projectRoot, context.workspaceRoot, outputPath, (_f = getLocaleBaseHref(i18n, locale)) !== null && _f !== void 0 ? _f : defaultBaseHref, options.ngswConfigPath);
257
+ await (0, service_worker_1.augmentAppWithServiceWorker)(projectRoot, context.workspaceRoot, outputPath, (_h = (_g = getLocaleBaseHref(i18n, locale)) !== null && _g !== void 0 ? _g : options.baseHref) !== null && _h !== void 0 ? _h : '/', options.ngswConfigPath);
260
258
  }
261
259
  catch (error) {
262
260
  spinner.fail('Service worker generation failed.');
@@ -280,11 +278,11 @@ function buildWebpackBrowser(options, context, transforms = {}) {
280
278
  return ({
281
279
  locale,
282
280
  path,
283
- baseHref: (_a = getLocaleBaseHref(i18n, locale)) !== null && _a !== void 0 ? _a : defaultBaseHref,
281
+ baseHref: (_a = getLocaleBaseHref(i18n, locale)) !== null && _a !== void 0 ? _a : options.baseHref,
284
282
  });
285
283
  })) || {
286
284
  path: baseOutputPath,
287
- baseHref: defaultBaseHref,
285
+ baseHref: options.baseHref,
288
286
  },
289
287
  })));
290
288
  }));
@@ -11,4 +11,5 @@ export declare function createCompilerPlugin(pluginOptions: {
11
11
  sourcemap: boolean;
12
12
  tsconfig: string;
13
13
  advancedOptimizations?: boolean;
14
+ thirdPartySourcemaps?: boolean;
14
15
  }, styleOptions: BundleStylesheetOptions): Plugin;
@@ -167,18 +167,25 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
167
167
  const result = {};
168
168
  // Create TypeScript compiler host
169
169
  const host = typescript_1.default.createIncrementalCompilerHost(compilerOptions);
170
- // Temporarily add a readResource hook to allow for a transformResource hook.
171
- // Once the AOT compiler allows only a transformResource hook this can be removed.
172
- host.readResource = function (fileName) {
173
- var _a;
174
- // Provide same no file found behavior as @ngtools/webpack
175
- return (_a = this.readFile(fileName)) !== null && _a !== void 0 ? _a : '';
170
+ // Temporarily process external resources via readResource.
171
+ // The AOT compiler currently requires this hook to allow for a transformResource hook.
172
+ // Once the AOT compiler allows only a transformResource hook, this can be reevaluated.
173
+ host.readResource = async function (fileName) {
174
+ var _a, _b, _c;
175
+ // Template resources (.html) files are not bundled or transformed
176
+ if (fileName.endsWith('.html')) {
177
+ return (_a = this.readFile(fileName)) !== null && _a !== void 0 ? _a : '';
178
+ }
179
+ const { contents, errors, warnings } = await (0, stylesheets_1.bundleStylesheetFile)(fileName, styleOptions);
180
+ ((_b = result.errors) !== null && _b !== void 0 ? _b : (result.errors = [])).push(...errors);
181
+ ((_c = result.warnings) !== null && _c !== void 0 ? _c : (result.warnings = [])).push(...warnings);
182
+ return contents;
176
183
  };
177
184
  // Add an AOT compiler resource transform hook
178
185
  host.transformResource = async function (data, context) {
179
186
  var _a, _b, _c;
180
- // Only style resources are transformed currently
181
- if (context.type !== 'style') {
187
+ // Only inline style resources are transformed separately currently
188
+ if (context.resourceFile || context.type !== 'style') {
182
189
  return null;
183
190
  }
184
191
  // The file with the resource content will either be an actual file (resourceFile)
@@ -256,10 +263,12 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
256
263
  ],
257
264
  };
258
265
  }
266
+ const useInputSourcemap = pluginOptions.sourcemap &&
267
+ (!!pluginOptions.thirdPartySourcemaps || !/[\\/]node_modules[\\/]/.test(args.path));
259
268
  const data = (_a = typescriptResult.content) !== null && _a !== void 0 ? _a : '';
260
269
  const babelResult = await (0, core_1.transformAsync)(data, {
261
270
  filename: args.path,
262
- inputSourceMap: (pluginOptions.sourcemap ? undefined : false),
271
+ inputSourceMap: (useInputSourcemap ? undefined : false),
263
272
  sourceMaps: pluginOptions.sourcemap ? 'inline' : false,
264
273
  compact: false,
265
274
  configFile: false,
@@ -285,10 +294,12 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
285
294
  var _a;
286
295
  const angularPackage = /[\\/]node_modules[\\/]@angular[\\/]/.test(args.path);
287
296
  const linkerPluginCreator = (await (0, load_esm_1.loadEsmModule)('@angular/compiler-cli/linker/babel')).createEs2015LinkerPlugin;
297
+ const useInputSourcemap = pluginOptions.sourcemap &&
298
+ (!!pluginOptions.thirdPartySourcemaps || !/[\\/]node_modules[\\/]/.test(args.path));
288
299
  const data = await fs_1.promises.readFile(args.path, 'utf-8');
289
300
  const result = await (0, core_1.transformAsync)(data, {
290
301
  filename: args.path,
291
- inputSourceMap: (pluginOptions.sourcemap ? undefined : false),
302
+ inputSourceMap: (useInputSourcemap ? undefined : false),
292
303
  sourceMaps: pluginOptions.sourcemap ? 'inline' : false,
293
304
  compact: false,
294
305
  configFile: false,
@@ -7,8 +7,6 @@
7
7
  */
8
8
  import { BuilderContext } from '@angular-devkit/architect';
9
9
  import { BuildFailure, BuildOptions, BuildResult, Message, OutputFile } from 'esbuild';
10
- /** Default outdir setting for esbuild. */
11
- export declare const DEFAULT_OUTDIR: string;
12
10
  /**
13
11
  * Determines if an unknown value is an esbuild BuildFailure error object thrown by esbuild.
14
12
  * @param value A potential esbuild BuildFailure error object.
@@ -7,11 +7,8 @@
7
7
  * found in the LICENSE file at https://angular.io/license
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.logMessages = exports.bundle = exports.isEsBuildFailure = exports.DEFAULT_OUTDIR = void 0;
10
+ exports.logMessages = exports.bundle = exports.isEsBuildFailure = void 0;
11
11
  const esbuild_1 = require("esbuild");
12
- const path_1 = require("path");
13
- /** Default outdir setting for esbuild. */
14
- exports.DEFAULT_OUTDIR = (0, path_1.resolve)('/virtual-output');
15
12
  /**
16
13
  * Determines if an unknown value is an esbuild BuildFailure error object thrown by esbuild.
17
14
  * @param value A potential esbuild BuildFailure error object.
@@ -57,7 +57,7 @@ const stylesheets_1 = require("./stylesheets");
57
57
  */
58
58
  // eslint-disable-next-line max-lines-per-function
59
59
  async function buildEsbuildBrowser(options, context) {
60
- var _a, _b, _c, _d, _e, _f;
60
+ var _a, _b, _c, _d, _e, _f, _g;
61
61
  const startTime = Date.now();
62
62
  // Only AOT is currently supported
63
63
  if (options.aot !== true) {
@@ -101,7 +101,7 @@ async function buildEsbuildBrowser(options, context) {
101
101
  // Entries in the metafile are relative to the `absWorkingDir` option which is set to the workspaceRoot
102
102
  const relativeFilePath = path.relative(workspaceRoot, outputFile.path);
103
103
  const entryPoint = (_c = (_b = result.metafile) === null || _b === void 0 ? void 0 : _b.outputs[relativeFilePath]) === null || _c === void 0 ? void 0 : _c.entryPoint;
104
- outputFile.path = path.relative(esbuild_1.DEFAULT_OUTDIR, outputFile.path);
104
+ outputFile.path = relativeFilePath;
105
105
  if (entryPoint) {
106
106
  // An entryPoint value indicates an initial file
107
107
  initialFiles.push({
@@ -130,9 +130,11 @@ async function buildEsbuildBrowser(options, context) {
130
130
  .map((file) => `@import '${file.replace(/\\/g, '/')}';`)
131
131
  .join('\n');
132
132
  const sheetResult = await (0, stylesheets_1.bundleStylesheetText)(virtualEntryData, { virtualName: `angular:style/global;${name}`, resolvePath: workspaceRoot }, {
133
+ workspaceRoot,
133
134
  optimization: !!optimizationOptions.styles.minify,
134
- sourcemap: !!sourcemapOptions.styles,
135
+ sourcemap: !!sourcemapOptions.styles && (sourcemapOptions.hidden ? 'external' : true),
135
136
  outputNames: noInjectNames.includes(name) ? { media: outputNames.media } : outputNames,
137
+ includePaths: (_e = options.stylePreprocessorOptions) === null || _e === void 0 ? void 0 : _e.includePaths,
136
138
  });
137
139
  await (0, esbuild_1.logMessages)(context, sheetResult);
138
140
  if (!sheetResult.path) {
@@ -161,8 +163,8 @@ async function buildEsbuildBrowser(options, context) {
161
163
  // Generate index HTML file
162
164
  if (options.index) {
163
165
  const entrypoints = (0, package_chunk_sort_1.generateEntryPoints)({
164
- scripts: (_e = options.scripts) !== null && _e !== void 0 ? _e : [],
165
- styles: (_f = options.styles) !== null && _f !== void 0 ? _f : [],
166
+ scripts: (_f = options.scripts) !== null && _f !== void 0 ? _f : [],
167
+ styles: (_g = options.styles) !== null && _g !== void 0 ? _g : [],
166
168
  });
167
169
  // Create an index HTML generator that reads from the in-memory output files
168
170
  const indexHtmlGenerator = new index_html_generator_1.IndexHtmlGenerator({
@@ -228,6 +230,7 @@ function createOutputFileFromText(path, text) {
228
230
  };
229
231
  }
230
232
  async function bundleCode(workspaceRoot, entryPoints, outputNames, options, optimizationOptions, sourcemapOptions, tsconfig) {
233
+ var _a;
231
234
  return (0, esbuild_1.bundle)({
232
235
  absWorkingDir: workspaceRoot,
233
236
  bundle: true,
@@ -243,7 +246,7 @@ async function bundleCode(workspaceRoot, entryPoints, outputNames, options, opti
243
246
  metafile: true,
244
247
  minify: optimizationOptions.scripts,
245
248
  pure: ['forwardRef'],
246
- outdir: esbuild_1.DEFAULT_OUTDIR,
249
+ outdir: workspaceRoot,
247
250
  sourcemap: sourcemapOptions.scripts && (sourcemapOptions.hidden ? 'external' : true),
248
251
  splitting: true,
249
252
  tsconfig,
@@ -256,6 +259,7 @@ async function bundleCode(workspaceRoot, entryPoints, outputNames, options, opti
256
259
  // JS/TS options
257
260
  {
258
261
  sourcemap: !!sourcemapOptions.scripts,
262
+ thirdPartySourcemaps: sourcemapOptions.vendor,
259
263
  tsconfig,
260
264
  advancedOptimizations: options.buildOptimizer,
261
265
  },
@@ -263,8 +267,13 @@ async function bundleCode(workspaceRoot, entryPoints, outputNames, options, opti
263
267
  {
264
268
  workspaceRoot,
265
269
  optimization: !!optimizationOptions.styles.minify,
266
- sourcemap: !!sourcemapOptions.styles,
270
+ sourcemap:
271
+ // Hidden component stylesheet sourcemaps are inaccessible which is effectively
272
+ // the same as being disabled. Disabling has the advantage of avoiding the overhead
273
+ // of sourcemap processing.
274
+ !!sourcemapOptions.styles && (sourcemapOptions.hidden ? false : 'inline'),
267
275
  outputNames,
276
+ includePaths: (_a = options.stylePreprocessorOptions) === null || _a === void 0 ? void 0 : _a.includePaths,
268
277
  }),
269
278
  ],
270
279
  define: {
@@ -0,0 +1,12 @@
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.io/license
7
+ */
8
+ import type { Plugin } from 'esbuild';
9
+ export declare function createSassPlugin(options: {
10
+ sourcemap: boolean;
11
+ includePaths?: string[];
12
+ }): Plugin;
@@ -0,0 +1,52 @@
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.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.createSassPlugin = void 0;
11
+ const sass_service_1 = require("../../sass/sass-service");
12
+ function createSassPlugin(options) {
13
+ return {
14
+ name: 'angular-sass',
15
+ setup(build) {
16
+ let sass;
17
+ build.onStart(() => {
18
+ sass = new sass_service_1.SassWorkerImplementation();
19
+ });
20
+ build.onEnd(() => {
21
+ sass === null || sass === void 0 ? void 0 : sass.close();
22
+ });
23
+ build.onLoad({ filter: /\.s[ac]ss$/ }, async (args) => {
24
+ const result = await new Promise((resolve, reject) => {
25
+ sass.render({
26
+ file: args.path,
27
+ includePaths: options.includePaths,
28
+ indentedSyntax: args.path.endsWith('.sass'),
29
+ outputStyle: 'expanded',
30
+ sourceMap: options.sourcemap,
31
+ sourceMapContents: options.sourcemap,
32
+ sourceMapEmbed: options.sourcemap,
33
+ quietDeps: true,
34
+ }, (error, result) => {
35
+ if (error) {
36
+ reject(error);
37
+ }
38
+ if (result) {
39
+ resolve(result);
40
+ }
41
+ });
42
+ });
43
+ return {
44
+ contents: result.css,
45
+ loader: 'css',
46
+ watchFiles: result.stats.includedFiles,
47
+ };
48
+ });
49
+ },
50
+ };
51
+ }
52
+ exports.createSassPlugin = createSassPlugin;
@@ -7,14 +7,15 @@
7
7
  */
8
8
  import type { OutputFile } from 'esbuild';
9
9
  export interface BundleStylesheetOptions {
10
- workspaceRoot?: string;
10
+ workspaceRoot: string;
11
11
  optimization: boolean;
12
12
  preserveSymlinks?: boolean;
13
- sourcemap: boolean | 'external';
13
+ sourcemap: boolean | 'external' | 'inline';
14
14
  outputNames?: {
15
15
  bundles?: string;
16
16
  media?: string;
17
17
  };
18
+ includePaths?: string[];
18
19
  }
19
20
  /**
20
21
  * Bundle a stylesheet that exists as a file on the filesystem.
@@ -33,6 +33,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
33
33
  exports.bundleStylesheetText = exports.bundleStylesheetFile = void 0;
34
34
  const path = __importStar(require("path"));
35
35
  const esbuild_1 = require("./esbuild");
36
+ const sass_plugin_1 = require("./sass-plugin");
36
37
  async function bundleStylesheet(entry, options) {
37
38
  var _a, _b;
38
39
  // Execute esbuild
@@ -45,14 +46,14 @@ async function bundleStylesheet(entry, options) {
45
46
  logLevel: 'silent',
46
47
  minify: options.optimization,
47
48
  sourcemap: options.sourcemap,
48
- outdir: esbuild_1.DEFAULT_OUTDIR,
49
+ outdir: options.workspaceRoot,
49
50
  write: false,
50
51
  platform: 'browser',
51
52
  preserveSymlinks: options.preserveSymlinks,
52
53
  conditions: ['style'],
53
54
  mainFields: ['style'],
54
55
  plugins: [
55
- // TODO: preprocessor plugins
56
+ (0, sass_plugin_1.createSassPlugin)({ sourcemap: !!options.sourcemap, includePaths: options.includePaths }),
56
57
  ],
57
58
  });
58
59
  // Extract the result of the bundling from the output files
@@ -62,7 +63,7 @@ async function bundleStylesheet(entry, options) {
62
63
  const resourceFiles = [];
63
64
  if (result.outputFiles) {
64
65
  for (const outputFile of result.outputFiles) {
65
- outputFile.path = path.relative(esbuild_1.DEFAULT_OUTDIR, outputFile.path);
66
+ outputFile.path = path.relative(options.workspaceRoot, outputFile.path);
66
67
  const filename = path.basename(outputFile.path);
67
68
  if (filename.endsWith('.css')) {
68
69
  outputPath = outputFile.path;
@@ -71,6 +71,8 @@ async function findMatchingTests(pattern, workspaceRoot, projectSourceRoot) {
71
71
  }
72
72
  return globPromise(normalizedPattern, {
73
73
  cwd: projectSourceRoot,
74
+ root: projectSourceRoot,
75
+ nomount: true,
74
76
  });
75
77
  }
76
78
  async function isDirectory(path) {
@@ -37,17 +37,18 @@ exports.copyAssets = void 0;
37
37
  const fs = __importStar(require("fs"));
38
38
  const glob_1 = __importDefault(require("glob"));
39
39
  const path = __importStar(require("path"));
40
- function globAsync(pattern, options) {
41
- return new Promise((resolve, reject) => (0, glob_1.default)(pattern, options, (e, m) => (e ? reject(e) : resolve(m))));
42
- }
40
+ const util_1 = require("util");
41
+ const globPromise = (0, util_1.promisify)(glob_1.default);
43
42
  async function copyAssets(entries, basePaths, root, changed) {
44
43
  const defaultIgnore = ['.gitkeep', '**/.DS_Store', '**/Thumbs.db'];
45
44
  for (const entry of entries) {
46
45
  const cwd = path.resolve(root, entry.input);
47
- const files = await globAsync(entry.glob, {
46
+ const files = await globPromise(entry.glob, {
48
47
  cwd,
49
48
  dot: true,
50
49
  nodir: true,
50
+ root: cwd,
51
+ nomount: true,
51
52
  ignore: entry.ignore ? defaultIgnore.concat(entry.ignore) : defaultIgnore,
52
53
  follow: entry.followSymlinks,
53
54
  });
@@ -43,12 +43,14 @@ const webpack_subresource_integrity_1 = require("webpack-subresource-integrity")
43
43
  const environment_options_1 = require("../../utils/environment-options");
44
44
  const load_esm_1 = require("../../utils/load-esm");
45
45
  const plugins_1 = require("../plugins");
46
+ const devtools_ignore_plugin_1 = require("../plugins/devtools-ignore-plugin");
46
47
  const named_chunks_plugin_1 = require("../plugins/named-chunks-plugin");
47
48
  const progress_plugin_1 = require("../plugins/progress-plugin");
48
49
  const transfer_size_plugin_1 = require("../plugins/transfer-size-plugin");
49
50
  const typescript_2 = require("../plugins/typescript");
50
51
  const watch_files_logs_plugin_1 = require("../plugins/watch-files-logs-plugin");
51
52
  const helpers_1 = require("../utils/helpers");
53
+ const VENDORS_TEST = /[\\/]node_modules[\\/]/;
52
54
  // eslint-disable-next-line max-lines-per-function
53
55
  async function getCommonConfig(wco) {
54
56
  var _a, _b;
@@ -132,6 +134,7 @@ async function getCommonConfig(wco) {
132
134
  if (stylesSourceMap) {
133
135
  include.push(/css$/);
134
136
  }
137
+ extraPlugins.push(new devtools_ignore_plugin_1.DevToolsIgnorePlugin());
135
138
  extraPlugins.push(new webpack_2.SourceMapDevToolPlugin({
136
139
  filename: '[file].map',
137
140
  include,
@@ -307,7 +310,7 @@ async function getCommonConfig(wco) {
307
310
  supportedBrowsers: buildOptions.supportedBrowsers,
308
311
  instrumentCode: codeCoverage
309
312
  ? {
310
- includedBasePath: sourceRoot,
313
+ includedBasePath: sourceRoot !== null && sourceRoot !== void 0 ? sourceRoot : projectRoot,
311
314
  excludedPaths: (0, helpers_1.getInstrumentationExcludedPaths)(root, codeCoverageExclude),
312
315
  }
313
316
  : undefined,
@@ -355,7 +358,7 @@ async function getCommonConfig(wco) {
355
358
  name: 'vendor',
356
359
  chunks: (chunk) => chunk.name === 'main',
357
360
  enforce: true,
358
- test: /[\\/]node_modules[\\/]/,
361
+ test: VENDORS_TEST,
359
362
  },
360
363
  },
361
364
  },
@@ -12,7 +12,9 @@ const path_1 = require("path");
12
12
  const webpack_diagnostics_1 = require("../../utils/webpack-diagnostics");
13
13
  // Webpack doesn't export these so the deep imports can potentially break.
14
14
  const AMDDefineDependency = require('webpack/lib/dependencies/AMDDefineDependency');
15
+ const CommonJsExportsDependency = require('webpack/lib/dependencies/CommonJsExportsDependency');
15
16
  const CommonJsRequireDependency = require('webpack/lib/dependencies/CommonJsRequireDependency');
17
+ const CommonJsSelfReferenceDependency = require('webpack/lib/dependencies/CommonJsSelfReferenceDependency');
16
18
  class CommonJsUsageWarnPlugin {
17
19
  constructor(options = {}) {
18
20
  this.options = options;
@@ -81,7 +83,10 @@ class CommonJsUsageWarnPlugin {
81
83
  }
82
84
  hasCommonJsDependencies(compilation, dependencies, checkParentModules = false) {
83
85
  for (const dep of dependencies) {
84
- if (dep instanceof CommonJsRequireDependency || dep instanceof AMDDefineDependency) {
86
+ if (dep instanceof CommonJsRequireDependency ||
87
+ dep instanceof CommonJsExportsDependency ||
88
+ dep instanceof CommonJsSelfReferenceDependency ||
89
+ dep instanceof AMDDefineDependency) {
85
90
  return true;
86
91
  }
87
92
  if (checkParentModules) {
@@ -0,0 +1,16 @@
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.io/license
7
+ */
8
+ import { Compiler } from 'webpack';
9
+ /**
10
+ * This plugin adds a field to source maps that identifies which sources are
11
+ * vendored or runtime-injected (aka third-party) sources. These are consumed by
12
+ * Chrome DevTools to automatically ignore-list sources.
13
+ */
14
+ export declare class DevToolsIgnorePlugin {
15
+ apply(compiler: Compiler): void;
16
+ }
@@ -0,0 +1,56 @@
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.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DevToolsIgnorePlugin = void 0;
11
+ const webpack_1 = require("webpack");
12
+ // Following the naming conventions from
13
+ // https://sourcemaps.info/spec.html#h.ghqpj1ytqjbm
14
+ const IGNORE_LIST = 'x_google_ignoreList';
15
+ const PLUGIN_NAME = 'devtools-ignore-plugin';
16
+ /**
17
+ * This plugin adds a field to source maps that identifies which sources are
18
+ * vendored or runtime-injected (aka third-party) sources. These are consumed by
19
+ * Chrome DevTools to automatically ignore-list sources.
20
+ */
21
+ class DevToolsIgnorePlugin {
22
+ apply(compiler) {
23
+ const { RawSource } = compiler.webpack.sources;
24
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
25
+ compilation.hooks.processAssets.tap({
26
+ name: PLUGIN_NAME,
27
+ stage: webpack_1.Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING,
28
+ additionalAssets: true,
29
+ }, (assets) => {
30
+ for (const [name, asset] of Object.entries(assets)) {
31
+ // Instead of using `asset.map()` to fetch the source maps from
32
+ // SourceMapSource assets, process them directly as a RawSource.
33
+ // This is because `.map()` is slow and can take several seconds.
34
+ if (!name.endsWith('.map')) {
35
+ // Ignore non source map files.
36
+ continue;
37
+ }
38
+ const mapContent = asset.source().toString();
39
+ if (!mapContent) {
40
+ continue;
41
+ }
42
+ const map = JSON.parse(mapContent);
43
+ const ignoreList = [];
44
+ for (const [index, path] of map.sources.entries()) {
45
+ if (path.includes('/node_modules/') || path.startsWith('webpack/')) {
46
+ ignoreList.push(index);
47
+ }
48
+ }
49
+ map[IGNORE_LIST] = ignoreList;
50
+ compilation.updateAsset(name, new RawSource(JSON.stringify(map)));
51
+ }
52
+ });
53
+ });
54
+ }
55
+ }
56
+ exports.DevToolsIgnorePlugin = DevToolsIgnorePlugin;
@@ -35,6 +35,10 @@ const loader_utils_1 = require("loader-utils");
35
35
  const path = __importStar(require("path"));
36
36
  const webpack_1 = require("webpack");
37
37
  const Entrypoint = require('webpack/lib/Entrypoint');
38
+ /**
39
+ * The name of the plugin provided to Webpack when tapping Webpack compiler hooks.
40
+ */
41
+ const PLUGIN_NAME = 'scripts-webpack-plugin';
38
42
  function addDependencies(compilation, scripts) {
39
43
  for (const script of scripts) {
40
44
  compilation.fileDependencies.add(script);
@@ -88,8 +92,8 @@ class ScriptsWebpackPlugin {
88
92
  const scripts = this.options.scripts
89
93
  .filter((script) => !!script)
90
94
  .map((script) => path.resolve(this.options.basePath || '', script));
91
- compiler.hooks.thisCompilation.tap('scripts-webpack-plugin', (compilation) => {
92
- compilation.hooks.additionalAssets.tapPromise('scripts-webpack-plugin', async () => {
95
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
96
+ compilation.hooks.additionalAssets.tapPromise(PLUGIN_NAME, async () => {
93
97
  if (await this.shouldSkip(compilation, scripts)) {
94
98
  if (this._cachedOutput) {
95
99
  this._insertOutput(compilation, this._cachedOutput, true);
@@ -129,14 +133,24 @@ class ScriptsWebpackPlugin {
129
133
  concatSource.add('\n;');
130
134
  });
131
135
  const combinedSource = new webpack_1.sources.CachedSource(concatSource);
132
- const filename = (0, loader_utils_1.interpolateName)({ resourcePath: 'scripts.js' }, this.options.filename, {
133
- content: combinedSource.source(),
134
- });
135
- const output = { filename, source: combinedSource };
136
+ const output = { filename: this.options.filename, source: combinedSource };
136
137
  this._insertOutput(compilation, output);
137
138
  this._cachedOutput = output;
138
139
  addDependencies(compilation, scripts);
139
140
  });
141
+ compilation.hooks.processAssets.tapPromise({
142
+ name: PLUGIN_NAME,
143
+ stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING,
144
+ }, async () => {
145
+ const assetName = this.options.filename;
146
+ const asset = compilation.getAsset(assetName);
147
+ if (asset) {
148
+ const interpolatedFilename = (0, loader_utils_1.interpolateName)({ resourcePath: 'scripts.js' }, assetName, { content: asset.source.source() });
149
+ if (assetName !== interpolatedFilename) {
150
+ compilation.renameAsset(assetName, interpolatedFilename);
151
+ }
152
+ }
153
+ });
140
154
  });
141
155
  }
142
156
  }
@@ -21,7 +21,7 @@ export declare function getOutputHashFormat(outputHashing?: OutputHashing, lengt
21
21
  export declare type NormalizedEntryPoint = Required<Exclude<ScriptElement | StyleElement, string>>;
22
22
  export declare function normalizeExtraEntryPoints(extraEntryPoints: (ScriptElement | StyleElement)[], defaultBundleName: string): NormalizedEntryPoint[];
23
23
  export declare function assetNameTemplateFactory(hashFormat: HashFormat): (resourcePath: string) => string;
24
- export declare function getInstrumentationExcludedPaths(sourceRoot: string, excludedPaths: string[]): Set<string>;
24
+ export declare function getInstrumentationExcludedPaths(root: string, excludedPaths: string[]): Set<string>;
25
25
  export declare function getCacheSettings(wco: WebpackConfigOptions, angularVersion: string): WebpackOptionsNormalized['cache'];
26
26
  export declare function globalScriptsByBundleName(root: string, scripts: ScriptElement[]): {
27
27
  bundleName: string;
@@ -121,12 +121,12 @@ function assetNameTemplateFactory(hashFormat) {
121
121
  };
122
122
  }
123
123
  exports.assetNameTemplateFactory = assetNameTemplateFactory;
124
- function getInstrumentationExcludedPaths(sourceRoot, excludedPaths) {
124
+ function getInstrumentationExcludedPaths(root, excludedPaths) {
125
125
  const excluded = new Set();
126
126
  for (const excludeGlob of excludedPaths) {
127
127
  glob_1.default
128
- .sync(excludeGlob, { nodir: true, cwd: sourceRoot })
129
- .forEach((p) => excluded.add(path.join(sourceRoot, p)));
128
+ .sync(excludeGlob, { nodir: true, cwd: root, root, nomount: true })
129
+ .forEach((p) => excluded.add(path.join(root, p)));
130
130
  }
131
131
  return excluded;
132
132
  }