-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
build.impl.ts
101 lines (93 loc) · 3.07 KB
/
build.impl.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
import { BuilderContext, createBuilder } from '@angular-devkit/architect';
import { JsonObject, workspaces } from '@angular-devkit/core';
import { runWebpack, BuildResult } from '@angular-devkit/build-webpack';
import { Observable, from } from 'rxjs';
import { resolve } from 'path';
import { map, concatMap } from 'rxjs/operators';
import { getNodeWebpackConfig } from '../../utils/node.config';
import { OUT_FILENAME } from '../../utils/config';
import { BuildBuilderOptions } from '../../utils/types';
import { normalizeBuildOptions } from '../../utils/normalize';
import { NodeJsSyncHost } from '@angular-devkit/core/node';
import { createProjectGraph } from '@nrwl/workspace/src/core/project-graph';
import {
calculateProjectDependencies,
createTmpTsConfig
} from '@nrwl/workspace/src/utils/buildable-libs-utils';
try {
require('dotenv').config();
} catch (e) {}
export interface BuildNodeBuilderOptions extends BuildBuilderOptions {
optimization?: boolean;
sourceMap?: boolean;
externalDependencies: 'all' | 'none' | string[];
buildLibsFromSource?: boolean;
}
export type NodeBuildEvent = BuildResult & {
outfile: string;
};
export default createBuilder<JsonObject & BuildNodeBuilderOptions>(run);
function run(
options: JsonObject & BuildNodeBuilderOptions,
context: BuilderContext
): Observable<NodeBuildEvent> {
if (!options.buildLibsFromSource) {
const projGraph = createProjectGraph();
const { target, dependencies } = calculateProjectDependencies(
projGraph,
context
);
options.tsConfig = createTmpTsConfig(
options.tsConfig,
context.workspaceRoot,
target.data.root,
dependencies
);
}
return from(getSourceRoot(context)).pipe(
map(sourceRoot =>
normalizeBuildOptions(options, context.workspaceRoot, sourceRoot)
),
map(options => {
let config = getNodeWebpackConfig(options);
if (options.webpackConfig) {
config = require(options.webpackConfig)(config, {
options,
configuration: context.target.configuration
});
}
return config;
}),
concatMap(config =>
runWebpack(config, context, {
logging: stats => {
context.logger.info(stats.toString(config.stats));
},
webpackFactory: require('webpack')
})
),
map((buildEvent: BuildResult) => {
buildEvent.outfile = resolve(
context.workspaceRoot,
options.outputPath,
OUT_FILENAME
);
return buildEvent as NodeBuildEvent;
})
);
}
async function getSourceRoot(context: BuilderContext) {
const workspaceHost = workspaces.createWorkspaceHost(new NodeJsSyncHost());
const { workspace } = await workspaces.readWorkspace(
context.workspaceRoot,
workspaceHost
);
if (workspace.projects.get(context.target.project).sourceRoot) {
return workspace.projects.get(context.target.project).sourceRoot;
} else {
context.reportStatus('Error');
const message = `${context.target.project} does not have a sourceRoot. Please define one.`;
context.logger.error(message);
throw new Error(message);
}
}