Skip to content

Commit 23477eb

Browse files
author
Angular Builds
committed
2b23454 refactor(@angular-devkit/build-angular): add transform support to server builder
1 parent bbb9906 commit 23477eb

14 files changed

+91
-133
lines changed

package.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
{
22
"name": "@angular-devkit/build-angular",
3-
"version": "0.800.0-beta.13+33.359d4f9",
3+
"version": "0.800.0-beta.13+39.2b23454",
44
"description": "Angular Webpack Build Facade",
55
"experimental": true,
66
"main": "src/index.js",
77
"typings": "src/index.d.ts",
88
"builders": "builders.json",
99
"dependencies": {
10-
"@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#359d4f9",
11-
"@angular-devkit/build-optimizer": "github:angular/angular-devkit-build-optimizer-builds#359d4f9",
12-
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#359d4f9",
13-
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#359d4f9",
14-
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#359d4f9",
10+
"@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#2b23454",
11+
"@angular-devkit/build-optimizer": "github:angular/angular-devkit-build-optimizer-builds#2b23454",
12+
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#2b23454",
13+
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#2b23454",
14+
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#2b23454",
1515
"ajv": "6.10.0",
1616
"autoprefixer": "9.5.1",
1717
"browserslist": "4.5.4",

src/browser/index.d.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,20 @@ import { BuilderContext, BuilderOutput } from '@angular-devkit/architect';
1010
import { WebpackLoggingCallback } from '@angular-devkit/build-webpack';
1111
import { experimental, json, logging, virtualFs } from '@angular-devkit/core';
1212
import * as fs from 'fs';
13-
import { Observable } from 'rxjs';
1413
import * as webpack from 'webpack';
14+
import { ExecutionTransformer } from '../transforms';
1515
import { Schema as BrowserBuilderSchema } from './schema';
1616
export declare type BrowserBuilderOutput = json.JsonObject & BuilderOutput & {
1717
outputPath: string;
1818
};
1919
export declare function createBrowserLoggingCallback(verbose: boolean, logger: logging.LoggerApi): WebpackLoggingCallback;
20-
export declare function buildBrowserWebpackConfigFromContext(options: BrowserBuilderSchema, context: BuilderContext, host: virtualFs.Host<fs.Stats>): Promise<{
20+
export declare function buildBrowserWebpackConfigFromContext(options: BrowserBuilderSchema, context: BuilderContext, host?: virtualFs.Host<fs.Stats>): Promise<{
2121
workspace: experimental.workspace.Workspace;
2222
config: webpack.Configuration[];
2323
}>;
24-
export declare type BrowserConfigTransformFn = (workspace: experimental.workspace.Workspace, config: webpack.Configuration) => Observable<webpack.Configuration>;
2524
export declare function buildWebpackBrowser(options: BrowserBuilderSchema, context: BuilderContext, transforms?: {
26-
config?: BrowserConfigTransformFn;
27-
output?: (output: BrowserBuilderOutput) => Observable<BuilderOutput>;
25+
webpackConfiguration?: ExecutionTransformer<webpack.Configuration>;
2826
logging?: WebpackLoggingCallback;
29-
}): Observable<BuilderOutput>;
27+
}): import("rxjs").Observable<BrowserBuilderOutput>;
3028
declare const _default: import("@angular-devkit/architect/src/internal").Builder<json.JsonObject & BrowserBuilderSchema>;
3129
export default _default;

src/browser/index.js

+17-21
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ function createBrowserLoggingCallback(verbose, logger) {
4040
};
4141
}
4242
exports.createBrowserLoggingCallback = createBrowserLoggingCallback;
43-
async function buildBrowserWebpackConfigFromContext(options, context, host) {
43+
async function buildBrowserWebpackConfigFromContext(options, context, host = new node_1.NodeJsSyncHost()) {
4444
return webpack_browser_config_1.generateBrowserWebpackConfigFromContext(options, context, wco => [
4545
webpack_configs_1.getCommonConfig(wco),
4646
webpack_configs_1.getBrowserConfig(wco),
@@ -75,30 +75,26 @@ function getCompilerConfig(wco) {
7575
}
7676
return {};
7777
}
78+
async function initialize(options, context, host, webpackConfigurationTransform) {
79+
const { config, workspace } = await buildBrowserWebpackConfigFromContext(options, context, host);
80+
let transformedConfig;
81+
if (webpackConfigurationTransform) {
82+
transformedConfig = [];
83+
for (const c of config) {
84+
transformedConfig.push(await webpackConfigurationTransform(c));
85+
}
86+
}
87+
if (options.deleteOutputPath) {
88+
await utils_1.deleteOutputDir(core_1.normalize(context.workspaceRoot), core_1.normalize(options.outputPath), host).toPromise();
89+
}
90+
return { config: transformedConfig || config, workspace };
91+
}
7892
function buildWebpackBrowser(options, context, transforms = {}) {
7993
const host = new node_1.NodeJsSyncHost();
8094
const root = core_1.normalize(context.workspaceRoot);
81-
const configFn = transforms.config;
82-
const outputFn = transforms.output;
8395
const loggingFn = transforms.logging
8496
|| createBrowserLoggingCallback(!!options.verbose, context.logger);
85-
// This makes a host observable into a cold one. This is because we want to wait until
86-
// subscription before calling buildBrowserWebpackConfigFromContext, which can throw.
87-
return rxjs_1.of(null).pipe(operators_1.switchMap(() => rxjs_1.from(buildBrowserWebpackConfigFromContext(options, context, host))), operators_1.switchMap(({ workspace, config }) => {
88-
if (configFn) {
89-
return rxjs_1.combineLatest(config.map(config => configFn(workspace, config))).pipe(operators_1.map(config => ({ workspace, config })));
90-
}
91-
else {
92-
return rxjs_1.of({ workspace, config });
93-
}
94-
}), operators_1.switchMap(({ workspace, config }) => {
95-
if (options.deleteOutputPath) {
96-
return utils_1.deleteOutputDir(root, core_1.normalize(options.outputPath), host).pipe(operators_1.map(() => ({ workspace, config })));
97-
}
98-
else {
99-
return rxjs_1.of({ workspace, config });
100-
}
101-
}), operators_1.switchMap(({ workspace, config: configs }) => {
97+
return rxjs_1.from(initialize(options, context, host, transforms.webpackConfiguration)).pipe(operators_1.switchMap(({ workspace, config: configs }) => {
10298
const projectName = context.target
10399
? context.target.project : workspace.getDefaultProjectName();
104100
if (!projectName) {
@@ -141,7 +137,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
141137
...event,
142138
// If we use differential loading, both configs have the same outputs
143139
outputPath: path.resolve(context.workspaceRoot, options.outputPath),
144-
})), operators_1.concatMap(output => outputFn ? outputFn(output) : rxjs_1.of(output)));
140+
})));
145141
}));
146142
}
147143
exports.buildWebpackBrowser = buildWebpackBrowser;

src/dev-server/index.d.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import { BuilderContext } from '@angular-devkit/architect';
99
import { DevServerBuildOutput, WebpackLoggingCallback } from '@angular-devkit/build-webpack';
1010
import { experimental, json, logging } from '@angular-devkit/core';
1111
import { Observable } from 'rxjs';
12+
import * as webpack from 'webpack';
1213
import * as WebpackDevServer from 'webpack-dev-server';
13-
import { BrowserConfigTransformFn } from '../browser';
1414
import { Schema as BrowserBuilderSchema } from '../browser/schema';
15+
import { ExecutionTransformer } from '../transforms';
1516
import { Schema } from './schema';
1617
export declare type DevServerBuilderSchema = Schema & json.JsonObject;
1718
export declare const devServerBuildOverriddenKeys: (keyof DevServerBuilderSchema)[];
@@ -27,8 +28,7 @@ export declare type ServerConfigTransformFn = (workspace: experimental.workspace
2728
* transforming webpack configuration before passing it to webpack).
2829
*/
2930
export declare function serveWebpackBrowser(options: DevServerBuilderSchema, context: BuilderContext, transforms?: {
30-
browserConfig?: BrowserConfigTransformFn;
31-
serverConfig?: ServerConfigTransformFn;
31+
webpackConfiguration?: ExecutionTransformer<webpack.Configuration>;
3232
logging?: WebpackLoggingCallback;
3333
}): Observable<DevServerBuilderOutput>;
3434
/**

src/dev-server/index.js

+3-8
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,10 @@ function serveWebpackBrowser(options, context, transforms = {}) {
6868
const webpackConfigResult = await browser_1.buildBrowserWebpackConfigFromContext(browserOptions, context, host);
6969
// No differential loading for dev-server, hence there is just one config
7070
let webpackConfig = webpackConfigResult.config[0];
71-
const workspace = webpackConfigResult.workspace;
72-
if (transforms.browserConfig) {
73-
webpackConfig = await transforms.browserConfig(workspace, webpackConfig).toPromise();
74-
}
7571
const port = await check_port_1.checkPort(options.port || 0, options.host || 'localhost', 4200);
76-
let webpackDevServerConfig = buildServerConfig(root, options, browserOptions, context.logger);
77-
if (transforms.serverConfig) {
78-
webpackDevServerConfig = await transforms.serverConfig(workspace, webpackConfig).toPromise();
72+
const webpackDevServerConfig = webpackConfig.devServer = buildServerConfig(root, options, browserOptions, context.logger);
73+
if (transforms.webpackConfiguration) {
74+
webpackConfig = await transforms.webpackConfiguration(webpackConfig);
7975
}
8076
return { browserOptions, webpackConfig, webpackDevServerConfig, port };
8177
}
@@ -136,7 +132,6 @@ function serveWebpackBrowser(options, context, transforms = {}) {
136132
**
137133
`);
138134
openAddress = serverAddress + webpackDevServerConfig.publicPath;
139-
webpackConfig.devServer = webpackDevServerConfig;
140135
return build_webpack_1.runWebpackDevServer(webpackConfig, context, { logging: loggingFn });
141136
}), operators_1.map(buildEvent => {
142137
if (first && options.open) {

src/index.d.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Use of this source code is governed by an MIT-style license that can be
66
* found in the LICENSE file at https://angular.io/license
77
*/
8+
export * from './transforms';
89
export * from './app-shell';
910
export * from './browser';
1011
export { AssetPattern, AssetPatternClass as AssetPatternObject, Budget, ExtraEntryPoint, ExtraEntryPointClass as ExtraEntryPointObject, FileReplacement, OptimizationClass as OptimizationObject, OptimizationUnion, OutputHashing, Schema as BrowserBuilderSchema, SourceMapClass as SourceMapObject, SourceMapUnion, StylePreprocessorOptions, Type, } from './browser/schema';
@@ -13,5 +14,5 @@ export * from './extract-i18n';
1314
export * from './karma';
1415
export * from './karma/schema';
1516
export * from './protractor';
16-
export * from './server';
17+
export { execute as executeServerBuilder } from './server';
1718
export * from './tslint';

src/index.js

+2-7
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@ function __export(m) {
1010
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
1111
}
1212
Object.defineProperty(exports, "__esModule", { value: true });
13-
// TODO: remove this commented AJV require.
14-
// We don't actually require AJV, but there is a bug with NPM and peer dependencies that is
15-
// whose workaround is to depend on AJV.
16-
// See https://github.com/angular/angular-cli/issues/9691#issuecomment-367322703 for details.
17-
// We need to add a require here to satisfy the dependency checker.
18-
// require('ajv');
1913
__export(require("./app-shell"));
2014
__export(require("./browser"));
2115
var schema_1 = require("./browser/schema");
@@ -25,5 +19,6 @@ __export(require("./dev-server"));
2519
__export(require("./extract-i18n"));
2620
__export(require("./karma"));
2721
__export(require("./protractor"));
28-
__export(require("./server"));
22+
var server_1 = require("./server");
23+
exports.executeServerBuilder = server_1.execute;
2924
__export(require("./tslint"));

src/karma/index.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
import { BuilderContext, BuilderOutput } from '@angular-devkit/architect';
99
import { Observable } from 'rxjs';
1010
import * as webpack from 'webpack';
11+
import { ExecutionTransformer } from '../transforms';
1112
import { Schema as KarmaBuilderOptions } from './schema';
1213
declare type KarmaConfigOptions = import('karma').ConfigOptions & {
1314
buildWebpack?: unknown;
1415
configFile?: string;
1516
};
16-
declare type WebpackConfigurationTransformer = (configuration: webpack.Configuration) => webpack.Configuration;
1717
export declare function execute(options: KarmaBuilderOptions, context: BuilderContext, transforms?: {
18-
webpackConfiguration?: WebpackConfigurationTransformer;
18+
webpackConfiguration?: ExecutionTransformer<webpack.Configuration>;
1919
karmaOptions?: (options: KarmaConfigOptions) => KarmaConfigOptions;
2020
}): Observable<BuilderOutput>;
2121
export { KarmaBuilderOptions };

src/karma/index.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const rxjs_1 = require("rxjs");
1313
const operators_1 = require("rxjs/operators");
1414
const webpack_configs_1 = require("../angular-cli-files/models/webpack-configs");
1515
const webpack_browser_config_1 = require("../utils/webpack-browser-config");
16-
async function initialize(options, context) {
16+
async function initialize(options, context, webpackConfigurationTransformer) {
1717
const { config } = await webpack_browser_config_1.generateBrowserWebpackConfigFromContext(
1818
// only two properties are missing:
1919
// * `outputPath` which is fixed for tests
@@ -27,10 +27,13 @@ async function initialize(options, context) {
2727
]);
2828
// tslint:disable-next-line:no-implicit-dependencies
2929
const karma = await Promise.resolve().then(() => require('karma'));
30-
return [karma, config[0]];
30+
return [
31+
karma,
32+
webpackConfigurationTransformer ? await webpackConfigurationTransformer(config[0]) : config[0],
33+
];
3134
}
3235
function execute(options, context, transforms = {}) {
33-
return rxjs_1.from(initialize(options, context)).pipe(operators_1.switchMap(([karma, webpackConfig]) => new rxjs_1.Observable(subscriber => {
36+
return rxjs_1.from(initialize(options, context, transforms.webpackConfiguration)).pipe(operators_1.switchMap(([karma, webpackConfig]) => new rxjs_1.Observable(subscriber => {
3437
const karmaOptions = {};
3538
if (options.watch !== undefined) {
3639
karmaOptions.singleRun = !options.watch;
@@ -52,9 +55,7 @@ function execute(options, context, transforms = {}) {
5255
karmaOptions.configFile = path_1.resolve(context.workspaceRoot, options.karmaConfig);
5356
karmaOptions.buildWebpack = {
5457
options,
55-
webpackConfig: transforms.webpackConfiguration
56-
? transforms.webpackConfiguration(webpackConfig)
57-
: webpackConfig,
58+
webpackConfig,
5859
// Pass onto Karma to emit BuildEvents.
5960
successCb: () => subscriber.next({ success: true }),
6061
failureCb: () => subscriber.next({ success: false }),

src/server/index.d.ts

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
1-
/// <reference types="node" />
21
/**
32
* @license
43
* Copyright Google Inc. All Rights Reserved.
54
*
65
* Use of this source code is governed by an MIT-style license that can be
76
* found in the LICENSE file at https://angular.io/license
87
*/
9-
import { BuilderOutput } from '@angular-devkit/architect';
10-
import { Path, json, logging, virtualFs } from '@angular-devkit/core';
11-
import { Stats } from 'fs';
12-
import { NormalizedWebpackServerBuilderSchema } from '../utils';
13-
import { Schema as BuildWebpackServerSchema } from './schema';
8+
import { BuilderContext, BuilderOutput } from '@angular-devkit/architect';
9+
import { json } from '@angular-devkit/core';
10+
import { Observable } from 'rxjs';
11+
import * as webpack from 'webpack';
12+
import { ExecutionTransformer } from '../transforms';
13+
import { Schema as BuildWebpackServerOptions } from './schema';
1414
export declare type ServerBuilderOutput = json.JsonObject & BuilderOutput & {
1515
outputPath?: string;
1616
};
17-
declare const _default: import("@angular-devkit/architect/src/internal").Builder<json.JsonObject & BuildWebpackServerSchema>;
17+
export declare function execute(options: BuildWebpackServerOptions, context: BuilderContext, transforms?: {
18+
webpackConfiguration?: ExecutionTransformer<webpack.Configuration>;
19+
}): Observable<ServerBuilderOutput>;
20+
declare const _default: import("@angular-devkit/architect/src/internal").Builder<json.JsonObject & BuildWebpackServerOptions>;
1821
export default _default;
19-
export declare function buildServerWebpackConfig(root: Path, projectRoot: Path, _host: virtualFs.Host<Stats>, options: NormalizedWebpackServerBuilderSchema, logger: logging.Logger): any;

0 commit comments

Comments
 (0)