@angular-devkit/build-angular 14.0.0-next.1 → 14.0.0-next.12

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 (95) hide show
  1. package/README.md +10 -10
  2. package/builders.json +5 -0
  3. package/package.json +33 -34
  4. package/src/babel/plugins/pure-toplevel-functions.js +5 -1
  5. package/src/babel/presets/application.js +5 -1
  6. package/src/babel/webpack-loader.d.ts +1 -0
  7. package/src/babel/webpack-loader.js +2 -0
  8. package/src/builders/app-shell/index.js +8 -4
  9. package/src/builders/app-shell/schema.d.ts +2 -2
  10. package/src/builders/app-shell/schema.json +2 -2
  11. package/src/builders/browser/index.d.ts +2 -3
  12. package/src/builders/browser/index.js +13 -10
  13. package/src/builders/browser/schema.d.ts +0 -1
  14. package/src/builders/browser/schema.json +2 -3
  15. package/src/builders/browser-esbuild/compiler-plugin.d.ts +14 -0
  16. package/src/builders/browser-esbuild/compiler-plugin.js +338 -0
  17. package/src/builders/browser-esbuild/esbuild.d.ts +34 -0
  18. package/src/builders/browser-esbuild/esbuild.js +59 -0
  19. package/src/builders/browser-esbuild/experimental-warnings.d.ts +10 -0
  20. package/src/builders/browser-esbuild/experimental-warnings.js +65 -0
  21. package/src/builders/browser-esbuild/index.d.ts +19 -0
  22. package/src/builders/browser-esbuild/index.js +258 -0
  23. package/src/builders/browser-esbuild/options.d.ts +34 -0
  24. package/src/builders/browser-esbuild/options.js +87 -0
  25. package/src/builders/browser-esbuild/stylesheets.d.ts +52 -0
  26. package/src/builders/browser-esbuild/stylesheets.js +118 -0
  27. package/src/builders/dev-server/index.d.ts +1 -1
  28. package/src/builders/dev-server/index.js +5 -1
  29. package/src/builders/dev-server/schema.d.ts +1 -1
  30. package/src/builders/dev-server/schema.json +1 -1
  31. package/src/builders/extract-i18n/index.d.ts +1 -1
  32. package/src/builders/extract-i18n/index.js +5 -1
  33. package/src/builders/extract-i18n/ivy-extract-loader.js +5 -1
  34. package/src/builders/karma/find-tests.js +5 -1
  35. package/src/builders/karma/index.d.ts +1 -1
  36. package/src/builders/karma/index.js +10 -6
  37. package/src/builders/ng-packagr/index.js +5 -1
  38. package/src/builders/protractor/index.d.ts +2 -1
  39. package/src/builders/protractor/index.js +5 -1
  40. package/src/builders/server/index.d.ts +2 -3
  41. package/src/builders/server/index.js +5 -1
  42. package/src/builders/server/schema.json +1 -2
  43. package/src/index.js +5 -1
  44. package/src/typings.d.ts +0 -4
  45. package/src/utils/check-port.js +8 -4
  46. package/src/utils/color.js +5 -1
  47. package/src/utils/copy-assets.js +5 -1
  48. package/src/utils/delete-output-dir.js +6 -9
  49. package/src/utils/environment-options.d.ts +0 -1
  50. package/src/utils/environment-options.js +1 -13
  51. package/src/utils/i18n-inlining.js +5 -1
  52. package/src/utils/i18n-options.js +1 -8
  53. package/src/utils/index-file/html-rewriting-stream.js +5 -1
  54. package/src/utils/index-file/index-html-generator.js +5 -1
  55. package/src/utils/index-file/inline-critical-css.js +5 -1
  56. package/src/utils/index-file/inline-fonts.js +5 -1
  57. package/src/utils/index.js +5 -1
  58. package/src/utils/load-translations.js +5 -1
  59. package/src/utils/normalize-asset-patterns.d.ts +2 -2
  60. package/src/utils/normalize-asset-patterns.js +34 -10
  61. package/src/utils/normalize-builder-schema.d.ts +2 -2
  62. package/src/utils/normalize-builder-schema.js +5 -6
  63. package/src/utils/normalize-cache.js +0 -4
  64. package/src/utils/normalize-file-replacements.d.ts +4 -4
  65. package/src/utils/normalize-file-replacements.js +38 -18
  66. package/src/utils/process-bundle.js +6 -2
  67. package/src/utils/purge-cache.js +3 -8
  68. package/src/utils/read-tsconfig.js +5 -1
  69. package/src/utils/service-worker.d.ts +1 -2
  70. package/src/utils/service-worker.js +14 -12
  71. package/src/utils/webpack-browser-config.js +14 -12
  72. package/src/webpack/configs/analytics.js +1 -4
  73. package/src/webpack/configs/common.js +10 -12
  74. package/src/webpack/configs/dev-server.js +6 -2
  75. package/src/webpack/configs/index.js +5 -1
  76. package/src/webpack/configs/styles.d.ts +6 -0
  77. package/src/webpack/configs/styles.js +16 -22
  78. package/src/webpack/plugins/analytics.d.ts +1 -2
  79. package/src/webpack/plugins/analytics.js +1 -3
  80. package/src/webpack/plugins/any-component-style-budget-checker.js +5 -1
  81. package/src/webpack/plugins/common-js-usage-warn-plugin.js +2 -2
  82. package/src/webpack/plugins/css-optimizer-plugin.js +7 -3
  83. package/src/webpack/plugins/esbuild-executor.d.ts +2 -2
  84. package/src/webpack/plugins/esbuild-executor.js +11 -17
  85. package/src/webpack/plugins/javascript-optimizer-plugin.js +8 -4
  86. package/src/webpack/plugins/json-stats-plugin.js +5 -1
  87. package/src/webpack/plugins/karma/karma.js +11 -27
  88. package/src/webpack/plugins/named-chunks-plugin.js +9 -0
  89. package/src/webpack/plugins/postcss-cli-resources.js +7 -3
  90. package/src/webpack/plugins/scripts-webpack-plugin.js +5 -1
  91. package/src/webpack/plugins/transfer-size-plugin.js +3 -2
  92. package/src/webpack/plugins/typescript.js +1 -2
  93. package/src/webpack/utils/helpers.js +5 -1
  94. package/src/webpack/utils/stats.js +5 -1
  95. package/esbuild-check.js +0 -16
@@ -0,0 +1,338 @@
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
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || function (mod) {
26
+ if (mod && mod.__esModule) return mod;
27
+ var result = {};
28
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
+ __setModuleDefault(result, mod);
30
+ return result;
31
+ };
32
+ var __importDefault = (this && this.__importDefault) || function (mod) {
33
+ return (mod && mod.__esModule) ? mod : { "default": mod };
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createCompilerPlugin = void 0;
37
+ const core_1 = require("@babel/core");
38
+ const assert = __importStar(require("assert"));
39
+ const fs_1 = require("fs");
40
+ const path = __importStar(require("path"));
41
+ const typescript_1 = __importDefault(require("typescript"));
42
+ const application_1 = __importDefault(require("../../babel/presets/application"));
43
+ const webpack_loader_1 = require("../../babel/webpack-loader");
44
+ const load_esm_1 = require("../../utils/load-esm");
45
+ const stylesheets_1 = require("./stylesheets");
46
+ /**
47
+ * Converts TypeScript Diagnostic related information into an esbuild compatible note object.
48
+ * Related information is a subset of a full TypeScript Diagnostic and also used for diagnostic
49
+ * notes associated with the main Diagnostic.
50
+ * @param diagnostic The TypeScript diagnostic relative information to convert.
51
+ * @param host A TypeScript FormatDiagnosticsHost instance to use during conversion.
52
+ * @returns An esbuild diagnostic message as a PartialMessage object
53
+ */
54
+ function convertTypeScriptDiagnosticInfo(info, host, textPrefix) {
55
+ let text = typescript_1.default.flattenDiagnosticMessageText(info.messageText, host.getNewLine());
56
+ if (textPrefix) {
57
+ text = textPrefix + text;
58
+ }
59
+ const note = { text };
60
+ if (info.file) {
61
+ note.location = {
62
+ file: info.file.fileName,
63
+ length: info.length,
64
+ };
65
+ // Calculate the line/column location and extract the full line text that has the diagnostic
66
+ if (info.start) {
67
+ const { line, character } = typescript_1.default.getLineAndCharacterOfPosition(info.file, info.start);
68
+ note.location.line = line + 1;
69
+ note.location.column = character;
70
+ // The start position for the slice is the first character of the error line
71
+ const lineStartPosition = typescript_1.default.getPositionOfLineAndCharacter(info.file, line, 0);
72
+ // The end position for the slice is the first character of the next line or the length of
73
+ // the entire file if the line is the last line of the file (getPositionOfLineAndCharacter
74
+ // will error if a nonexistent line is passed).
75
+ const { line: lastLineOfFile } = typescript_1.default.getLineAndCharacterOfPosition(info.file, info.file.text.length - 1);
76
+ const lineEndPosition = line < lastLineOfFile
77
+ ? typescript_1.default.getPositionOfLineAndCharacter(info.file, line + 1, 0)
78
+ : info.file.text.length;
79
+ note.location.lineText = info.file.text.slice(lineStartPosition, lineEndPosition).trimEnd();
80
+ }
81
+ }
82
+ return note;
83
+ }
84
+ /**
85
+ * Converts a TypeScript Diagnostic message into an esbuild compatible message object.
86
+ * @param diagnostic The TypeScript diagnostic to convert.
87
+ * @param host A TypeScript FormatDiagnosticsHost instance to use during conversion.
88
+ * @returns An esbuild diagnostic message as a PartialMessage object
89
+ */
90
+ function convertTypeScriptDiagnostic(diagnostic, host) {
91
+ var _a;
92
+ let codePrefix = 'TS';
93
+ let code = `${diagnostic.code}`;
94
+ if (diagnostic.source === 'ngtsc') {
95
+ codePrefix = 'NG';
96
+ // Remove `-99` Angular prefix from diagnostic code
97
+ code = code.slice(3);
98
+ }
99
+ const message = {
100
+ ...convertTypeScriptDiagnosticInfo(diagnostic, host, `${codePrefix}${code}: `),
101
+ // Store original diagnostic for reference if needed downstream
102
+ detail: diagnostic,
103
+ };
104
+ if ((_a = diagnostic.relatedInformation) === null || _a === void 0 ? void 0 : _a.length) {
105
+ message.notes = diagnostic.relatedInformation.map((info) => convertTypeScriptDiagnosticInfo(info, host));
106
+ }
107
+ return message;
108
+ }
109
+ // This is a non-watch version of the compiler code from `@ngtools/webpack` augmented for esbuild
110
+ // eslint-disable-next-line max-lines-per-function
111
+ function createCompilerPlugin(pluginOptions, styleOptions) {
112
+ return {
113
+ name: 'angular-compiler',
114
+ // eslint-disable-next-line max-lines-per-function
115
+ async setup(build) {
116
+ var _a;
117
+ var _b;
118
+ // This uses a wrapped dynamic import to load `@angular/compiler-cli` which is ESM.
119
+ // Once TypeScript provides support for retaining dynamic imports this workaround can be dropped.
120
+ const compilerCli = await (0, load_esm_1.loadEsmModule)('@angular/compiler-cli');
121
+ // Temporary deep import for transformer support
122
+ const { createAotTransformers, mergeTransformers, } = require('@ngtools/webpack/src/ivy/transformation');
123
+ // Setup defines based on the values provided by the Angular compiler-cli
124
+ (_a = (_b = build.initialOptions).define) !== null && _a !== void 0 ? _a : (_b.define = {});
125
+ for (const [key, value] of Object.entries(compilerCli.GLOBAL_DEFS_FOR_TERSER_WITH_AOT)) {
126
+ if (key in build.initialOptions.define) {
127
+ // Skip keys that have been manually provided
128
+ continue;
129
+ }
130
+ // esbuild requires values to be a string (actual strings need to be quoted).
131
+ // In this case, all provided values are booleans.
132
+ build.initialOptions.define[key] = value.toString();
133
+ }
134
+ // The tsconfig is loaded in setup instead of in start to allow the esbuild target build option to be modified.
135
+ // esbuild build options can only be modified in setup prior to starting the build.
136
+ const { options: compilerOptions, rootNames, errors: configurationDiagnostics, } = compilerCli.readConfiguration(pluginOptions.tsconfig, {
137
+ enableIvy: true,
138
+ noEmitOnError: false,
139
+ suppressOutputPathCheck: true,
140
+ outDir: undefined,
141
+ inlineSources: pluginOptions.sourcemap,
142
+ inlineSourceMap: pluginOptions.sourcemap,
143
+ sourceMap: false,
144
+ mapRoot: undefined,
145
+ sourceRoot: undefined,
146
+ declaration: false,
147
+ declarationMap: false,
148
+ allowEmptyCodegenFiles: false,
149
+ annotationsAs: 'decorators',
150
+ enableResourceInlining: false,
151
+ });
152
+ // Adjust the esbuild output target based on the tsconfig target
153
+ if (compilerOptions.target === undefined ||
154
+ compilerOptions.target <= typescript_1.default.ScriptTarget.ES2015) {
155
+ build.initialOptions.target = 'es2015';
156
+ }
157
+ else if (compilerOptions.target >= typescript_1.default.ScriptTarget.ESNext) {
158
+ build.initialOptions.target = 'esnext';
159
+ }
160
+ else {
161
+ build.initialOptions.target = typescript_1.default.ScriptTarget[compilerOptions.target].toLowerCase();
162
+ }
163
+ // The file emitter created during `onStart` that will be used during the build in `onLoad` callbacks for TS files
164
+ let fileEmitter;
165
+ build.onStart(async () => {
166
+ var _a, _b;
167
+ const result = {};
168
+ // Create TypeScript compiler host
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 : '';
176
+ };
177
+ // Add an AOT compiler resource transform hook
178
+ host.transformResource = async function (data, context) {
179
+ var _a, _b, _c;
180
+ // Only style resources are transformed currently
181
+ if (context.type !== 'style') {
182
+ return null;
183
+ }
184
+ // The file with the resource content will either be an actual file (resourceFile)
185
+ // or the file containing the inline component style text (containingFile).
186
+ const file = (_a = context.resourceFile) !== null && _a !== void 0 ? _a : context.containingFile;
187
+ const { contents, errors, warnings } = await (0, stylesheets_1.bundleStylesheetText)(data, {
188
+ resolvePath: path.dirname(file),
189
+ virtualName: file,
190
+ }, styleOptions);
191
+ ((_b = result.errors) !== null && _b !== void 0 ? _b : (result.errors = [])).push(...errors);
192
+ ((_c = result.warnings) !== null && _c !== void 0 ? _c : (result.warnings = [])).push(...warnings);
193
+ return { content: contents };
194
+ };
195
+ // Create the Angular specific program that contains the Angular compiler
196
+ const angularProgram = new compilerCli.NgtscProgram(rootNames, compilerOptions, host);
197
+ const angularCompiler = angularProgram.compiler;
198
+ const { ignoreForDiagnostics, ignoreForEmit } = angularCompiler;
199
+ const typeScriptProgram = angularProgram.getTsProgram();
200
+ const builder = typescript_1.default.createAbstractBuilder(typeScriptProgram, host);
201
+ await angularCompiler.analyzeAsync();
202
+ function* collectDiagnostics() {
203
+ // Collect program level diagnostics
204
+ yield* configurationDiagnostics;
205
+ yield* angularCompiler.getOptionDiagnostics();
206
+ yield* builder.getOptionsDiagnostics();
207
+ yield* builder.getGlobalDiagnostics();
208
+ // Collect source file specific diagnostics
209
+ const OptimizeFor = compilerCli.OptimizeFor;
210
+ for (const sourceFile of builder.getSourceFiles()) {
211
+ if (ignoreForDiagnostics.has(sourceFile)) {
212
+ continue;
213
+ }
214
+ yield* builder.getSyntacticDiagnostics(sourceFile);
215
+ yield* builder.getSemanticDiagnostics(sourceFile);
216
+ const angularDiagnostics = angularCompiler.getDiagnosticsForFile(sourceFile, OptimizeFor.WholeProgram);
217
+ yield* angularDiagnostics;
218
+ }
219
+ }
220
+ for (const diagnostic of collectDiagnostics()) {
221
+ const message = convertTypeScriptDiagnostic(diagnostic, host);
222
+ if (diagnostic.category === typescript_1.default.DiagnosticCategory.Error) {
223
+ ((_a = result.errors) !== null && _a !== void 0 ? _a : (result.errors = [])).push(message);
224
+ }
225
+ else {
226
+ ((_b = result.warnings) !== null && _b !== void 0 ? _b : (result.warnings = [])).push(message);
227
+ }
228
+ }
229
+ fileEmitter = createFileEmitter(builder, mergeTransformers(angularCompiler.prepareEmit().transformers, createAotTransformers(builder, {})), () => []);
230
+ return result;
231
+ });
232
+ build.onLoad({ filter: compilerOptions.allowJs ? /\.[cm]?[jt]sx?$/ : /\.[cm]?tsx?$/ }, async (args) => {
233
+ var _a, _b;
234
+ assert.ok(fileEmitter, 'Invalid plugin execution order');
235
+ const typescriptResult = await fileEmitter(args.path);
236
+ if (!typescriptResult) {
237
+ // No TS result indicates the file is not part of the TypeScript program.
238
+ // If allowJs is enabled and the file is JS then defer to the next load hook.
239
+ if (compilerOptions.allowJs && /\.[cm]?js$/.test(args.path)) {
240
+ return undefined;
241
+ }
242
+ // Otherwise return an error
243
+ return {
244
+ errors: [
245
+ {
246
+ text: 'File is missing from the TypeScript compilation.',
247
+ location: { file: args.path },
248
+ notes: [
249
+ {
250
+ text: `Ensure the file is part of the TypeScript program via the 'files' or 'include' property.`,
251
+ },
252
+ ],
253
+ },
254
+ ],
255
+ };
256
+ }
257
+ const data = (_a = typescriptResult.content) !== null && _a !== void 0 ? _a : '';
258
+ const babelResult = await (0, core_1.transformAsync)(data, {
259
+ filename: args.path,
260
+ inputSourceMap: (pluginOptions.sourcemap ? undefined : false),
261
+ sourceMaps: pluginOptions.sourcemap ? 'inline' : false,
262
+ compact: false,
263
+ configFile: false,
264
+ babelrc: false,
265
+ browserslistConfigFile: false,
266
+ plugins: [],
267
+ presets: [
268
+ [
269
+ application_1.default,
270
+ {
271
+ forceAsyncTransformation: data.includes('async'),
272
+ optimize: pluginOptions.advancedOptimizations && {},
273
+ },
274
+ ],
275
+ ],
276
+ });
277
+ return {
278
+ contents: (_b = babelResult === null || babelResult === void 0 ? void 0 : babelResult.code) !== null && _b !== void 0 ? _b : '',
279
+ loader: 'js',
280
+ };
281
+ });
282
+ build.onLoad({ filter: /\.[cm]?js$/ }, async (args) => {
283
+ var _a;
284
+ const angularPackage = /[\\/]node_modules[\\/]@angular[\\/]/.test(args.path);
285
+ const linkerPluginCreator = (await (0, load_esm_1.loadEsmModule)('@angular/compiler-cli/linker/babel')).createEs2015LinkerPlugin;
286
+ const data = await fs_1.promises.readFile(args.path, 'utf-8');
287
+ const result = await (0, core_1.transformAsync)(data, {
288
+ filename: args.path,
289
+ inputSourceMap: (pluginOptions.sourcemap ? undefined : false),
290
+ sourceMaps: pluginOptions.sourcemap ? 'inline' : false,
291
+ compact: false,
292
+ configFile: false,
293
+ babelrc: false,
294
+ browserslistConfigFile: false,
295
+ plugins: [],
296
+ presets: [
297
+ [
298
+ application_1.default,
299
+ {
300
+ angularLinker: {
301
+ shouldLink: await (0, webpack_loader_1.requiresLinking)(args.path, data),
302
+ jitMode: false,
303
+ linkerPluginCreator,
304
+ },
305
+ forceAsyncTransformation: !/[\\/][_f]?esm2015[\\/]/.test(args.path) && data.includes('async'),
306
+ optimize: pluginOptions.advancedOptimizations && {
307
+ looseEnums: angularPackage,
308
+ pureTopLevel: angularPackage,
309
+ },
310
+ },
311
+ ],
312
+ ],
313
+ });
314
+ return {
315
+ contents: (_a = result === null || result === void 0 ? void 0 : result.code) !== null && _a !== void 0 ? _a : data,
316
+ loader: 'js',
317
+ };
318
+ });
319
+ },
320
+ };
321
+ }
322
+ exports.createCompilerPlugin = createCompilerPlugin;
323
+ function createFileEmitter(program, transformers = {}, onAfterEmit) {
324
+ return async (file) => {
325
+ const sourceFile = program.getSourceFile(file);
326
+ if (!sourceFile) {
327
+ return undefined;
328
+ }
329
+ let content;
330
+ program.emit(sourceFile, (filename, data) => {
331
+ if (/\.[cm]?js$/.test(filename)) {
332
+ content = data;
333
+ }
334
+ }, undefined /* cancellationToken */, undefined /* emitOnlyDtsFiles */, transformers);
335
+ onAfterEmit === null || onAfterEmit === void 0 ? void 0 : onAfterEmit(sourceFile);
336
+ return { content, dependencies: [] };
337
+ };
338
+ }
@@ -0,0 +1,34 @@
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 { BuilderContext } from '@angular-devkit/architect';
9
+ import { BuildFailure, BuildOptions, BuildResult, Message, OutputFile } from 'esbuild';
10
+ /**
11
+ * Determines if an unknown value is an esbuild BuildFailure error object thrown by esbuild.
12
+ * @param value A potential esbuild BuildFailure error object.
13
+ * @returns `true` if the object is determined to be a BuildFailure object; otherwise, `false`.
14
+ */
15
+ export declare function isEsBuildFailure(value: unknown): value is BuildFailure;
16
+ /**
17
+ * Executes the esbuild build function and normalizes the build result in the event of a
18
+ * build failure that results in no output being generated.
19
+ * All builds use the `write` option with a value of `false` to allow for the output files
20
+ * build result array to be populated.
21
+ *
22
+ * @param options The esbuild options object to use when building.
23
+ * @returns If output files are generated, the full esbuild BuildResult; if not, the
24
+ * warnings and errors for the attempted build.
25
+ */
26
+ export declare function bundle(options: BuildOptions): Promise<(BuildResult & {
27
+ outputFiles: OutputFile[];
28
+ }) | (BuildFailure & {
29
+ outputFiles?: never;
30
+ })>;
31
+ export declare function logMessages(context: BuilderContext, { errors, warnings }: {
32
+ errors: Message[];
33
+ warnings: Message[];
34
+ }): Promise<void>;
@@ -0,0 +1,59 @@
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.logMessages = exports.bundle = exports.isEsBuildFailure = void 0;
11
+ const esbuild_1 = require("esbuild");
12
+ /**
13
+ * Determines if an unknown value is an esbuild BuildFailure error object thrown by esbuild.
14
+ * @param value A potential esbuild BuildFailure error object.
15
+ * @returns `true` if the object is determined to be a BuildFailure object; otherwise, `false`.
16
+ */
17
+ function isEsBuildFailure(value) {
18
+ return !!value && typeof value === 'object' && 'errors' in value && 'warnings' in value;
19
+ }
20
+ exports.isEsBuildFailure = isEsBuildFailure;
21
+ /**
22
+ * Executes the esbuild build function and normalizes the build result in the event of a
23
+ * build failure that results in no output being generated.
24
+ * All builds use the `write` option with a value of `false` to allow for the output files
25
+ * build result array to be populated.
26
+ *
27
+ * @param options The esbuild options object to use when building.
28
+ * @returns If output files are generated, the full esbuild BuildResult; if not, the
29
+ * warnings and errors for the attempted build.
30
+ */
31
+ async function bundle(options) {
32
+ try {
33
+ return await (0, esbuild_1.build)({
34
+ ...options,
35
+ write: false,
36
+ });
37
+ }
38
+ catch (failure) {
39
+ // Build failures will throw an exception which contains errors/warnings
40
+ if (isEsBuildFailure(failure)) {
41
+ return failure;
42
+ }
43
+ else {
44
+ throw failure;
45
+ }
46
+ }
47
+ }
48
+ exports.bundle = bundle;
49
+ async function logMessages(context, { errors, warnings }) {
50
+ if (warnings.length) {
51
+ const warningMessages = await (0, esbuild_1.formatMessages)(warnings, { kind: 'warning', color: true });
52
+ context.logger.warn(warningMessages.join('\n'));
53
+ }
54
+ if (errors.length) {
55
+ const errorMessages = await (0, esbuild_1.formatMessages)(errors, { kind: 'error', color: true });
56
+ context.logger.error(errorMessages.join('\n'));
57
+ }
58
+ }
59
+ exports.logMessages = logMessages;
@@ -0,0 +1,10 @@
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 { BuilderContext } from '@angular-devkit/architect';
9
+ import { Schema as BrowserBuilderOptions } from '../browser/schema';
10
+ export declare function logExperimentalWarnings(options: BrowserBuilderOptions, context: BuilderContext): void;
@@ -0,0 +1,65 @@
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.logExperimentalWarnings = void 0;
11
+ const UNSUPPORTED_OPTIONS = [
12
+ 'allowedCommonJsDependencies',
13
+ 'budgets',
14
+ 'extractLicenses',
15
+ 'fileReplacements',
16
+ 'progress',
17
+ 'scripts',
18
+ 'statsJson',
19
+ // * i18n support
20
+ 'localize',
21
+ // The following two have no effect when localize is not enabled
22
+ // 'i18nDuplicateTranslation',
23
+ // 'i18nMissingTranslation',
24
+ // * Serviceworker support
25
+ 'ngswConfigPath',
26
+ 'serviceWorker',
27
+ // * Stylesheet preprocessor support
28
+ 'inlineStyleLanguage',
29
+ // The following option has no effect until preprocessors are supported
30
+ // 'stylePreprocessorOptions',
31
+ // * Watch mode
32
+ 'watch',
33
+ 'poll',
34
+ // * Deprecated
35
+ 'deployUrl',
36
+ // * Always enabled with esbuild
37
+ // 'commonChunk',
38
+ // * Currently unsupported by esbuild
39
+ 'namedChunks',
40
+ 'vendorChunk',
41
+ 'webWorkerTsConfig',
42
+ ];
43
+ function logExperimentalWarnings(options, context) {
44
+ // Warn about experimental status of this builder
45
+ context.logger.warn(`The esbuild browser application builder ('browser-esbuild') is currently experimental.`);
46
+ // Validate supported options
47
+ // Currently only a subset of the Webpack-based browser builder options are supported.
48
+ for (const unsupportedOption of UNSUPPORTED_OPTIONS) {
49
+ const value = options[unsupportedOption];
50
+ if (value === undefined || value === false) {
51
+ continue;
52
+ }
53
+ if (Array.isArray(value) && value.length === 0) {
54
+ continue;
55
+ }
56
+ if (typeof value === 'object' && Object.keys(value).length === 0) {
57
+ continue;
58
+ }
59
+ if (unsupportedOption === 'inlineStyleLanguage' && value === 'css') {
60
+ continue;
61
+ }
62
+ context.logger.warn(`The '${unsupportedOption}' option is currently unsupported by this experimental builder and will be ignored.`);
63
+ }
64
+ }
65
+ exports.logExperimentalWarnings = logExperimentalWarnings;
@@ -0,0 +1,19 @@
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 { BuilderContext, BuilderOutput } from '@angular-devkit/architect';
9
+ import { Schema as BrowserBuilderOptions } from '../browser/schema';
10
+ /**
11
+ * Main execution function for the esbuild-based application builder.
12
+ * The options are compatible with the Webpack-based builder.
13
+ * @param options The browser builder options to use when setting up the application build
14
+ * @param context The Architect builder context object
15
+ * @returns A promise with the builder result output
16
+ */
17
+ export declare function execute(options: BrowserBuilderOptions, context: BuilderContext): Promise<BuilderOutput>;
18
+ declare const _default: import("@angular-devkit/architect/src/internal").Builder<BrowserBuilderOptions & import("../../../../core/src").JsonObject>;
19
+ export default _default;