Skip to content

Commit

Permalink
refactor: clean up how to generate normalized build options and impro…
Browse files Browse the repository at this point in the history
…ve type safety
  • Loading branch information
alan-agius4 authored and alexeagle committed Dec 6, 2018
1 parent 4f8a5b7 commit af67b49
Show file tree
Hide file tree
Showing 21 changed files with 220 additions and 197 deletions.
Expand Up @@ -16,19 +16,18 @@ import {
CurrentFileReplacement,
ExtraEntryPoint,
} from '../../browser/schema';
import { NormalizedOptimization } from '../../utils/index';
import { NormalizedOptimization, NormalizedSourceMaps } from '../../utils/index';

export interface BuildOptions {
optimization: NormalizedOptimization;
environment?: string;
outputPath: string;
resourcesOutputPath?: string;
aot?: boolean;
sourceMap?: boolean;
scriptsSourceMap?: boolean;
stylesSourceMap?: boolean;
hiddenSourceMap?: boolean;
sourceMap: NormalizedSourceMaps;
/** @deprecated use sourceMap instead */
vendorSourceMap?: boolean;
/** @deprecated */
evalSourceMap?: boolean;
vendorChunk?: boolean;
commonChunk?: boolean;
Expand Down
Expand Up @@ -21,8 +21,14 @@ export function getBrowserConfig(wco: WebpackConfigOptions) {

let isEval = false;
const { styles: stylesOptimization, scripts: scriptsOptimization } = buildOptions.optimization;
const {
styles: stylesSouceMap,
scripts: scriptsSourceMap,
hidden: hiddenSourceMap,
} = buildOptions.sourceMap;

// See https://webpack.js.org/configuration/devtool/ for sourcemap types.
if (buildOptions.sourceMap &&
if ((stylesSouceMap || scriptsSourceMap) &&
buildOptions.evalSourceMap &&
!stylesOptimization &&
!scriptsOptimization) {
Expand Down Expand Up @@ -58,16 +64,10 @@ export function getBrowserConfig(wco: WebpackConfigOptions) {
}));
}

if (!isEval && buildOptions.sourceMap) {
const {
scriptsSourceMap = false,
stylesSourceMap = false,
hiddenSourceMap = false,
} = buildOptions;

if (!isEval && (scriptsSourceMap || stylesSouceMap)) {
extraPlugins.push(getSourceMapDevTool(
scriptsSourceMap,
stylesSourceMap,
stylesSouceMap,
hiddenSourceMap,
));
}
Expand Down
Expand Up @@ -34,6 +34,11 @@ export const buildOptimizerLoader: string = g['_DevKitIsLocal']
export function getCommonConfig(wco: WebpackConfigOptions) {
const { root, projectRoot, buildOptions } = wco;
const { styles: stylesOptimization, scripts: scriptsOptimization } = buildOptions.optimization;
const {
styles: stylesSouceMap,
scripts: scriptsSourceMap,
vendor: vendorSourceMap,
} = buildOptions.sourceMap;

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

extraPlugins.push(new ScriptsWebpackPlugin({
name: bundleName,
sourceMap: buildOptions.scriptsSourceMap,
sourceMap: scriptsSourceMap,
filename: `${path.basename(bundleName)}${hash}.js`,
scripts: script.paths,
basePath: projectRoot,
Expand Down Expand Up @@ -159,7 +164,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
}

let sourceMapUseRule;
if (buildOptions.sourceMap && buildOptions.vendorSourceMap) {
if ((scriptsSourceMap || stylesSouceMap) && vendorSourceMap) {
sourceMapUseRule = {
use: [
{
Expand All @@ -175,7 +180,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
use: [
{
loader: buildOptimizerLoader,
options: { sourceMap: buildOptions.scriptsSourceMap },
options: { sourceMap: scriptsSourceMap },
},
],
};
Expand Down Expand Up @@ -209,7 +214,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
if (stylesOptimization) {
extraMinimizers.push(
new CleanCssWebpackPlugin({
sourceMap: buildOptions.stylesSourceMap,
sourceMap: stylesSouceMap,
// component styles retain their original file name
test: (file) => /\.(?:css|scss|sass|less|styl)$/.test(file),
}),
Expand Down Expand Up @@ -248,7 +253,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {

extraMinimizers.push(
new TerserPlugin({
sourceMap: buildOptions.scriptsSourceMap,
sourceMap: scriptsSourceMap,
parallel: true,
cache: true,
terserOptions,
Expand Down
Expand Up @@ -18,16 +18,12 @@ export function getServerConfig(wco: WebpackConfigOptions) {

const extraPlugins = [];
if (wco.buildOptions.sourceMap) {
const {
scriptsSourceMap = false,
stylesSourceMap = false,
hiddenSourceMap = false,
} = wco.buildOptions;
const { scripts, styles, hidden } = wco.buildOptions.sourceMap;

extraPlugins.push(getSourceMapDevTool(
scriptsSourceMap,
stylesSourceMap,
hiddenSourceMap,
scripts,
styles,
hidden,
));
}

Expand Down
Expand Up @@ -41,7 +41,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) {
const globalStylePaths: string[] = [];
const extraPlugins = [];

const cssSourceMap = buildOptions.stylesSourceMap;
const cssSourceMap = buildOptions.sourceMap.styles;

// Determine hashing format.
const hashFormat = getOutputHashFormat(buildOptions.outputHashing as string);
Expand Down Expand Up @@ -188,7 +188,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) {
options: {
ident: 'embedded',
plugins: postcssPluginCreator,
sourceMap: cssSourceMap && !buildOptions.hiddenSourceMap ? 'inline' : false,
sourceMap: cssSourceMap && !buildOptions.sourceMap.hidden ? 'inline' : false,
},
},
...(use as webpack.Loader[]),
Expand All @@ -211,7 +211,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) {
plugins: postcssPluginCreator,
sourceMap: cssSourceMap
&& !buildOptions.extractCss
&& !buildOptions.hiddenSourceMap
&& !buildOptions.sourceMap.hidden
? 'inline' : cssSourceMap,
},
},
Expand Down
Expand Up @@ -57,14 +57,11 @@ export function getTestConfig(
}

if (wco.buildOptions.sourceMap) {
const {
scriptsSourceMap = false,
stylesSourceMap = false,
} = wco.buildOptions;
const { styles, scripts } = wco.buildOptions.sourceMap;

extraPlugins.push(getSourceMapDevTool(
scriptsSourceMap,
stylesSourceMap,
styles,
scripts,
false,
true,
));
Expand Down
Expand Up @@ -75,7 +75,7 @@ function _createAotPlugin(
locale: buildOptions.i18nLocale,
platform: buildOptions.platform === 'server' ? PLATFORM.Server : PLATFORM.Browser,
missingTranslation: buildOptions.i18nMissingTranslation,
sourceMap: buildOptions.scriptsSourceMap,
sourceMap: buildOptions.sourceMap.scripts,
additionalLazyModules,
hostReplacementPaths,
nameLazyFiles: buildOptions.namedChunks,
Expand Down Expand Up @@ -108,7 +108,7 @@ export function getAotConfig(
if (buildOptions.buildOptimizer) {
loaders.unshift({
loader: buildOptimizerLoader,
options: { sourceMap: buildOptions.scriptsSourceMap }
options: { sourceMap: buildOptions.sourceMap.scripts }
});
}

Expand Down
56 changes: 10 additions & 46 deletions packages/angular_devkit/build_angular/src/browser/index.ts
Expand Up @@ -38,78 +38,42 @@ import {
NormalizedOptimization,
NormalizedSourceMaps,
defaultProgress,
normalizeAssetPatterns,
normalizeFileReplacements,
normalizeOptimization,
normalizeSourceMaps,
normalizeBuilderSchema,
} from '../utils';
import {
AssetPatternObject,
BrowserBuilderSchema,
CurrentFileReplacement,
NormalizedBrowserBuilderSchema,
} from './schema';
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
const webpackMerge = require('webpack-merge');


// TODO: figure out a better way to normalize assets, extra entry points, file replacements,
// and whatever else needs to be normalized, while keeping type safety.
// Right now this normalization has to be done in all other builders that make use of the
// BrowserBuildSchema and BrowserBuilder.buildWebpackConfig.
// It would really help if it happens during architect.validateBuilderOptions, or similar.
export interface NormalizedBrowserBuilderSchema extends
Pick<
BrowserBuilderSchema,
Exclude<keyof BrowserBuilderSchema, 'sourceMap' | 'vendorSourceMap' | 'optimization'>
>,
NormalizedSourceMaps {
assets: AssetPatternObject[];
fileReplacements: CurrentFileReplacement[];
optimization: NormalizedOptimization;
}

export class BrowserBuilder implements Builder<BrowserBuilderSchema> {

constructor(public context: BuilderContext) { }

run(builderConfig: BuilderConfiguration<BrowserBuilderSchema>): Observable<BuildEvent> {
let options = builderConfig.options;
let options: NormalizedBrowserBuilderSchema;
const root = this.context.workspace.root;
const projectRoot = resolve(root, builderConfig.root);
const host = new virtualFs.AliasHost(this.context.host as virtualFs.Host<fs.Stats>);
const webpackBuilder = new WebpackBuilder({ ...this.context, host });

return of(null).pipe(
concatMap(() => normalizeBuilderSchema(
host,
root,
builderConfig,
)),
tap(normalizedOptions => options = normalizedOptions),
concatMap(() => options.deleteOutputPath
? this._deleteOutputDir(root, normalize(options.outputPath), this.context.host)
: of(null)),
concatMap(() => normalizeFileReplacements(options.fileReplacements, host, root)),
tap(fileReplacements => options.fileReplacements = fileReplacements),
concatMap(() => normalizeAssetPatterns(
options.assets, host, root, projectRoot, builderConfig.sourceRoot)),
// Replace the assets in options with the normalized version.
tap((assetPatternObjects => options.assets = assetPatternObjects)),
tap(() => {
const normalizedOptions = normalizeSourceMaps(options.sourceMap);
// todo: remove when removing the deprecations
normalizedOptions.vendorSourceMap
= normalizedOptions.vendorSourceMap || !!options.vendorSourceMap;

options = {
...options,
...normalizedOptions,
// tslint:disable-next-line:no-any
optimization: normalizeOptimization(options.optimization) as any,
};
}),
concatMap(() => {
let webpackConfig;
try {
webpackConfig = this.buildWebpackConfig(root, projectRoot, host,
// todo replace with unknown
// we need to find a clear way to create this options
// tslint:disable-next-line:no-any
options as any as NormalizedBrowserBuilderSchema);
webpackConfig = this.buildWebpackConfig(root, projectRoot, host, options);
} catch (e) {
return throwError(e);
}
Expand Down
16 changes: 16 additions & 0 deletions packages/angular_devkit/build_angular/src/browser/schema.d.ts
Expand Up @@ -403,3 +403,19 @@ export enum BudgetType {
AnyScript = 'anyScript',
Bundle = 'bundle',
}

// TODO: figure out a better way to normalize assets, extra entry points, file replacements,
// and whatever else needs to be normalized, while keeping type safety.
// Right now this normalization has to be done in all other builders that make use of the
// BrowserBuildSchema and BrowserBuilder.buildWebpackConfig.
// It would really help if it happens during architect.validateBuilderOptions, or similar.
export interface NormalizedBrowserBuilderSchema extends
Pick<
BrowserBuilderSchema,
Exclude<keyof BrowserBuilderSchema, 'sourceMap' | 'vendorSourceMap' | 'optimization'>
> {
sourceMap: NormalizedSourceMaps;
assets: AssetPatternObject[];
fileReplacements: CurrentFileReplacement[];
optimization: NormalizedOptimization;
}
Expand Up @@ -56,7 +56,6 @@
},
"optimization": {
"description": "Enables optimization of the build output.",
"default": false,
"oneOf": [
{
"type": "object",
Expand Down

0 comments on commit af67b49

Please sign in to comment.