123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- "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.dev/license
- */
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.default = default_1;
- 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 paths_1 = require("../utility/paths");
- const workspace_1 = require("../utility/workspace");
- const workspace_models_1 = require("../utility/workspace-models");
- const schema_1 = require("./schema");
- function default_1(options) {
- return async (host, context) => {
- const { appDir, appRootSelector, componentOptions, folderName, sourceDir } = await getAppOptions(host, options);
- return (0, schematics_1.chain)([
- addAppToWorkspaceFile(options, appDir, folderName),
- options.standalone
- ? (0, schematics_1.noop)()
- : (0, schematics_1.schematic)('module', {
- name: 'app',
- commonModule: false,
- flat: true,
- routing: options.routing,
- routingScope: 'Root',
- path: sourceDir,
- project: options.name,
- }),
- (0, schematics_1.schematic)('component', {
- name: 'app',
- selector: appRootSelector,
- flat: true,
- path: sourceDir,
- skipImport: true,
- project: options.name,
- ...componentOptions,
- }),
- (0, schematics_1.mergeWith)((0, schematics_1.apply)((0, schematics_1.url)(options.standalone ? './files/standalone-files' : './files/module-files'), [
- options.routing ? (0, schematics_1.noop)() : (0, schematics_1.filter)((path) => !path.endsWith('app.routes.ts.template')),
- componentOptions.skipTests
- ? (0, schematics_1.filter)((path) => !path.endsWith('.spec.ts.template'))
- : (0, schematics_1.noop)(),
- (0, schematics_1.applyTemplates)({
- utils: schematics_1.strings,
- ...options,
- ...componentOptions,
- selector: appRootSelector,
- relativePathToWorkspaceRoot: (0, paths_1.relativePathToWorkspaceRoot)(appDir),
- appName: options.name,
- folderName,
- }),
- (0, schematics_1.move)(appDir),
- ]), schematics_1.MergeStrategy.Overwrite),
- (0, schematics_1.mergeWith)((0, schematics_1.apply)((0, schematics_1.url)('./files/common-files'), [
- options.minimal
- ? (0, schematics_1.filter)((path) => !path.endsWith('tsconfig.spec.json.template'))
- : (0, schematics_1.noop)(),
- componentOptions.inlineTemplate
- ? (0, schematics_1.filter)((path) => !path.endsWith('component.html.template'))
- : (0, schematics_1.noop)(),
- (0, schematics_1.applyTemplates)({
- utils: schematics_1.strings,
- ...options,
- selector: appRootSelector,
- relativePathToWorkspaceRoot: (0, paths_1.relativePathToWorkspaceRoot)(appDir),
- appName: options.name,
- folderName,
- }),
- (0, schematics_1.move)(appDir),
- ]), schematics_1.MergeStrategy.Overwrite),
- options.ssr
- ? (0, schematics_1.schematic)('ssr', {
- project: options.name,
- serverRouting: options.serverRouting,
- skipInstall: true,
- })
- : (0, schematics_1.noop)(),
- options.skipPackageJson ? (0, schematics_1.noop)() : addDependenciesToPackageJson(options),
- ]);
- };
- }
- 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) => (0, dependencies_1.addPackageJsonDependency)(host, dependency));
- if (!options.skipInstall) {
- context.addTask(new tasks_1.NodePackageInstallTask());
- }
- return host;
- };
- }
- function addAppToWorkspaceFile(options, appDir, folderName) {
- let projectRoot = appDir;
- if (projectRoot) {
- projectRoot += '/';
- }
- const schematics = {};
- if (options.inlineTemplate ||
- options.inlineStyle ||
- options.minimal ||
- options.style !== schema_1.Style.Css) {
- const componentSchematicsOptions = {};
- if (options.inlineTemplate ?? options.minimal) {
- componentSchematicsOptions.inlineTemplate = true;
- }
- if (options.inlineStyle ?? 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) {
- const schematicsWithTests = [
- 'class',
- 'component',
- 'directive',
- 'guard',
- 'interceptor',
- 'pipe',
- 'resolver',
- 'service',
- ];
- schematicsWithTests.forEach((type) => {
- (schematics[`@schematics/angular:${type}`] ??= {}).skipTests = true;
- });
- }
- if (!options.standalone) {
- const schematicsWithStandalone = ['component', 'directive', 'pipe'];
- schematicsWithStandalone.forEach((type) => {
- (schematics[`@schematics/angular:${type}`] ??= {}).standalone = false;
- });
- }
- const sourceRoot = (0, core_1.join)((0, core_1.normalize)(projectRoot), 'src');
- let budgets = [];
- if (options.strict) {
- budgets = [
- {
- type: 'initial',
- maximumWarning: '500kB',
- maximumError: '1MB',
- },
- {
- type: 'anyComponentStyle',
- maximumWarning: '4kB',
- maximumError: '8kB',
- },
- ];
- }
- else {
- budgets = [
- {
- type: 'initial',
- maximumWarning: '2MB',
- maximumError: '5MB',
- },
- {
- type: 'anyComponentStyle',
- maximumWarning: '6kB',
- maximumError: '10kB',
- },
- ];
- }
- const inlineStyleLanguage = options?.style !== schema_1.Style.Css ? options.style : undefined;
- const project = {
- root: (0, core_1.normalize)(projectRoot),
- sourceRoot,
- projectType: workspace_models_1.ProjectType.Application,
- prefix: options.prefix || 'app',
- schematics,
- targets: {
- build: {
- builder: workspace_models_1.Builders.Application,
- defaultConfiguration: 'production',
- options: {
- outputPath: `dist/${folderName}`,
- index: `${sourceRoot}/index.html`,
- browser: `${sourceRoot}/main.ts`,
- polyfills: options.experimentalZoneless ? [] : ['zone.js'],
- tsConfig: `${projectRoot}tsconfig.app.json`,
- inlineStyleLanguage,
- assets: [{ 'glob': '**/*', 'input': `${projectRoot}public` }],
- styles: [`${sourceRoot}/styles.${options.style}`],
- scripts: [],
- },
- configurations: {
- production: {
- budgets,
- outputHashing: 'all',
- },
- development: {
- optimization: false,
- extractLicenses: false,
- sourceMap: true,
- },
- },
- },
- serve: {
- builder: workspace_models_1.Builders.DevServer,
- defaultConfiguration: 'development',
- options: {},
- configurations: {
- production: {
- buildTarget: `${options.name}:build:production`,
- },
- development: {
- buildTarget: `${options.name}:build:development`,
- },
- },
- },
- 'extract-i18n': {
- builder: workspace_models_1.Builders.ExtractI18n,
- },
- test: options.minimal
- ? undefined
- : {
- builder: workspace_models_1.Builders.Karma,
- options: {
- polyfills: options.experimentalZoneless ? [] : ['zone.js', 'zone.js/testing'],
- tsConfig: `${projectRoot}tsconfig.spec.json`,
- inlineStyleLanguage,
- assets: [{ 'glob': '**/*', 'input': `${projectRoot}public` }],
- styles: [`${sourceRoot}/styles.${options.style}`],
- scripts: [],
- },
- },
- },
- };
- return (0, workspace_1.updateWorkspace)((workspace) => {
- workspace.projects.add({
- name: options.name,
- ...project,
- });
- });
- }
- async function getAppOptions(host, options) {
- const appRootSelector = `${options.prefix}-root`;
- const componentOptions = getComponentOptions(options);
- const workspace = await (0, workspace_1.getWorkspace)(host);
- const newProjectRoot = workspace.extensions.newProjectRoot || '';
- // If scoped project (i.e. "@foo/bar"), convert dir to "foo/bar".
- let folderName = options.name.startsWith('@') ? options.name.slice(1) : options.name;
- if (/[A-Z]/.test(folderName)) {
- folderName = schematics_1.strings.dasherize(folderName);
- }
- const appDir = options.projectRoot === undefined
- ? (0, core_1.join)((0, core_1.normalize)(newProjectRoot), folderName)
- : (0, core_1.normalize)(options.projectRoot);
- const sourceDir = `${appDir}/src/app`;
- return {
- appDir,
- appRootSelector,
- componentOptions,
- folderName,
- sourceDir,
- };
- }
- function getComponentOptions(options) {
- const componentOptions = !options.minimal
- ? {
- inlineStyle: options.inlineStyle,
- inlineTemplate: options.inlineTemplate,
- skipTests: options.skipTests,
- style: options.style,
- viewEncapsulation: options.viewEncapsulation,
- }
- : {
- inlineStyle: options.inlineStyle ?? true,
- inlineTemplate: options.inlineTemplate ?? true,
- skipTests: true,
- style: options.style,
- viewEncapsulation: options.viewEncapsulation,
- };
- return componentOptions;
- }
|