Skip to content

Commit d48d94a

Browse files
author
Angular Builds
committed
0e3d8e4a6 feat(@schematics/angular): add packageManager option
1 parent ed28322 commit d48d94a

21 files changed

+273
-182
lines changed

package.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
22
"name": "@angular-devkit/build-angular",
3-
"version": "0.900.0-next.15+17.341b18d",
3+
"version": "0.900.0-next.15+22.0e3d8e4",
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#341b18d8a",
11-
"@angular-devkit/build-optimizer": "github:angular/angular-devkit-build-optimizer-builds#341b18d8a",
12-
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#341b18d8a",
13-
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#341b18d8a",
10+
"@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#0e3d8e4a6",
11+
"@angular-devkit/build-optimizer": "github:angular/angular-devkit-build-optimizer-builds#0e3d8e4a6",
12+
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#0e3d8e4a6",
13+
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#0e3d8e4a6",
1414
"@babel/core": "7.6.4",
1515
"@babel/generator": "7.6.4",
1616
"@babel/preset-env": "7.6.3",
17-
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#341b18d8a",
17+
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#0e3d8e4a6",
1818
"ajv": "6.10.2",
1919
"autoprefixer": "9.6.5",
2020
"browserslist": "4.7.2",
@@ -44,6 +44,7 @@
4444
"postcss-loader": "3.0.0",
4545
"raw-loader": "3.1.0",
4646
"regenerator-runtime": "0.13.3",
47+
"rimraf": "3.0.0",
4748
"rollup": "1.25.2",
4849
"rxjs": "6.5.3",
4950
"sass": "1.23.1",

src/browser/index.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,21 @@ import { Observable } from 'rxjs';
1414
import * as webpack from 'webpack';
1515
import { IndexHtmlTransform } from '../angular-cli-files/utilities/index-file/write-index-html';
1616
import { ExecutionTransformer } from '../transforms';
17+
import { I18nOptions } from '../utils/i18n-options';
1718
import { Schema as BrowserBuilderSchema } from './schema';
1819
export declare type BrowserBuilderOutput = json.JsonObject & BuilderOutput & {
1920
outputPath: string;
2021
};
2122
export declare function createBrowserLoggingCallback(verbose: boolean, logger: logging.LoggerApi): WebpackLoggingCallback;
22-
export declare function buildBrowserWebpackConfigFromContext(options: BrowserBuilderSchema, context: BuilderContext, host?: virtualFs.Host<fs.Stats>): Promise<{
23+
interface ConfigFromContextReturn {
2324
config: webpack.Configuration;
2425
projectRoot: string;
2526
projectSourceRoot?: string;
27+
}
28+
export declare function buildBrowserWebpackConfigFromContext(options: BrowserBuilderSchema, context: BuilderContext, host: virtualFs.Host<fs.Stats>, i18n: boolean): Promise<ConfigFromContextReturn & {
29+
i18n: I18nOptions;
2630
}>;
31+
export declare function buildBrowserWebpackConfigFromContext(options: BrowserBuilderSchema, context: BuilderContext, host?: virtualFs.Host<fs.Stats>): Promise<ConfigFromContextReturn>;
2732
export declare function buildWebpackBrowser(options: BrowserBuilderSchema, context: BuilderContext, transforms?: {
2833
webpackConfiguration?: ExecutionTransformer<webpack.Configuration>;
2934
logging?: WebpackLoggingCallback;

src/browser/index.js

Lines changed: 14 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ const build_webpack_1 = require("@angular-devkit/build-webpack");
1212
const core_1 = require("@angular-devkit/core");
1313
const node_1 = require("@angular-devkit/core/node");
1414
const fs = require("fs");
15-
const os = require("os");
1615
const path = require("path");
1716
const rxjs_1 = require("rxjs");
1817
const operators_1 = require("rxjs/operators");
@@ -24,15 +23,14 @@ const read_tsconfig_1 = require("../angular-cli-files/utilities/read-tsconfig");
2423
const service_worker_1 = require("../angular-cli-files/utilities/service-worker");
2524
const stats_1 = require("../angular-cli-files/utilities/stats");
2625
const utils_1 = require("../utils");
26+
const action_executor_1 = require("../utils/action-executor");
2727
const cache_path_1 = require("../utils/cache-path");
2828
const copy_assets_1 = require("../utils/copy-assets");
2929
const environment_options_1 = require("../utils/environment-options");
3030
const i18n_inlining_1 = require("../utils/i18n-inlining");
31-
const i18n_options_1 = require("../utils/i18n-options");
32-
const load_translations_1 = require("../utils/load-translations");
31+
const output_paths_1 = require("../utils/output-paths");
3332
const version_1 = require("../utils/version");
3433
const webpack_browser_config_1 = require("../utils/webpack-browser-config");
35-
const action_executor_1 = require("./action-executor");
3634
const cacheDownlevelPath = environment_options_1.cachingDisabled ? undefined : cache_path_1.findCachePath('angular-build-dl');
3735
function createBrowserLoggingCallback(verbose, logger) {
3836
return (stats, config) => {
@@ -53,16 +51,20 @@ function createBrowserLoggingCallback(verbose, logger) {
5351
};
5452
}
5553
exports.createBrowserLoggingCallback = createBrowserLoggingCallback;
56-
async function buildBrowserWebpackConfigFromContext(options, context, host = new node_1.NodeJsSyncHost()) {
57-
return webpack_browser_config_1.generateBrowserWebpackConfigFromContext(options, context, wco => [
54+
async function buildBrowserWebpackConfigFromContext(options, context, host = new node_1.NodeJsSyncHost(), i18n = false) {
55+
const webpackPartialGenerator = (wco) => [
5856
webpack_configs_1.getCommonConfig(wco),
5957
webpack_configs_1.getBrowserConfig(wco),
6058
webpack_configs_1.getStylesConfig(wco),
6159
webpack_configs_1.getStatsConfig(wco),
6260
getAnalyticsConfig(wco, context),
6361
getCompilerConfig(wco),
6462
wco.buildOptions.webWorkerTsConfig ? webpack_configs_1.getWorkerConfig(wco) : {},
65-
], host);
63+
];
64+
if (i18n) {
65+
return webpack_browser_config_1.generateI18nBrowserWebpackConfigFromContext(options, context, webpackPartialGenerator, host);
66+
}
67+
return webpack_browser_config_1.generateBrowserWebpackConfigFromContext(options, context, webpackPartialGenerator, host);
6668
}
6769
exports.buildBrowserWebpackConfigFromContext = buildBrowserWebpackConfigFromContext;
6870
function getAnalyticsConfig(wco, context) {
@@ -88,66 +90,14 @@ function getCompilerConfig(wco) {
8890
return {};
8991
}
9092
async function initialize(options, context, host, webpackConfigurationTransform) {
91-
if (!context.target) {
92-
throw new Error('The builder requires a target.');
93-
}
94-
const tsConfig = read_tsconfig_1.readTsconfig(options.tsConfig, context.workspaceRoot);
95-
const usingIvy = tsConfig.options.enableIvy !== false;
96-
const metadata = await context.getProjectMetadata(context.target);
97-
const projectRoot = path.join(context.workspaceRoot, metadata.root || '');
98-
const i18n = i18n_options_1.createI18nOptions(metadata, options.localize);
99-
// Until 11.0, support deprecated i18n options when not using new localize option
100-
// i18nFormat is automatically calculated
101-
if (options.localize === undefined && usingIvy) {
102-
i18n_options_1.mergeDeprecatedI18nOptions(i18n, options.i18nLocale, options.i18nFile);
103-
}
104-
else if (options.localize !== undefined && !usingIvy) {
105-
options.localize = undefined;
106-
context.logger.warn(`Option 'localize' is not supported with View Engine.`);
107-
}
108-
if (i18n.shouldInline) {
109-
// Load locales
110-
const loader = await load_translations_1.createTranslationLoader();
111-
const usedFormats = new Set();
112-
for (const [locale, desc] of Object.entries(i18n.locales)) {
113-
if (i18n.inlineLocales.has(locale)) {
114-
const result = loader(path.join(projectRoot, desc.file));
115-
usedFormats.add(result.format);
116-
if (usedFormats.size > 1 && tsConfig.options.enableI18nLegacyMessageIdFormat !== false) {
117-
// This limitation is only for legacy message id support (defaults to true as of 9.0)
118-
throw new Error('Localization currently only supports using one type of translation file format for the entire application.');
119-
}
120-
desc.format = result.format;
121-
desc.translation = result.translation;
122-
}
123-
}
124-
// Legacy message id's require the format of the translations
125-
if (usedFormats.size > 0) {
126-
options.i18nFormat = [...usedFormats][0];
127-
}
128-
}
12993
const originalOutputPath = options.outputPath;
130-
// If inlining store the output in a temporary location to facilitate post-processing
131-
if (i18n.shouldInline) {
132-
options.outputPath = fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()), 'angular-cli-'));
133-
}
134-
const { config, projectSourceRoot } = await buildBrowserWebpackConfigFromContext(options, context, host);
135-
if (i18n.shouldInline) {
136-
// Remove localize "polyfill"
137-
if (!config.resolve) {
138-
config.resolve = {};
139-
}
140-
if (!config.resolve.alias) {
141-
config.resolve.alias = {};
142-
}
143-
config.resolve.alias['@angular/localize/init'] = require.resolve('./empty.js');
144-
}
94+
const { config, projectRoot, projectSourceRoot, i18n } = await buildBrowserWebpackConfigFromContext(options, context, host, true);
14595
let transformedConfig;
14696
if (webpackConfigurationTransform) {
14797
transformedConfig = await webpackConfigurationTransform(config);
14898
}
14999
if (options.deleteOutputPath) {
150-
await utils_1.deleteOutputDir(core_1.normalize(context.workspaceRoot), core_1.normalize(originalOutputPath), host).toPromise();
100+
utils_1.deleteOutputDir(context.workspaceRoot, originalOutputPath);
151101
}
152102
return { config: transformedConfig || config, projectRoot, projectSourceRoot, i18n };
153103
}
@@ -198,14 +148,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
198148
return { success };
199149
}
200150
else if (success) {
201-
const outputPaths = i18n.shouldInline && !i18n.flatOutput
202-
? [...i18n.inlineLocales].map(l => path.join(baseOutputPath, l))
203-
: [baseOutputPath];
204-
for (const outputPath of outputPaths) {
205-
if (!fs.existsSync(outputPath)) {
206-
fs.mkdirSync(outputPath, { recursive: true });
207-
}
208-
}
151+
const outputPaths = output_paths_1.ensureOutputPaths(baseOutputPath, i18n);
209152
let noModuleFiles;
210153
let moduleFiles;
211154
let files;
@@ -214,7 +157,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
214157
moduleFiles = emittedFiles;
215158
files = moduleFiles.filter(x => x.extension === '.css' || (x.name && scriptsEntryPointName.includes(x.name)));
216159
if (i18n.shouldInline) {
217-
const success = await i18nInlineEmittedFiles(context, emittedFiles, i18n, baseOutputPath, outputPaths, scriptsEntryPointName,
160+
const success = await i18n_inlining_1.i18nInlineEmittedFiles(context, emittedFiles, i18n, baseOutputPath, outputPaths, scriptsEntryPointName,
218161
// tslint:disable-next-line: no-non-null-assertion
219162
webpackStats.outputPath, target <= typescript_1.ScriptTarget.ES5, options.i18nMissingTranslation);
220163
if (!success) {
@@ -417,14 +360,6 @@ function buildWebpackBrowser(options, context, transforms = {}) {
417360
}
418361
finally {
419362
executor.stop();
420-
if (i18n.shouldInline) {
421-
try {
422-
// Remove temporary directory used for i18n processing
423-
// tslint:disable-next-line: no-non-null-assertion
424-
await host.delete(core_1.normalize(webpackStats.outputPath)).toPromise();
425-
}
426-
catch (_b) { }
427-
}
428363
}
429364
// Copy assets
430365
if (options.assets) {
@@ -488,7 +423,7 @@ function buildWebpackBrowser(options, context, transforms = {}) {
488423
files = emittedFiles.filter(x => x.name !== 'polyfills-es5');
489424
noModuleFiles = emittedFiles.filter(x => x.name === 'polyfills-es5');
490425
if (i18n.shouldInline) {
491-
const success = await i18nInlineEmittedFiles(context, emittedFiles, i18n, baseOutputPath, outputPaths, scriptsEntryPointName,
426+
const success = await i18n_inlining_1.i18nInlineEmittedFiles(context, emittedFiles, i18n, baseOutputPath, outputPaths, scriptsEntryPointName,
492427
// tslint:disable-next-line: no-non-null-assertion
493428
webpackStats.outputPath, target <= typescript_1.ScriptTarget.ES5, options.i18nMissingTranslation);
494429
if (!success) {
@@ -542,45 +477,6 @@ function generateIndex(baseOutputPath, options, root, files, noModuleFiles, modu
542477
lang: options.i18nLocale,
543478
}).toPromise();
544479
}
545-
async function i18nInlineEmittedFiles(context, emittedFiles, i18n, baseOutputPath, outputPaths, scriptsEntryPointName, emittedPath, es5, missingTranslation) {
546-
const executor = new action_executor_1.BundleActionExecutor({ i18n });
547-
let hasErrors = false;
548-
try {
549-
const { options, originalFiles: processedFiles } = i18n_inlining_1.emittedFilesToInlineOptions(emittedFiles, scriptsEntryPointName, emittedPath, baseOutputPath, es5, missingTranslation);
550-
for await (const result of executor.inlineAll(options)) {
551-
for (const diagnostic of result.diagnostics) {
552-
if (diagnostic.type === 'error') {
553-
hasErrors = true;
554-
context.logger.error(diagnostic.message);
555-
}
556-
else {
557-
context.logger.warn(diagnostic.message);
558-
}
559-
}
560-
}
561-
// Copy any non-processed files into the output locations
562-
await copy_assets_1.copyAssets([
563-
{
564-
glob: '**/*',
565-
input: emittedPath,
566-
output: '',
567-
ignore: [...processedFiles].map(f => path.relative(emittedPath, f)),
568-
},
569-
], outputPaths, '');
570-
}
571-
catch (err) {
572-
context.logger.error('Localized bundle generation failed: ' + err.message);
573-
return false;
574-
}
575-
finally {
576-
executor.stop();
577-
}
578-
context.logger.info(`Localized bundle generation ${hasErrors ? 'failed' : 'complete'}.`);
579-
if (hasErrors) {
580-
return false;
581-
}
582-
return true;
583-
}
584480
function mapErrorToMessage(error) {
585481
if (error instanceof Error) {
586482
return error.message;

src/server/index.js

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,43 @@ Object.defineProperty(exports, "__esModule", { value: true });
99
*/
1010
const architect_1 = require("@angular-devkit/architect");
1111
const build_webpack_1 = require("@angular-devkit/build-webpack");
12-
const core_1 = require("@angular-devkit/core");
1312
const node_1 = require("@angular-devkit/core/node");
1413
const path = require("path");
1514
const rxjs_1 = require("rxjs");
1615
const operators_1 = require("rxjs/operators");
16+
const typescript_1 = require("typescript");
1717
const webpack_configs_1 = require("../angular-cli-files/models/webpack-configs");
18+
const read_tsconfig_1 = require("../angular-cli-files/utilities/read-tsconfig");
1819
const utils_1 = require("../utils");
20+
const i18n_inlining_1 = require("../utils/i18n-inlining");
21+
const output_paths_1 = require("../utils/output-paths");
1922
const version_1 = require("../utils/version");
2023
const webpack_browser_config_1 = require("../utils/webpack-browser-config");
2124
function execute(options, context, transforms = {}) {
2225
const host = new node_1.NodeJsSyncHost();
2326
const root = context.workspaceRoot;
2427
// Check Angular version.
2528
version_1.assertCompatibleAngularVersion(context.workspaceRoot, context.logger);
26-
return rxjs_1.from(buildServerWebpackConfig(options, context)).pipe(operators_1.concatMap(async (v) => transforms.webpackConfiguration ? transforms.webpackConfiguration(v) : v), operators_1.concatMap(v => {
27-
if (options.deleteOutputPath) {
28-
return utils_1.deleteOutputDir(core_1.normalize(root), core_1.normalize(options.outputPath), host).pipe(operators_1.map(() => v));
29-
}
30-
else {
31-
return rxjs_1.of(v);
32-
}
33-
}), operators_1.concatMap(webpackConfig => build_webpack_1.runWebpack(webpackConfig, context)), operators_1.map(output => {
34-
if (output.success === false) {
29+
const tsConfig = read_tsconfig_1.readTsconfig(options.tsConfig, context.workspaceRoot);
30+
const target = tsConfig.options.target || typescript_1.ScriptTarget.ES5;
31+
const baseOutputPath = path.resolve(context.workspaceRoot, options.outputPath);
32+
return rxjs_1.from(initialize(options, context, host, transforms.webpackConfiguration)).pipe(operators_1.concatMap(({ config, i18n }) => {
33+
return build_webpack_1.runWebpack(config, context).pipe(operators_1.concatMap(async (output) => {
34+
const { emittedFiles = [], webpackStats } = output;
35+
if (!output.success || !i18n.shouldInline) {
36+
return output;
37+
}
38+
if (!webpackStats) {
39+
throw new Error('Webpack stats build result is required.');
40+
}
41+
const outputPaths = output_paths_1.ensureOutputPaths(baseOutputPath, i18n);
42+
const success = await i18n_inlining_1.i18nInlineEmittedFiles(context, emittedFiles, i18n, baseOutputPath, outputPaths, [],
43+
// tslint:disable-next-line: no-non-null-assertion
44+
webpackStats.outputPath, target <= typescript_1.ScriptTarget.ES5, options.i18nMissingTranslation);
45+
return { output, success };
46+
}));
47+
}), operators_1.map(output => {
48+
if (!output.success) {
3549
return output;
3650
}
3751
return {
@@ -42,14 +56,9 @@ function execute(options, context, transforms = {}) {
4256
}
4357
exports.execute = execute;
4458
exports.default = architect_1.createBuilder(execute);
45-
function getCompilerConfig(wco) {
46-
if (wco.buildOptions.main || wco.buildOptions.polyfills) {
47-
return wco.buildOptions.aot ? webpack_configs_1.getAotConfig(wco) : webpack_configs_1.getNonAotConfig(wco);
48-
}
49-
return {};
50-
}
51-
async function buildServerWebpackConfig(options, context) {
52-
const { config } = await webpack_browser_config_1.generateBrowserWebpackConfigFromContext({
59+
async function initialize(options, context, host, webpackConfigurationTransform) {
60+
const originalOutputPath = options.outputPath;
61+
const { config, i18n } = await webpack_browser_config_1.generateI18nBrowserWebpackConfigFromContext({
5362
...options,
5463
buildOptimizer: false,
5564
aot: true,
@@ -59,7 +68,14 @@ async function buildServerWebpackConfig(options, context) {
5968
webpack_configs_1.getServerConfig(wco),
6069
webpack_configs_1.getStylesConfig(wco),
6170
webpack_configs_1.getStatsConfig(wco),
62-
getCompilerConfig(wco),
71+
webpack_configs_1.getAotConfig(wco),
6372
]);
64-
return config;
73+
let transformedConfig;
74+
if (webpackConfigurationTransform) {
75+
transformedConfig = await webpackConfigurationTransform(config);
76+
}
77+
if (options.deleteOutputPath) {
78+
utils_1.deleteOutputDir(context.workspaceRoot, originalOutputPath);
79+
}
80+
return { config: transformedConfig || config, i18n };
6581
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/// <reference types="node" />
22
import * as fs from 'fs';
3-
import { ProcessBundleOptions, ProcessBundleResult } from '../utils/process-bundle';
3+
import { ProcessBundleOptions, ProcessBundleResult } from './process-bundle';
44
export interface CacheEntry {
55
path: string;
66
size: number;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
99
*/
1010
const crypto_1 = require("crypto");
1111
const fs = require("fs");
12-
const copy_file_1 = require("../utils/copy-file");
13-
const environment_options_1 = require("../utils/environment-options");
12+
const copy_file_1 = require("./copy-file");
13+
const environment_options_1 = require("./environment-options");
1414
const cacache = require('cacache');
1515
const packageVersion = require('../../package.json').version;
1616
class BundleActionCache {

0 commit comments

Comments
 (0)