Skip to content

Commit af67b49

Browse files
alan-agius4alexeagle
authored andcommitted
refactor: clean up how to generate normalized build options and improve type safety
1 parent 4f8a5b7 commit af67b49

File tree

21 files changed

+220
-197
lines changed

21 files changed

+220
-197
lines changed

packages/angular_devkit/build_angular/src/angular-cli-files/models/build-options.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,18 @@ import {
1616
CurrentFileReplacement,
1717
ExtraEntryPoint,
1818
} from '../../browser/schema';
19-
import { NormalizedOptimization } from '../../utils/index';
19+
import { NormalizedOptimization, NormalizedSourceMaps } from '../../utils/index';
2020

2121
export interface BuildOptions {
2222
optimization: NormalizedOptimization;
2323
environment?: string;
2424
outputPath: string;
2525
resourcesOutputPath?: string;
2626
aot?: boolean;
27-
sourceMap?: boolean;
28-
scriptsSourceMap?: boolean;
29-
stylesSourceMap?: boolean;
30-
hiddenSourceMap?: boolean;
27+
sourceMap: NormalizedSourceMaps;
28+
/** @deprecated use sourceMap instead */
3129
vendorSourceMap?: boolean;
30+
/** @deprecated */
3231
evalSourceMap?: boolean;
3332
vendorChunk?: boolean;
3433
commonChunk?: boolean;

packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/browser.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,14 @@ export function getBrowserConfig(wco: WebpackConfigOptions) {
2121

2222
let isEval = false;
2323
const { styles: stylesOptimization, scripts: scriptsOptimization } = buildOptions.optimization;
24+
const {
25+
styles: stylesSouceMap,
26+
scripts: scriptsSourceMap,
27+
hidden: hiddenSourceMap,
28+
} = buildOptions.sourceMap;
29+
2430
// See https://webpack.js.org/configuration/devtool/ for sourcemap types.
25-
if (buildOptions.sourceMap &&
31+
if ((stylesSouceMap || scriptsSourceMap) &&
2632
buildOptions.evalSourceMap &&
2733
!stylesOptimization &&
2834
!scriptsOptimization) {
@@ -58,16 +64,10 @@ export function getBrowserConfig(wco: WebpackConfigOptions) {
5864
}));
5965
}
6066

61-
if (!isEval && buildOptions.sourceMap) {
62-
const {
63-
scriptsSourceMap = false,
64-
stylesSourceMap = false,
65-
hiddenSourceMap = false,
66-
} = buildOptions;
67-
67+
if (!isEval && (scriptsSourceMap || stylesSouceMap)) {
6868
extraPlugins.push(getSourceMapDevTool(
6969
scriptsSourceMap,
70-
stylesSourceMap,
70+
stylesSouceMap,
7171
hiddenSourceMap,
7272
));
7373
}

packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/common.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ export const buildOptimizerLoader: string = g['_DevKitIsLocal']
3434
export function getCommonConfig(wco: WebpackConfigOptions) {
3535
const { root, projectRoot, buildOptions } = wco;
3636
const { styles: stylesOptimization, scripts: scriptsOptimization } = buildOptions.optimization;
37+
const {
38+
styles: stylesSouceMap,
39+
scripts: scriptsSourceMap,
40+
vendor: vendorSourceMap,
41+
} = buildOptions.sourceMap;
3742

3843
const nodeModules = findUp('node_modules', projectRoot);
3944
if (!nodeModules) {
@@ -103,7 +108,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
103108

104109
extraPlugins.push(new ScriptsWebpackPlugin({
105110
name: bundleName,
106-
sourceMap: buildOptions.scriptsSourceMap,
111+
sourceMap: scriptsSourceMap,
107112
filename: `${path.basename(bundleName)}${hash}.js`,
108113
scripts: script.paths,
109114
basePath: projectRoot,
@@ -159,7 +164,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
159164
}
160165

161166
let sourceMapUseRule;
162-
if (buildOptions.sourceMap && buildOptions.vendorSourceMap) {
167+
if ((scriptsSourceMap || stylesSouceMap) && vendorSourceMap) {
163168
sourceMapUseRule = {
164169
use: [
165170
{
@@ -175,7 +180,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
175180
use: [
176181
{
177182
loader: buildOptimizerLoader,
178-
options: { sourceMap: buildOptions.scriptsSourceMap },
183+
options: { sourceMap: scriptsSourceMap },
179184
},
180185
],
181186
};
@@ -209,7 +214,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
209214
if (stylesOptimization) {
210215
extraMinimizers.push(
211216
new CleanCssWebpackPlugin({
212-
sourceMap: buildOptions.stylesSourceMap,
217+
sourceMap: stylesSouceMap,
213218
// component styles retain their original file name
214219
test: (file) => /\.(?:css|scss|sass|less|styl)$/.test(file),
215220
}),
@@ -248,7 +253,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
248253

249254
extraMinimizers.push(
250255
new TerserPlugin({
251-
sourceMap: buildOptions.scriptsSourceMap,
256+
sourceMap: scriptsSourceMap,
252257
parallel: true,
253258
cache: true,
254259
terserOptions,

packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/server.ts

+4-8
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,12 @@ export function getServerConfig(wco: WebpackConfigOptions) {
1818

1919
const extraPlugins = [];
2020
if (wco.buildOptions.sourceMap) {
21-
const {
22-
scriptsSourceMap = false,
23-
stylesSourceMap = false,
24-
hiddenSourceMap = false,
25-
} = wco.buildOptions;
21+
const { scripts, styles, hidden } = wco.buildOptions.sourceMap;
2622

2723
extraPlugins.push(getSourceMapDevTool(
28-
scriptsSourceMap,
29-
stylesSourceMap,
30-
hiddenSourceMap,
24+
scripts,
25+
styles,
26+
hidden,
3127
));
3228
}
3329

packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/styles.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) {
4141
const globalStylePaths: string[] = [];
4242
const extraPlugins = [];
4343

44-
const cssSourceMap = buildOptions.stylesSourceMap;
44+
const cssSourceMap = buildOptions.sourceMap.styles;
4545

4646
// Determine hashing format.
4747
const hashFormat = getOutputHashFormat(buildOptions.outputHashing as string);
@@ -188,7 +188,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) {
188188
options: {
189189
ident: 'embedded',
190190
plugins: postcssPluginCreator,
191-
sourceMap: cssSourceMap && !buildOptions.hiddenSourceMap ? 'inline' : false,
191+
sourceMap: cssSourceMap && !buildOptions.sourceMap.hidden ? 'inline' : false,
192192
},
193193
},
194194
...(use as webpack.Loader[]),
@@ -211,7 +211,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) {
211211
plugins: postcssPluginCreator,
212212
sourceMap: cssSourceMap
213213
&& !buildOptions.extractCss
214-
&& !buildOptions.hiddenSourceMap
214+
&& !buildOptions.sourceMap.hidden
215215
? 'inline' : cssSourceMap,
216216
},
217217
},

packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/test.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,11 @@ export function getTestConfig(
5757
}
5858

5959
if (wco.buildOptions.sourceMap) {
60-
const {
61-
scriptsSourceMap = false,
62-
stylesSourceMap = false,
63-
} = wco.buildOptions;
60+
const { styles, scripts } = wco.buildOptions.sourceMap;
6461

6562
extraPlugins.push(getSourceMapDevTool(
66-
scriptsSourceMap,
67-
stylesSourceMap,
63+
styles,
64+
scripts,
6865
false,
6966
true,
7067
));

packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/typescript.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function _createAotPlugin(
7575
locale: buildOptions.i18nLocale,
7676
platform: buildOptions.platform === 'server' ? PLATFORM.Server : PLATFORM.Browser,
7777
missingTranslation: buildOptions.i18nMissingTranslation,
78-
sourceMap: buildOptions.scriptsSourceMap,
78+
sourceMap: buildOptions.sourceMap.scripts,
7979
additionalLazyModules,
8080
hostReplacementPaths,
8181
nameLazyFiles: buildOptions.namedChunks,
@@ -108,7 +108,7 @@ export function getAotConfig(
108108
if (buildOptions.buildOptimizer) {
109109
loaders.unshift({
110110
loader: buildOptimizerLoader,
111-
options: { sourceMap: buildOptions.scriptsSourceMap }
111+
options: { sourceMap: buildOptions.sourceMap.scripts }
112112
});
113113
}
114114

packages/angular_devkit/build_angular/src/browser/index.ts

+10-46
Original file line numberDiff line numberDiff line change
@@ -38,78 +38,42 @@ import {
3838
NormalizedOptimization,
3939
NormalizedSourceMaps,
4040
defaultProgress,
41-
normalizeAssetPatterns,
42-
normalizeFileReplacements,
43-
normalizeOptimization,
44-
normalizeSourceMaps,
41+
normalizeBuilderSchema,
4542
} from '../utils';
4643
import {
4744
AssetPatternObject,
4845
BrowserBuilderSchema,
4946
CurrentFileReplacement,
47+
NormalizedBrowserBuilderSchema,
5048
} from './schema';
5149
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
5250
const webpackMerge = require('webpack-merge');
5351

54-
55-
// TODO: figure out a better way to normalize assets, extra entry points, file replacements,
56-
// and whatever else needs to be normalized, while keeping type safety.
57-
// Right now this normalization has to be done in all other builders that make use of the
58-
// BrowserBuildSchema and BrowserBuilder.buildWebpackConfig.
59-
// It would really help if it happens during architect.validateBuilderOptions, or similar.
60-
export interface NormalizedBrowserBuilderSchema extends
61-
Pick<
62-
BrowserBuilderSchema,
63-
Exclude<keyof BrowserBuilderSchema, 'sourceMap' | 'vendorSourceMap' | 'optimization'>
64-
>,
65-
NormalizedSourceMaps {
66-
assets: AssetPatternObject[];
67-
fileReplacements: CurrentFileReplacement[];
68-
optimization: NormalizedOptimization;
69-
}
70-
7152
export class BrowserBuilder implements Builder<BrowserBuilderSchema> {
7253

7354
constructor(public context: BuilderContext) { }
7455

7556
run(builderConfig: BuilderConfiguration<BrowserBuilderSchema>): Observable<BuildEvent> {
76-
let options = builderConfig.options;
57+
let options: NormalizedBrowserBuilderSchema;
7758
const root = this.context.workspace.root;
7859
const projectRoot = resolve(root, builderConfig.root);
7960
const host = new virtualFs.AliasHost(this.context.host as virtualFs.Host<fs.Stats>);
8061
const webpackBuilder = new WebpackBuilder({ ...this.context, host });
8162

8263
return of(null).pipe(
64+
concatMap(() => normalizeBuilderSchema(
65+
host,
66+
root,
67+
builderConfig,
68+
)),
69+
tap(normalizedOptions => options = normalizedOptions),
8370
concatMap(() => options.deleteOutputPath
8471
? this._deleteOutputDir(root, normalize(options.outputPath), this.context.host)
8572
: of(null)),
86-
concatMap(() => normalizeFileReplacements(options.fileReplacements, host, root)),
87-
tap(fileReplacements => options.fileReplacements = fileReplacements),
88-
concatMap(() => normalizeAssetPatterns(
89-
options.assets, host, root, projectRoot, builderConfig.sourceRoot)),
90-
// Replace the assets in options with the normalized version.
91-
tap((assetPatternObjects => options.assets = assetPatternObjects)),
92-
tap(() => {
93-
const normalizedOptions = normalizeSourceMaps(options.sourceMap);
94-
// todo: remove when removing the deprecations
95-
normalizedOptions.vendorSourceMap
96-
= normalizedOptions.vendorSourceMap || !!options.vendorSourceMap;
97-
98-
options = {
99-
...options,
100-
...normalizedOptions,
101-
// tslint:disable-next-line:no-any
102-
optimization: normalizeOptimization(options.optimization) as any,
103-
};
104-
}),
10573
concatMap(() => {
10674
let webpackConfig;
10775
try {
108-
webpackConfig = this.buildWebpackConfig(root, projectRoot, host,
109-
// todo replace with unknown
110-
// we need to find a clear way to create this options
111-
// tslint:disable-next-line:no-any
112-
options as any as NormalizedBrowserBuilderSchema);
76+
webpackConfig = this.buildWebpackConfig(root, projectRoot, host, options);
11377
} catch (e) {
11478
return throwError(e);
11579
}

packages/angular_devkit/build_angular/src/browser/schema.d.ts

+16
Original file line numberDiff line numberDiff line change
@@ -403,3 +403,19 @@ export enum BudgetType {
403403
AnyScript = 'anyScript',
404404
Bundle = 'bundle',
405405
}
406+
407+
// TODO: figure out a better way to normalize assets, extra entry points, file replacements,
408+
// and whatever else needs to be normalized, while keeping type safety.
409+
// Right now this normalization has to be done in all other builders that make use of the
410+
// BrowserBuildSchema and BrowserBuilder.buildWebpackConfig.
411+
// It would really help if it happens during architect.validateBuilderOptions, or similar.
412+
export interface NormalizedBrowserBuilderSchema extends
413+
Pick<
414+
BrowserBuilderSchema,
415+
Exclude<keyof BrowserBuilderSchema, 'sourceMap' | 'vendorSourceMap' | 'optimization'>
416+
> {
417+
sourceMap: NormalizedSourceMaps;
418+
assets: AssetPatternObject[];
419+
fileReplacements: CurrentFileReplacement[];
420+
optimization: NormalizedOptimization;
421+
}

packages/angular_devkit/build_angular/src/browser/schema.json

-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
},
5757
"optimization": {
5858
"description": "Enables optimization of the build output.",
59-
"default": false,
6059
"oneOf": [
6160
{
6261
"type": "object",

0 commit comments

Comments
 (0)