diff --git a/.eslintignore b/.eslintignore index 3a012076c286..c3cc98e062af 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,6 +3,8 @@ /goldens/public-api /packages/angular_devkit/build_angular/test/ /packages/angular_devkit/build_webpack/test/ +/packages/angular_devkit/schematics_cli/blank/project-files/ +/packages/angular_devkit/schematics_cli/blank/schematic-files/ /packages/angular_devkit/schematics_cli/schematic/files/ /tests/ .yarn/ diff --git a/.prettierignore b/.prettierignore index 6853bd566bb9..d1cd003e83c5 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,6 +4,9 @@ /goldens/public-api /packages/angular_devkit/build_angular/test/ /packages/angular_devkit/core/src/workspace/json/test/ +/packages/angular_devkit/schematics_cli/blank/project-files/ +/packages/angular_devkit/schematics_cli/blank/schematic-files/ +/packages/angular_devkit/schematics_cli/schematic/files/ /README.md /CONTRIBUTING.md .yarn/ diff --git a/packages/angular_devkit/schematics_cli/blank/factory.ts b/packages/angular_devkit/schematics_cli/blank/factory.ts index 7483c71cdf9d..3911d70ee70e 100644 --- a/packages/angular_devkit/schematics_cli/blank/factory.ts +++ b/packages/angular_devkit/schematics_cli/blank/factory.ts @@ -22,10 +22,10 @@ import { Tree, UpdateRecorder, apply, - applyTemplates, chain, mergeWith, move, + template, url, } from '@angular-devkit/schematics'; import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; @@ -116,7 +116,7 @@ export default function (options: Schema): Rule { } catch {} let source = apply(url('./schematic-files'), [ - applyTemplates({ + template({ ...options, coreVersion, schematicsVersion, @@ -130,7 +130,7 @@ export default function (options: Schema): Rule { if (!collectionPath) { collectionPath = normalize('/' + options.name + '/src/collection.json'); source = apply(url('./project-files'), [ - applyTemplates({ + template({ ...(options as object), coreVersion, schematicsVersion, diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/README.md.template b/packages/angular_devkit/schematics_cli/blank/project-files/README.md similarity index 99% rename from packages/angular_devkit/schematics_cli/blank/project-files/README.md.template rename to packages/angular_devkit/schematics_cli/blank/project-files/README.md index 7854bc97d952..1784a81768c2 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/README.md.template +++ b/packages/angular_devkit/schematics_cli/blank/project-files/README.md @@ -7,6 +7,7 @@ This repository is a basic Schematic implementation that serves as a starting po To test locally, install `@angular-devkit/schematics-cli` globally and use the `schematics` command line tool. That tool acts the same as the `generate` command of the Angular CLI, but also has a debug mode. Check the documentation with + ```bash schematics --help ``` @@ -25,4 +26,3 @@ npm publish ``` That's it! - \ No newline at end of file diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/__dot__gitignore.template b/packages/angular_devkit/schematics_cli/blank/project-files/__dot__gitignore similarity index 99% rename from packages/angular_devkit/schematics_cli/blank/project-files/__dot__gitignore.template rename to packages/angular_devkit/schematics_cli/blank/project-files/__dot__gitignore index 82677b588411..d4b3bf2873e8 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/__dot__gitignore.template +++ b/packages/angular_devkit/schematics_cli/blank/project-files/__dot__gitignore @@ -1,3 +1,4 @@ + # Outputs src/**/*.js src/**/*.js.map diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/__dot__npmignore.template b/packages/angular_devkit/schematics_cli/blank/project-files/__dot__npmignore similarity index 98% rename from packages/angular_devkit/schematics_cli/blank/project-files/__dot__npmignore.template rename to packages/angular_devkit/schematics_cli/blank/project-files/__dot__npmignore index c55ccfc3f5f9..7c31f4692f1e 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/__dot__npmignore.template +++ b/packages/angular_devkit/schematics_cli/blank/project-files/__dot__npmignore @@ -1,3 +1,4 @@ + # Ignores TypeScript files, but keeps definitions. *.ts !*.d.ts diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/package.json.template b/packages/angular_devkit/schematics_cli/blank/project-files/package.json similarity index 100% rename from packages/angular_devkit/schematics_cli/blank/project-files/package.json.template rename to packages/angular_devkit/schematics_cli/blank/project-files/package.json diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/src/collection.json.template b/packages/angular_devkit/schematics_cli/blank/project-files/src/collection.json similarity index 79% rename from packages/angular_devkit/schematics_cli/blank/project-files/src/collection.json.template rename to packages/angular_devkit/schematics_cli/blank/project-files/src/collection.json index 272c195ad411..2651cd0f839d 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/src/collection.json.template +++ b/packages/angular_devkit/schematics_cli/blank/project-files/src/collection.json @@ -1,5 +1,4 @@ { "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json", - "schematics": { - } + "schematics": {} } diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json.template b/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json similarity index 73% rename from packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json.template rename to packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json index c294d9b63384..75cf15fa8e3c 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json.template +++ b/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json @@ -1,10 +1,7 @@ { "compilerOptions": { "baseUrl": "tsconfig", - "lib": [ - "es2018", - "dom" - ], + "lib": ["es2018", "dom"], "declaration": true, "module": "commonjs", "moduleResolution": "node", @@ -20,15 +17,8 @@ "sourceMap": true, "strictNullChecks": true, "target": "es6", - "types": [ - "jasmine", - "node" - ] + "types": ["jasmine", "node"] }, - "include": [ - "src/**/*" - ], - "exclude": [ - "src/*/files/**/*" - ] + "include": ["src/**/*"], + "exclude": ["src/*/files/**/*"] } diff --git a/packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index.ts.template b/packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index.ts similarity index 100% rename from packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index.ts.template rename to packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index.ts diff --git a/packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index_spec.ts.template b/packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index_spec.ts similarity index 77% rename from packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index_spec.ts.template rename to packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index_spec.ts index 8d794c1cdced..6583dd811719 100644 --- a/packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index_spec.ts.template +++ b/packages/angular_devkit/schematics_cli/blank/schematic-files/src/__name@dasherize__/index_spec.ts @@ -2,14 +2,14 @@ import { Tree } from '@angular-devkit/schematics'; import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; import * as path from 'path'; - const collectionPath = path.join(__dirname, '../collection.json'); - describe('<%= dasherize(name) %>', () => { it('works', async () => { const runner = new SchematicTestRunner('schematics', collectionPath); - const tree = await runner.runSchematicAsync('<%= dasherize(name) %>', {}, Tree.empty()).toPromise(); + const tree = await runner + .runSchematicAsync('<%= dasherize(name) %>', {}, Tree.empty()) + .toPromise(); expect(tree.files).toEqual([]); }); diff --git a/packages/schematics/angular/BUILD.bazel b/packages/schematics/angular/BUILD.bazel index e3e3eb731e21..1626e8b3c7bb 100644 --- a/packages/schematics/angular/BUILD.bazel +++ b/packages/schematics/angular/BUILD.bazel @@ -64,6 +64,7 @@ ts_library( include = [ "collection.json", "package.json", + "utility/latest-versions/package.json", "migrations/migration-collection.json", "*/schema.json", "*/files/**/*", diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts index ad922f789e0a..cd599cdb404c 100644 --- a/packages/schematics/angular/application/index.ts +++ b/packages/schematics/angular/application/index.ts @@ -50,7 +50,7 @@ function addDependenciesToPackageJson(options: ApplicationOptions) { { type: NodeDependencyType.Dev, name: 'typescript', - version: latestVersions.TypeScript, + version: latestVersions['typescript'], }, ].forEach((dependency) => addPackageJsonDependency(host, dependency)); diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts index cef08c2722ed..213f38683380 100644 --- a/packages/schematics/angular/application/index_spec.ts +++ b/packages/schematics/angular/application/index_spec.ts @@ -341,7 +341,7 @@ describe('Application Schematic', () => { .toPromise(); const pkg = JSON.parse(tree.readContent('/package.json')); expect(pkg.devDependencies['@angular/compiler-cli']).toEqual(latestVersions.Angular); - expect(pkg.devDependencies['typescript']).toEqual(latestVersions.TypeScript); + expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']); }); it(`should not override existing users dependencies`, async () => { @@ -349,7 +349,7 @@ describe('Application Schematic', () => { workspaceTree.overwrite( 'package.json', oldPackageJson.replace( - `"typescript": "${latestVersions.TypeScript}"`, + `"typescript": "${latestVersions['typescript']}"`, `"typescript": "~2.5.2"`, ), ); diff --git a/packages/schematics/angular/library/index.ts b/packages/schematics/angular/library/index.ts index 40ff8b1a4583..35f999c35590 100644 --- a/packages/schematics/angular/library/index.ts +++ b/packages/schematics/angular/library/index.ts @@ -61,17 +61,17 @@ function addDependenciesToPackageJson() { { type: NodeDependencyType.Dev, name: 'ng-packagr', - version: latestVersions.ngPackagr, + version: latestVersions['ng-packagr'], }, { type: NodeDependencyType.Default, name: 'tslib', - version: latestVersions.TsLib, + version: latestVersions['tslib'], }, { type: NodeDependencyType.Dev, name: 'typescript', - version: latestVersions.TypeScript, + version: latestVersions['typescript'], }, ].forEach((dependency) => addPackageJsonDependency(host, dependency)); @@ -162,8 +162,8 @@ export default function (options: LibraryOptions): Rule { distRoot, relativePathToWorkspaceRoot: relativePathToWorkspaceRoot(projectRoot), prefix, - angularLatestVersion: latestVersions.Angular.replace('~', '').replace('^', ''), - tsLibLatestVersion: latestVersions.TsLib.replace('~', '').replace('^', ''), + angularLatestVersion: latestVersions.Angular.replace(/\~|\^/, ''), + tsLibLatestVersion: latestVersions['tslib'].replace(/\~|\^/, ''), folderName, }), move(projectRoot), diff --git a/packages/schematics/angular/library/index_spec.ts b/packages/schematics/angular/library/index_spec.ts index 0bb815a9b410..0ae0e9a55f30 100644 --- a/packages/schematics/angular/library/index_spec.ts +++ b/packages/schematics/angular/library/index_spec.ts @@ -183,7 +183,7 @@ describe('Library Schematic', () => { .toPromise(); const packageJson = getJsonFileContent(tree, 'package.json'); - expect(packageJson.devDependencies['ng-packagr']).toEqual(latestVersions.ngPackagr); + expect(packageJson.devDependencies['ng-packagr']).toEqual(latestVersions['ng-packagr']); }); it('should use the latest known versions in package.json', async () => { @@ -192,7 +192,7 @@ describe('Library Schematic', () => { .toPromise(); const pkg = JSON.parse(tree.readContent('/package.json')); expect(pkg.devDependencies['@angular/compiler-cli']).toEqual(latestVersions.Angular); - expect(pkg.devDependencies['typescript']).toEqual(latestVersions.TypeScript); + expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']); }); it(`should not override existing users dependencies`, async () => { @@ -200,7 +200,7 @@ describe('Library Schematic', () => { workspaceTree.overwrite( 'package.json', oldPackageJson.replace( - `"typescript": "${latestVersions.TypeScript}"`, + `"typescript": "${latestVersions['typescript']}"`, `"typescript": "~2.5.2"`, ), ); diff --git a/packages/schematics/angular/migrations/update-10/update-dependencies.ts b/packages/schematics/angular/migrations/update-10/update-dependencies.ts index 40abeb752d95..f6c87c238b95 100644 --- a/packages/schematics/angular/migrations/update-10/update-dependencies.ts +++ b/packages/schematics/angular/migrations/update-10/update-dependencies.ts @@ -22,7 +22,7 @@ export default function (): Rule { 'karma-jasmine': '~4.0.0', 'karma-jasmine-html-reporter': '^1.5.0', 'protractor': '~7.0.0', - 'ng-packagr': latestVersions.ngPackagr, + 'ng-packagr': latestVersions['ng-packagr'], 'tslib': '^2.0.0', }; diff --git a/packages/schematics/angular/migrations/update-11/update-dependencies.ts b/packages/schematics/angular/migrations/update-11/update-dependencies.ts index 5ceb862e0c24..2d84b18daa20 100644 --- a/packages/schematics/angular/migrations/update-11/update-dependencies.ts +++ b/packages/schematics/angular/migrations/update-11/update-dependencies.ts @@ -9,7 +9,6 @@ import { Rule } from '@angular-devkit/schematics'; import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; import { addPackageJsonDependency, getPackageJsonDependency } from '../../utility/dependencies'; -import { latestVersions } from '../../utility/latest-versions'; export default function (): Rule { return (host, context) => { diff --git a/packages/schematics/angular/migrations/update-9/add-tslib.ts b/packages/schematics/angular/migrations/update-9/add-tslib.ts index f8f4a3f90d20..3c57cfe79eef 100644 --- a/packages/schematics/angular/migrations/update-9/add-tslib.ts +++ b/packages/schematics/angular/migrations/update-9/add-tslib.ts @@ -25,7 +25,7 @@ export function addTsLib(): Rule { addPackageJsonDependency(host, { name: 'tslib', - version: latestVersions.TsLib, + version: latestVersions['tslib'], type: NodeDependencyType.Default, overwrite: true, }); diff --git a/packages/schematics/angular/migrations/update-9/update-dependencies.ts b/packages/schematics/angular/migrations/update-9/update-dependencies.ts index 3208d8972b37..a5308a52fce6 100644 --- a/packages/schematics/angular/migrations/update-9/update-dependencies.ts +++ b/packages/schematics/angular/migrations/update-9/update-dependencies.ts @@ -12,7 +12,6 @@ import { getPackageJsonDependency, removePackageJsonDependency, } from '../../utility/dependencies'; -import { latestVersions } from '../../utility/latest-versions'; export function updateDependencies(): Rule { return (host, context) => { diff --git a/packages/schematics/angular/utility/latest-versions.ts b/packages/schematics/angular/utility/latest-versions.ts index ed6d59bee2c1..dda249efd9dd 100644 --- a/packages/schematics/angular/utility/latest-versions.ts +++ b/packages/schematics/angular/utility/latest-versions.ts @@ -6,18 +6,19 @@ * found in the LICENSE file at https://angular.io/license */ -export const latestVersions = { +export const latestVersions: Record & { + Angular: string; + DevkitBuildAngular: string; +} = { + // We could have used TypeScripts' `resolveJsonModule` to make the `latestVersion` object typesafe, + // but ts_library doesn't support JSON inputs. + ...require('./latest-versions/package.json')['dependencies'], + // These versions should be kept up to date with latest Angular peer dependencies. Angular: '~12.2.0-next.2', - RxJs: '~6.6.0', - ZoneJs: '~0.11.4', - TypeScript: '~4.3.2', - TsLib: '^2.2.0', // Since @angular-devkit/build-angular and @schematics/angular are always // published together from the same monorepo, and they are both // non-experimental, they will always have the same version. DevkitBuildAngular: '~' + require('../package.json')['version'], - - ngPackagr: '^12.1.0', }; diff --git a/packages/schematics/angular/utility/latest-versions/package.json b/packages/schematics/angular/utility/latest-versions/package.json new file mode 100644 index 000000000000..314ad86efbfd --- /dev/null +++ b/packages/schematics/angular/utility/latest-versions/package.json @@ -0,0 +1,20 @@ +{ + "description": "Package versions used by schematics in @schematics/angular.", + "comment": "This file is needed so that depedencies are synced by Renovate.", + "private": true, + "dependencies": { + "@types/jasmine": "~3.8.0", + "@types/node": "^12.11.1", + "jasmine-core": "~3.8.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.0.3", + "karma-jasmine-html-reporter": "~1.7.0", + "karma-jasmine": "~4.0.0", + "karma": "~6.3.0", + "ng-packagr": "^12.1.1", + "rxjs": "~6.6.0", + "tslib": "^2.3.0", + "typescript": "~4.3.5", + "zone.js": "~0.11.4" + } +} diff --git a/packages/schematics/angular/workspace/files/package.json.template b/packages/schematics/angular/workspace/files/package.json.template index ce5dabad8112..490d505e58b6 100644 --- a/packages/schematics/angular/workspace/files/package.json.template +++ b/packages/schematics/angular/workspace/files/package.json.template @@ -18,21 +18,21 @@ "@angular/platform-browser": "<%= latestVersions.Angular %>", "@angular/platform-browser-dynamic": "<%= latestVersions.Angular %>", "@angular/router": "<%= latestVersions.Angular %>", - "rxjs": "<%= latestVersions.RxJs %>", - "tslib": "<%= latestVersions.TsLib %>", - "zone.js": "<%= latestVersions.ZoneJs %>" + "rxjs": "<%= latestVersions['rxjs'] %>", + "tslib": "<%= latestVersions['tslib'] %>", + "zone.js": "<%= latestVersions['zone.js'] %>" }, "devDependencies": { "@angular/cli": "<%= '~' + version %>", "@angular/compiler-cli": "<%= latestVersions.Angular %>",<% if (!minimal) { %> - "@types/jasmine": "~3.8.0",<% } %> - "@types/node": "^12.11.1",<% if (!minimal) { %> - "jasmine-core": "~3.8.0", - "karma": "~6.3.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.0.3", - "karma-jasmine": "~4.0.0", - "karma-jasmine-html-reporter": "~1.7.0",<% } %> - "typescript": "<%= latestVersions.TypeScript %>" + "@types/jasmine": "<%= latestVersions['@types/jasmine'] %>",<% } %> + "@types/node": "<%= latestVersions['@types/node'] %>",<% if (!minimal) { %> + "jasmine-core": "<%= latestVersions['jasmine-core'] %>", + "karma": "<%= latestVersions['karma'] %>", + "karma-chrome-launcher": "<%= latestVersions['karma-chrome-launcher'] %>", + "karma-coverage": "<%= latestVersions['karma-coverage'] %>", + "karma-jasmine": "<%= latestVersions['karma-jasmine'] %>", + "karma-jasmine-html-reporter": "<%= latestVersions['karma-jasmine-html-reporter'] %>",<% } %> + "typescript": "<%= latestVersions['typescript'] %>" } } diff --git a/packages/schematics/angular/workspace/index_spec.ts b/packages/schematics/angular/workspace/index_spec.ts index 25f5c986caf4..202f8906b333 100644 --- a/packages/schematics/angular/workspace/index_spec.ts +++ b/packages/schematics/angular/workspace/index_spec.ts @@ -54,9 +54,9 @@ describe('Workspace Schematic', () => { const tree = await schematicRunner.runSchematicAsync('workspace', defaultOptions).toPromise(); const pkg = JSON.parse(tree.readContent('/package.json')); expect(pkg.dependencies['@angular/core']).toEqual(latestVersions.Angular); - expect(pkg.dependencies['rxjs']).toEqual(latestVersions.RxJs); - expect(pkg.dependencies['zone.js']).toEqual(latestVersions.ZoneJs); - expect(pkg.devDependencies['typescript']).toEqual(latestVersions.TypeScript); + expect(pkg.dependencies['rxjs']).toEqual(latestVersions['rxjs']); + expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']); + expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']); }); it('should create correct files when using minimal', async () => { diff --git a/renovate.json b/renovate.json index 22693c93a82d..3697d129c868 100644 --- a/renovate.json +++ b/renovate.json @@ -44,7 +44,21 @@ "enabled": false }, { - "excludePackagePatterns": ["^@angular/.*"], + "matchPaths": [ + "packages/angular_devkit/schematics_cli/blank/project-files/package.json", + "packages/angular_devkit/schematics_cli/schematic/files/package.json", + "packages/schematics/angular/utility/latest-versions/package.json" + ], + "matchPackagePatterns": ["*"], + "groupName": "schematics dependencies", + "groupSlug": "all-schematics-dependencies" + }, + { + "matchPaths": [ + "!packages/angular_devkit/schematics_cli/blank/project-files/package.json", + "!packages/angular_devkit/schematics_cli/schematic/files/package.json", + "!packages/schematics/angular/utility/latest-versions/package.json" + ], "matchPackagePatterns": ["*"], "matchUpdateTypes": ["minor", "patch"], "groupName": "all non-major dependencies", diff --git a/tsconfig.json b/tsconfig.json index 825ad3038016..47eb178dc84a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -57,7 +57,8 @@ "goldens/**/*", "**/node_modules/**/*", "**/third_party/**/*", - "packages/angular_devkit/schematics_cli/*/files/**/*", + "packages/angular_devkit/schematics_cli/blank/*-files/**/*", + "packages/angular_devkit/schematics_cli/schematic/files/**/*", "packages/angular_devkit/*/test/**/*", "packages/schematics/*/*/*files/**/*", "tests/**/*",