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": {
"/technologies/angular/api/migrations/update-angular-cli-version-20-0-0-rc-3": {
"description": "Update the @angular/cli package version to 20.0.0-rc.3.",
"file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json",
"/technologies/angular/api/migrations/update-angular-cli-version-20-0-0": {
"description": "Update the @angular/cli package version to ~20.0.0.",
"file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0.json",
"hidden": false,
"name": "update-angular-cli-version-20-0-0-rc-3",
"version": "21.2.0-beta.0",
"name": "update-angular-cli-version-20-0-0",
"version": "21.2.0-beta.3",
"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"
},
"/technologies/angular/api/migrations/migrate-provide-server-rendering-import": {
@ -414,17 +414,17 @@
"file": "generated/packages/angular/migrations/migrate-provide-server-rendering-import.json",
"hidden": false,
"name": "migrate-provide-server-rendering-import",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/migrate-provide-server-rendering-import",
"type": "migration"
},
"/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",
"hidden": false,
"name": "replace-provide-server-routing",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/replace-provide-server-routing",
"type": "migration"
@ -434,7 +434,7 @@
"file": "generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json",
"hidden": false,
"name": "set-generator-defaults-for-previous-style-guide",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/set-generator-defaults-for-previous-style-guide",
"type": "migration"
@ -444,7 +444,7 @@
"file": "generated/packages/angular/migrations/update-module-resolution.json",
"hidden": false,
"name": "update-module-resolution",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/update-module-resolution",
"type": "migration"
@ -454,11 +454,51 @@
"file": "generated/packages/angular/migrations/21.2.0-package-updates.json",
"hidden": false,
"name": "21.2.0-package-updates",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "/technologies/angular/api/migrations/21.2.0-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-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": {
"description": "",
"file": "generated/packages/angular/migrations/21.1.0-package-updates.json",
@ -4881,6 +4921,16 @@
}
},
"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": {
"description": "",
"file": "generated/packages/vite/migrations/21.1.2-package-updates.json",

View File

@ -440,13 +440,13 @@
],
"migrations": [
{
"description": "Update the @angular/cli package version to 20.0.0-rc.3.",
"file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json",
"description": "Update the @angular/cli package version to ~20.0.0.",
"file": "generated/packages/angular/migrations/update-angular-cli-version-20-0-0.json",
"hidden": false,
"name": "update-angular-cli-version-20-0-0-rc-3",
"version": "21.2.0-beta.0",
"name": "update-angular-cli-version-20-0-0",
"version": "21.2.0-beta.3",
"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"
},
{
@ -454,17 +454,17 @@
"file": "generated/packages/angular/migrations/migrate-provide-server-rendering-import.json",
"hidden": false,
"name": "migrate-provide-server-rendering-import",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/migrate-provide-server-rendering-import",
"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",
"hidden": false,
"name": "replace-provide-server-routing",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/replace-provide-server-routing",
"type": "migration"
@ -474,7 +474,7 @@
"file": "generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json",
"hidden": false,
"name": "set-generator-defaults-for-previous-style-guide",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/set-generator-defaults-for-previous-style-guide",
"type": "migration"
@ -484,7 +484,7 @@
"file": "generated/packages/angular/migrations/update-module-resolution.json",
"hidden": false,
"name": "update-module-resolution",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/update-module-resolution",
"type": "migration"
@ -494,11 +494,51 @@
"file": "generated/packages/angular/migrations/21.2.0-package-updates.json",
"hidden": false,
"name": "21.2.0-package-updates",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"originalFilePath": "/packages/angular",
"path": "angular/migrations/21.2.0-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-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": "",
"file": "generated/packages/angular/migrations/21.1.0-package-updates.json",
@ -5249,6 +5289,16 @@
}
],
"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": "",
"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",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"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": {
"@angular-devkit/build-angular": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/core": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/schematics": {
"version": "20.0.0-rc.3",
"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",
"version": "~20.0.0",
"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": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/architect": {
"version": "0.2000.0-rc.3",
"version": "~0.2000.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/build-webpack": {
"version": "0.2000.0-rc.3",
"version": "~0.2000.0",
"alwaysAddToPackageJson": false
},
"@angular/core": {
"version": "20.0.0-rc.2",
"alwaysAddToPackageJson": true
},
"@angular/core": { "version": "~20.0.0", "alwaysAddToPackageJson": true },
"@angular/material": {
"version": "20.0.0-rc.2",
"alwaysAddToPackageJson": false
},
"@angular/cdk": {
"version": "20.0.0-rc.2",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/cdk": { "version": "~20.0.0", "alwaysAddToPackageJson": false },
"@angular/google-maps": {
"version": "20.0.0-rc.2",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"ng-packagr": { "version": "20.0.0-rc.1", "alwaysAddToPackageJson": false }
"ng-packagr": { "version": "~20.0.0", "alwaysAddToPackageJson": false }
},
"aliases": [],
"description": "",

View File

@ -1,7 +1,7 @@
{
"name": "migrate-provide-server-rendering-import",
"version": "21.2.0-beta.0",
"requires": { "@angular/core": ">=20.0.0-rc.2" },
"version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0" },
"description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.",
"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",

View File

@ -1,8 +1,8 @@
{
"name": "replace-provide-server-routing",
"version": "21.2.0-beta.0",
"requires": { "@angular/core": ">=20.0.0-rc.2" },
"description": "Replace `provideServerRouting` with `provideServerRendering` using `withRoutes`.",
"version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0" },
"description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.",
"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",
"aliases": [],
@ -10,5 +10,5 @@
"path": "/packages/angular",
"schema": null,
"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",
"version": "21.2.0-beta.0",
"requires": { "@angular/core": ">=20.0.0-rc.2" },
"version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0" },
"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",
"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",
"version": "21.2.0-beta.0",
"requires": { "@angular/core": ">=20.0.0-rc.2" },
"description": "Update the @angular/cli package version to 20.0.0-rc.3.",
"version": "21.2.0-beta.3",
"requires": { "@angular/core": ">=20.0.0" },
"description": "Update the @angular/cli package version to ~20.0.0.",
"factory": "./src/migrations/update-21-2-0/update-angular-cli",
"implementation": "/packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts",
"aliases": [],

View File

@ -1,7 +1,7 @@
{
"name": "update-module-resolution",
"version": "21.2.0-beta.0",
"requires": { "@angular/core": ">=20.0.0-rc.2" },
"version": "21.2.0-beta.3",
"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.",
"factory": "./src/migrations/update-21-2-0/update-module-resolution",
"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": {
"versionRange": ">= 19.8",
"groups": [
["angular-eslint"],
[
"angular-eslint",
"@angular-eslint/eslint-plugin",
"@angular-eslint/eslint-plugin-template",
"@angular-eslint/template-parser",

View File

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

View File

@ -51,52 +51,21 @@
{
"buildTargets": ["build-base"],
"ignoredDependencies": [
"nx",
"eslint",
"vite",
"rxjs",
"semver",
"@angular-devkit/architect",
"@angular-devkit/schematics",
"@nx/cypress",
"@nx/playwright",
"@nx/jest",
"@nx/rollup",
"@nx/playwright",
"@nx/storybook",
"@nx/vite",
"@nx/webpack",
"prettier",
"typescript",
"@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",
"cacache",
"less",
"node-sass",
"node-sass-tilde-importer",
"ora",
"convert-source-map",
"postcss",
"autoprefixer",
"postcss-url",
"sass",
"stylus",
"tailwindcss",
"cypress",
"esbuild",
"piscina"
"eslint",
"injection-js",
"nx",
"piscina",
"typescript"
]
}
]

View File

@ -303,43 +303,43 @@
"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"
},
"update-angular-cli-version-20-0-0-rc-3": {
"update-angular-cli-version-20-0-0": {
"cli": "nx",
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"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"
},
"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"
"@angular/core": ">=20.0.0"
},
"description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.",
"factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import"
},
"replace-provide-server-routing": {
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"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"
},
"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"
"@angular/core": ">=20.0.0"
},
"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"
},
"update-module-resolution": {
"version": "21.2.0-beta.0",
"version": "21.2.0-beta.3",
"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.",
"factory": "./src/migrations/update-21-2-0/update-module-resolution"
@ -1667,66 +1667,145 @@
}
},
"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?",
"requires": {
"@angular/core": ">=19.2.0 <20.0.0-rc.2"
"@angular/core": ">=19.2.0 <20.0.0"
},
"packages": {
"@angular-devkit/build-angular": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/core": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/schematics": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/build": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/pwa": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/ssr": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@schematics/angular": {
"version": "20.0.0-rc.3",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/architect": {
"version": "0.2000.0-rc.3",
"version": "~0.2000.0",
"alwaysAddToPackageJson": false
},
"@angular-devkit/build-webpack": {
"version": "0.2000.0-rc.3",
"version": "~0.2000.0",
"alwaysAddToPackageJson": false
},
"@angular/core": {
"version": "20.0.0-rc.2",
"version": "~20.0.0",
"alwaysAddToPackageJson": true
},
"@angular/material": {
"version": "20.0.0-rc.2",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/cdk": {
"version": "20.0.0-rc.2",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"@angular/google-maps": {
"version": "20.0.0-rc.2",
"version": "~20.0.0",
"alwaysAddToPackageJson": false
},
"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
}
}

View File

@ -7,28 +7,14 @@
"deleteDestPath": false,
"allowedNonPeerDependencies": [
"@nx/",
"@angular-devkit",
"@angular-eslint/",
"@module-federation/enhanced",
"@schematics",
"@phenomnomnominal/tsquery",
"@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",
"find-cache-dir",
"webpack"
"magic-string",
"picocolors",
"picomatch",
"semver",
"webpack-merge"
],
"keepLifecycleScripts": true
}

View File

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

View File

@ -168,9 +168,7 @@ describe('addLinting generator', () => {
prefix: "my-org",
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",
"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',
},
],
// 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, {
@ -125,10 +121,6 @@ export async function addLintingGenerator(
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`] = `
"import { TestBed } from '@angular/core/testing';
import { App } from './app';
import { RouterModule } from '@angular/router';
describe('App', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [App, RouterModule.forRoot([])],
imports: [App],
}).compileComponents();
});
@ -488,12 +487,11 @@ exports[`app --standalone should generate a standalone app correctly with routin
"import { TestBed } from '@angular/core/testing';
import { App } from './app';
import { NxWelcome } from './nx-welcome';
import { RouterModule } from '@angular/router';
describe('App', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [App, NxWelcome, RouterModule.forRoot([])],
imports: [App, NxWelcome],
}).compileComponents();
});
@ -746,12 +744,11 @@ exports[`app angular compat support should generate components with the "compone
"import { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { NxWelcomeComponent } from './nx-welcome.component';
import { RouterModule } from '@angular/router';
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [AppComponent, NxWelcomeComponent, RouterModule.forRoot([])],
imports: [AppComponent, NxWelcomeComponent],
}).compileComponents();
});
@ -1196,12 +1193,11 @@ exports[`app template generation mode should respect the "type" configured in th
"import { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { NxWelcomeComponent } from './nx-welcome.component';
import { RouterModule } from '@angular/router';
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [AppComponent, NxWelcomeComponent, RouterModule.forRoot([])],
imports: [AppComponent, NxWelcomeComponent],
}).compileComponents();
});

View File

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

View File

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

View File

@ -700,9 +700,7 @@ describe('lib', () => {
"prefix": "lib",
"style": "kebab-case"
}
],
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/directive-class-suffix": "off"
]
}
},
{
@ -1250,9 +1248,7 @@ describe('lib', () => {
prefix: "lib",
style: "kebab-case"
}
],
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/directive-class-suffix": "off"
]
}
},
{
@ -1292,7 +1288,6 @@ describe('lib', () => {
"*.ts",
],
"rules": {
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/component-selector": [
"error",
{
@ -1301,7 +1296,6 @@ describe('lib', () => {
"type": "element",
},
],
"@angular-eslint/directive-class-suffix": "off",
"@angular-eslint/directive-selector": [
"error",
{
@ -1354,7 +1348,6 @@ describe('lib', () => {
"*.ts",
],
"rules": {
"@angular-eslint/component-class-suffix": "off",
"@angular-eslint/component-selector": [
"error",
{
@ -1363,7 +1356,6 @@ describe('lib', () => {
"type": "element",
},
],
"@angular-eslint/directive-class-suffix": "off",
"@angular-eslint/directive-selector": [
"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
@ -79,3 +79,47 @@ const serverConfig: ApplicationConfig = {
{% /tab %}
{% /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);
`
);

View File

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

View File

@ -1,6 +1,6 @@
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) {
let shouldFormat = false;

View File

@ -1,9 +1,9 @@
export const nxVersion = require('../../package.json').version;
export const angularVersion = '20.0.0-rc.2';
export const angularDevkitVersion = '20.0.0-rc.3';
export const ngPackagrVersion = '20.0.0-rc.1';
export const angularRspackVersion = '^21.0.1';
export const angularVersion = '~20.0.0';
export const angularDevkitVersion = '~20.0.0';
export const ngPackagrVersion = '~20.0.0';
export const angularRspackVersion = '^21.1.0';
export const ngrxVersion = '^19.0.0';
export const rxjsVersion = '~7.8.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 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 tailwindVersion = '^3.0.2';
export const postcssVersion = '^8.4.5';
@ -27,7 +27,7 @@ export const postcssUrlVersion = '~10.1.3';
export const autoprefixerVersion = '^10.4.0';
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 jasmineMarblesVersion = '^0.9.2';

View File

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

View File

@ -53,10 +53,10 @@ export function convertNxExecutor(executor: Executor) {
const context: ExecutorContext = {
root: builderContext.workspaceRoot,
projectName: builderContext.target.project,
targetName: builderContext.target.target,
target: builderContext.target.target,
configurationName: builderContext.target.configuration,
projectName: builderContext.target?.project,
targetName: builderContext.target?.target,
target: builderContext.target?.target,
configurationName: builderContext.target?.configuration,
projectsConfigurations,
nxJsonConfiguration,
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 () => {
updateJson(tree, 'package.json', (json) => {
json.devDependencies = { ...json.devDependencies, typescript: '~5.2.0' };
json.devDependencies = { ...json.devDependencies, typescript: '~5.4.0' };
return json;
});
await init(tree, {});
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(
typescriptVersion
);

View File

@ -15,6 +15,6 @@ export const typescriptVersion = '~5.8.2';
/**
* The minimum version is currently determined from the lowest version
* 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
}
}
},
"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 jitiVersion = '2.4.2';
export const analogVitestAngular = '~1.16.1';
export const analogVitestAngular = '~1.17.1';
// Coverage providers
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
// deps are not installed from workspace
export const angularCliVersion = '20.0.0-rc.3';
export const angularRspackVersion = '^21.0.1';
export const angularCliVersion = '~20.0.0';
export const angularRspackVersion = '^21.1.0';

1030
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff