feat(angular): support angular v20 (#31369)

Add support for Angular v20.

BREAKING CHANGE: Support for Angular v17 was dropped.

### TODO

- [x] Update Angular packages to the stable v20
- [x] Update `jest-preset-angular` when it releases support for Angular
v20
  - [x] PR: https://github.com/thymikee/jest-preset-angular/pull/3119
- [x] Release:
https://github.com/thymikee/jest-preset-angular/releases/tag/v14.6.0
- [ ] Update Angular ESLint packages to the v20 stable version once
released
  - [ ] PR: https://github.com/angular-eslint/angular-eslint/pull/2448
- [x] Update AnalogJS packages when they are released with support for
Angular v20
  - [x] PR: https://github.com/analogjs/analog/pull/1751
- [x] Release: https://github.com/analogjs/analog/releases/tag/v1.17.0
- [x] Fix for `@analogjs/vitest-angular` peer deps:
https://github.com/analogjs/analog/pull/1754
    - [x] Release:
- [x] Beta:
https://github.com/analogjs/analog/releases/tag/v1.17.1-beta.1
- [x] Stable: https://github.com/analogjs/analog/releases/tag/v1.17.1
- [ ] Update Storybook packages
- [x] PRs: https://github.com/storybookjs/storybook/pull/31602 and
https://github.com/storybookjs/storybook/pull/31611
- [x] Storybook 9 Release:
https://github.com/storybookjs/storybook/releases/tag/v9.0.3
  - [ ] Storybook 8 Release??: PENDING
- [ ] Remaining issue:
https://github.com/storybookjs/storybook/issues/31652
This commit is contained in:
Leosvel Pérez Espinosa 2025-06-06 16:55:26 +02:00 committed by GitHub
parent 66c4dae6b6
commit 601fecdf0c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
38 changed files with 1123 additions and 784 deletions

View File

@ -399,14 +399,14 @@
} }
}, },
"migrations": { "migrations": {
"/technologies/angular/api/migrations/update-angular-cli-version-20-0-0-rc-3": { "/technologies/angular/api/migrations/update-angular-cli-version-20-0-0": {
"description": "Update the @angular/cli package version to 20.0.0-rc.3.", "description": "Update the @angular/cli package version to ~20.0.0.",
"file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json", "file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0.json",
"hidden": false, "hidden": false,
"name": "update-angular-cli-version-20-0-0-rc-3", "name": "update-angular-cli-version-20-0-0",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/update-angular-cli-version-20-0-0-rc-3", "path": "/technologies/angular/api/migrations/update-angular-cli-version-20-0-0",
"type": "migration" "type": "migration"
}, },
"/technologies/angular/api/migrations/migrate-provide-server-rendering-import": { "/technologies/angular/api/migrations/migrate-provide-server-rendering-import": {
@ -414,17 +414,17 @@
"file": "generated/packages/angular/migrations/migrate-provide-server-rendering-import.json", "file": "generated/packages/angular/migrations/migrate-provide-server-rendering-import.json",
"hidden": false, "hidden": false,
"name": "migrate-provide-server-rendering-import", "name": "migrate-provide-server-rendering-import",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/migrate-provide-server-rendering-import", "path": "/technologies/angular/api/migrations/migrate-provide-server-rendering-import",
"type": "migration" "type": "migration"
}, },
"/technologies/angular/api/migrations/replace-provide-server-routing": { "/technologies/angular/api/migrations/replace-provide-server-routing": {
"description": "Replace `provideServerRouting` with `provideServerRendering` using `withRoutes`.", "description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.",
"file": "generated/packages/angular/migrations/replace-provide-server-routing.json", "file": "generated/packages/angular/migrations/replace-provide-server-routing.json",
"hidden": false, "hidden": false,
"name": "replace-provide-server-routing", "name": "replace-provide-server-routing",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/replace-provide-server-routing", "path": "/technologies/angular/api/migrations/replace-provide-server-routing",
"type": "migration" "type": "migration"
@ -434,7 +434,7 @@
"file": "generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json", "file": "generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json",
"hidden": false, "hidden": false,
"name": "set-generator-defaults-for-previous-style-guide", "name": "set-generator-defaults-for-previous-style-guide",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/set-generator-defaults-for-previous-style-guide", "path": "/technologies/angular/api/migrations/set-generator-defaults-for-previous-style-guide",
"type": "migration" "type": "migration"
@ -444,7 +444,7 @@
"file": "generated/packages/angular/migrations/update-module-resolution.json", "file": "generated/packages/angular/migrations/update-module-resolution.json",
"hidden": false, "hidden": false,
"name": "update-module-resolution", "name": "update-module-resolution",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/update-module-resolution", "path": "/technologies/angular/api/migrations/update-module-resolution",
"type": "migration" "type": "migration"
@ -454,11 +454,51 @@
"file": "generated/packages/angular/migrations/21.2.0-package-updates.json", "file": "generated/packages/angular/migrations/21.2.0-package-updates.json",
"hidden": false, "hidden": false,
"name": "21.2.0-package-updates", "name": "21.2.0-package-updates",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/21.2.0-package-updates", "path": "/technologies/angular/api/migrations/21.2.0-package-updates",
"type": "migration" "type": "migration"
}, },
"/technologies/angular/api/migrations/21.2.0-angular-eslint-package-updates": {
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-angular-eslint-package-updates.json",
"hidden": false,
"name": "21.2.0-angular-eslint-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/21.2.0-angular-eslint-package-updates",
"type": "migration"
},
"/technologies/angular/api/migrations/21.2.0-@angular-eslint-package-updates": {
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-@angular-eslint-package-updates.json",
"hidden": false,
"name": "21.2.0-@angular-eslint-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/21.2.0-@angular-eslint-package-updates",
"type": "migration"
},
"/technologies/angular/api/migrations/21.2.0-angular-rspack-package-updates": {
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-angular-rspack-package-updates.json",
"hidden": false,
"name": "21.2.0-angular-rspack-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/21.2.0-angular-rspack-package-updates",
"type": "migration"
},
"/technologies/angular/api/migrations/21.2.0-jest-package-updates": {
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-jest-package-updates.json",
"hidden": false,
"name": "21.2.0-jest-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/21.2.0-jest-package-updates",
"type": "migration"
},
"/technologies/angular/api/migrations/21.1.0-package-updates": { "/technologies/angular/api/migrations/21.1.0-package-updates": {
"description": "", "description": "",
"file": "generated/packages/angular/migrations/21.1.0-package-updates.json", "file": "generated/packages/angular/migrations/21.1.0-package-updates.json",
@ -4881,6 +4921,16 @@
} }
}, },
"migrations": { "migrations": {
"/technologies/build-tools/vite/api/migrations/21.2.0-package-updates": {
"description": "",
"file": "generated/packages/vite/migrations/21.2.0-package-updates.json",
"hidden": false,
"name": "21.2.0-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/vite",
"path": "/technologies/build-tools/vite/api/migrations/21.2.0-package-updates",
"type": "migration"
},
"/technologies/build-tools/vite/api/migrations/21.1.2-package-updates": { "/technologies/build-tools/vite/api/migrations/21.1.2-package-updates": {
"description": "", "description": "",
"file": "generated/packages/vite/migrations/21.1.2-package-updates.json", "file": "generated/packages/vite/migrations/21.1.2-package-updates.json",

View File

@ -440,13 +440,13 @@
], ],
"migrations": [ "migrations": [
{ {
"description": "Update the @angular/cli package version to 20.0.0-rc.3.", "description": "Update the @angular/cli package version to ~20.0.0.",
"file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json", "file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0.json",
"hidden": false, "hidden": false,
"name": "update-angular-cli-version-20-0-0-rc-3", "name": "update-angular-cli-version-20-0-0",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "angular/migrations/update-angular-cli-version-20-0-0-rc-3", "path": "angular/migrations/update-angular-cli-version-20-0-0",
"type": "migration" "type": "migration"
}, },
{ {
@ -454,17 +454,17 @@
"file": "generated/packages/angular/migrations/migrate-provide-server-rendering-import.json", "file": "generated/packages/angular/migrations/migrate-provide-server-rendering-import.json",
"hidden": false, "hidden": false,
"name": "migrate-provide-server-rendering-import", "name": "migrate-provide-server-rendering-import",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "angular/migrations/migrate-provide-server-rendering-import", "path": "angular/migrations/migrate-provide-server-rendering-import",
"type": "migration" "type": "migration"
}, },
{ {
"description": "Replace `provideServerRouting` with `provideServerRendering` using `withRoutes`.", "description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.",
"file": "generated/packages/angular/migrations/replace-provide-server-routing.json", "file": "generated/packages/angular/migrations/replace-provide-server-routing.json",
"hidden": false, "hidden": false,
"name": "replace-provide-server-routing", "name": "replace-provide-server-routing",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "angular/migrations/replace-provide-server-routing", "path": "angular/migrations/replace-provide-server-routing",
"type": "migration" "type": "migration"
@ -474,7 +474,7 @@
"file": "generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json", "file": "generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json",
"hidden": false, "hidden": false,
"name": "set-generator-defaults-for-previous-style-guide", "name": "set-generator-defaults-for-previous-style-guide",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "angular/migrations/set-generator-defaults-for-previous-style-guide", "path": "angular/migrations/set-generator-defaults-for-previous-style-guide",
"type": "migration" "type": "migration"
@ -484,7 +484,7 @@
"file": "generated/packages/angular/migrations/update-module-resolution.json", "file": "generated/packages/angular/migrations/update-module-resolution.json",
"hidden": false, "hidden": false,
"name": "update-module-resolution", "name": "update-module-resolution",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "angular/migrations/update-module-resolution", "path": "angular/migrations/update-module-resolution",
"type": "migration" "type": "migration"
@ -494,11 +494,51 @@
"file": "generated/packages/angular/migrations/21.2.0-package-updates.json", "file": "generated/packages/angular/migrations/21.2.0-package-updates.json",
"hidden": false, "hidden": false,
"name": "21.2.0-package-updates", "name": "21.2.0-package-updates",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular", "originalFilePath": "/packages/angular",
"path": "angular/migrations/21.2.0-package-updates", "path": "angular/migrations/21.2.0-package-updates",
"type": "migration" "type": "migration"
}, },
{
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-angular-eslint-package-updates.json",
"hidden": false,
"name": "21.2.0-angular-eslint-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/21.2.0-angular-eslint-package-updates",
"type": "migration"
},
{
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-@angular-eslint-package-updates.json",
"hidden": false,
"name": "21.2.0-@angular-eslint-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/21.2.0-@angular-eslint-package-updates",
"type": "migration"
},
{
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-angular-rspack-package-updates.json",
"hidden": false,
"name": "21.2.0-angular-rspack-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/21.2.0-angular-rspack-package-updates",
"type": "migration"
},
{
"description": "",
"file": "generated/packages/angular/migrations/21.2.0-jest-package-updates.json",
"hidden": false,
"name": "21.2.0-jest-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/21.2.0-jest-package-updates",
"type": "migration"
},
{ {
"description": "", "description": "",
"file": "generated/packages/angular/migrations/21.1.0-package-updates.json", "file": "generated/packages/angular/migrations/21.1.0-package-updates.json",
@ -5249,6 +5289,16 @@
} }
], ],
"migrations": [ "migrations": [
{
"description": "",
"file": "generated/packages/vite/migrations/21.2.0-package-updates.json",
"hidden": false,
"name": "21.2.0-package-updates",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/vite",
"path": "vite/migrations/21.2.0-package-updates",
"type": "migration"
},
{ {
"description": "", "description": "",
"file": "generated/packages/vite/migrations/21.1.2-package-updates.json", "file": "generated/packages/vite/migrations/21.1.2-package-updates.json",

View File

@ -0,0 +1,49 @@
{
"name": "21.2.0-@angular-eslint-package-updates",
"version": "21.2.0-beta.3",
"requires": {
"@angular/core": ">= 20.0.0 < 21.0.0",
"eslint": "^8.57.0 || ^9.0.0"
},
"packages": {
"@angular-eslint/eslint-plugin": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/eslint-plugin-template": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/template-parser": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/utils": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/schematics": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/test-utils": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/builder": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/bundled-angular-compiler": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
}
},
"aliases": [],
"description": "",
"hidden": false,
"implementation": "",
"path": "/packages/angular",
"schema": null,
"type": "migration"
}

View File

@ -0,0 +1,22 @@
{
"name": "21.2.0-angular-eslint-package-updates",
"version": "21.2.0-beta.3",
"requires": {
"@angular/core": ">= 20.0.0 < 21.0.0",
"typescript-eslint": "^8.0.0",
"eslint": "^8.57.0 || ^9.0.0"
},
"packages": {
"angular-eslint": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
}
},
"aliases": [],
"description": "",
"hidden": false,
"implementation": "",
"path": "/packages/angular",
"schema": null,
"type": "migration"
}

View File

@ -0,0 +1,17 @@
{
"name": "21.2.0-angular-rspack-package-updates",
"version": "21.2.0-beta.3",
"packages": {
"@nx/angular-rspack": {
"version": "^21.1.0",
"alwaysAddToPackageJson": false
}
},
"aliases": [],
"description": "",
"hidden": false,
"implementation": "",
"path": "/packages/angular",
"schema": null,
"type": "migration"
}

View File

@ -0,0 +1,23 @@
{
"name": "21.2.0-jest-package-updates",
"version": "21.2.0-beta.3",
"requires": {
"@angular/compiler-cli": ">=15.0.0 <21.0.0",
"@angular/core": ">=15.0.0 <21.0.0",
"@angular/platform-browser-dynamic": ">=15.0.0 <21.0.0",
"jest": "^29.0.0"
},
"packages": {
"jest-preset-angular": {
"version": "~14.6.0",
"alwaysAddToPackageJson": false
}
},
"aliases": [],
"description": "",
"hidden": false,
"implementation": "",
"path": "/packages/angular",
"schema": null,
"type": "migration"
}

View File

@ -1,62 +1,47 @@
{ {
"name": "21.2.0-package-updates", "name": "21.2.0-package-updates",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"x-prompt": "Do you want to update the Angular version to v20?", "x-prompt": "Do you want to update the Angular version to v20?",
"requires": { "@angular/core": ">=19.2.0 <20.0.0-rc.2" }, "requires": { "@angular/core": ">=19.2.0 <20.0.0" },
"packages": { "packages": {
"@angular-devkit/build-angular": { "@angular-devkit/build-angular": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/core": { "@angular-devkit/core": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/schematics": { "@angular-devkit/schematics": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/build": {
"version": "20.0.0-rc.3",
"alwaysAddToPackageJson": false
},
"@angular/pwa": {
"version": "20.0.0-rc.3",
"alwaysAddToPackageJson": false
},
"@angular/ssr": {
"version": "20.0.0-rc.3",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/build": { "version": "~20.0.0", "alwaysAddToPackageJson": false },
"@angular/pwa": { "version": "~20.0.0", "alwaysAddToPackageJson": false },
"@angular/ssr": { "version": "~20.0.0", "alwaysAddToPackageJson": false },
"@schematics/angular": { "@schematics/angular": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/architect": { "@angular-devkit/architect": {
"version": "0.2000.0-rc.3", "version": "~0.2000.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/build-webpack": { "@angular-devkit/build-webpack": {
"version": "0.2000.0-rc.3", "version": "~0.2000.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/core": { "@angular/core": { "version": "~20.0.0", "alwaysAddToPackageJson": true },
"version": "20.0.0-rc.2",
"alwaysAddToPackageJson": true
},
"@angular/material": { "@angular/material": {
"version": "20.0.0-rc.2", "version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/cdk": {
"version": "20.0.0-rc.2",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/cdk": { "version": "~20.0.0", "alwaysAddToPackageJson": false },
"@angular/google-maps": { "@angular/google-maps": {
"version": "20.0.0-rc.2", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"ng-packagr": { "version": "20.0.0-rc.1", "alwaysAddToPackageJson": false } "ng-packagr": { "version": "~20.0.0", "alwaysAddToPackageJson": false }
}, },
"aliases": [], "aliases": [],
"description": "", "description": "",

View File

@ -1,7 +1,7 @@
{ {
"name": "migrate-provide-server-rendering-import", "name": "migrate-provide-server-rendering-import",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0-rc.2" }, "requires": { "@angular/core": ">=20.0.0" },
"description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.", "description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.",
"factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import", "factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import",
"implementation": "/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.ts", "implementation": "/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.ts",

View File

@ -1,8 +1,8 @@
{ {
"name": "replace-provide-server-routing", "name": "replace-provide-server-routing",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0-rc.2" }, "requires": { "@angular/core": ">=20.0.0" },
"description": "Replace `provideServerRouting` with `provideServerRendering` using `withRoutes`.", "description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.",
"factory": "./src/migrations/update-21-2-0/replace-provide-server-routing", "factory": "./src/migrations/update-21-2-0/replace-provide-server-routing",
"implementation": "/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.ts", "implementation": "/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.ts",
"aliases": [], "aliases": [],
@ -10,5 +10,5 @@
"path": "/packages/angular", "path": "/packages/angular",
"schema": null, "schema": null,
"type": "migration", "type": "migration",
"examplesFile": "#### Replace `provideServerRouting` with `provideServerRendering`\n\nReplace `provideServerRouting` calls with `provideServerRendering` using `withRoutes`.\n\n#### Examples\n\nRemove `provideServerRouting` from your providers array and update the `provideServerRendering` call to use `withRoutes`:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,6] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering, provideServerRouting } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [provideServerRendering(), provideServerRouting(serverRoutes)],\n};\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,6] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering, withRoutes } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [provideServerRendering(withRoutes(serverRoutes))],\n};\n```\n\n{% /tab %}\n{% /tabs %}\n\nIf you have `provideServerRouting` with additional arguments, the migration will preserve them:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[4,11,12] %}\nimport { ApplicationConfig } from '@angular/core';\nimport {\n provideServerRendering,\n provideServerRouting,\n withAppShell,\n} from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [\n provideServerRendering(),\n provideServerRouting(serverRoutes, withAppShell(AppShellComponent)),\n ],\n};\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,\"7-10\"] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering, withAppShell, withRoutes } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [\n provideServerRendering(\n withRoutes(serverRoutes),\n withAppShell(AppShellComponent)\n ),\n ],\n};\n```\n\n{% /tab %}\n{% /tabs %}\n" "examplesFile": "#### Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering`\n\nReplace `provideServerRouting` and `provideServerRoutesConfig` calls with `provideServerRendering` using `withRoutes`.\n\n#### Examples\n\nRemove `provideServerRouting` from your providers array and update the `provideServerRendering` call to use `withRoutes`:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,6] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering, provideServerRouting } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [provideServerRendering(), provideServerRouting(serverRoutes)],\n};\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,6] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering, withRoutes } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [provideServerRendering(withRoutes(serverRoutes))],\n};\n```\n\n{% /tab %}\n{% /tabs %}\n\nIf you have `provideServerRouting` with additional arguments, the migration will preserve them:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[4,11,12] %}\nimport { ApplicationConfig } from '@angular/core';\nimport {\n provideServerRendering,\n provideServerRouting,\n withAppShell,\n} from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [\n provideServerRendering(),\n provideServerRouting(serverRoutes, withAppShell(AppShellComponent)),\n ],\n};\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,\"7-10\"] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering, withAppShell, withRoutes } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [\n provideServerRendering(\n withRoutes(serverRoutes),\n withAppShell(AppShellComponent)\n ),\n ],\n};\n```\n\n{% /tab %}\n{% /tabs %}\n\nRemove `provideServerRoutesConfig` from your providers array and update the `provideServerRendering` call to use `withRoutes`:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[4,11,12] %}\nimport { ApplicationConfig } from '@angular/core';\nimport {\n provideServerRendering,\n provideServerRoutesConfig,\n withAppShell,\n} from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [\n provideServerRendering(),\n provideServerRoutesConfig(serverRoutes, withAppShell(AppShellComponent)),\n ],\n};\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,\"7-10\"] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering, withAppShell, withRoutes } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [\n provideServerRendering(\n withRoutes(serverRoutes),\n withAppShell(AppShellComponent)\n ),\n ],\n};\n```\n\n{% /tab %}\n{% /tabs %}\n"
} }

View File

@ -1,7 +1,7 @@
{ {
"name": "set-generator-defaults-for-previous-style-guide", "name": "set-generator-defaults-for-previous-style-guide",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0-rc.2" }, "requires": { "@angular/core": ">=20.0.0" },
"description": "Update the generator defaults to maintain the previous style guide behavior.", "description": "Update the generator defaults to maintain the previous style guide behavior.",
"factory": "./src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide", "factory": "./src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide",
"implementation": "/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.ts", "implementation": "/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.ts",

View File

@ -1,9 +1,9 @@
{ {
"name": "update-angular-cli-version-20-0-0-rc-3", "name": "update-angular-cli-version-20-0-0",
"cli": "nx", "cli": "nx",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0-rc.2" }, "requires": { "@angular/core": ">=20.0.0" },
"description": "Update the @angular/cli package version to 20.0.0-rc.3.", "description": "Update the @angular/cli package version to ~20.0.0.",
"factory": "./src/migrations/update-21-2-0/update-angular-cli", "factory": "./src/migrations/update-21-2-0/update-angular-cli",
"implementation": "/packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts", "implementation": "/packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts",
"aliases": [], "aliases": [],

View File

@ -1,7 +1,7 @@
{ {
"name": "update-module-resolution", "name": "update-module-resolution",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0-rc.2" }, "requires": { "@angular/core": ">=20.0.0" },
"description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.", "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.",
"factory": "./src/migrations/update-21-2-0/update-module-resolution", "factory": "./src/migrations/update-21-2-0/update-module-resolution",
"implementation": "/packages/angular/src/migrations/update-21-2-0/update-module-resolution.ts", "implementation": "/packages/angular/src/migrations/update-21-2-0/update-module-resolution.ts",

View File

@ -0,0 +1,21 @@
{
"name": "21.2.0-package-updates",
"version": "21.2.0-beta.3",
"packages": {
"@analogjs/vite-plugin-angular": {
"version": "~1.17.1",
"alwaysAddToPackageJson": false
},
"@analogjs/vitest-angular": {
"version": "~1.17.1",
"alwaysAddToPackageJson": false
}
},
"aliases": [],
"description": "",
"hidden": false,
"implementation": "",
"path": "/packages/vite",
"schema": null,
"type": "migration"
}

View File

@ -318,8 +318,8 @@
"options": { "options": {
"versionRange": ">= 19.8", "versionRange": ">= 19.8",
"groups": [ "groups": [
["angular-eslint"],
[ [
"angular-eslint",
"@angular-eslint/eslint-plugin", "@angular-eslint/eslint-plugin",
"@angular-eslint/eslint-plugin-template", "@angular-eslint/eslint-plugin-template",
"@angular-eslint/template-parser", "@angular-eslint/template-parser",

View File

@ -28,21 +28,21 @@
}, },
"devDependencies": { "devDependencies": {
"@actions/core": "^1.10.0", "@actions/core": "^1.10.0",
"@angular-devkit/architect": "0.2000.0-rc.3", "@angular-devkit/architect": "~0.2000.0",
"@angular-devkit/build-angular": "20.0.0-rc.3", "@angular-devkit/build-angular": "~20.0.0",
"@angular-devkit/core": "20.0.0-rc.3", "@angular-devkit/core": "~20.0.0",
"@angular-devkit/schematics": "20.0.0-rc.3", "@angular-devkit/schematics": "~20.0.0",
"@angular-eslint/eslint-plugin": "19.2.0", "@angular-eslint/eslint-plugin": "20.0.0-beta.1",
"@angular-eslint/eslint-plugin-template": "19.2.0", "@angular-eslint/eslint-plugin-template": "20.0.0-beta.1",
"@angular-eslint/template-parser": "19.2.0", "@angular-eslint/template-parser": "20.0.0-beta.1",
"@angular/build": "20.0.0-rc.3", "@angular/build": "~20.0.0",
"@angular/cli": "20.0.0-rc.3", "@angular/cli": "~20.0.0",
"@angular/common": "20.0.0-rc.2", "@angular/common": "~20.0.0",
"@angular/compiler": "20.0.0-rc.2", "@angular/compiler": "~20.0.0",
"@angular/compiler-cli": "20.0.0-rc.2", "@angular/compiler-cli": "~20.0.0",
"@angular/core": "20.0.0-rc.2", "@angular/core": "~20.0.0",
"@angular/platform-browser": "20.0.0-rc.2", "@angular/platform-browser": "~20.0.0",
"@angular/router": "20.0.0-rc.2", "@angular/router": "~20.0.0",
"@astrojs/check": "^0.7.0", "@astrojs/check": "^0.7.0",
"@astrojs/react": "^3.6.2", "@astrojs/react": "^3.6.2",
"@babel/core": "^7.23.2", "@babel/core": "^7.23.2",
@ -116,7 +116,7 @@
"@rspack/dev-server": "1.1.1", "@rspack/dev-server": "1.1.1",
"@rspack/plugin-minify": "^0.7.5", "@rspack/plugin-minify": "^0.7.5",
"@rspack/plugin-react-refresh": "^1.0.0", "@rspack/plugin-react-refresh": "^1.0.0",
"@schematics/angular": "20.0.0-rc.3", "@schematics/angular": "~20.0.0",
"@storybook/addon-essentials": "8.4.6", "@storybook/addon-essentials": "8.4.6",
"@storybook/addon-interactions": "8.4.6", "@storybook/addon-interactions": "8.4.6",
"@storybook/core-server": "8.4.6", "@storybook/core-server": "8.4.6",
@ -174,7 +174,7 @@
"@zkochan/js-yaml": "0.0.7", "@zkochan/js-yaml": "0.0.7",
"ai": "^2.2.10", "ai": "^2.2.10",
"ajv": "^8.12.0", "ajv": "^8.12.0",
"angular-eslint": "19.2.0", "angular-eslint": "20.0.0-beta.1",
"astro": "4.15.0", "astro": "4.15.0",
"autoprefixer": "10.4.13", "autoprefixer": "10.4.13",
"babel-jest": "29.7.0", "babel-jest": "29.7.0",
@ -216,7 +216,6 @@
"fast-xml-parser": "^4.2.7", "fast-xml-parser": "^4.2.7",
"figures": "3.2.0", "figures": "3.2.0",
"file-type": "^16.2.0", "file-type": "^16.2.0",
"find-cache-dir": "^3.3.2",
"flat": "^5.0.2", "flat": "^5.0.2",
"fork-ts-checker-webpack-plugin": "7.2.13", "fork-ts-checker-webpack-plugin": "7.2.13",
"fs-extra": "^11.1.0", "fs-extra": "^11.1.0",
@ -266,7 +265,7 @@
"mini-css-extract-plugin": "~2.4.7", "mini-css-extract-plugin": "~2.4.7",
"minimatch": "9.0.3", "minimatch": "9.0.3",
"next-sitemap": "^3.1.10", "next-sitemap": "^3.1.10",
"ng-packagr": "20.0.0-rc.1", "ng-packagr": "~20.0.0",
"npm-package-arg": "11.0.1", "npm-package-arg": "11.0.1",
"nuxt": "^3.10.0", "nuxt": "^3.10.0",
"nx": "21.2.0-beta.1", "nx": "21.2.0-beta.1",

View File

@ -51,52 +51,21 @@
{ {
"buildTargets": ["build-base"], "buildTargets": ["build-base"],
"ignoredDependencies": [ "ignoredDependencies": [
"nx", "@angular-devkit/architect",
"eslint", "@angular-devkit/schematics",
"vite",
"rxjs",
"semver",
"@nx/cypress", "@nx/cypress",
"@nx/playwright",
"@nx/jest", "@nx/jest",
"@nx/rollup", "@nx/playwright",
"@nx/storybook", "@nx/storybook",
"@nx/vite", "@nx/vite",
"@nx/webpack",
"prettier",
"typescript",
"@schematics/angular", "@schematics/angular",
"@angular-devkit/core",
"@angular-devkit/architect",
"@angular-devkit/build-angular",
"@angular-devkit/schematics",
"@angular/compiler",
"@angular/compiler-cli",
"@angular/core",
"@angular/router",
"@ngrx/effects",
"@ngrx/router-store",
"@ngrx/store",
"@storybook/angular",
"@module-federation/node",
"@nguniversal/builders",
"injection-js",
"browserslist", "browserslist",
"cacache",
"less",
"node-sass",
"node-sass-tilde-importer",
"ora",
"convert-source-map",
"postcss",
"autoprefixer",
"postcss-url",
"sass",
"stylus",
"tailwindcss",
"cypress", "cypress",
"esbuild", "eslint",
"piscina" "injection-js",
"nx",
"piscina",
"typescript"
] ]
} }
] ]

View File

@ -303,43 +303,43 @@
"description": "Change the data persistence operator imports to '@ngrx/router-store/data-persistence'.", "description": "Change the data persistence operator imports to '@ngrx/router-store/data-persistence'.",
"factory": "./src/migrations/update-21-0-0/change-data-persistence-operators-imports-to-ngrx-router-store-data-persistence" "factory": "./src/migrations/update-21-0-0/change-data-persistence-operators-imports-to-ngrx-router-store-data-persistence"
}, },
"update-angular-cli-version-20-0-0-rc-3": { "update-angular-cli-version-20-0-0": {
"cli": "nx", "cli": "nx",
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "requires": {
"@angular/core": ">=20.0.0-rc.2" "@angular/core": ">=20.0.0"
}, },
"description": "Update the @angular/cli package version to 20.0.0-rc.3.", "description": "Update the @angular/cli package version to ~20.0.0.",
"factory": "./src/migrations/update-21-2-0/update-angular-cli" "factory": "./src/migrations/update-21-2-0/update-angular-cli"
}, },
"migrate-provide-server-rendering-import": { "migrate-provide-server-rendering-import": {
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "requires": {
"@angular/core": ">=20.0.0-rc.2" "@angular/core": ">=20.0.0"
}, },
"description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.", "description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.",
"factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import" "factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import"
}, },
"replace-provide-server-routing": { "replace-provide-server-routing": {
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "requires": {
"@angular/core": ">=20.0.0-rc.2" "@angular/core": ">=20.0.0"
}, },
"description": "Replace `provideServerRouting` with `provideServerRendering` using `withRoutes`.", "description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.",
"factory": "./src/migrations/update-21-2-0/replace-provide-server-routing" "factory": "./src/migrations/update-21-2-0/replace-provide-server-routing"
}, },
"set-generator-defaults-for-previous-style-guide": { "set-generator-defaults-for-previous-style-guide": {
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "requires": {
"@angular/core": ">=20.0.0-rc.2" "@angular/core": ">=20.0.0"
}, },
"description": "Update the generator defaults to maintain the previous style guide behavior.", "description": "Update the generator defaults to maintain the previous style guide behavior.",
"factory": "./src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide" "factory": "./src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide"
}, },
"update-module-resolution": { "update-module-resolution": {
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"requires": { "requires": {
"@angular/core": ">=20.0.0-rc.2" "@angular/core": ">=20.0.0"
}, },
"description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.", "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.",
"factory": "./src/migrations/update-21-2-0/update-module-resolution" "factory": "./src/migrations/update-21-2-0/update-module-resolution"
@ -1667,66 +1667,145 @@
} }
}, },
"21.2.0": { "21.2.0": {
"version": "21.2.0-beta.0", "version": "21.2.0-beta.3",
"x-prompt": "Do you want to update the Angular version to v20?", "x-prompt": "Do you want to update the Angular version to v20?",
"requires": { "requires": {
"@angular/core": ">=19.2.0 <20.0.0-rc.2" "@angular/core": ">=19.2.0 <20.0.0"
}, },
"packages": { "packages": {
"@angular-devkit/build-angular": { "@angular-devkit/build-angular": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/core": { "@angular-devkit/core": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/schematics": { "@angular-devkit/schematics": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/build": { "@angular/build": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/pwa": { "@angular/pwa": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/ssr": { "@angular/ssr": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@schematics/angular": { "@schematics/angular": {
"version": "20.0.0-rc.3", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/architect": { "@angular-devkit/architect": {
"version": "0.2000.0-rc.3", "version": "~0.2000.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular-devkit/build-webpack": { "@angular-devkit/build-webpack": {
"version": "0.2000.0-rc.3", "version": "~0.2000.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/core": { "@angular/core": {
"version": "20.0.0-rc.2", "version": "~20.0.0",
"alwaysAddToPackageJson": true "alwaysAddToPackageJson": true
}, },
"@angular/material": { "@angular/material": {
"version": "20.0.0-rc.2", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/cdk": { "@angular/cdk": {
"version": "20.0.0-rc.2", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"@angular/google-maps": { "@angular/google-maps": {
"version": "20.0.0-rc.2", "version": "~20.0.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
}, },
"ng-packagr": { "ng-packagr": {
"version": "20.0.0-rc.1", "version": "~20.0.0",
"alwaysAddToPackageJson": false
}
}
},
"21.2.0-angular-eslint": {
"version": "21.2.0-beta.3",
"requires": {
"@angular/core": ">= 20.0.0 < 21.0.0",
"typescript-eslint": "^8.0.0",
"eslint": "^8.57.0 || ^9.0.0"
},
"packages": {
"angular-eslint": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
}
}
},
"21.2.0-@angular-eslint": {
"version": "21.2.0-beta.3",
"requires": {
"@angular/core": ">= 20.0.0 < 21.0.0",
"eslint": "^8.57.0 || ^9.0.0"
},
"packages": {
"@angular-eslint/eslint-plugin": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/eslint-plugin-template": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/template-parser": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/utils": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/schematics": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/test-utils": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/builder": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
},
"@angular-eslint/bundled-angular-compiler": {
"version": "^20.0.0-beta.1",
"alwaysAddToPackageJson": false
}
}
},
"21.2.0-angular-rspack": {
"version": "21.2.0-beta.3",
"packages": {
"@nx/angular-rspack": {
"version": "^21.1.0",
"alwaysAddToPackageJson": false
}
}
},
"21.2.0-jest": {
"version": "21.2.0-beta.3",
"requires": {
"@angular/compiler-cli": ">=15.0.0 <21.0.0",
"@angular/core": ">=15.0.0 <21.0.0",
"@angular/platform-browser-dynamic": ">=15.0.0 <21.0.0",
"jest": "^29.0.0"
},
"packages": {
"jest-preset-angular": {
"version": "~14.6.0",
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
} }
} }

View File

@ -7,28 +7,14 @@
"deleteDestPath": false, "deleteDestPath": false,
"allowedNonPeerDependencies": [ "allowedNonPeerDependencies": [
"@nx/", "@nx/",
"@angular-devkit",
"@angular-eslint/",
"@module-federation/enhanced",
"@schematics",
"@phenomnomnominal/tsquery", "@phenomnomnominal/tsquery",
"@typescript-eslint/", "@typescript-eslint/",
"picocolors",
"ignore",
"picomatch",
"rxjs-for-await",
"webpack-merge",
"ts-node",
"tsconfig-paths",
"semver",
"webpack",
"express",
"http-proxy-middleware",
"http-server",
"magic-string",
"enquirer", "enquirer",
"find-cache-dir", "magic-string",
"webpack" "picocolors",
"picomatch",
"semver",
"webpack-merge"
], ],
"keepLifecycleScripts": true "keepLifecycleScripts": true
} }

View File

@ -18,7 +18,6 @@ exports[`addLinting generator should correctly generate the .eslintrc.json file
"*.ts", "*.ts",
], ],
"rules": { "rules": {
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/component-selector": [ "@angular-eslint/component-selector": [
"error", "error",
{ {
@ -27,7 +26,6 @@ exports[`addLinting generator should correctly generate the .eslintrc.json file
"type": "element", "type": "element",
}, },
], ],
"@angular-eslint/directive-class-suffix": "off",
"@angular-eslint/directive-selector": [ "@angular-eslint/directive-selector": [
"error", "error",
{ {

View File

@ -168,9 +168,7 @@ describe('addLinting generator', () => {
prefix: "my-org", prefix: "my-org",
style: "kebab-case" style: "kebab-case"
} }
], ]
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/directive-class-suffix": "off"
} }
}, },
{ {
@ -291,9 +289,7 @@ describe('addLinting generator', () => {
"prefix": "my-org", "prefix": "my-org",
"style": "kebab-case" "style": "kebab-case"
} }
], ]
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/directive-class-suffix": "off"
} }
}, },
{ {

View File

@ -82,10 +82,6 @@ export async function addLintingGenerator(
style: 'kebab-case', style: 'kebab-case',
}, },
], ],
// Temporary disable these rules until Angular ESLint recommended
// rules are updated with the new Style Guide
'@angular-eslint/component-class-suffix': 'off',
'@angular-eslint/directive-class-suffix': 'off',
}, },
}); });
addOverrideToLintConfig(tree, options.projectRoot, { addOverrideToLintConfig(tree, options.projectRoot, {
@ -125,10 +121,6 @@ export async function addLintingGenerator(
style: 'kebab-case', style: 'kebab-case',
}, },
], ],
// Temporary disable these rules until Angular ESLint recommended
// rules are updated with the new Style Guide
'@angular-eslint/component-class-suffix': 'off',
'@angular-eslint/directive-class-suffix': 'off',
}, },
}, },
{ {

View File

@ -366,12 +366,11 @@ export class App {}
exports[`app --minimal should skip "nx-welcome.ts" file and references for standalone apps with routing 2`] = ` exports[`app --minimal should skip "nx-welcome.ts" file and references for standalone apps with routing 2`] = `
"import { TestBed } from '@angular/core/testing'; "import { TestBed } from '@angular/core/testing';
import { App } from './app'; import { App } from './app';
import { RouterModule } from '@angular/router';
describe('App', () => { describe('App', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [App, RouterModule.forRoot([])], imports: [App],
}).compileComponents(); }).compileComponents();
}); });
@ -488,12 +487,11 @@ exports[`app --standalone should generate a standalone app correctly with routin
"import { TestBed } from '@angular/core/testing'; "import { TestBed } from '@angular/core/testing';
import { App } from './app'; import { App } from './app';
import { NxWelcome } from './nx-welcome'; import { NxWelcome } from './nx-welcome';
import { RouterModule } from '@angular/router';
describe('App', () => { describe('App', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [App, NxWelcome, RouterModule.forRoot([])], imports: [App, NxWelcome],
}).compileComponents(); }).compileComponents();
}); });
@ -746,12 +744,11 @@ exports[`app angular compat support should generate components with the "compone
"import { TestBed } from '@angular/core/testing'; "import { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { NxWelcomeComponent } from './nx-welcome.component'; import { NxWelcomeComponent } from './nx-welcome.component';
import { RouterModule } from '@angular/router';
describe('AppComponent', () => { describe('AppComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [AppComponent, NxWelcomeComponent, RouterModule.forRoot([])], imports: [AppComponent, NxWelcomeComponent],
}).compileComponents(); }).compileComponents();
}); });
@ -1196,12 +1193,11 @@ exports[`app template generation mode should respect the "type" configured in th
"import { TestBed } from '@angular/core/testing'; "import { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { NxWelcomeComponent } from './nx-welcome.component'; import { NxWelcomeComponent } from './nx-welcome.component';
import { RouterModule } from '@angular/router';
describe('AppComponent', () => { describe('AppComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [AppComponent, NxWelcomeComponent, RouterModule.forRoot([])], imports: [AppComponent, NxWelcomeComponent],
}).compileComponents(); }).compileComponents();
}); });

View File

@ -671,7 +671,6 @@ describe('app', () => {
"*.ts", "*.ts",
], ],
"rules": { "rules": {
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/component-selector": [ "@angular-eslint/component-selector": [
"error", "error",
{ {
@ -680,7 +679,6 @@ describe('app', () => {
"type": "element", "type": "element",
}, },
], ],
"@angular-eslint/directive-class-suffix": "off",
"@angular-eslint/directive-selector": [ "@angular-eslint/directive-selector": [
"error", "error",
{ {

View File

@ -1,12 +1,11 @@
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { App<%= componentType %> } from './app<%= componentFileSuffix %>';<% if(!minimal) { %> import { App<%= componentType %> } from './app<%= componentFileSuffix %>';<% if(!minimal) { %>
import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %><% if(routing) { %> import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %>
import { RouterModule } from '@angular/router';<% } %>
describe('App<%= componentType %>', () => { describe('App<%= componentType %>', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %><% if(routing) { %>, RouterModule.forRoot([])<% } %>], imports: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %>],
}).compileComponents(); }).compileComponents();
}); });

View File

@ -700,9 +700,7 @@ describe('lib', () => {
"prefix": "lib", "prefix": "lib",
"style": "kebab-case" "style": "kebab-case"
} }
], ]
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/directive-class-suffix": "off"
} }
}, },
{ {
@ -1250,9 +1248,7 @@ describe('lib', () => {
prefix: "lib", prefix: "lib",
style: "kebab-case" style: "kebab-case"
} }
], ]
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/directive-class-suffix": "off"
} }
}, },
{ {
@ -1292,7 +1288,6 @@ describe('lib', () => {
"*.ts", "*.ts",
], ],
"rules": { "rules": {
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/component-selector": [ "@angular-eslint/component-selector": [
"error", "error",
{ {
@ -1301,7 +1296,6 @@ describe('lib', () => {
"type": "element", "type": "element",
}, },
], ],
"@angular-eslint/directive-class-suffix": "off",
"@angular-eslint/directive-selector": [ "@angular-eslint/directive-selector": [
"error", "error",
{ {
@ -1354,7 +1348,6 @@ describe('lib', () => {
"*.ts", "*.ts",
], ],
"rules": { "rules": {
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/component-selector": [ "@angular-eslint/component-selector": [
"error", "error",
{ {
@ -1363,7 +1356,6 @@ describe('lib', () => {
"type": "element", "type": "element",
}, },
], ],
"@angular-eslint/directive-class-suffix": "off",
"@angular-eslint/directive-selector": [ "@angular-eslint/directive-selector": [
"error", "error",
{ {

View File

@ -1,6 +1,6 @@
#### Replace `provideServerRouting` with `provideServerRendering` #### Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering`
Replace `provideServerRouting` calls with `provideServerRendering` using `withRoutes`. Replace `provideServerRouting` and `provideServerRoutesConfig` calls with `provideServerRendering` using `withRoutes`.
#### Examples #### Examples
@ -79,3 +79,47 @@ const serverConfig: ApplicationConfig = {
{% /tab %} {% /tab %}
{% /tabs %} {% /tabs %}
Remove `provideServerRoutesConfig` from your providers array and update the `provideServerRendering` call to use `withRoutes`:
{% tabs %}
{% tab label="Before" %}
```ts {% fileName="app/app.config.server.ts" highlightLines=[4,11,12] %}
import { ApplicationConfig } from '@angular/core';
import {
provideServerRendering,
provideServerRoutesConfig,
withAppShell,
} from '@angular/ssr';
import { serverRoutes } from './app.routes.server';
const serverConfig: ApplicationConfig = {
providers: [
provideServerRendering(),
provideServerRoutesConfig(serverRoutes, withAppShell(AppShellComponent)),
],
};
```
{% /tab %}
{% tab label="After" %}
```ts {% fileName="app/app.config.server.ts" highlightLines=[2,"7-10"] %}
import { ApplicationConfig } from '@angular/core';
import { provideServerRendering, withAppShell, withRoutes } from '@angular/ssr';
import { serverRoutes } from './app.routes.server';
const serverConfig: ApplicationConfig = {
providers: [
provideServerRendering(
withRoutes(serverRoutes),
withAppShell(AppShellComponent)
),
],
};
```
{% /tab %}
{% /tabs %}

View File

@ -89,6 +89,82 @@ const serverConfig: ApplicationConfig = {
], ],
}; };
export const config = mergeApplicationConfig(appConfig, serverConfig);
`
);
await migration(tree);
expect(tree.read('apps/app1/src/app/app.config.server.ts', 'utf-8'))
.toMatchInlineSnapshot(`
"import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
import { provideServerRendering, withAppShell, withRoutes } from '@angular/ssr';
import { appConfig } from './app.config';
import { serverRoutes } from './app.routes.server';
const serverConfig: ApplicationConfig = {
providers: [
provideServerRendering(
withRoutes(serverRoutes),
withAppShell(AppShellComponent)
),
],
};
export const config = mergeApplicationConfig(appConfig, serverConfig);
"
`);
});
it('should remove "provideServerRoutesConfig", add an import for "withRoutes" and update "provideServerRendering" to use "withRoutes"', async () => {
tree.write(
'apps/app1/src/app/app.config.server.ts',
`import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
import { provideServerRendering, provideServerRoutesConfig } from '@angular/ssr';
import { appConfig } from './app.config';
import { serverRoutes } from './app.routes.server';
const serverConfig: ApplicationConfig = {
providers: [provideServerRendering(), provideServerRoutesConfig(serverRoutes)],
};
export const config = mergeApplicationConfig(appConfig, serverConfig);
`
);
await migration(tree);
expect(tree.read('apps/app1/src/app/app.config.server.ts', 'utf-8'))
.toMatchInlineSnapshot(`
"import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
import { provideServerRendering, withRoutes } from '@angular/ssr';
import { appConfig } from './app.config';
import { serverRoutes } from './app.routes.server';
const serverConfig: ApplicationConfig = {
providers: [provideServerRendering(withRoutes(serverRoutes))],
};
export const config = mergeApplicationConfig(appConfig, serverConfig);
"
`);
});
it('should include extra arguments provided to "provideServerRoutesConfig"', async () => {
tree.write(
'apps/app1/src/app/app.config.server.ts',
`import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
import { provideServerRendering, provideServerRoutesConfig, withAppShell } from '@angular/ssr';
import { appConfig } from './app.config';
import { serverRoutes } from './app.routes.server';
const serverConfig: ApplicationConfig = {
providers: [
provideServerRendering(),
provideServerRoutesConfig(serverRoutes, withAppShell(AppShellComponent)),
],
};
export const config = mergeApplicationConfig(appConfig, serverConfig); export const config = mergeApplicationConfig(appConfig, serverConfig);
` `
); );

View File

@ -30,7 +30,8 @@ function processFile(tree: Tree, filePath: string): void {
const content = tree.read(filePath, 'utf-8'); const content = tree.read(filePath, 'utf-8');
if ( if (
!content.includes('provideServerRouting') || (!content.includes('provideServerRouting') &&
!content.includes('provideServerRoutesConfig')) ||
!content.includes('@angular/ssr') !content.includes('@angular/ssr')
) { ) {
return; return;
@ -40,13 +41,26 @@ function processFile(tree: Tree, filePath: string): void {
const providersArray = tsquery.query<ts.ArrayLiteralExpression>( const providersArray = tsquery.query<ts.ArrayLiteralExpression>(
sourceFile, sourceFile,
'PropertyAssignment:has(Identifier[name=providers]) > ArrayLiteralExpression:has(CallExpression > Identifier[name=provideServerRouting])', 'PropertyAssignment:has(Identifier[name=providers]) > ArrayLiteralExpression',
{ visitAllChildren: true } { visitAllChildren: true }
)[0]; )[0];
if (!providersArray) { if (!providersArray) {
return; return;
} }
if (
!providersArray.elements.some(
(el) =>
ts.isCallExpression(el) &&
ts.isIdentifier(el.expression) &&
(el.expression.getText() === 'provideServerRouting' ||
el.expression.getText() === 'provideServerRoutesConfig')
)
) {
return;
}
const recorder = new FileChangeRecorder(tree, filePath); const recorder = new FileChangeRecorder(tree, filePath);
const printer = ts.createPrinter({ const printer = ts.createPrinter({
newLine: ts.NewLineKind.LineFeed, newLine: ts.NewLineKind.LineFeed,
@ -61,7 +75,10 @@ function processFile(tree: Tree, filePath: string): void {
for (const node of providerCallNodes) { for (const node of providerCallNodes) {
if (node.expression.getText() === 'provideServerRendering') { if (node.expression.getText() === 'provideServerRendering') {
provideServerRenderingCall = node; provideServerRenderingCall = node;
} else if (node.expression.getText() === 'provideServerRouting') { } else if (
node.expression.getText() === 'provideServerRouting' ||
node.expression.getText() === 'provideServerRoutesConfig'
) {
provideServerRoutingCall = node; provideServerRoutingCall = node;
} }
} }
@ -74,7 +91,8 @@ function processFile(tree: Tree, filePath: string): void {
let updatedProvidersArray: ts.ArrayLiteralExpression; let updatedProvidersArray: ts.ArrayLiteralExpression;
if (provideServerRenderingCall) { if (provideServerRenderingCall) {
// remove the "provideServerRouting" call and update the existing "provideServerRendering" call // remove the "provideServerRouting" and "provideServerRoutesConfig"
// calls and update the existing "provideServerRendering" call
updatedProvidersArray = ts.factory.updateArrayLiteralExpression( updatedProvidersArray = ts.factory.updateArrayLiteralExpression(
providersArray, providersArray,
providersArray.elements providersArray.elements
@ -83,7 +101,8 @@ function processFile(tree: Tree, filePath: string): void {
!( !(
ts.isCallExpression(el) && ts.isCallExpression(el) &&
ts.isIdentifier(el.expression) && ts.isIdentifier(el.expression) &&
el.expression.text === 'provideServerRouting' (el.expression.text === 'provideServerRouting' ||
el.expression.text === 'provideServerRoutesConfig')
) )
) )
.map((el) => { .map((el) => {
@ -104,14 +123,16 @@ function processFile(tree: Tree, filePath: string): void {
}) })
); );
} else { } else {
// replace the "provideServerRouting" call with the new "provideServerRendering" call // replace the "provideServerRouting" and "provideServerRoutesConfig"
// calls with the new "provideServerRendering" call
updatedProvidersArray = ts.factory.updateArrayLiteralExpression( updatedProvidersArray = ts.factory.updateArrayLiteralExpression(
providersArray, providersArray,
providersArray.elements.map((el) => { providersArray.elements.map((el) => {
if ( if (
ts.isCallExpression(el) && ts.isCallExpression(el) &&
ts.isIdentifier(el.expression) && ts.isIdentifier(el.expression) &&
el.expression.text === 'provideServerRouting' (el.expression.text === 'provideServerRouting' ||
el.expression.text === 'provideServerRoutesConfig')
) { ) {
return ts.factory.createCallExpression( return ts.factory.createCallExpression(
ts.factory.createIdentifier('provideServerRendering'), ts.factory.createIdentifier('provideServerRendering'),
@ -145,11 +166,15 @@ function processFile(tree: Tree, filePath: string): void {
const namedBindings = importDecl?.importClause.namedBindings; const namedBindings = importDecl?.importClause.namedBindings;
if (ts.isNamedImports(namedBindings)) { if (ts.isNamedImports(namedBindings)) {
// remove the "provideServerRouting" import and ensure we have the "withRoutes" import // remove the "provideServerRouting" and "provideServerRoutesConfig"
// imports and ensure we have the "withRoutes" import
const updatedElementNames = new Set([ const updatedElementNames = new Set([
...namedBindings.elements ...namedBindings.elements
.map((el) => el.getText()) .map((el) => el.getText())
.filter((x) => x !== 'provideServerRouting'), .filter(
(x) =>
x !== 'provideServerRouting' && x !== 'provideServerRoutesConfig'
),
'withRoutes', 'withRoutes',
]); ]);
const updatedNamedBindings = ts.factory.updateNamedImports( const updatedNamedBindings = ts.factory.updateNamedImports(

View File

@ -1,6 +1,6 @@
import { formatFiles, Tree, updateJson } from '@nx/devkit'; import { formatFiles, Tree, updateJson } from '@nx/devkit';
export const angularCliVersion = '20.0.0-rc.3'; export const angularCliVersion = '~20.0.0';
export default async function (tree: Tree) { export default async function (tree: Tree) {
let shouldFormat = false; let shouldFormat = false;

View File

@ -1,9 +1,9 @@
export const nxVersion = require('../../package.json').version; export const nxVersion = require('../../package.json').version;
export const angularVersion = '20.0.0-rc.2'; export const angularVersion = '~20.0.0';
export const angularDevkitVersion = '20.0.0-rc.3'; export const angularDevkitVersion = '~20.0.0';
export const ngPackagrVersion = '20.0.0-rc.1'; export const ngPackagrVersion = '~20.0.0';
export const angularRspackVersion = '^21.0.1'; export const angularRspackVersion = '^21.1.0';
export const ngrxVersion = '^19.0.0'; export const ngrxVersion = '^19.0.0';
export const rxjsVersion = '~7.8.0'; export const rxjsVersion = '~7.8.0';
export const zoneJsVersion = '~0.15.0'; export const zoneJsVersion = '~0.15.0';
@ -19,7 +19,7 @@ export const moduleFederationNodeVersion = '^2.6.26';
export const moduleFederationEnhancedVersion = '^0.9.0'; export const moduleFederationEnhancedVersion = '^0.9.0';
export const webpackMergeVersion = '^5.8.0'; export const webpackMergeVersion = '^5.8.0';
export const angularEslintVersion = '^19.2.0'; export const angularEslintVersion = '^20.0.0-beta.1';
export const typescriptEslintVersion = '^7.16.0'; export const typescriptEslintVersion = '^7.16.0';
export const tailwindVersion = '^3.0.2'; export const tailwindVersion = '^3.0.2';
export const postcssVersion = '^8.4.5'; export const postcssVersion = '^8.4.5';
@ -27,7 +27,7 @@ export const postcssUrlVersion = '~10.1.3';
export const autoprefixerVersion = '^10.4.0'; export const autoprefixerVersion = '^10.4.0';
export const tsNodeVersion = '10.9.1'; export const tsNodeVersion = '10.9.1';
export const jestPresetAngularVersion = '~14.4.0'; export const jestPresetAngularVersion = '~14.6.0';
export const typesNodeVersion = '18.16.9'; export const typesNodeVersion = '18.16.9';
export const jasmineMarblesVersion = '^0.9.2'; export const jasmineMarblesVersion = '^0.9.2';

View File

@ -57,7 +57,6 @@ describe('Convert Nx Executor', () => {
// ASSERT // ASSERT
expect(convertedRunResult).toMatchInlineSnapshot(` expect(convertedRunResult).toMatchInlineSnapshot(`
{ {
"error": undefined,
"info": { "info": {
"builderName": "nx:test", "builderName": "nx:test",
"description": "Testing only builder.", "description": "Testing only builder.",
@ -66,16 +65,10 @@ describe('Convert Nx Executor', () => {
}, },
}, },
"success": true, "success": true,
"target": {
"configuration": undefined,
"project": undefined,
"target": undefined,
},
} }
`); `);
expect(realRunResult).toMatchInlineSnapshot(` expect(realRunResult).toMatchInlineSnapshot(`
{ {
"error": undefined,
"info": { "info": {
"builderName": "ng:test", "builderName": "ng:test",
"description": "Testing only builder.", "description": "Testing only builder.",
@ -84,11 +77,6 @@ describe('Convert Nx Executor', () => {
}, },
}, },
"success": true, "success": true,
"target": {
"configuration": undefined,
"project": undefined,
"target": undefined,
},
} }
`); `);
expect(convertedRunResult.success).toEqual(realRunResult.success); expect(convertedRunResult.success).toEqual(realRunResult.success);

View File

@ -53,10 +53,10 @@ export function convertNxExecutor(executor: Executor) {
const context: ExecutorContext = { const context: ExecutorContext = {
root: builderContext.workspaceRoot, root: builderContext.workspaceRoot,
projectName: builderContext.target.project, projectName: builderContext.target?.project,
targetName: builderContext.target.target, targetName: builderContext.target?.target,
target: builderContext.target.target, target: builderContext.target?.target,
configurationName: builderContext.target.configuration, configurationName: builderContext.target?.configuration,
projectsConfigurations, projectsConfigurations,
nxJsonConfiguration, nxJsonConfiguration,
cwd: process.cwd(), cwd: process.cwd(),

View File

@ -108,14 +108,14 @@ describe('js init generator', () => {
it('should not overwrite installed typescript version when is a supported version', async () => { it('should not overwrite installed typescript version when is a supported version', async () => {
updateJson(tree, 'package.json', (json) => { updateJson(tree, 'package.json', (json) => {
json.devDependencies = { ...json.devDependencies, typescript: '~5.2.0' }; json.devDependencies = { ...json.devDependencies, typescript: '~5.4.0' };
return json; return json;
}); });
await init(tree, {}); await init(tree, {});
const packageJson = readJson(tree, 'package.json'); const packageJson = readJson(tree, 'package.json');
expect(packageJson.devDependencies['typescript']).toBe('~5.2.0'); expect(packageJson.devDependencies['typescript']).toBe('~5.4.0');
expect(packageJson.devDependencies['typescript']).not.toBe( expect(packageJson.devDependencies['typescript']).not.toBe(
typescriptVersion typescriptVersion
); );

View File

@ -15,6 +15,6 @@ export const typescriptVersion = '~5.8.2';
/** /**
* The minimum version is currently determined from the lowest version * The minimum version is currently determined from the lowest version
* that's supported by the lowest Angular supported version, e.g. * that's supported by the lowest Angular supported version, e.g.
* `npm view @angular/compiler-cli@17.0.0 peerDependencies.typescript` * `npm view @angular/compiler-cli@18.0.0 peerDependencies.typescript`
*/ */
export const supportedTypescriptVersions = '>=5.2.0'; export const supportedTypescriptVersions = '>=5.4.0';

View File

@ -71,6 +71,19 @@
"alwaysAddToPackageJson": false "alwaysAddToPackageJson": false
} }
} }
},
"21.2.0": {
"version": "21.2.0-beta.3",
"packages": {
"@analogjs/vite-plugin-angular": {
"version": "~1.17.1",
"alwaysAddToPackageJson": false
},
"@analogjs/vitest-angular": {
"version": "~1.17.1",
"alwaysAddToPackageJson": false
}
}
} }
} }
} }

View File

@ -13,7 +13,7 @@ export const happyDomVersion = '~9.20.3';
export const edgeRuntimeVmVersion = '~3.0.2'; export const edgeRuntimeVmVersion = '~3.0.2';
export const jitiVersion = '2.4.2'; export const jitiVersion = '2.4.2';
export const analogVitestAngular = '~1.16.1'; export const analogVitestAngular = '~1.17.1';
// Coverage providers // Coverage providers
export const vitestCoverageV8Version = '^3.0.5'; export const vitestCoverageV8Version = '^3.0.5';

View File

@ -4,5 +4,5 @@ export const typescriptVersion = '~5.8.2';
// TODO: remove when preset generation is reworked and // TODO: remove when preset generation is reworked and
// deps are not installed from workspace // deps are not installed from workspace
export const angularCliVersion = '20.0.0-rc.3'; export const angularCliVersion = '~20.0.0';
export const angularRspackVersion = '^21.0.1'; export const angularRspackVersion = '^21.1.0';

1030
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff