You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
288 lines
12 KiB
288 lines
12 KiB
"use strict";
|
|
/**
|
|
* @license
|
|
* Copyright Google LLC 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
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const core_1 = require("@angular-devkit/core");
|
|
const schematics_1 = require("@angular-devkit/schematics");
|
|
const tasks_1 = require("@angular-devkit/schematics/tasks");
|
|
const dependencies_1 = require("../utility/dependencies");
|
|
const latest_versions_1 = require("../utility/latest-versions");
|
|
const lint_fix_1 = require("../utility/lint-fix");
|
|
const paths_1 = require("../utility/paths");
|
|
const validation_1 = require("../utility/validation");
|
|
const workspace_1 = require("../utility/workspace");
|
|
const workspace_models_1 = require("../utility/workspace-models");
|
|
const schema_1 = require("./schema");
|
|
function addDependenciesToPackageJson(options) {
|
|
return (host, context) => {
|
|
[
|
|
{
|
|
type: dependencies_1.NodeDependencyType.Dev,
|
|
name: '@angular/compiler-cli',
|
|
version: latest_versions_1.latestVersions.Angular,
|
|
},
|
|
{
|
|
type: dependencies_1.NodeDependencyType.Dev,
|
|
name: '@angular-devkit/build-angular',
|
|
version: latest_versions_1.latestVersions.DevkitBuildAngular,
|
|
},
|
|
{
|
|
type: dependencies_1.NodeDependencyType.Dev,
|
|
name: 'typescript',
|
|
version: latest_versions_1.latestVersions['typescript'],
|
|
},
|
|
].forEach((dependency) => dependencies_1.addPackageJsonDependency(host, dependency));
|
|
if (!options.skipInstall) {
|
|
context.addTask(new tasks_1.NodePackageInstallTask());
|
|
}
|
|
return host;
|
|
};
|
|
}
|
|
function addAppToWorkspaceFile(options, appDir) {
|
|
var _a, _b;
|
|
let projectRoot = appDir;
|
|
if (projectRoot) {
|
|
projectRoot += '/';
|
|
}
|
|
const schematics = {};
|
|
if (options.inlineTemplate ||
|
|
options.inlineStyle ||
|
|
options.minimal ||
|
|
options.style !== schema_1.Style.Css) {
|
|
const componentSchematicsOptions = {};
|
|
if ((_a = options.inlineTemplate) !== null && _a !== void 0 ? _a : options.minimal) {
|
|
componentSchematicsOptions.inlineTemplate = true;
|
|
}
|
|
if ((_b = options.inlineStyle) !== null && _b !== void 0 ? _b : options.minimal) {
|
|
componentSchematicsOptions.inlineStyle = true;
|
|
}
|
|
if (options.style && options.style !== schema_1.Style.Css) {
|
|
componentSchematicsOptions.style = options.style;
|
|
}
|
|
schematics['@schematics/angular:component'] = componentSchematicsOptions;
|
|
}
|
|
if (options.skipTests || options.minimal) {
|
|
['class', 'component', 'directive', 'guard', 'interceptor', 'pipe', 'service'].forEach((type) => {
|
|
if (!(`@schematics/angular:${type}` in schematics)) {
|
|
schematics[`@schematics/angular:${type}`] = {};
|
|
}
|
|
schematics[`@schematics/angular:${type}`].skipTests = true;
|
|
});
|
|
}
|
|
if (options.strict) {
|
|
if (!('@schematics/angular:application' in schematics)) {
|
|
schematics['@schematics/angular:application'] = {};
|
|
}
|
|
schematics['@schematics/angular:application'].strict = true;
|
|
}
|
|
const sourceRoot = core_1.join(core_1.normalize(projectRoot), 'src');
|
|
let budgets = [];
|
|
if (options.strict) {
|
|
budgets = [
|
|
{
|
|
type: 'initial',
|
|
maximumWarning: '500kb',
|
|
maximumError: '1mb',
|
|
},
|
|
{
|
|
type: 'anyComponentStyle',
|
|
maximumWarning: '2kb',
|
|
maximumError: '4kb',
|
|
},
|
|
];
|
|
}
|
|
else {
|
|
budgets = [
|
|
{
|
|
type: 'initial',
|
|
maximumWarning: '2mb',
|
|
maximumError: '5mb',
|
|
},
|
|
{
|
|
type: 'anyComponentStyle',
|
|
maximumWarning: '6kb',
|
|
maximumError: '10kb',
|
|
},
|
|
];
|
|
}
|
|
const inlineStyleLanguage = (options === null || options === void 0 ? void 0 : options.style) !== schema_1.Style.Css ? options.style : undefined;
|
|
const project = {
|
|
root: core_1.normalize(projectRoot),
|
|
sourceRoot,
|
|
projectType: workspace_models_1.ProjectType.Application,
|
|
prefix: options.prefix || 'app',
|
|
schematics,
|
|
targets: {
|
|
build: {
|
|
builder: workspace_models_1.Builders.Browser,
|
|
defaultConfiguration: 'production',
|
|
options: {
|
|
outputPath: `dist/${options.name}`,
|
|
index: `${sourceRoot}/index.html`,
|
|
main: `${sourceRoot}/main.ts`,
|
|
polyfills: `${sourceRoot}/polyfills.ts`,
|
|
tsConfig: `${projectRoot}tsconfig.app.json`,
|
|
inlineStyleLanguage,
|
|
assets: [`${sourceRoot}/favicon.ico`, `${sourceRoot}/assets`],
|
|
styles: [`${sourceRoot}/styles.${options.style}`],
|
|
scripts: [],
|
|
},
|
|
configurations: {
|
|
production: {
|
|
budgets,
|
|
fileReplacements: [
|
|
{
|
|
replace: `${sourceRoot}/environments/environment.ts`,
|
|
with: `${sourceRoot}/environments/environment.prod.ts`,
|
|
},
|
|
],
|
|
outputHashing: 'all',
|
|
},
|
|
development: {
|
|
buildOptimizer: false,
|
|
optimization: false,
|
|
vendorChunk: true,
|
|
extractLicenses: false,
|
|
sourceMap: true,
|
|
namedChunks: true,
|
|
},
|
|
},
|
|
},
|
|
serve: {
|
|
builder: workspace_models_1.Builders.DevServer,
|
|
defaultConfiguration: 'development',
|
|
options: {},
|
|
configurations: {
|
|
production: {
|
|
browserTarget: `${options.name}:build:production`,
|
|
},
|
|
development: {
|
|
browserTarget: `${options.name}:build:development`,
|
|
},
|
|
},
|
|
},
|
|
'extract-i18n': {
|
|
builder: workspace_models_1.Builders.ExtractI18n,
|
|
options: {
|
|
browserTarget: `${options.name}:build`,
|
|
},
|
|
},
|
|
test: options.minimal
|
|
? undefined
|
|
: {
|
|
builder: workspace_models_1.Builders.Karma,
|
|
options: {
|
|
main: `${sourceRoot}/test.ts`,
|
|
polyfills: `${sourceRoot}/polyfills.ts`,
|
|
tsConfig: `${projectRoot}tsconfig.spec.json`,
|
|
karmaConfig: `${projectRoot}karma.conf.js`,
|
|
inlineStyleLanguage,
|
|
assets: [`${sourceRoot}/favicon.ico`, `${sourceRoot}/assets`],
|
|
styles: [`${sourceRoot}/styles.${options.style}`],
|
|
scripts: [],
|
|
},
|
|
},
|
|
},
|
|
};
|
|
return workspace_1.updateWorkspace((workspace) => {
|
|
if (workspace.projects.size === 0) {
|
|
workspace.extensions.defaultProject = options.name;
|
|
}
|
|
workspace.projects.add({
|
|
name: options.name,
|
|
...project,
|
|
});
|
|
});
|
|
}
|
|
function minimalPathFilter(path) {
|
|
const toRemoveList = /(test.ts|tsconfig.spec.json|karma.conf.js).template$/;
|
|
return !toRemoveList.test(path);
|
|
}
|
|
function default_1(options) {
|
|
return async (host) => {
|
|
var _a, _b;
|
|
if (!options.name) {
|
|
throw new schematics_1.SchematicsException(`Invalid options, "name" is required.`);
|
|
}
|
|
validation_1.validateProjectName(options.name);
|
|
const appRootSelector = `${options.prefix}-root`;
|
|
const componentOptions = !options.minimal
|
|
? {
|
|
inlineStyle: options.inlineStyle,
|
|
inlineTemplate: options.inlineTemplate,
|
|
skipTests: options.skipTests,
|
|
style: options.style,
|
|
viewEncapsulation: options.viewEncapsulation,
|
|
}
|
|
: {
|
|
inlineStyle: (_a = options.inlineStyle) !== null && _a !== void 0 ? _a : true,
|
|
inlineTemplate: (_b = options.inlineTemplate) !== null && _b !== void 0 ? _b : true,
|
|
skipTests: true,
|
|
style: options.style,
|
|
viewEncapsulation: options.viewEncapsulation,
|
|
};
|
|
const workspace = await workspace_1.getWorkspace(host);
|
|
const newProjectRoot = workspace.extensions.newProjectRoot || '';
|
|
const isRootApp = options.projectRoot !== undefined;
|
|
const appDir = isRootApp
|
|
? core_1.normalize(options.projectRoot || '')
|
|
: core_1.join(core_1.normalize(newProjectRoot), core_1.strings.dasherize(options.name));
|
|
const sourceDir = `${appDir}/src/app`;
|
|
return schematics_1.chain([
|
|
addAppToWorkspaceFile(options, appDir),
|
|
schematics_1.mergeWith(schematics_1.apply(schematics_1.url('./files'), [
|
|
options.minimal ? schematics_1.filter(minimalPathFilter) : schematics_1.noop(),
|
|
schematics_1.applyTemplates({
|
|
utils: core_1.strings,
|
|
...options,
|
|
relativePathToWorkspaceRoot: paths_1.relativePathToWorkspaceRoot(appDir),
|
|
appName: options.name,
|
|
isRootApp,
|
|
}),
|
|
schematics_1.move(appDir),
|
|
]), schematics_1.MergeStrategy.Overwrite),
|
|
schematics_1.schematic('module', {
|
|
name: 'app',
|
|
commonModule: false,
|
|
flat: true,
|
|
routing: options.routing,
|
|
routingScope: 'Root',
|
|
path: sourceDir,
|
|
project: options.name,
|
|
}),
|
|
schematics_1.schematic('component', {
|
|
name: 'app',
|
|
selector: appRootSelector,
|
|
flat: true,
|
|
path: sourceDir,
|
|
skipImport: true,
|
|
project: options.name,
|
|
...componentOptions,
|
|
}),
|
|
schematics_1.mergeWith(schematics_1.apply(schematics_1.url('./other-files'), [
|
|
options.strict ? schematics_1.noop() : schematics_1.filter((path) => path !== '/package.json.template'),
|
|
componentOptions.inlineTemplate
|
|
? schematics_1.filter((path) => !path.endsWith('.html.template'))
|
|
: schematics_1.noop(),
|
|
componentOptions.skipTests
|
|
? schematics_1.filter((path) => !path.endsWith('.spec.ts.template'))
|
|
: schematics_1.noop(),
|
|
schematics_1.applyTemplates({
|
|
utils: core_1.strings,
|
|
...options,
|
|
selector: appRootSelector,
|
|
...componentOptions,
|
|
}),
|
|
schematics_1.move(sourceDir),
|
|
]), schematics_1.MergeStrategy.Overwrite),
|
|
options.skipPackageJson ? schematics_1.noop() : addDependenciesToPackageJson(options),
|
|
options.lintFix ? lint_fix_1.applyLintFix(appDir) : schematics_1.noop(),
|
|
]);
|
|
};
|
|
}
|
|
exports.default = default_1;
|