-
Notifications
You must be signed in to change notification settings - Fork 12k
/
Copy pathindex.ts
111 lines (100 loc) · 3.27 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect';
import { runWebpack } from '@angular-devkit/build-webpack';
import { json, normalize } from '@angular-devkit/core';
import { NodeJsSyncHost } from '@angular-devkit/core/node';
import * as path from 'path';
import { Observable, from, of } from 'rxjs';
import { concatMap, map } from 'rxjs/operators';
import * as webpack from 'webpack';
import { WebpackConfigOptions } from '../angular-cli-files/models/build-options';
import {
getAotConfig,
getCommonConfig,
getNonAotConfig,
getServerConfig,
getStatsConfig,
getStylesConfig,
} from '../angular-cli-files/models/webpack-configs';
import { ExecutionTransformer } from '../transforms';
import { NormalizedBrowserBuilderSchema, deleteOutputDir } from '../utils';
import { Version } from '../utils/version';
import { generateBrowserWebpackConfigFromContext } from '../utils/webpack-browser-config';
import { Schema as ServerBuilderOptions } from './schema';
// If success is true, outputPath should be set.
export type ServerBuilderOutput = json.JsonObject & BuilderOutput & {
outputPath?: string;
};
export { ServerBuilderOptions };
export function execute(
options: ServerBuilderOptions,
context: BuilderContext,
transforms: {
webpackConfiguration?: ExecutionTransformer<webpack.Configuration>;
} = {},
): Observable<ServerBuilderOutput> {
const host = new NodeJsSyncHost();
const root = context.workspaceRoot;
// Check Angular version.
Version.assertCompatibleAngularVersion(context.workspaceRoot);
return from(buildServerWebpackConfig(options, context)).pipe(
concatMap(async v => transforms.webpackConfiguration ? transforms.webpackConfiguration(v) : v),
concatMap(v => {
if (options.deleteOutputPath) {
return deleteOutputDir(normalize(root), normalize(options.outputPath), host).pipe(
map(() => v),
);
} else {
return of(v);
}
}),
concatMap(webpackConfig => runWebpack(webpackConfig, context)),
map(output => {
if (output.success === false) {
return output as ServerBuilderOutput;
}
return {
...output,
outputPath: path.resolve(root, options.outputPath),
} as ServerBuilderOutput;
}),
);
}
export default createBuilder<json.JsonObject & ServerBuilderOptions, ServerBuilderOutput>(
execute,
);
function getCompilerConfig(wco: WebpackConfigOptions) {
if (wco.buildOptions.main || wco.buildOptions.polyfills) {
return wco.buildOptions.aot ? getAotConfig(wco) : getNonAotConfig(wco);
}
return {};
}
async function buildServerWebpackConfig(
options: ServerBuilderOptions,
context: BuilderContext,
) {
const { config } = await generateBrowserWebpackConfigFromContext(
{
...options,
index: '',
buildOptimizer: false,
aot: true,
platform: 'server',
} as NormalizedBrowserBuilderSchema,
context,
wco => [
getCommonConfig(wco),
getServerConfig(wco),
getStylesConfig(wco),
getStatsConfig(wco),
getCompilerConfig(wco),
],
);
return config[0];
}