"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;