From 752d418f78144daac48bda91d4d3f5f678909857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Mon, 26 May 2025 16:00:47 +0200 Subject: [PATCH] feat(angular): support angular cli v20.0.0-rc.3 (#30715) Add support for the Angular CLI **20.0.0-rc.3** version. --- .prettierignore | 3 + docs/generated/manifests/nx-api.json | 100 + docs/generated/packages-metadata.json | 100 + .../angular/executors/application.json | 29 +- .../angular/executors/dev-server.json | 17 +- .../angular/executors/extract-i18n.json | 5 + .../module-federation-dev-server.json | 13 +- .../angular/executors/ng-packagr-lite.json | 5 +- .../packages/angular/executors/package.json | 7 +- .../angular/generators/application.json | 2 +- .../angular/generators/component.json | 10 +- .../angular/generators/directive.json | 12 +- .../packages/angular/generators/host.json | 2 +- .../packages/angular/generators/ngrx.json | 6 +- .../packages/angular/generators/pipe.json | 13 +- .../packages/angular/generators/remote.json | 2 +- .../angular/generators/scam-directive.json | 12 +- .../angular/generators/scam-pipe.json | 5 + .../packages/angular/generators/scam.json | 3 +- .../angular/generators/setup-ssr.json | 2 +- .../migrations/21.2.0-package-updates.json | 68 + ...grate-provide-server-rendering-import.json | 14 + .../replace-provide-server-routing.json | 14 + ...tor-defaults-for-previous-style-guide.json | 14 + ...pdate-angular-cli-version-20-0-0-rc-3.json | 15 + .../migrations/update-module-resolution.json | 14 + ....0-@typescript-eslint-package-updates.json | 30 + ...2.0-typescript-eslint-package-updates.json | 30 + .../js/migrations/21.2.0-package-updates.json | 16 + .../packages/workspace/generators/new.json | 4 - .../packages/workspace/generators/preset.json | 4 - .../migrations/21.2.0-package-updates.json | 16 + e2e/angular/src/config.test.ts | 4 +- .../src/cypress-component-tests.test.ts | 52 +- e2e/angular/src/misc.test.ts | 14 +- .../src/module-federation.rspack.test.ts | 29 +- e2e/angular/src/module-federation.test.ts | 38 +- e2e/angular/src/ng-add.test.ts | 18 +- e2e/angular/src/ngrx.test.ts | 12 +- e2e/angular/src/projects.test.ts | 77 +- e2e/angular/src/tailwind.test.ts | 32 +- e2e/nx-init/src/nx-init-angular.test.ts | 2 +- .../src/release-publishable-libraries.test.ts | 1 - .../src/create-nx-workspace.test.ts | 4 +- package.json | 43 +- packages/angular/.eslintrc.json | 4 +- packages/angular/docs/component-examples.md | 30 +- packages/angular/docs/dev-server-examples.md | 6 - packages/angular/migrations.json | 106 + packages/angular/ng-package.json | 1 - packages/angular/package.json | 42 +- packages/angular/plugins/component-testing.ts | 17 +- .../builders/dev-server/dev-server.impl.ts | 21 +- .../dev-server/lib/normalize-options.ts | 14 +- .../dev-server/lib/validate-options.ts | 5 - .../src/builders/dev-server/schema.d.ts | 18 +- .../src/builders/dev-server/schema.json | 12 +- .../webpack-browser/webpack-browser.impl.ts | 2 + .../webpack-server/webpack-server.impl.ts | 15 +- .../executors/application/application.impl.ts | 25 +- .../src/executors/application/schema.d.ts | 2 +- .../src/executors/application/schema.json | 31 +- .../application/utils/normalize-options.ts | 12 +- .../application/utils/validate-options.ts | 85 +- .../extract-i18n/extract-i18n.impl.ts | 31 +- .../src/executors/extract-i18n/schema.d.ts | 7 +- .../src/executors/extract-i18n/schema.json | 5 + .../extract-i18n/utils/validate-options.ts | 15 + .../lib/normalize-options.ts | 15 +- .../module-federation-dev-server/schema.d.ts | 18 +- .../module-federation-dev-server/schema.json | 17 +- .../module-federation-ssr-dev-server.impl.ts | 31 +- .../ng-package/entry-point/entry-point.ts | 111 +- .../entry-point/write-bundles.di.ts | 14 +- .../entry-point/write-bundles.transform.ts | 53 +- .../src/executors/ng-packagr-lite/schema.json | 5 +- .../src/executors/package/package.impl.ts | 12 +- .../angular/src/executors/package/schema.d.ts | 4 +- .../angular/src/executors/package/schema.json | 5 +- .../executors/utilities/builder-package.ts | 9 + .../executors/utilities/esbuild-extensions.ts | 5 +- .../utilities/ng-packagr/package-imports.ts | 10 +- .../pre-v19/stylesheet-processor.ts | 196 +- .../ng-packagr/stylesheet-processor.di.ts | 20 +- .../ng-packagr/v19+/stylesheet-processor.ts | 34 +- .../utilities/patch-builder-context.ts | 6 +- .../__snapshots__/add-linting.spec.ts.snap | 2 + .../add-linting/add-linting.spec.ts | 10 +- .../src/generators/add-linting/add-linting.ts | 8 + .../__snapshots__/application.spec.ts.snap | 423 +- .../application/application.spec.ts | 732 +- .../src/generators/application/application.ts | 41 +- .../files/base-pre18/src/favicon.ico | Bin 15086 -> 0 bytes .../{base-18+ => base}/public/favicon.ico | Bin .../files/base/tsconfig.app.json__tpl__ | 11 +- .../files/base/tsconfig.json__tpl__ | 11 +- .../src/app/app.component.spec.ts__tpl__ | 29 - .../ng-module/src/app/app.module.ts__tpl__ | 17 - .../app/app__componentFileSuffix__.__style__} | 0 ...=> app__componentFileSuffix__.html__tpl__} | 0 .../app__componentFileSuffix__.spec.ts__tpl__ | 28 + ..._ => app__componentFileSuffix__.ts__tpl__} | 8 +- ...app__moduleTypeSeparator__module.ts__tpl__ | 17 + .../files/ng-module/src/main.ts__tpl__ | 14 +- ...-welcome__componentFileSuffix__.ts__tpl__} | 2 +- ...-welcome__componentFileSuffix__.ts__tpl__} | 2 +- ...-welcome__componentFileSuffix__.ts__tpl__} | 2 +- ...-welcome__componentFileSuffix__.ts__tpl__} | 2 +- ...-welcome__componentFileSuffix__.ts__tpl__} | 2 +- ...-welcome__componentFileSuffix__.ts__tpl__} | 2 +- .../src/app/app.component.__style__ | 0 .../src/app/app.component.spec.ts__tpl__ | 28 - .../src/app/app.config.ts__tpl__ | 8 +- .../app/app__componentFileSuffix__.__style__} | 0 ...=> app__componentFileSuffix__.html__tpl__} | 0 .../app__componentFileSuffix__.spec.ts__tpl__ | 27 + ..._ => app__componentFileSuffix__.ts__tpl__} | 12 +- .../standalone-components/src/main.ts__tpl__ | 4 +- .../application/lib/create-files.ts | 63 +- .../application/lib/create-project.ts | 168 +- .../lib/enable-strict-type-checking.ts | 7 +- .../src/generators/application/lib/index.ts | 3 +- .../application/lib/set-app-strict-default.ts | 14 - .../application/lib/set-generator-defaults.ts | 1 + .../application/lib/update-editor-tsconfig.ts | 41 - .../application/lib/update-tsconfig-files.ts | 116 + .../src/generators/application/schema.json | 2 +- .../__snapshots__/component-test.spec.ts.snap | 8 +- .../component-test/component-test.spec.ts | 26 +- .../__snapshots__/component.spec.ts.snap | 111 +- .../generators/component/component.spec.ts | 440 +- .../src/generators/component/component.ts | 22 +- .../component/files/__fileName__.ts__tpl__ | 2 +- ...pl__ => __fileName____ngext__.html__tpl__} | 0 .../src/generators/component/lib/component.ts | 15 +- .../src/generators/component/lib/module.ts | 33 +- .../component/lib/normalize-options.ts | 11 +- .../src/generators/component/schema.d.ts | 1 + .../src/generators/component/schema.json | 8 +- .../convert-to-application-executor.spec.ts | 86 +- .../convert-to-application-executor.ts | 80 +- ...press-component-configuration.spec.ts.snap | 112 +- .../cypress-component-configuration.spec.ts | 38 +- .../__snapshots__/directive.spec.ts.snap | 50 +- .../generators/directive/directive.spec.ts | 151 +- .../src/generators/directive/directive.ts | 2 +- .../directive/lib/normalize-options.ts | 10 +- .../src/generators/directive/schema.d.ts | 1 + .../src/generators/directive/schema.json | 12 +- .../host/__snapshots__/host.spec.ts.snap | 195 +- .../angular/src/generators/host/host.spec.ts | 221 +- .../angular/src/generators/host/schema.json | 2 +- packages/angular/src/generators/init/init.ts | 8 +- ...library-secondary-entry-point.spec.ts.snap | 4 +- .../files/src/index.ts__tmpl__ | 2 +- ...___moduleTypeSeparator__module.ts__tmpl__} | 0 .../lib/add-files.ts | 3 +- .../lib/normalize-options.ts | 7 +- .../library-secondary-entry-point.spec.ts | 87 +- .../library-secondary-entry-point/schema.d.ts | 1 + .../__snapshots__/library.spec.ts.snap | 198 +- .../library/files/base/tsconfig.json__tpl__ | 10 +- .../files/ng-module/src/index.ts__tpl__ | 2 +- ...____moduleTypeSeparator__module.ts__tpl__} | 0 .../src/lib/lib.routes.ts__tpl__ | 4 +- .../library/lib/add-standalone-component.ts | 1 + .../generators/library/lib/create-files.ts | 21 +- .../lib/enable-strict-type-checking.ts | 59 - .../library/lib/normalize-options.ts | 17 +- .../library/lib/normalized-schema.ts | 2 + .../library/lib/set-generator-defaults.ts | 1 + .../library/lib/update-tsconfig-files.ts | 118 + .../generators/library/lib/update-tsconfig.ts | 59 - .../src/generators/library/library.spec.ts | 446 +- .../angular/src/generators/library/library.ts | 66 +- .../generators/move/lib/update-module-name.ts | 40 +- .../move/lib/update-secondary-entry-points.ts | 3 - .../angular/src/generators/move/move.spec.ts | 144 +- .../builders/angular-devkit-karma.migrator.ts | 2 +- .../migrators/projects/app.migrator.spec.ts | 11 +- .../ng-add/migrators/projects/app.migrator.ts | 71 +- .../migrators/projects/lib.migrator.spec.ts | 6 +- .../ngrx-feature-store.spec.ts.snap | 14 +- .../ngrx-feature-store.spec.ts | 10 +- .../ngrx-root-store.spec.ts.snap | 80 +- .../ngrx-root-store/lib/normalize-options.ts | 15 +- .../ngrx-root-store/ngrx-root-store.spec.ts | 16 +- .../ngrx/__snapshots__/ngrx.spec.ts.snap | 88 +- .../angular/src/generators/ngrx/ngrx.spec.ts | 67 +- .../angular/src/generators/ngrx/schema.json | 6 +- .../pipe/__snapshots__/pipe.spec.ts.snap | 16 +- .../generators/pipe/lib/normalize-options.ts | 5 + .../angular/src/generators/pipe/pipe.spec.ts | 109 +- packages/angular/src/generators/pipe/pipe.ts | 2 +- .../angular/src/generators/pipe/schema.d.ts | 1 + .../angular/src/generators/pipe/schema.json | 13 +- .../remote/__snapshots__/remote.spec.ts.snap | 92 +- .../src/bootstrap.server.ts__tmpl__ | 8 +- .../generators/remote/lib/update-ssr-setup.ts | 7 + .../src/generators/remote/remote.spec.ts | 255 +- .../angular/src/generators/remote/schema.json | 2 +- .../lib/convert-directive-to-scam.spec.ts | 38 +- .../lib/convert-directive-to-scam.ts | 8 +- .../scam-directive/lib/normalize-options.ts | 20 +- .../scam-directive/scam-directive.spec.ts | 244 +- .../src/generators/scam-directive/schema.d.ts | 2 + .../src/generators/scam-directive/schema.json | 12 +- .../lib/convert-pipe-to-scam.spec.ts | 20 +- .../scam-pipe/lib/convert-pipe-to-scam.ts | 8 +- .../scam-pipe/lib/normalize-options.ts | 15 +- .../generators/scam-pipe/scam-pipe.spec.ts | 208 +- .../src/generators/scam-pipe/schema.d.ts | 2 + .../src/generators/scam-pipe/schema.json | 5 + .../scam-to-standalone.spec.ts | 33 +- .../lib/convert-component-to-scam.spec.ts | 50 +- .../scam/lib/convert-component-to-scam.ts | 8 +- .../generators/scam/lib/normalize-options.ts | 21 +- .../angular/src/generators/scam/scam.spec.ts | 219 +- .../angular/src/generators/scam/schema.d.ts | 1 + .../angular/src/generators/scam/schema.json | 3 +- .../__snapshots__/setup-mf.spec.ts.snap | 36 +- ...l__ => __entryModuleFileName__.ts__tmpl__} | 8 +- .../entry.routes.ts__tmpl__ | 4 +- ...> entry__componentFileSuffix__.ts__tmpl__} | 2 +- .../__appFileName__.spec.ts__tmpl__ | 43 + .../host-files/app.component.spec.ts__tmpl__ | 47 - .../entry.routes.ts__tmpl__ | 4 +- ...> entry__componentFileSuffix__.ts__tmpl__} | 6 +- .../module-federation.config.ts__tmpl__ | 2 +- .../ts-webpack/tsconfig.lint.json__tmpl__ | 2 +- .../module-federation.config.js__tmpl__ | 2 +- .../setup-mf/lib/add-remote-entry.ts | 23 +- .../setup-mf/lib/add-remote-to-host.ts | 12 +- .../generators/setup-mf/lib/fix-bootstrap.ts | 26 +- .../setup-mf/lib/generate-config.ts | 5 +- .../setup-mf/lib/normalize-options.ts | 26 +- .../lib/remove-dead-code-from-remote.ts | 53 +- .../setup-mf/lib/setup-host-if-dynamic.ts | 16 +- .../setup-mf/lib/setup-tspath-for-remote.ts | 6 +- .../setup-mf/lib/update-host-app-routes.ts | 36 +- .../setup-mf/lib/update-tsconfig.ts | 12 +- .../src/generators/setup-mf/schema.d.ts | 7 + .../src/generators/setup-mf/setup-mf.spec.ts | 274 +- .../src/generators/setup-mf/setup-mf.ts | 70 +- .../__snapshots__/setup-ssr.spec.ts.snap | 102 +- .../server/__serverFileName__ | 0 .../application-builder/ngmodule-src/__main__ | 0 .../ngmodule-src/app/__rootModuleFileName__ | 0 .../app/app.routes.server.ts__tpl__ | 0 .../server/__serverFileName__ | 0 .../standalone-src/__main__ | 0 .../app/app.config.server.ts__tpl__ | 0 .../app/app.routes.server.ts__tpl__ | 0 .../server-builder/ngmodule-src/__main__ | 0 .../ngmodule-src/app/__rootModuleFileName__ | 0 .../root/tsconfig.server.json.template | 0 .../server-builder/server/__serverFileName__ | 0 .../server-builder/standalone-src/__main__ | 0 .../app/app.config.server.ts.template | 0 .../application-builder/ngmodule-src/__main__ | 1 + .../ngmodule-src/app/__rootModuleFileName__ | 12 + .../app/app.routes.server.ts__tpl__ | 8 + .../server/__serverFileName__ | 66 + .../standalone-src/__main__ | 7 + .../app/app.config.server.ts__tpl__ | 12 + .../app/app.routes.server.ts__tpl__ | 8 + .../v20+/server-builder/ngmodule-src/__main__ | 1 + .../ngmodule-src/app/__rootModuleFileName__ | 14 + .../root/tsconfig.server.json.template | 18 + .../server-builder/server/__serverFileName__ | 69 + .../server-builder/standalone-src/__main__ | 7 + .../app/app.config.server.ts.template | 11 + .../setup-ssr/lib/add-dependencies.ts | 23 +- .../setup-ssr/lib/add-hydration.spec.ts | 4 + .../generators/setup-ssr/lib/add-hydration.ts | 21 +- .../setup-ssr/lib/add-server-file.ts | 13 +- .../setup-ssr/lib/generate-files.ts | 33 +- .../lib/generate-server-ts-config.ts | 42 +- .../setup-ssr/lib/normalize-options.ts | 15 +- .../lib/set-router-initial-navigation.spec.ts | 3 + .../setup-ssr/lib/update-project-config.ts | 7 + .../setup-ssr/lib/validate-options.ts | 4 +- .../src/generators/setup-ssr/schema.d.ts | 1 + .../src/generators/setup-ssr/schema.json | 2 +- .../generators/setup-ssr/setup-ssr.spec.ts | 499 +- .../__snapshots__/stories-app.spec.ts.snap | 40 +- .../__snapshots__/stories-lib.spec.ts.snap | 40 +- .../generators/stories/stories-app.spec.ts | 28 +- .../generators/stories/stories-lib.spec.ts | 116 +- .../storybook-configuration.spec.ts.snap | 328 +- .../storybook-configuration.spec.ts | 25 +- .../angular/src/generators/utils/add-jest.ts | 11 +- .../generators/utils/app-components-info.ts | 80 + .../src/generators/utils/artifact-types.ts | 37 + .../utils/ensure-angular-dependencies.spec.ts | 25 +- .../utils/ensure-angular-dependencies.ts | 20 +- .../src/generators/utils/export-scam.spec.ts | 20 +- .../src/generators/utils/export-scam.ts | 7 +- .../src/generators/utils/find-module.ts | 38 +- .../utils/storybook-ast/component-info.ts | 97 +- .../utils/storybook-ast/module-info.ts | 14 +- .../angular/src/generators/utils/testing.ts | 56 +- .../src/generators/utils/version-utils.ts | 4 +- .../generators/web-worker/lib/add-snippet.ts | 8 +- ...migrate-provide-server-rendering-import.md | 68 + ...te-provide-server-rendering-import.spec.ts | 105 + ...migrate-provide-server-rendering-import.ts | 175 + .../replace-provide-server-routing.md | 81 + .../replace-provide-server-routing.spec.ts | 118 + .../replace-provide-server-routing.ts | 181 + ...rator-defaults-for-previous-style-guide.md | 176 + ...-defaults-for-previous-style-guide.spec.ts | 301 + ...rator-defaults-for-previous-style-guide.ts | 82 + .../update-21-2-0/update-angular-cli.md | 29 + .../update-21-2-0/update-angular-cli.spec.ts | 42 + .../update-21-2-0/update-angular-cli.ts | 23 + .../update-21-2-0/update-module-resolution.md | 65 + .../update-module-resolution.spec.ts | 140 + .../update-21-2-0/update-module-resolution.ts | 63 + packages/angular/src/plugins/plugin.ts | 49 +- .../src/utils/backward-compatible-versions.ts | 66 +- .../angular/src/utils/nx-devkit/ast-utils.ts | 30 +- .../angular/src/utils/nx-devkit/testing.ts | 18 +- packages/angular/src/utils/targets.ts | 10 +- packages/angular/src/utils/versions.spec.ts | 4 +- packages/angular/src/utils/versions.ts | 6 +- .../bin/create-nx-workspace.ts | 22 - .../artifact-name-and-directory-utils.spec.ts | 23 + .../artifact-name-and-directory-utils.ts | 4 +- packages/devkit/src/utils/versions.ts | 2 +- packages/eslint/migrations.json | 64 + packages/eslint/package.json | 2 +- .../convert-to-flat-config/generator.spec.ts | 4 +- packages/eslint/src/utils/versions.ts | 2 +- packages/js/migrations.json | 13 + packages/js/src/utils/versions.ts | 2 +- .../module-federation/src/utils/share.spec.ts | 20 + packages/nx/.eslintrc.json | 1 + packages/nx/src/adapter/compat.ts | 4 + .../init/implementation/angular/index.ts | 4 +- .../angular/standalone-workspace.ts | 41 +- packages/nx/src/plugins/js/versions.ts | 2 +- packages/remix/src/utils/versions.ts | 2 +- .../rspack/src/utils/read-rspack-options.ts | 2 +- .../vitest/__snapshots__/vitest.spec.ts.snap | 13 +- .../src/generators/vitest/vitest-generator.ts | 46 +- .../vite/src/generators/vitest/vitest.spec.ts | 28 + .../__snapshots__/library.spec.ts.snap | 2 +- packages/webpack/package.json | 2 +- .../src/utils/webpack/read-webpack-options.ts | 2 +- packages/workspace/migrations.json | 13 + .../src/generators/new/generate-preset.ts | 1 - packages/workspace/src/generators/new/new.ts | 1 - .../workspace/src/generators/new/schema.json | 4 - .../src/generators/preset/preset.spec.ts | 33 +- .../workspace/src/generators/preset/preset.ts | 2 - .../src/generators/preset/schema.json | 4 - packages/workspace/src/utils/versions.ts | 4 +- pnpm-lock.yaml | 6810 ++++++++++------- .../build-migrations.ts | 129 +- .../fetch-versions-from-registry.ts | 1 + .../files/angular-cli-upgrade-migration.ts | 39 +- .../angular-support-upgrades/init-upgrade.ts | 11 +- .../update-package-jsons.ts | 21 +- .../update-version-utils.ts | 41 +- .../create-embeddings/src/main.mts | 14 +- 366 files changed, 13928 insertions(+), 6652 deletions(-) create mode 100644 docs/generated/packages/angular/migrations/21.2.0-package-updates.json create mode 100644 docs/generated/packages/angular/migrations/migrate-provide-server-rendering-import.json create mode 100644 docs/generated/packages/angular/migrations/replace-provide-server-routing.json create mode 100644 docs/generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json create mode 100644 docs/generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json create mode 100644 docs/generated/packages/angular/migrations/update-module-resolution.json create mode 100644 docs/generated/packages/eslint/migrations/21.2.0-@typescript-eslint-package-updates.json create mode 100644 docs/generated/packages/eslint/migrations/21.2.0-typescript-eslint-package-updates.json create mode 100644 docs/generated/packages/js/migrations/21.2.0-package-updates.json create mode 100644 docs/generated/packages/workspace/migrations/21.2.0-package-updates.json create mode 100644 packages/angular/src/executors/extract-i18n/utils/validate-options.ts create mode 100644 packages/angular/src/executors/utilities/builder-package.ts delete mode 100644 packages/angular/src/generators/application/files/base-pre18/src/favicon.ico rename packages/angular/src/generators/application/files/{base-18+ => base}/public/favicon.ico (100%) delete mode 100644 packages/angular/src/generators/application/files/ng-module/src/app/app.component.spec.ts__tpl__ delete mode 100644 packages/angular/src/generators/application/files/ng-module/src/app/app.module.ts__tpl__ rename packages/angular/src/generators/application/files/{base-pre18/src/assets/.gitkeep__tpl__ => ng-module/src/app/app__componentFileSuffix__.__style__} (100%) rename packages/angular/src/generators/application/files/ng-module/src/app/{app.component.html__tpl__ => app__componentFileSuffix__.html__tpl__} (100%) create mode 100644 packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.spec.ts__tpl__ rename packages/angular/src/generators/application/files/ng-module/src/app/{app.component.ts__tpl__ => app__componentFileSuffix__.ts__tpl__} (67%) create mode 100644 packages/angular/src/generators/application/files/ng-module/src/app/app__moduleTypeSeparator__module.ts__tpl__ rename packages/angular/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/{nx-welcome.component.ts__tpl__ => nx-welcome__componentFileSuffix__.ts__tpl__} (99%) rename packages/angular/src/generators/application/files/nx-welcome/claimed/standalone/src/app/{nx-welcome.component.ts__tpl__ => nx-welcome__componentFileSuffix__.ts__tpl__} (99%) rename packages/angular/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/{nx-welcome.component.ts__tpl__ => nx-welcome__componentFileSuffix__.ts__tpl__} (99%) rename packages/angular/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/{nx-welcome.component.ts__tpl__ => nx-welcome__componentFileSuffix__.ts__tpl__} (99%) rename packages/angular/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/{nx-welcome.component.ts__tpl__ => nx-welcome__componentFileSuffix__.ts__tpl__} (99%) rename packages/angular/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/{nx-welcome.component.ts__tpl__ => nx-welcome__componentFileSuffix__.ts__tpl__} (99%) delete mode 100644 packages/angular/src/generators/application/files/standalone-components/src/app/app.component.__style__ delete mode 100644 packages/angular/src/generators/application/files/standalone-components/src/app/app.component.spec.ts__tpl__ rename packages/angular/src/generators/application/files/{ng-module/src/app/app.component.__style__ => standalone-components/src/app/app__componentFileSuffix__.__style__} (100%) rename packages/angular/src/generators/application/files/standalone-components/src/app/{app.component.html__tpl__ => app__componentFileSuffix__.html__tpl__} (100%) create mode 100644 packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ rename packages/angular/src/generators/application/files/standalone-components/src/app/{app.component.ts__tpl__ => app__componentFileSuffix__.ts__tpl__} (58%) delete mode 100644 packages/angular/src/generators/application/lib/set-app-strict-default.ts delete mode 100644 packages/angular/src/generators/application/lib/update-editor-tsconfig.ts create mode 100644 packages/angular/src/generators/application/lib/update-tsconfig-files.ts rename packages/angular/src/generators/component/files/{__fileName__.html__tpl__ => __fileName____ngext__.html__tpl__} (100%) rename packages/angular/src/generators/library-secondary-entry-point/files/src/lib/{__fileName__.module.ts__tmpl__ => __fileName____moduleTypeSeparator__module.ts__tmpl__} (100%) rename packages/angular/src/generators/library/files/ng-module/src/lib/{__libFileName__.module.ts__tpl__ => __libFileName____moduleTypeSeparator__module.ts__tpl__} (100%) delete mode 100644 packages/angular/src/generators/library/lib/enable-strict-type-checking.ts create mode 100644 packages/angular/src/generators/library/lib/update-tsconfig-files.ts delete mode 100644 packages/angular/src/generators/library/lib/update-tsconfig.ts rename packages/angular/src/generators/setup-mf/files/entry-module-files/{entry.module.ts__tmpl__ => __entryModuleFileName__.ts__tmpl__} (56%) rename packages/angular/src/generators/setup-mf/files/entry-module-files/{entry.component.ts__tmpl__ => entry__componentFileSuffix__.ts__tmpl__} (88%) create mode 100644 packages/angular/src/generators/setup-mf/files/host-files/__appFileName__.spec.ts__tmpl__ delete mode 100644 packages/angular/src/generators/setup-mf/files/host-files/app.component.spec.ts__tmpl__ rename packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/{entry.component.ts__tmpl__ => entry__componentFileSuffix__.ts__tmpl__} (66%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder-common-engine/server/__serverFileName__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder/ngmodule-src/__main__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder/ngmodule-src/app/__rootModuleFileName__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder/server/__serverFileName__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder/standalone-src/__main__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder/standalone-src/app/app.config.server.ts__tpl__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/application-builder/standalone-src/app/app.routes.server.ts__tpl__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/server-builder/ngmodule-src/__main__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/server-builder/ngmodule-src/app/__rootModuleFileName__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/server-builder/root/tsconfig.server.json.template (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/server-builder/server/__serverFileName__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/server-builder/standalone-src/__main__ (100%) rename packages/angular/src/generators/setup-ssr/files/{v19+ => v19}/server-builder/standalone-src/app/app.config.server.ts.template (100%) create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/__main__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/__rootModuleFileName__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/application-builder/server/__serverFileName__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/__main__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.config.server.ts__tpl__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/__main__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/app/__rootModuleFileName__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/server-builder/root/tsconfig.server.json.template create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/server-builder/server/__serverFileName__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/__main__ create mode 100644 packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/app/app.config.server.ts.template create mode 100644 packages/angular/src/generators/utils/app-components-info.ts create mode 100644 packages/angular/src/generators/utils/artifact-types.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.md create mode 100644 packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.spec.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.md create mode 100644 packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.spec.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.md create mode 100644 packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.spec.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/update-angular-cli.md create mode 100644 packages/angular/src/migrations/update-21-2-0/update-angular-cli.spec.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/update-module-resolution.md create mode 100644 packages/angular/src/migrations/update-21-2-0/update-module-resolution.spec.ts create mode 100644 packages/angular/src/migrations/update-21-2-0/update-module-resolution.ts diff --git a/.prettierignore b/.prettierignore index 0f3bb1a9f9..039a945266 100644 --- a/.prettierignore +++ b/.prettierignore @@ -51,3 +51,6 @@ CODEOWNERS /.nx/workflows/dynamic-changesets.yaml _files _solution + +# this file uses TS import attributes which the current prettier version does not support +tools/documentation/create-embeddings/src/main.mts diff --git a/docs/generated/manifests/nx-api.json b/docs/generated/manifests/nx-api.json index d9013d9d83..5c9409fedb 100644 --- a/docs/generated/manifests/nx-api.json +++ b/docs/generated/manifests/nx-api.json @@ -444,6 +444,66 @@ } }, "migrations": { + "/nx-api/angular/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", + "hidden": false, + "name": "update-angular-cli-version-20-0-0-rc-3", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/angular", + "path": "/nx-api/angular/migrations/update-angular-cli-version-20-0-0-rc-3", + "type": "migration" + }, + "/nx-api/angular/migrations/migrate-provide-server-rendering-import": { + "description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.", + "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", + "originalFilePath": "/packages/angular", + "path": "/nx-api/angular/migrations/migrate-provide-server-rendering-import", + "type": "migration" + }, + "/nx-api/angular/migrations/replace-provide-server-routing": { + "description": "Replace `provideServerRouting` 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", + "originalFilePath": "/packages/angular", + "path": "/nx-api/angular/migrations/replace-provide-server-routing", + "type": "migration" + }, + "/nx-api/angular/migrations/set-generator-defaults-for-previous-style-guide": { + "description": "Update the generator defaults to maintain the previous style guide behavior.", + "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", + "originalFilePath": "/packages/angular", + "path": "/nx-api/angular/migrations/set-generator-defaults-for-previous-style-guide", + "type": "migration" + }, + "/nx-api/angular/migrations/update-module-resolution": { + "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.", + "file": "generated/packages/angular/migrations/update-module-resolution.json", + "hidden": false, + "name": "update-module-resolution", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/angular", + "path": "/nx-api/angular/migrations/update-module-resolution", + "type": "migration" + }, + "/nx-api/angular/migrations/21.2.0-package-updates": { + "description": "", + "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", + "originalFilePath": "/packages/angular", + "path": "/nx-api/angular/migrations/21.2.0-package-updates", + "type": "migration" + }, "/nx-api/angular/migrations/21.1.0-package-updates": { "description": "", "file": "generated/packages/angular/migrations/21.1.0-package-updates.json", @@ -1687,6 +1747,26 @@ } }, "migrations": { + "/nx-api/eslint/migrations/21.2.0-typescript-eslint-package-updates": { + "description": "", + "file": "generated/packages/eslint/migrations/21.2.0-typescript-eslint-package-updates.json", + "hidden": false, + "name": "21.2.0-typescript-eslint-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/eslint", + "path": "/nx-api/eslint/migrations/21.2.0-typescript-eslint-package-updates", + "type": "migration" + }, + "/nx-api/eslint/migrations/21.2.0-@typescript-eslint-package-updates": { + "description": "", + "file": "generated/packages/eslint/migrations/21.2.0-@typescript-eslint-package-updates.json", + "hidden": false, + "name": "21.2.0-@typescript-eslint-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/eslint", + "path": "/nx-api/eslint/migrations/21.2.0-@typescript-eslint-package-updates", + "type": "migration" + }, "/nx-api/eslint/migrations/20.7.0-package-updates": { "description": "", "file": "generated/packages/eslint/migrations/20.7.0-package-updates.json", @@ -2454,6 +2534,16 @@ } }, "migrations": { + "/nx-api/js/migrations/21.2.0-package-updates": { + "description": "", + "file": "generated/packages/js/migrations/21.2.0-package-updates.json", + "hidden": false, + "name": "21.2.0-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/js", + "path": "/nx-api/js/migrations/21.2.0-package-updates", + "type": "migration" + }, "/nx-api/js/migrations/20.7.1-beta.0-package-updates": { "description": "", "file": "generated/packages/js/migrations/20.7.1-beta.0-package-updates.json", @@ -5724,6 +5814,16 @@ } }, "migrations": { + "/nx-api/workspace/migrations/21.2.0-package-updates": { + "description": "", + "file": "generated/packages/workspace/migrations/21.2.0-package-updates.json", + "hidden": false, + "name": "21.2.0-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/workspace", + "path": "/nx-api/workspace/migrations/21.2.0-package-updates", + "type": "migration" + }, "/nx-api/workspace/migrations/20.4.0-package-updates": { "description": "", "file": "generated/packages/workspace/migrations/20.4.0-package-updates.json", diff --git a/docs/generated/packages-metadata.json b/docs/generated/packages-metadata.json index abe34799bd..fb1c57d08d 100644 --- a/docs/generated/packages-metadata.json +++ b/docs/generated/packages-metadata.json @@ -439,6 +439,66 @@ } ], "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", + "hidden": false, + "name": "update-angular-cli-version-20-0-0-rc-3", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/angular", + "path": "angular/migrations/update-angular-cli-version-20-0-0-rc-3", + "type": "migration" + }, + { + "description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.", + "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", + "originalFilePath": "/packages/angular", + "path": "angular/migrations/migrate-provide-server-rendering-import", + "type": "migration" + }, + { + "description": "Replace `provideServerRouting` 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", + "originalFilePath": "/packages/angular", + "path": "angular/migrations/replace-provide-server-routing", + "type": "migration" + }, + { + "description": "Update the generator defaults to maintain the previous style guide behavior.", + "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", + "originalFilePath": "/packages/angular", + "path": "angular/migrations/set-generator-defaults-for-previous-style-guide", + "type": "migration" + }, + { + "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.", + "file": "generated/packages/angular/migrations/update-module-resolution.json", + "hidden": false, + "name": "update-module-resolution", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/angular", + "path": "angular/migrations/update-module-resolution", + "type": "migration" + }, + { + "description": "", + "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", + "originalFilePath": "/packages/angular", + "path": "angular/migrations/21.2.0-package-updates", + "type": "migration" + }, { "description": "", "file": "generated/packages/angular/migrations/21.1.0-package-updates.json", @@ -1675,6 +1735,26 @@ } ], "migrations": [ + { + "description": "", + "file": "generated/packages/eslint/migrations/21.2.0-typescript-eslint-package-updates.json", + "hidden": false, + "name": "21.2.0-typescript-eslint-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/eslint", + "path": "eslint/migrations/21.2.0-typescript-eslint-package-updates", + "type": "migration" + }, + { + "description": "", + "file": "generated/packages/eslint/migrations/21.2.0-@typescript-eslint-package-updates.json", + "hidden": false, + "name": "21.2.0-@typescript-eslint-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/eslint", + "path": "eslint/migrations/21.2.0-@typescript-eslint-package-updates", + "type": "migration" + }, { "description": "", "file": "generated/packages/eslint/migrations/20.7.0-package-updates.json", @@ -2436,6 +2516,16 @@ } ], "migrations": [ + { + "description": "", + "file": "generated/packages/js/migrations/21.2.0-package-updates.json", + "hidden": false, + "name": "21.2.0-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/js", + "path": "js/migrations/21.2.0-package-updates", + "type": "migration" + }, { "description": "", "file": "generated/packages/js/migrations/20.7.1-beta.0-package-updates.json", @@ -5686,6 +5776,16 @@ } ], "migrations": [ + { + "description": "", + "file": "generated/packages/workspace/migrations/21.2.0-package-updates.json", + "hidden": false, + "name": "21.2.0-package-updates", + "version": "21.2.0-beta.0", + "originalFilePath": "/packages/workspace", + "path": "workspace/migrations/21.2.0-package-updates", + "type": "migration" + }, { "description": "", "file": "generated/packages/workspace/migrations/20.4.0-package-updates.json", diff --git a/docs/generated/packages/angular/executors/application.json b/docs/generated/packages/angular/executors/application.json index 96c3103273..7695776f32 100644 --- a/docs/generated/packages/angular/executors/application.json +++ b/docs/generated/packages/angular/executors/application.json @@ -54,7 +54,6 @@ "description": "The full path for the browser entry point to the application, relative to the current workspace." }, "server": { - "type": "string", "description": "The full path for the server entry point to the application, relative to the current workspace.", "oneOf": [ { @@ -80,7 +79,7 @@ }, "deployUrl": { "type": "string", - "description": "Customize the base path for the URLs of resources in 'index.html' and component stylesheets. This option is only necessary for specific deployment scenarios, such as with Angular Elements or when utilizing different CDN locations. _Note: this is only supported in Angular versions >= 17.3.0_." + "description": "Customize the base path for the URLs of resources in 'index.html' and component stylesheets. This option is only necessary for specific deployment scenarios, such as with Angular Elements or when utilizing different CDN locations." }, "security": { "description": "Security features to protect against XSS and other common attacks. _Note: this is only supported in Angular versions >= 19.0.0_.", @@ -226,7 +225,7 @@ "clearScreen": { "type": "boolean", "default": false, - "description": "Automatically clear the terminal screen during rebuilds. _Note: this is only supported in Angular versions >= 17.2.0_." + "description": "Automatically clear the terminal screen during rebuilds." }, "optimization": { "description": "Enables optimization of the build output. Including minification of scripts and styles, tree-shaking, dead-code elimination, inlining of critical CSS and fonts inlining. For more information, see https://angular.dev/reference/configs/workspace-config#optimization-configuration.", @@ -259,7 +258,7 @@ }, "removeSpecialComments": { "type": "boolean", - "description": "Remove comments in global CSS that contains '@license' or '@preserve' or that starts with '//!' or '/*!'. _Note: this is only supported in Angular versions >= 17.1.0_.", + "description": "Remove comments in global CSS that contains '@license' or '@preserve' or that starts with '//!' or '/*!'.", "default": true } }, @@ -293,17 +292,22 @@ ] }, "loader": { - "description": "Defines the type of loader to use with a specified file extension when used with a JavaScript `import`. `text` inlines the content as a string; `binary` inlines the content as a Uint8Array; `file` emits the file and provides the runtime location of the file; `empty` considers the content to be empty and not include it in bundles. _Note: this is only supported in Angular versions >= 17.1.0_.", + "description": "Defines the type of loader to use with a specified file extension when used with a JavaScript `import`. `text` inlines the content as a string; `binary` inlines the content as a Uint8Array; `file` emits the file and provides the runtime location of the file; `empty` considers the content to be empty and not include it in bundles.", "type": "object", "patternProperties": { "^\\.\\S+$": { "enum": ["text", "binary", "file", "empty"] } } }, "define": { - "description": "Defines global identifiers that will be replaced with a specified constant value when found in any JavaScript or TypeScript code including libraries. The value will be used directly. String values must be put in quotes. Identifiers within Angular metadata such as Component Decorators will not be replaced. _Note: this is only supported in Angular versions >= 17.2.0_.", + "description": "Defines global identifiers that will be replaced with a specified constant value when found in any JavaScript or TypeScript code including libraries. The value will be used directly. String values must be put in quotes. Identifiers within Angular metadata such as Component Decorators will not be replaced.", "type": "object", "additionalProperties": { "type": "string" } }, + "conditions": { + "description": "Custom package resolution conditions used to resolve conditional exports/imports. Defaults to ['module', 'development'/'production']. The following special conditions are always present if the requirements are satisfied: 'default', 'import', 'require', 'browser', 'node'. _Note: this is only supported in Angular versions >= 20.0.0_.", + "type": "array", + "items": { "type": "string" } + }, "fileReplacements": { "description": "Replace compilation source files with other compilation source files in the build.", "type": "array", @@ -322,7 +326,7 @@ "default": [] }, "outputPath": { - "description": "Specify the output path relative to workspace root. _Note: the object notation is only supported in Angular versions >= 17.1.0_.", + "description": "Specify the output path relative to workspace root.", "oneOf": [ { "type": "object", @@ -387,6 +391,11 @@ "type": "boolean", "description": "Resolve vendor packages source maps.", "default": false + }, + "sourcesContent": { + "type": "boolean", + "description": "Output original source content for files within the source map. _Note: this is only supported in Angular versions >= 20.0.0_.", + "default": true } }, "additionalProperties": false @@ -511,7 +520,7 @@ "preloadInitial": { "type": "boolean", "default": true, - "description": "Generates 'preload', 'modulepreload', and 'preconnect' link elements for initial application files and resources. _Note: this is only supported in Angular versions >= 17.1.0_." + "description": "Generates 'preload', 'modulepreload', and 'preconnect' link elements for initial application files and resources." } }, "required": ["input"] @@ -694,12 +703,12 @@ } }, "indexHtmlTransformer": { - "description": "Path to a file exposing a default function to transform the `index.html` file. _Note: this is only supported in Angular versions >= 17.1.0_.", + "description": "Path to a file exposing a default function to transform the `index.html` file.", "type": "string" } }, "additionalProperties": false, - "required": ["outputPath", "index", "browser", "tsConfig"], + "required": ["outputPath", "tsConfig"], "definitions": { "assetPattern": { "oneOf": [ diff --git a/docs/generated/packages/angular/executors/dev-server.json b/docs/generated/packages/angular/executors/dev-server.json index 838ec08c7e..44ccd0ebe9 100644 --- a/docs/generated/packages/angular/executors/dev-server.json +++ b/docs/generated/packages/angular/executors/dev-server.json @@ -8,18 +8,12 @@ "$schema": "http://json-schema.org/draft-07/schema", "title": "Schema for Webpack Dev Server", "description": "Serves an Angular application using [webpack](https://webpack.js.org/) when the build target is using a webpack-based executor, or [Vite](https://vitejs.dev/) when the build target uses an [esbuild](https://esbuild.github.io/)-based executor.", - "examplesFile": "This executor is a drop-in replacement for the `@angular-devkit/build-angular:dev-server` builder provided by the Angular CLI. In addition to the features provided by the Angular CLI builder, the `@nx/angular:dev-server` executor also supports the following:\n\n- Serving applications with Vite when using the `@nx/angular:application` or `@nx/angular:browser-esbuild` executors to build them\n- Serving applications with webpack when using the `@nx/angular:webpack-browser` executor\n- Providing HTTP request middleware functions when the build target is using an esbuild-based executor\n- Incremental builds\n\n## Examples\n\n{% tabs %}\n{% tab label=\"Using a custom webpack configuration\" %}\n\nThis executor should be used along with `@nx/angular:webpack-browser` to serve an application using a custom webpack configuration.\n\nAdd the `serve` target using the `@nx/angular:dev-server` executor, set the `build` target executor as `@nx/angular:webpack-browser` and set the `customWebpackConfig` option as shown below:\n\n```json {% fileName=\"apps/my-app/project.json\" highlightLines=[2,\"5-7\",\"10-20\"] %}\n\"build\": {\n \"executor\": \"@nx/angular:webpack-browser\",\n \"options\": {\n ...\n \"customWebpackConfig\": {\n \"path\": \"apps/my-app/webpack.config.js\"\n }\n }\n},\n\"serve\": {\n \"executor\": \"@nx/angular:dev-server\",\n \"configurations\": {\n \"production\": {\n \"buildTarget\": \"my-app:build:production\"\n },\n \"development\": {\n \"buildTarget\": \"my-app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n}\n```\n\n```js {% fileName=\"apps/my-app/webpack.config.js\" %}\nmodule.exports = (config) => {\n // update the config with your custom configuration\n\n return config;\n};\n```\n\n{% /tab %}\n\n{% tab label=\"Providing HTTP request middleware function\" %}\n\n{% callout type=\"warning\" title=\"Overrides\" }\n\nAvailable for workspaces using Angular version 17.0.0 or greater and with `build` targets using an esbuild-based executor.\n\n{% /callout %}\n\nThe executor accepts an `esbuildMiddleware` option that allows you to provide HTTP require middleware functions that will be used by the Vite development server.\n\n```json {% fileName=\"apps/my-app/project.json\" highlightLines=[8] %}\n{\n ...\n \"targets\": {\n \"serve\": {\n \"executor\": \"@nx/angular:dev-server\",\n \"options\": {\n ...\n \"esbuildMiddleware\": [\"apps/my-app/hello-world.middleware.ts\"]\n }\n }\n ...\n }\n}\n```\n\n```ts {% fileName=\"apps/my-app/hello-world.middleware.ts\" %}\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\nconst helloWorldMiddleware = (\n req: IncomingMessage,\n res: ServerResponse,\n next: (err?: unknown) => void\n) => {\n if (req.url === '/hello-world') {\n res.end('

Hello World!

');\n } else {\n next();\n }\n};\n\nexport default helloWorldMiddleware;\n```\n\n{% /tab %}\n", + "examplesFile": "This executor is a drop-in replacement for the `@angular-devkit/build-angular:dev-server` builder provided by the Angular CLI. In addition to the features provided by the Angular CLI builder, the `@nx/angular:dev-server` executor also supports the following:\n\n- Serving applications with Vite when using the `@nx/angular:application` or `@nx/angular:browser-esbuild` executors to build them\n- Serving applications with webpack when using the `@nx/angular:webpack-browser` executor\n- Providing HTTP request middleware functions when the build target is using an esbuild-based executor\n- Incremental builds\n\n## Examples\n\n{% tabs %}\n{% tab label=\"Using a custom webpack configuration\" %}\n\nThis executor should be used along with `@nx/angular:webpack-browser` to serve an application using a custom webpack configuration.\n\nAdd the `serve` target using the `@nx/angular:dev-server` executor, set the `build` target executor as `@nx/angular:webpack-browser` and set the `customWebpackConfig` option as shown below:\n\n```json {% fileName=\"apps/my-app/project.json\" highlightLines=[2,\"5-7\",\"10-20\"] %}\n\"build\": {\n \"executor\": \"@nx/angular:webpack-browser\",\n \"options\": {\n ...\n \"customWebpackConfig\": {\n \"path\": \"apps/my-app/webpack.config.js\"\n }\n }\n},\n\"serve\": {\n \"executor\": \"@nx/angular:dev-server\",\n \"configurations\": {\n \"production\": {\n \"buildTarget\": \"my-app:build:production\"\n },\n \"development\": {\n \"buildTarget\": \"my-app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n}\n```\n\n```js {% fileName=\"apps/my-app/webpack.config.js\" %}\nmodule.exports = (config) => {\n // update the config with your custom configuration\n\n return config;\n};\n```\n\n{% /tab %}\n\n{% tab label=\"Providing HTTP request middleware function\" %}\n\nThe executor accepts an `esbuildMiddleware` option that allows you to provide HTTP require middleware functions that will be used by the Vite development server.\n\n```json {% fileName=\"apps/my-app/project.json\" highlightLines=[8] %}\n{\n ...\n \"targets\": {\n \"serve\": {\n \"executor\": \"@nx/angular:dev-server\",\n \"options\": {\n ...\n \"esbuildMiddleware\": [\"apps/my-app/hello-world.middleware.ts\"]\n }\n }\n ...\n }\n}\n```\n\n```ts {% fileName=\"apps/my-app/hello-world.middleware.ts\" %}\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\nconst helloWorldMiddleware = (\n req: IncomingMessage,\n res: ServerResponse,\n next: (err?: unknown) => void\n) => {\n if (req.url === '/hello-world') {\n res.end('

Hello World!

');\n } else {\n next();\n }\n};\n\nexport default helloWorldMiddleware;\n```\n\n{% /tab %}\n", "type": "object", "presets": [ { "name": "Using a Different Port", "keys": ["buildTarget", "port"] } ], "properties": { - "browserTarget": { - "type": "string", - "description": "A browser builder target to serve in the format of `project:target[:configuration]`. Ignored if `buildTarget` is set.", - "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed when Angular v20 is released." - }, "buildTarget": { "type": "string", "description": "A build builder target to serve in the format of `project:target[:configuration]`.", @@ -122,7 +116,7 @@ ] }, "prebundle": { - "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other Webpack-based builders. _Note: this is only supported in Angular versions >= 17.2.0_.", + "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other Webpack-based builders.", "oneOf": [ { "type": "boolean" }, { @@ -141,7 +135,7 @@ }, "buildLibsFromSource": { "type": "boolean", - "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `browserTarget` options, or it will default to `true` if it's also not set in the `browserTarget` options.", + "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `buildTarget` options, or it will default to `true` if it's also not set in the `buildTarget` options.", "x-priority": "important" }, "esbuildMiddleware": { @@ -159,10 +153,7 @@ } }, "additionalProperties": false, - "anyOf": [ - { "required": ["buildTarget"] }, - { "required": ["browserTarget"] } - ] + "required": ["buildTarget"] }, "description": "Serves an Angular application using [webpack](https://webpack.js.org/) when the build target is using a webpack-based executor, or [Vite](https://vitejs.dev/) when the build target uses an [esbuild](https://esbuild.github.io/)-based executor.", "aliases": [], diff --git a/docs/generated/packages/angular/executors/extract-i18n.json b/docs/generated/packages/angular/executors/extract-i18n.json index 3a607bbbfd..f7b8115d8c 100644 --- a/docs/generated/packages/angular/executors/extract-i18n.json +++ b/docs/generated/packages/angular/executors/extract-i18n.json @@ -41,6 +41,11 @@ "outFile": { "type": "string", "description": "Name of the file to output." + }, + "i18nDuplicateTranslation": { + "type": "string", + "description": "How to handle duplicate translations. _Note: this is only available in Angular 20.0.0 and above._", + "enum": ["error", "warning", "ignore"] } }, "additionalProperties": false, diff --git a/docs/generated/packages/angular/executors/module-federation-dev-server.json b/docs/generated/packages/angular/executors/module-federation-dev-server.json index d27cfdf967..c9cc557f34 100644 --- a/docs/generated/packages/angular/executors/module-federation-dev-server.json +++ b/docs/generated/packages/angular/executors/module-federation-dev-server.json @@ -12,12 +12,6 @@ { "name": "Using a Different Port", "keys": ["buildTarget", "port"] } ], "properties": { - "browserTarget": { - "type": "string", - "description": "A browser builder target to serve in the format of `project:target[:configuration]`.", - "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed when Angular v20 is released." - }, "buildTarget": { "type": "string", "description": "A build builder target to serve in the format of `project:target[:configuration]`.", @@ -152,15 +146,12 @@ }, "buildLibsFromSource": { "type": "boolean", - "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `browserTarget` options, or it will default to `true` if it's also not set in the `browserTarget` options.", + "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `buildTarget` options, or it will default to `true` if it's also not set in the `buildTarget` options.", "x-priority": "important" } }, "additionalProperties": false, - "anyOf": [ - { "required": ["buildTarget"] }, - { "required": ["browserTarget"] } - ], + "required": ["buildTarget"], "examplesFile": "## Examples\n\n{% tabs %}\n\n{% tab label=\"Basic Usage\" %}\nThe Module Federation Dev Server will serve a host application and find the remote applications associated with the host and serve them statically also. \nSee an example set up of it below:\n\n```json\n{\n \"serve\": {\n \"executor\": \"@nx/angular:module-federation-dev-server\",\n \"configurations\": {\n \"production\": {\n \"buildTarget\": \"host:build:production\"\n },\n \"development\": {\n \"buildTarget\": \"host:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n \"options\": {\n \"port\": 4200,\n \"publicHost\": \"http://localhost:4200\"\n }\n }\n}\n```\n\n{% /tab %}\n\n{% tab label=\"Serve host with remotes that can be live reloaded\" %}\nThe Module Federation Dev Server will serve a host application and find the remote applications associated with the host and serve a set selection with live reloading enabled also. \nSee an example set up of it below:\n\n```json\n{\n \"serve-with-hmr-remotes\": {\n \"executor\": \"@nx/angular:module-federation-dev-server\",\n \"configurations\": {\n \"production\": {\n \"buildTarget\": \"host:build:production\"\n },\n \"development\": {\n \"buildTarget\": \"host:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n \"options\": {\n \"port\": 4200,\n \"publicHost\": \"http://localhost:4200\",\n \"devRemotes\": [\n \"remote1\",\n {\n \"remoteName\": \"remote2\",\n \"configuration\": \"development\"\n }\n ]\n }\n }\n}\n```\n\n{% /tab %}\n\n{% /tabs %}\n" }, "description": "Serves host [Module Federation](https://module-federation.io/) applications ([webpack](https://webpack.js.org/)-based) allowing to specify which remote applications should be served with the host.", diff --git a/docs/generated/packages/angular/executors/ng-packagr-lite.json b/docs/generated/packages/angular/executors/ng-packagr-lite.json index 5afa9203fc..197fc3a075 100644 --- a/docs/generated/packages/angular/executors/ng-packagr-lite.json +++ b/docs/generated/packages/angular/executors/ng-packagr-lite.json @@ -34,11 +34,10 @@ }, "poll": { "type": "number", - "description": "Enable and define the file watching poll time period in milliseconds. _Note: this is only supported in Angular versions >= 18.0.0_." + "description": "Enable and define the file watching poll time period in milliseconds." } }, - "additionalProperties": false, - "required": ["project"] + "additionalProperties": false }, "description": "Builds an Angular library with support for incremental builds.\n\nThis executor is meant to be used with buildable libraries in an incremental build scenario. It is similar to the `@nx/angular:package` executor but it only produces ESM2022 bundles.", "aliases": [], diff --git a/docs/generated/packages/angular/executors/package.json b/docs/generated/packages/angular/executors/package.json index 8a7e2f7ad6..dd7ff75766 100644 --- a/docs/generated/packages/angular/executors/package.json +++ b/docs/generated/packages/angular/executors/package.json @@ -36,13 +36,10 @@ }, "poll": { "type": "number", - "description": "Enable and define the file watching poll time period in milliseconds. _Note: this is only supported in Angular versions >= 18.0.0_." + "description": "Enable and define the file watching poll time period in milliseconds." } }, - "additionalProperties": false, - "required": [ - "project" - ] + "additionalProperties": false }, "description": "Builds and packages an Angular library producing an output following the Angular Package Format (APF) to be distributed as an NPM package.\n\nThis executor is a drop-in replacement for the `@angular-devkit/build-angular:ng-packagr` and `@angular/build:ng-packagr` builders, with additional support for incremental builds.", "aliases": [], diff --git a/docs/generated/packages/angular/generators/application.json b/docs/generated/packages/angular/generators/application.json index 0d37d84906..7c46efa901 100644 --- a/docs/generated/packages/angular/generators/application.json +++ b/docs/generated/packages/angular/generators/application.json @@ -174,7 +174,7 @@ "default": false }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" } }, diff --git a/docs/generated/packages/angular/generators/component.json b/docs/generated/packages/angular/generators/component.json index 65a4cb9b13..8e8c982610 100644 --- a/docs/generated/packages/angular/generators/component.json +++ b/docs/generated/packages/angular/generators/component.json @@ -95,8 +95,7 @@ }, "type": { "type": "string", - "description": "Adds a developer-defined type to the filename, in the format `name.type.ts`.", - "default": "component" + "description": "Append a custom type to the component's filename. It defaults to 'component' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." }, "export": { "type": "boolean", @@ -109,6 +108,11 @@ "default": false, "description": "Use default export for the component instead of a named export." }, + "ngHtml": { + "type": "boolean", + "default": false, + "description": "Generate component template files with an '.ng.html' file extension instead of '.html'." + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", @@ -117,7 +121,7 @@ } }, "required": ["path"], - "examplesFile": "## Examples\n\n{% tabs %}\n{% tab label=\"Simple Component\" %}\n\nGenerate a component named `MyComponent` at `apps/my-app/src/lib/my-component/my-component.component.ts`:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/my-component/my-component.ts\n```\n\n{% /tab %}\n\n{% tab label=\"Without Providing the File Extension\" %}\n\nGenerate a component named `MyComponent` at `apps/my-app/src/lib/my-component/my-component.component.ts`:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/my-component/my-component\n```\n\n{% /tab %}\n\n{% tab label=\"With Different Symbol Name\" %}\n\nGenerate a component named `CustomComponent` at `apps/my-app/src/lib/my-component/my-component.component.ts`:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/my-component/my-component --name=custom\n```\n\n{% /tab %}\n\n{% tab label=\"Single File Component\" %}\n\nCreate a component named `my-component` with inline styles and inline template:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/my-component/my-component --inlineStyle --inlineTemplate\n```\n\n{% /tab %}\n\n{% tab label=\"Component with OnPush Change Detection Strategy\" %}\n\nCreate a component named `my-component` with OnPush Change Detection Strategy:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/my-component/my-component --changeDetection=OnPush\n```\n\n{% /tab %}\n", + "examplesFile": "## Examples\n\n{% tabs %}\n{% tab label=\"Simple Component\" %}\n\nGenerate a component named `Card` at `apps/my-app/src/lib/card/card.ts`:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/card/card.ts\n```\n\n{% /tab %}\n\n{% tab label=\"Without Providing the File Extension\" %}\n\nGenerate a component named `Card` at `apps/my-app/src/lib/card/card.ts`:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/card/card\n```\n\n{% /tab %}\n\n{% tab label=\"With Different Symbol Name\" %}\n\nGenerate a component named `Custom` at `apps/my-app/src/lib/card/card.ts`:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/card/card --name=custom\n```\n\n{% /tab %}\n\n{% tab label=\"With a Component Type\" %}\n\nGenerate a component named `CardComponent` at `apps/my-app/src/lib/card/card.component.ts`:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/card/card --type=component\n```\n\n{% /tab %}\n\n{% tab label=\"Single File Component\" %}\n\nCreate a component named `Card` with inline styles and inline template:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/card/card --inlineStyle --inlineTemplate\n```\n\n{% /tab %}\n\n{% tab label=\"Component with OnPush Change Detection Strategy\" %}\n\nCreate a component named `Card` with `OnPush` Change Detection Strategy:\n\n```bash\nnx g @nx/angular:component apps/my-app/src/lib/card/card --changeDetection=OnPush\n```\n\n{% /tab %}\n", "presets": [] }, "aliases": ["c"], diff --git a/docs/generated/packages/angular/generators/directive.json b/docs/generated/packages/angular/generators/directive.json index 6cab845005..ba701e61cb 100644 --- a/docs/generated/packages/angular/generators/directive.json +++ b/docs/generated/packages/angular/generators/directive.json @@ -15,11 +15,15 @@ "command": "nx g @nx/angular:directive mylib/src/lib/foo.directive.ts" }, { - "description": "Generate a directive without providing the file extension. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive without providing the file extension. It results in the directive `Foo` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:directive mylib/src/lib/foo" }, { - "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `CustomDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive with a given type/suffix. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "command": "nx g @nx/angular:directive mylib/src/lib/foo --type=directive" + }, + { + "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `Custom` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:directive mylib/src/lib/foo --name=custom" } ], @@ -73,6 +77,10 @@ "default": false, "description": "The declaring NgModule exports this directive." }, + "type": { + "type": "string", + "description": "Append a custom type to the directive's filename. It defaults to 'directive' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." + }, "skipFormat": { "type": "boolean", "default": false, diff --git a/docs/generated/packages/angular/generators/host.json b/docs/generated/packages/angular/generators/host.json index e19716c567..2a710a4a09 100644 --- a/docs/generated/packages/angular/generators/host.json +++ b/docs/generated/packages/angular/generators/host.json @@ -175,7 +175,7 @@ "x-priority": "important" }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" }, "typescriptConfiguration": { diff --git a/docs/generated/packages/angular/generators/ngrx.json b/docs/generated/packages/angular/generators/ngrx.json index 8a219a39e2..8afb903818 100644 --- a/docs/generated/packages/angular/generators/ngrx.json +++ b/docs/generated/packages/angular/generators/ngrx.json @@ -11,11 +11,11 @@ "type": "object", "examples": [ { - "command": "nx g @nx/angular:ngrx --root --parent=apps/my-app/src/app/app.module.ts --facade=false placeholder", + "command": "nx g @nx/angular:ngrx --root --parent=apps/my-app/src/app/app-module.ts --facade=false placeholder", "description": "Add root ngrx configration to the `my-app` application" }, { - "command": "nx g @nx/angular:ngrx --parent=libs/my-lib/src/lib/my-lib.module.ts --facade=true --root=false users", + "command": "nx g @nx/angular:ngrx --parent=libs/my-lib/src/lib/my-lib-module.ts --facade=true --root=false users", "description": "Add a `users` state with a facade to the `my-lib` library. It will be tracked under the default `+state` folder in the lib" }, { @@ -42,7 +42,7 @@ }, "parent": { "type": "string", - "description": "The path to the file where the state will be registered. For NgModule usage, this will be your `app.module.ts` for your root state, or your Feature Module for feature state. For Standalone API usage, this will be your `app.config.ts` file for your root state, or the Routes definition file for your feature state. The host directory will create/use the new state directory.", + "description": "The path to the file where the state will be registered. For NgModule usage, this will be your `app-module.ts` for your root state, or your Feature Module for feature state. For Standalone API usage, this will be your `app.config.ts` file for your root state, or the Routes definition file for your feature state. The host directory will create/use the new state directory.", "x-prompt": "What is the path to the module or Routes definition where this NgRx state should be registered?", "x-priority": "important" }, diff --git a/docs/generated/packages/angular/generators/pipe.json b/docs/generated/packages/angular/generators/pipe.json index d2bdb46f56..b6142cdbaa 100644 --- a/docs/generated/packages/angular/generators/pipe.json +++ b/docs/generated/packages/angular/generators/pipe.json @@ -15,11 +15,15 @@ "command": "nx g @nx/angular:pipe mylib/src/lib/foo.pipe.ts" }, { - "description": "Generate a pipe without providing the file extension. It results in the pipe `FooPipe` at `mylib/src/lib/foo.pipe.ts`", + "description": "Generate a pipe without providing the file extension. It results in the pipe `FooPipe` at `mylib/src/lib/foo-pipe.ts`", "command": "nx g @nx/angular:pipe mylib/src/lib/foo" }, { - "description": "Generate a pipe with the exported symbol different from the file name. It results in the pipe `CustomPipe` at `mylib/src/lib/foo.pipe.ts`", + "description": "Generate a pipe with a different type separator. It results in the pipe `FooPipe` at `mylib/src/lib/foo.pipe.ts`", + "command": "nx g @nx/angular:pipe mylib/src/lib/foo --typeSeparator=." + }, + { + "description": "Generate a pipe with the exported symbol different from the file name. It results in the pipe `CustomPipe` at `mylib/src/lib/foo-pipe.ts`", "command": "nx g @nx/angular:pipe mylib/src/lib/foo --name=custom" } ], @@ -59,6 +63,11 @@ "default": false, "description": "The declaring NgModule exports this pipe." }, + "typeSeparator": { + "type": "string", + "enum": ["-", "."], + "description": "The separator character to use before the type within the generated file's name. For example, if you set the option to `.`, the file will be named `example.pipe.ts`. It defaults to '-' for Angular v20+. For versions below v20, it defaults to '.'." + }, "skipFormat": { "type": "boolean", "default": false, diff --git a/docs/generated/packages/angular/generators/remote.json b/docs/generated/packages/angular/generators/remote.json index 18a26c6023..b7d489b05e 100644 --- a/docs/generated/packages/angular/generators/remote.json +++ b/docs/generated/packages/angular/generators/remote.json @@ -168,7 +168,7 @@ "default": false }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" }, "typescriptConfiguration": { diff --git a/docs/generated/packages/angular/generators/scam-directive.json b/docs/generated/packages/angular/generators/scam-directive.json index a6bd20adf5..b03bcb75db 100644 --- a/docs/generated/packages/angular/generators/scam-directive.json +++ b/docs/generated/packages/angular/generators/scam-directive.json @@ -13,11 +13,15 @@ "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo.directive.ts" }, { - "description": "Generate a directive without providing the file extension. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive without providing the file extension. It results in the directive `Foo` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo" }, { - "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `CustomDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive with a given type/suffix. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo --type=directive" + }, + { + "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `Custom` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo --name=custom" } ], @@ -65,6 +69,10 @@ "default": true, "x-priority": "important" }, + "type": { + "type": "string", + "description": "Append a custom type to the directive's filename. It defaults to 'directive' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", diff --git a/docs/generated/packages/angular/generators/scam-pipe.json b/docs/generated/packages/angular/generators/scam-pipe.json index 96035de5df..0f96cf92ab 100644 --- a/docs/generated/packages/angular/generators/scam-pipe.json +++ b/docs/generated/packages/angular/generators/scam-pipe.json @@ -51,6 +51,11 @@ "default": true, "x-priority": "important" }, + "typeSeparator": { + "type": "string", + "enum": ["-", "."], + "description": "The separator character to use before the type within the generated file's name. For example, if you set the option to `.`, the file will be named `example.pipe.ts`. It defaults to '-' for Angular v20+. For versions below v20, it defaults to '.'." + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", diff --git a/docs/generated/packages/angular/generators/scam.json b/docs/generated/packages/angular/generators/scam.json index 418d311414..d16520de48 100644 --- a/docs/generated/packages/angular/generators/scam.json +++ b/docs/generated/packages/angular/generators/scam.json @@ -94,8 +94,7 @@ }, "type": { "type": "string", - "description": "Adds a developer-defined type to the filename, in the format `name.type.ts`.", - "default": "component" + "description": "Append a custom type to the component's filename. It defaults to 'component' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." }, "prefix": { "type": "string", diff --git a/docs/generated/packages/angular/generators/setup-ssr.json b/docs/generated/packages/angular/generators/setup-ssr.json index 5c03b2aab9..ea4de81a7a 100644 --- a/docs/generated/packages/angular/generators/setup-ssr.json +++ b/docs/generated/packages/angular/generators/setup-ssr.json @@ -53,7 +53,7 @@ "default": true }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" }, "skipFormat": { diff --git a/docs/generated/packages/angular/migrations/21.2.0-package-updates.json b/docs/generated/packages/angular/migrations/21.2.0-package-updates.json new file mode 100644 index 0000000000..148284e0a0 --- /dev/null +++ b/docs/generated/packages/angular/migrations/21.2.0-package-updates.json @@ -0,0 +1,68 @@ +{ + "name": "21.2.0-package-updates", + "version": "21.2.0-beta.0", + "x-prompt": "Do you want to update the Angular version to v20?", + "requires": { "@angular/core": ">=19.2.0 <20.0.0-rc.2" }, + "packages": { + "@angular-devkit/build-angular": { + "version": "20.0.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/core": { + "version": "20.0.0-rc.3", + "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", + "alwaysAddToPackageJson": false + }, + "@schematics/angular": { + "version": "20.0.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/architect": { + "version": "0.2000.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/build-webpack": { + "version": "0.2000.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular/core": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": true + }, + "@angular/material": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": false + }, + "@angular/cdk": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": false + }, + "@angular/google-maps": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": false + }, + "ng-packagr": { "version": "20.0.0-rc.1", "alwaysAddToPackageJson": false } + }, + "aliases": [], + "description": "", + "hidden": false, + "implementation": "", + "path": "/packages/angular", + "schema": null, + "type": "migration" +} diff --git a/docs/generated/packages/angular/migrations/migrate-provide-server-rendering-import.json b/docs/generated/packages/angular/migrations/migrate-provide-server-rendering-import.json new file mode 100644 index 0000000000..cfade409b5 --- /dev/null +++ b/docs/generated/packages/angular/migrations/migrate-provide-server-rendering-import.json @@ -0,0 +1,14 @@ +{ + "name": "migrate-provide-server-rendering-import", + "version": "21.2.0-beta.0", + "requires": { "@angular/core": ">=20.0.0-rc.2" }, + "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", + "aliases": [], + "hidden": false, + "path": "/packages/angular", + "schema": null, + "type": "migration", + "examplesFile": "#### Migrate Imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`\n\nMigrate the imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`. This migration will also add the `@angular/ssr` package to your dependencies if needed.\n\n#### Examples\n\nChange the import of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering } from '@angular/platform-server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [provideServerRendering()],\n};\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering } from '@angular/ssr';\n\nconst serverConfig: ApplicationConfig = {\n providers: [provideServerRendering()],\n};\n```\n\n{% /tab %}\n{% /tabs %}\n\nIf you already have imports from `@angular/ssr`, the migration will add `provideServerRendering` to the existing import:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"app/app.config.server.ts\" highlightLines=[2,3] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRendering } from '@angular/platform-server';\nimport { 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] %}\nimport { ApplicationConfig } from '@angular/core';\nimport { provideServerRouting, provideServerRendering } from '@angular/ssr';\nimport { serverRoutes } from './app.routes.server';\n\nconst serverConfig: ApplicationConfig = {\n providers: [provideServerRendering(), provideServerRouting(serverRoutes)],\n};\n```\n\n{% /tab %}\n{% /tabs %}\n" +} diff --git a/docs/generated/packages/angular/migrations/replace-provide-server-routing.json b/docs/generated/packages/angular/migrations/replace-provide-server-routing.json new file mode 100644 index 0000000000..e9671537cc --- /dev/null +++ b/docs/generated/packages/angular/migrations/replace-provide-server-routing.json @@ -0,0 +1,14 @@ +{ + "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`.", + "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": [], + "hidden": false, + "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" +} diff --git a/docs/generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json b/docs/generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json new file mode 100644 index 0000000000..8e00489a83 --- /dev/null +++ b/docs/generated/packages/angular/migrations/set-generator-defaults-for-previous-style-guide.json @@ -0,0 +1,14 @@ +{ + "name": "set-generator-defaults-for-previous-style-guide", + "version": "21.2.0-beta.0", + "requires": { "@angular/core": ">=20.0.0-rc.2" }, + "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", + "aliases": [], + "hidden": false, + "path": "/packages/angular", + "schema": null, + "type": "migration", + "examplesFile": "#### Set Generator Defaults for Previous Style Guide\n\nUpdates the generator defaults in the `nx.json` file to maintain the previous Angular Style Guide behavior. This ensures that newly generated code in existing workspaces follows the same conventions as the existing codebase.\n\n#### Examples\n\nThe migration will add default configurations for the relevant Angular generators in the workspace's `nx.json` file:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```json {% fileName=\"nx.json\" %}\n{\n \"generators\": {}\n}\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```json {% fileName=\"nx.json\" %}\n{\n \"generators\": {\n \"@nx/angular:component\": {\n \"type\": \"component\"\n },\n \"@nx/angular:directive\": {\n \"type\": \"directive\"\n },\n \"@nx/angular:service\": {\n \"type\": \"service\"\n },\n \"@nx/angular:scam\": {\n \"type\": \"component\"\n },\n \"@nx/angular:scam-directive\": {\n \"type\": \"directive\"\n },\n \"@nx/angular:guard\": {\n \"typeSeparator\": \".\"\n },\n \"@nx/angular:interceptor\": {\n \"typeSeparator\": \".\"\n },\n \"@nx/angular:module\": {\n \"typeSeparator\": \".\"\n },\n \"@nx/angular:pipe\": {\n \"typeSeparator\": \".\"\n },\n \"@nx/angular:resolver\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:component\": {\n \"type\": \"component\"\n },\n \"@schematics/angular:directive\": {\n \"type\": \"directive\"\n },\n \"@schematics/angular:service\": {\n \"type\": \"service\"\n },\n \"@schematics/angular:guard\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:interceptor\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:module\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:pipe\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:resolver\": {\n \"typeSeparator\": \".\"\n }\n }\n}\n```\n\n{% /tab %}\n{% /tabs %}\n\nIf some of the generator defaults are already set, the migration will not override them:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```json {% fileName=\"nx.json\" highlightLines=[\"3-14\"] %}\n{\n \"generators\": {\n \"@nx/angular:component\": {\n \"type\": \"cmp\"\n },\n \"@schematics/angular:component\": {\n \"type\": \"cmp\"\n },\n \"@nx/angular:interceptor\": {\n \"typeSeparator\": \"-\"\n },\n \"@schematics/angular:interceptor\": {\n \"typeSeparator\": \"-\"\n }\n }\n}\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```json {% fileName=\"nx.json\" highlightLines=[\"3-14\"] %}\n{\n \"generators\": {\n \"@nx/angular:component\": {\n \"type\": \"cmp\"\n },\n \"@schematics/angular:component\": {\n \"type\": \"cmp\"\n },\n \"@nx/angular:interceptor\": {\n \"typeSeparator\": \"-\"\n },\n \"@schematics/angular:interceptor\": {\n \"typeSeparator\": \"-\"\n },\n \"@nx/angular:directive\": {\n \"type\": \"directive\"\n },\n \"@nx/angular:service\": {\n \"type\": \"service\"\n },\n \"@nx/angular:scam\": {\n \"type\": \"component\"\n },\n \"@nx/angular:scam-directive\": {\n \"type\": \"directive\"\n },\n \"@nx/angular:guard\": {\n \"typeSeparator\": \".\"\n },\n \"@nx/angular:module\": {\n \"typeSeparator\": \".\"\n },\n \"@nx/angular:pipe\": {\n \"typeSeparator\": \".\"\n },\n \"@nx/angular:resolver\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:directive\": {\n \"type\": \"directive\"\n },\n \"@schematics/angular:service\": {\n \"type\": \"service\"\n },\n \"@schematics/angular:guard\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:module\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:pipe\": {\n \"typeSeparator\": \".\"\n },\n \"@schematics/angular:resolver\": {\n \"typeSeparator\": \".\"\n }\n }\n}\n```\n\n{% /tab %}\n{% /tabs %}\n" +} diff --git a/docs/generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json b/docs/generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json new file mode 100644 index 0000000000..7039c20489 --- /dev/null +++ b/docs/generated/packages/angular/migrations/update-angular-cli-version-20-0-0-rc-3.json @@ -0,0 +1,15 @@ +{ + "name": "update-angular-cli-version-20-0-0-rc-3", + "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.", + "factory": "./src/migrations/update-21-2-0/update-angular-cli", + "implementation": "/packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts", + "aliases": [], + "hidden": false, + "path": "/packages/angular", + "schema": null, + "type": "migration", + "examplesFile": "#### Sample Code Changes\n\nUpdate the `@angular/cli` package version in the `package.json` file at the workspace root to **~20.0.0**.\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```json {% fileName=\"package.json\" %}\n{\n \"devDependencies\": {\n \"@angular/cli\": \"~19.2.0\"\n }\n}\n```\n\n{% /tab %}\n{% tab label=\"After\" %}\n\n```json {% highlightLines=[3] fileName=\"package.json\" %}\n{\n \"devDependencies\": {\n \"@angular/cli\": \"~20.0.0\"\n }\n}\n```\n\n{% /tab %}\n\n{% /tabs %}\n" +} diff --git a/docs/generated/packages/angular/migrations/update-module-resolution.json b/docs/generated/packages/angular/migrations/update-module-resolution.json new file mode 100644 index 0000000000..ea832e6ac2 --- /dev/null +++ b/docs/generated/packages/angular/migrations/update-module-resolution.json @@ -0,0 +1,14 @@ +{ + "name": "update-module-resolution", + "version": "21.2.0-beta.0", + "requires": { "@angular/core": ">=20.0.0-rc.2" }, + "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", + "aliases": [], + "hidden": false, + "path": "/packages/angular", + "schema": null, + "type": "migration", + "examplesFile": "#### Update `moduleResolution` to `bundler` in TypeScript configurations\n\nUpdates the TypeScript `moduleResolution` option to `'bundler'` for improved compatibility with modern package resolution algorithms used by bundlers like Webpack, Vite, and esbuild.\n\n#### Examples\n\nThe migration will update TypeScript configuration files in your workspace to use the `'bundler'` module resolution strategy:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```json {% fileName=\"apps/app1/tsconfig.app.json\" highlightLines=[\"4\"] %}\n{\n \"compilerOptions\": {\n \"module\": \"es2020\",\n \"moduleResolution\": \"node\"\n }\n}\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```json {% fileName=\"apps/app1/tsconfig.app.json\" highlightLines=[\"4\"] %}\n{\n \"compilerOptions\": {\n \"module\": \"es2020\",\n \"moduleResolution\": \"bundler\"\n }\n}\n```\n\n{% /tab %}\n{% /tabs %}\n\nIf the `moduleResolution` is already set to `'bundler'` or the `module` is set to `'preserve'`, the migration will not modify the configuration:\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```json {% fileName=\"apps/app1/tsconfig.app.json\" highlightLines=[3,4] %}\n{\n \"compilerOptions\": {\n \"module\": \"preserve\",\n \"moduleResolution\": \"node\"\n }\n}\n```\n\n{% /tab %}\n\n{% tab label=\"After\" %}\n\n```json {% fileName=\"apps/app1/tsconfig.app.json\" highlightLines=[3,4] %}\n{\n \"compilerOptions\": {\n \"module\": \"preserve\",\n \"moduleResolution\": \"node\"\n }\n}\n```\n\n{% /tab %}\n{% /tabs %}\n" +} diff --git a/docs/generated/packages/eslint/migrations/21.2.0-@typescript-eslint-package-updates.json b/docs/generated/packages/eslint/migrations/21.2.0-@typescript-eslint-package-updates.json new file mode 100644 index 0000000000..99cdda4c68 --- /dev/null +++ b/docs/generated/packages/eslint/migrations/21.2.0-@typescript-eslint-package-updates.json @@ -0,0 +1,30 @@ +{ + "name": "21.2.0-@typescript-eslint-package-updates", + "version": "21.2.0-beta.0", + "requires": { "@typescript-eslint/eslint-plugin": ">8.0.0 <8.29.0" }, + "packages": { + "typescript-eslint": { "version": "^8.29.0" }, + "@typescript-eslint/eslint-plugin": { "version": "^8.29.0" }, + "@typescript-eslint/parser": { "version": "^8.29.0" }, + "@typescript-eslint/utils": { "version": "^8.29.0" }, + "@typescript-eslint/rule-tester": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/scope-manager": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/typescript-estree": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + } + }, + "aliases": [], + "description": "", + "hidden": false, + "implementation": "", + "path": "/packages/eslint", + "schema": null, + "type": "migration" +} diff --git a/docs/generated/packages/eslint/migrations/21.2.0-typescript-eslint-package-updates.json b/docs/generated/packages/eslint/migrations/21.2.0-typescript-eslint-package-updates.json new file mode 100644 index 0000000000..5bbe3e7f0f --- /dev/null +++ b/docs/generated/packages/eslint/migrations/21.2.0-typescript-eslint-package-updates.json @@ -0,0 +1,30 @@ +{ + "name": "21.2.0-typescript-eslint-package-updates", + "version": "21.2.0-beta.0", + "requires": { "typescript-eslint": ">8.0.0 <8.29.0" }, + "packages": { + "typescript-eslint": { "version": "^8.29.0" }, + "@typescript-eslint/eslint-plugin": { "version": "^8.29.0" }, + "@typescript-eslint/parser": { "version": "^8.29.0" }, + "@typescript-eslint/utils": { "version": "^8.29.0" }, + "@typescript-eslint/rule-tester": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/scope-manager": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/typescript-estree": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + } + }, + "aliases": [], + "description": "", + "hidden": false, + "implementation": "", + "path": "/packages/eslint", + "schema": null, + "type": "migration" +} diff --git a/docs/generated/packages/js/migrations/21.2.0-package-updates.json b/docs/generated/packages/js/migrations/21.2.0-package-updates.json new file mode 100644 index 0000000000..e613ca9e56 --- /dev/null +++ b/docs/generated/packages/js/migrations/21.2.0-package-updates.json @@ -0,0 +1,16 @@ +{ + "name": "21.2.0-package-updates", + "version": "21.2.0-beta.0", + "x-prompt": "Do you want to update to TypeScript v5.8?", + "requires": { "typescript": ">=5.7.0 <5.8.0" }, + "packages": { + "typescript": { "version": "~5.8.2", "alwaysAddToPackageJson": false } + }, + "aliases": [], + "description": "", + "hidden": false, + "implementation": "", + "path": "/packages/js", + "schema": null, + "type": "migration" +} diff --git a/docs/generated/packages/workspace/generators/new.json b/docs/generated/packages/workspace/generators/new.json index f485a8d30b..a213115c73 100644 --- a/docs/generated/packages/workspace/generators/new.json +++ b/docs/generated/packages/workspace/generators/new.json @@ -90,10 +90,6 @@ "type": "boolean", "default": false }, - "serverRouting": { - "description": "Use the Angular Server Routing and App Engine APIs (Developer Preview).", - "type": "boolean" - }, "prefix": { "description": "The prefix to use for Angular component and directive selectors.", "type": "string" diff --git a/docs/generated/packages/workspace/generators/preset.json b/docs/generated/packages/workspace/generators/preset.json index bd928ff683..b7c32afaab 100644 --- a/docs/generated/packages/workspace/generators/preset.json +++ b/docs/generated/packages/workspace/generators/preset.json @@ -107,10 +107,6 @@ "type": "boolean", "default": false }, - "serverRouting": { - "description": "Use the Angular Server Routing and App Engine APIs (Developer Preview).", - "type": "boolean" - }, "prefix": { "description": "The prefix to use for Angular component and directive selectors.", "type": "string" diff --git a/docs/generated/packages/workspace/migrations/21.2.0-package-updates.json b/docs/generated/packages/workspace/migrations/21.2.0-package-updates.json new file mode 100644 index 0000000000..84ce142e23 --- /dev/null +++ b/docs/generated/packages/workspace/migrations/21.2.0-package-updates.json @@ -0,0 +1,16 @@ +{ + "name": "21.2.0-package-updates", + "version": "21.2.0-beta.0", + "x-prompt": "Do you want to update to TypeScript v5.8?", + "requires": { "typescript": ">=5.7.0 <5.8.0" }, + "packages": { + "typescript": { "version": "~5.8.2", "alwaysAddToPackageJson": false } + }, + "aliases": [], + "description": "", + "hidden": false, + "implementation": "", + "path": "/packages/workspace", + "schema": null, + "type": "migration" +} diff --git a/e2e/angular/src/config.test.ts b/e2e/angular/src/config.test.ts index f7f0c3df96..ea730c70a7 100644 --- a/e2e/angular/src/config.test.ts +++ b/e2e/angular/src/config.test.ts @@ -13,7 +13,9 @@ describe('angular.json v1 config', () => { beforeAll(() => { newProject({ packages: ['@nx/angular'] }); - runCLI(`generate @nx/angular:app ${app1} --no-interactive`); + runCLI( + `generate @nx/angular:app ${app1} --bundler=webpack --no-interactive` + ); // reset workspace to use v1 config updateFile(`angular.json`, angularV1Json(app1)); removeFile(`${app1}/project.json`); diff --git a/e2e/angular/src/cypress-component-tests.test.ts b/e2e/angular/src/cypress-component-tests.test.ts index b780433646..5ce393768a 100644 --- a/e2e/angular/src/cypress-component-tests.test.ts +++ b/e2e/angular/src/cypress-component-tests.test.ts @@ -88,7 +88,7 @@ describe('Angular Cypress Component Tests', () => { } ); updateFile( - `${buildableLibName}/src/lib/input-standalone/input-standalone.component.cy.ts`, + `${buildableLibName}/src/lib/input-standalone/input-standalone.cy.ts`, (content) => { // text-green-500 should now apply return content.replace('rgb(0, 0, 0)', 'rgb(34, 197, 94)'); @@ -149,7 +149,7 @@ function createLib(projectName: string, appName: string, libName: string) { `generate @nx/angular:component ${libName}/src/lib/btn-standalone/btn-standalone --inlineTemplate --inlineStyle --export --standalone --no-interactive` ); updateFile( - `${libName}/src/lib/btn/btn.component.ts`, + `${libName}/src/lib/btn/btn.ts`, ` import { Component, Input } from '@angular/core'; @@ -158,13 +158,13 @@ import { Component, Input } from '@angular/core'; template: '', styles: [] }) -export class BtnComponent { +export class Btn { @Input() text = 'something'; } ` ); updateFile( - `${libName}/src/lib/btn-standalone/btn-standalone.component.ts`, + `${libName}/src/lib/btn-standalone/btn-standalone.ts`, ` import { Component, Input } from '@angular/core'; import { CommonModule } from '@angular/common'; @@ -175,7 +175,7 @@ import { CommonModule } from '@angular/common'; template: '', styles: [], }) -export class BtnStandaloneComponent { +export class BtnStandalone { @Input() text = 'something'; } ` @@ -187,7 +187,7 @@ function createBuildableLib(projectName: string, libName: string) { runCLI(`generate @nx/angular:lib ${libName} --buildable --no-interactive`); // create cmp for lib runCLI( - `generate @nx/angular:component ${libName}/src/lib/input/input --inlineTemplate --inlineStyle --export --no-interactive` + `generate @nx/angular:component ${libName}/src/lib/input/input.component --inlineTemplate --inlineStyle --export --no-interactive` ); // create standlone cmp for lib runCLI( @@ -210,7 +210,7 @@ import {Component, Input} from '@angular/core'; ` ); updateFile( - `${libName}/src/lib/input-standalone/input-standalone.component.ts`, + `${libName}/src/lib/input-standalone/input-standalone.ts`, ` import {Component, Input} from '@angular/core'; import {CommonModule} from '@angular/common'; @@ -221,7 +221,7 @@ import {CommonModule} from '@angular/common'; template: \`\`, styles : [] }) - export class InputStandaloneComponent{ + export class InputStandalone{ @Input() readOnly = false; } ` @@ -230,7 +230,7 @@ import {CommonModule} from '@angular/common'; function useLibInApp(projectName: string, appName: string, libName: string) { createFile( - `${appName}/src/app/app.component.html`, + `${appName}/src/app/app.html`, ` <${projectName}-btn> <${projectName}-btn-standalone> @@ -239,7 +239,7 @@ function useLibInApp(projectName: string, appName: string, libName: string) { ); const btnModuleName = names(libName).className; updateFile( - `${appName}/src/app/app.component.scss`, + `${appName}/src/app/app.scss`, ` @use 'styleguide' as *; @@ -248,20 +248,20 @@ h1 { }` ); updateFile( - `${appName}/src/app/app.module.ts`, + `${appName}/src/app/app-module.ts`, ` import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import {${btnModuleName}Module} from "@${projectName}/${libName}"; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { App } from './app'; +import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [BrowserModule, ${btnModuleName}Module], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {} ` @@ -328,25 +328,25 @@ describe(InputComponent.name, () => { ); createFile( - `${libName}/src/lib/input-standalone/input-standalone.component.cy.ts`, + `${libName}/src/lib/input-standalone/input-standalone.cy.ts`, ` import { MountConfig } from 'cypress/angular'; -import { InputStandaloneComponent } from './input-standalone.component'; +import { InputStandalone } from './input-standalone'; -describe(InputStandaloneComponent.name, () => { - const config: MountConfig = { +describe(InputStandalone.name, () => { + const config: MountConfig = { declarations: [], imports: [], providers: [], }; it('renders', () => { - cy.mount(InputStandaloneComponent, config); + cy.mount(InputStandalone, config); // make sure tailwind isn't getting applied cy.get('label').should('have.css', 'color', 'rgb(0, 0, 0)'); }); it('should be readonly', () => { - cy.mount(InputStandaloneComponent, { + cy.mount(InputStandalone, { ...config, componentProperties: { readOnly: true, @@ -367,19 +367,19 @@ function useBuildableLibInLib( const buildLibNames = names(buildableLibName); // use the buildable lib in lib so now buildableLib has an indirect dep on app updateFile( - `${libName}/src/lib/btn-standalone/btn-standalone.component.ts`, + `${libName}/src/lib/btn-standalone/btn-standalone.ts`, ` import { Component, Input } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { InputStandaloneComponent } from '@${projectName}/${buildLibNames.fileName}'; +import { InputStandalone } from '@${projectName}/${buildLibNames.fileName}'; @Component({ selector: '${projectName}-btn-standalone', standalone: true, - imports: [CommonModule, InputStandaloneComponent], + imports: [CommonModule, InputStandalone], template: '${projectName} <${projectName}-input-standalone>', styles: [], }) -export class BtnStandaloneComponent { +export class BtnStandalone { @Input() text = 'something'; } ` @@ -394,7 +394,7 @@ function updateBuilableLibTestsToAssertAppStyles( removeFile(`${buildableLibName}/src/lib/input/input.component.cy.ts`); updateFile( - `${buildableLibName}/src/lib/input-standalone/input-standalone.component.cy.ts`, + `${buildableLibName}/src/lib/input-standalone/input-standalone.cy.ts`, (content) => { // app styles should now apply return content.replace('rgb(34, 197, 94)', 'rgb(255, 192, 203)'); diff --git a/e2e/angular/src/misc.test.ts b/e2e/angular/src/misc.test.ts index 4c171ed6c3..f6fe69fe35 100644 --- a/e2e/angular/src/misc.test.ts +++ b/e2e/angular/src/misc.test.ts @@ -46,10 +46,8 @@ describe('Move Angular Project', () => { expect(moveOutput).toContain(`CREATE ${newPath}/src/main.ts`); expect(moveOutput).toContain(`CREATE ${newPath}/src/styles.css`); expect(moveOutput).toContain(`CREATE ${newPath}/src/test-setup.ts`); - expect(moveOutput).toContain( - `CREATE ${newPath}/src/app/app.component.html` - ); - expect(moveOutput).toContain(`CREATE ${newPath}/src/app/app.component.ts`); + expect(moveOutput).toContain(`CREATE ${newPath}/src/app/app.html`); + expect(moveOutput).toContain(`CREATE ${newPath}/src/app/app.ts`); expect(moveOutput).toContain(`CREATE ${newPath}/src/app/app.config.ts`); }); @@ -105,7 +103,7 @@ describe('Move Angular Project', () => { runCLI(`generate @nx/angular:lib ${lib2} --no-standalone --no-interactive`); updateFile( - `${lib2}/src/lib/${lib2}.module.ts`, + `${lib2}/src/lib/${lib2}-module.ts`, `import { ${classify(lib1)}Module } from '@${proj}/${lib1}'; export class ExtendedModule extends ${classify(lib1)}Module { }` @@ -122,7 +120,7 @@ describe('Move Angular Project', () => { expect(moveOutput).toContain(`CREATE ${testSetupPath}`); checkFilesExist(testSetupPath); - const modulePath = `${newPath}/src/lib/shared-${lib1}.module.ts`; + const modulePath = `${newPath}/src/lib/shared-${lib1}-module.ts`; expect(moveOutput).toContain(`CREATE ${modulePath}`); checkFilesExist(modulePath); const moduleFile = readFile(modulePath); @@ -132,12 +130,12 @@ describe('Move Angular Project', () => { expect(moveOutput).toContain(`CREATE ${indexPath}`); checkFilesExist(indexPath); const index = readFile(indexPath); - expect(index).toContain(`export * from './lib/shared-${lib1}.module'`); + expect(index).toContain(`export * from './lib/shared-${lib1}-module'`); /** * Check that the import in lib2 has been updated */ - const lib2FilePath = `${lib2}/src/lib/${lib2}.module.ts`; + const lib2FilePath = `${lib2}/src/lib/${lib2}-module.ts`; const lib2File = readFile(lib2FilePath); expect(lib2File).toContain( `import { ${newModule} } from '@${proj}/shared-${lib1}';` diff --git a/e2e/angular/src/module-federation.rspack.test.ts b/e2e/angular/src/module-federation.rspack.test.ts index cc56b9c709..e8585e588e 100644 --- a/e2e/angular/src/module-federation.rspack.test.ts +++ b/e2e/angular/src/module-federation.rspack.test.ts @@ -2,14 +2,11 @@ import { names } from '@nx/devkit'; import { checkFilesExist, cleanupProject, - killPorts, killProcessAndPorts, newProject, readFile, - readJson, runCLI, runCommandUntil, - runE2ETests, uniq, updateFile, updateJson, @@ -63,8 +60,8 @@ describe('Angular Module Federation', () => { // check files are generated without the layout directory ("apps/") checkFilesExist( - `${hostApp}/src/app/app.module.ts`, - `${remoteApp1}/src/app/app.module.ts` + `${hostApp}/src/app/app-module.ts`, + `${remoteApp1}/src/app/app-module.ts` ); // check default generated host is built successfully @@ -96,26 +93,26 @@ describe('Angular Module Federation', () => { // update host & remote files to use shared library updateFile( - `${hostApp}/src/app/app.module.ts`, + `${hostApp}/src/app/app-module.ts`, `import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { ${ names(wildcardLib).className }Module } from '@${proj}/${wildcardLib}/${ names(secondaryEntry).fileName - }.module'; + }-module'; import { ${ names(sharedLib).className }Module } from '@${proj}/${sharedLib}'; import { ${ names(secondaryEntry).className }Module } from '@${proj}/${sharedLib}/${secondaryEntry}'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { App } from './app'; + import { NxWelcome } from './nx-welcome'; import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, ${names(sharedLib).className}Module, @@ -134,13 +131,13 @@ describe('Angular Module Federation', () => { ), ], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {} ` ); updateFile( - `${remoteApp1}/src/app/remote-entry/entry.module.ts`, + `${remoteApp1}/src/app/remote-entry/entry-module.ts`, `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; @@ -148,18 +145,18 @@ describe('Angular Module Federation', () => { import { ${ names(secondaryEntry).className }Module } from '@${proj}/${sharedLib}/${secondaryEntry}'; - import { RemoteEntryComponent } from './entry.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { RemoteEntry } from './entry'; + import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [RemoteEntryComponent, NxWelcomeComponent], + declarations: [RemoteEntry, NxWelcome], imports: [ CommonModule, ${names(sharedLib).className}Module, RouterModule.forChild([ { path: '', - component: RemoteEntryComponent, + component: RemoteEntry, }, ]), ], diff --git a/e2e/angular/src/module-federation.test.ts b/e2e/angular/src/module-federation.test.ts index 45f95c31e1..eb78d0176a 100644 --- a/e2e/angular/src/module-federation.test.ts +++ b/e2e/angular/src/module-federation.test.ts @@ -49,8 +49,8 @@ describe('Angular Module Federation', () => { // check files are generated without the layout directory ("apps/") checkFilesExist( - `${hostApp}/src/app/app.module.ts`, - `${remoteApp1}/src/app/app.module.ts` + `${hostApp}/src/app/app-module.ts`, + `${remoteApp1}/src/app/app-module.ts` ); // check default generated host is built successfully @@ -80,26 +80,26 @@ describe('Angular Module Federation', () => { // update host & remote files to use shared library updateFile( - `${hostApp}/src/app/app.module.ts`, + `${hostApp}/src/app/app-module.ts`, `import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { ${ names(wildcardLib).className }Module } from '@${proj}/${wildcardLib}/${ - names(secondaryEntry).fileName - }.module'; + names(wildcardLib).fileName + }-module'; import { ${ names(sharedLib).className }Module } from '@${proj}/${sharedLib}'; import { ${ names(secondaryEntry).className }Module } from '@${proj}/${sharedLib}/${secondaryEntry}'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { App } from './app'; + import { NxWelcome } from './nx-welcome'; import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, ${names(sharedLib).className}Module, @@ -118,13 +118,13 @@ describe('Angular Module Federation', () => { ), ], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {} ` ); updateFile( - `${remoteApp1}/src/app/remote-entry/entry.module.ts`, + `${remoteApp1}/src/app/remote-entry/entry-module.ts`, `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; @@ -132,18 +132,18 @@ describe('Angular Module Federation', () => { import { ${ names(secondaryEntry).className }Module } from '@${proj}/${sharedLib}/${secondaryEntry}'; - import { RemoteEntryComponent } from './entry.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { RemoteEntry } from './entry'; + import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [RemoteEntryComponent, NxWelcomeComponent], + declarations: [RemoteEntry, NxWelcome], imports: [ CommonModule, ${names(sharedLib).className}Module, RouterModule.forChild([ { path: '', - component: RemoteEntryComponent, + component: RemoteEntry, }, ]), ], @@ -301,7 +301,7 @@ test('renders remotes', async ({ page }) => { // Update Host to use the module updateFile( - `${host}/src/app/app.component.ts`, + `${host}/src/app/app.ts`, ` import { Component } from '@angular/core'; import { isEven } from '${remote}/${module}'; @@ -311,7 +311,7 @@ test('renders remotes', async ({ page }) => { template: \`
{{title}}
\`, standalone: true }) - export class AppComponent { + export class App { title = \`shell is \${isEven(2) ? 'even' : 'odd'}\`; }` ); @@ -373,7 +373,7 @@ test('renders remotes', async ({ page }) => { // Update Host to use the module updateFile( - `${remote}/src/app/remote-entry/entry.component.ts`, + `${remote}/src/app/remote-entry/entry.ts`, ` import { Component } from '@angular/core'; import { isEven } from '${childRemote}/${module}'; @@ -383,7 +383,7 @@ test('renders remotes', async ({ page }) => { template: \`
{{title}}
\`, standalone: true }) - export class RemoteEntryComponent { + export class RemoteEntry { title = \`shell is \${isEven(2) ? 'even' : 'odd'}\`; }` ); @@ -398,7 +398,7 @@ test('renders remotes', async ({ page }) => { remotes: ['${childRemote}'], exposes: { './Routes': '${remote}/src/app/remote-entry/entry.routes.ts', - './Module': '${remote}/src/app/remote-entry/entry.component.ts', + './Module': '${remote}/src/app/remote-entry/entry.ts', }, }; diff --git a/e2e/angular/src/ng-add.test.ts b/e2e/angular/src/ng-add.test.ts index 5a500ae193..0dc85b76ed 100644 --- a/e2e/angular/src/ng-add.test.ts +++ b/e2e/angular/src/ng-add.test.ts @@ -115,7 +115,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { '.prettierrc', `apps/${project}/src/main.ts`, `apps/${project}/src/app/app.config.ts`, - `apps/${project}/src/app/app.component.ts`, + `apps/${project}/src/app/app.ts`, `apps/${project}/src/app/app.routes.ts` ); @@ -178,10 +178,10 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { const projectConfig = readJson(`apps/${project}/project.json`); expect(projectConfig.sourceRoot).toEqual(`apps/${project}/src`); expect(projectConfig.targets.build).toStrictEqual({ - executor: '@angular-devkit/build-angular:application', + executor: '@angular/build:application', + outputs: ['{options.outputPath}'], options: { - outputPath: `dist/apps/${project}`, - index: `apps/${project}/src/index.html`, + outputPath: `dist/${project}`, browser: `apps/${project}/src/main.ts`, polyfills: [`zone.js`], tsConfig: `apps/${project}/tsconfig.app.json`, @@ -214,7 +214,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { defaultConfiguration: 'production', }); expect(projectConfig.targets.serve).toEqual({ - executor: '@angular-devkit/build-angular:dev-server', + executor: '@angular/build:dev-server', configurations: { production: { buildTarget: `${project}:build:production` }, development: { buildTarget: `${project}:build:development` }, @@ -222,7 +222,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { defaultConfiguration: 'development', }); expect(projectConfig.targets.test).toStrictEqual({ - executor: '@angular-devkit/build-angular:karma', + executor: '@angular/build:karma', options: { polyfills: [`zone.js`, `zone.js/testing`], tsConfig: `apps/${project}/tsconfig.spec.json`, @@ -249,7 +249,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { }); runCLI(`build ${project} --configuration production --outputHashing none`); - checkFilesExist(`dist/apps/${project}/browser/main.js`); + checkFilesExist(`dist/${project}/browser/main.js`); }); it('should handle a workspace with cypress v9', () => { @@ -436,7 +436,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { expect(output).toContain( `Successfully ran target build for project ${project}` ); - checkFilesExist(`dist/apps/${project}/browser/main.js`); + checkFilesExist(`dist/${project}/browser/main.js`); output = runCLI(`build ${project} --outputHashing none`); expect(output).toContain( @@ -454,7 +454,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { expect(output).toContain( `Successfully ran target build for project ${app1}` ); - checkFilesExist(`dist/apps/${app1}/browser/main.js`); + checkFilesExist(`dist/${app1}/browser/main.js`); output = runCLI(`build ${app1} --outputHashing none`); expect(output).toContain( diff --git a/e2e/angular/src/ngrx.test.ts b/e2e/angular/src/ngrx.test.ts index e58dab427c..7dc23c94af 100644 --- a/e2e/angular/src/ngrx.test.ts +++ b/e2e/angular/src/ngrx.test.ts @@ -26,7 +26,7 @@ describe('Angular Package', () => { // Generate root ngrx state management runCLI( - `generate @nx/angular:ngrx users --parent=${myapp}/src/app/app.module.ts --root --minimal=false` + `generate @nx/angular:ngrx users --parent=${myapp}/src/app/app-module.ts --root --minimal=false` ); const packageJson = readJson('package.json'); expect(packageJson.dependencies['@ngrx/store']).toBeDefined(); @@ -38,7 +38,7 @@ describe('Angular Package', () => { // Generate feature library and ngrx state within that library runCLI(`g @nx/angular:lib ${mylib} --prefix=fl --no-standalone`); runCLI( - `generate @nx/angular:ngrx flights --parent=${mylib}/src/lib/${mylib}.module.ts --facade` + `generate @nx/angular:ngrx flights --parent=${mylib}/src/lib/${mylib}-module.ts --facade` ); expect(runCLI(`build ${myapp}`)).toMatch(/main-[a-zA-Z0-9]+\.js/); @@ -57,7 +57,7 @@ describe('Angular Package', () => { // Generate root ngrx state management runCLI( - `generate @nx/angular:ngrx users --parent=${myapp}/src/app/app.module.ts --root` + `generate @nx/angular:ngrx users --parent=${myapp}/src/app/app-module.ts --root` ); const packageJson = readJson('package.json'); expect(packageJson.dependencies['@ngrx/entity']).toBeDefined(); @@ -73,7 +73,7 @@ describe('Angular Package', () => { const flags = `--facade --barrels`; runCLI( - `generate @nx/angular:ngrx flights --parent=${mylib}/src/lib/${mylib}.module.ts ${flags}` + `generate @nx/angular:ngrx flights --parent=${mylib}/src/lib/${mylib}-module.ts ${flags}` ); expect(runCLI(`build ${myapp}`)).toMatch(/main-[a-zA-Z0-9]+\.js/); @@ -92,7 +92,7 @@ describe('Angular Package', () => { // Generate root ngrx state management runCLI( - `generate @nx/angular:ngrx users --parent=${myapp}/src/app/app.module.ts --root` + `generate @nx/angular:ngrx users --parent=${myapp}/src/app/app-module.ts --root` ); const packageJson = readJson('package.json'); expect(packageJson.dependencies['@ngrx/entity']).toBeDefined(); @@ -108,7 +108,7 @@ describe('Angular Package', () => { const flags = `--facade --barrels`; runCLI( - `generate @nx/angular:ngrx flights --module=${mylib}/src/lib/${mylib}.module.ts ${flags}` + `generate @nx/angular:ngrx flights --module=${mylib}/src/lib/${mylib}-module.ts ${flags}` ); expect(runCLI(`build ${myapp}`)).toMatch(/main-[a-zA-Z0-9]+\.js/); diff --git a/e2e/angular/src/projects.test.ts b/e2e/angular/src/projects.test.ts index 861b30b1c6..dfd92eb8a7 100644 --- a/e2e/angular/src/projects.test.ts +++ b/e2e/angular/src/projects.test.ts @@ -40,26 +40,21 @@ describe('Angular Projects', () => { `generate @nx/angular:app ${esbuildApp} --bundler=esbuild --no-standalone --no-interactive` ); runCLI(`generate @nx/angular:lib ${lib1} --no-interactive`); - app1DefaultModule = readFile(`${app1}/src/app/app.module.ts`); - app1DefaultComponentTemplate = readFile( - `${app1}/src/app/app.component.html` - ); - esbuildAppDefaultModule = readFile(`${esbuildApp}/src/app/app.module.ts`); + app1DefaultModule = readFile(`${app1}/src/app/app-module.ts`); + app1DefaultComponentTemplate = readFile(`${app1}/src/app/app.html`); + esbuildAppDefaultModule = readFile(`${esbuildApp}/src/app/app-module.ts`); esbuildAppDefaultComponentTemplate = readFile( - `${esbuildApp}/src/app/app.component.html` + `${esbuildApp}/src/app/app.html` ); esbuildAppDefaultProjectConfig = readFile(`${esbuildApp}/project.json`); }); afterEach(() => { - updateFile(`${app1}/src/app/app.module.ts`, app1DefaultModule); + updateFile(`${app1}/src/app/app-module.ts`, app1DefaultModule); + updateFile(`${app1}/src/app/app.html`, app1DefaultComponentTemplate); + updateFile(`${esbuildApp}/src/app/app-module.ts`, esbuildAppDefaultModule); updateFile( - `${app1}/src/app/app.component.html`, - app1DefaultComponentTemplate - ); - updateFile(`${esbuildApp}/src/app/app.module.ts`, esbuildAppDefaultModule); - updateFile( - `${esbuildApp}/src/app/app.component.html`, + `${esbuildApp}/src/app/app.html`, esbuildAppDefaultComponentTemplate ); updateFile(`${esbuildApp}/project.json`, esbuildAppDefaultProjectConfig); @@ -79,24 +74,24 @@ describe('Angular Projects', () => { ); updateFile( - `${app1}/src/app/app.module.ts`, + `${app1}/src/app/app-module.ts`, ` import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; import { appRoutes } from './app.routes'; - import { NxWelcomeComponent } from './nx-welcome.component'; - import { ${names(lib1).className}Component } from '@${proj}/${lib1}'; + import { NxWelcome } from './nx-welcome'; + import { ${names(lib1).className} } from '@${proj}/${lib1}'; @NgModule({ imports: [ BrowserModule, RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), - ${names(lib1).className}Component + ${names(lib1).className} ], - declarations: [AppComponent, NxWelcomeComponent], - bootstrap: [AppComponent] + declarations: [App, NxWelcome], + bootstrap: [App] }) export class AppModule {} ` @@ -193,7 +188,7 @@ describe('Angular Projects', () => { // External HTML template file const templateWhichFailsBananaInBoxLintCheck = `
`; updateFile( - `${app1}/src/app/app.component.html`, + `${app1}/src/app/app.html`, templateWhichFailsBananaInBoxLintCheck ); // Inline template within component.ts file @@ -216,9 +211,7 @@ describe('Angular Projects', () => { const appLintStdOut = runCLI(`lint ${app1}`, { silenceError: true, }); - expect(appLintStdOut).toContain( - normalize(`${app1}/src/app/app.component.html`) - ); + expect(appLintStdOut).toContain(normalize(`${app1}/src/app/app.html`)); expect(appLintStdOut).toContain(`1:6`); expect(appLintStdOut).toContain(`Invalid binding syntax`); expect(appLintStdOut).toContain( @@ -249,53 +242,53 @@ describe('Angular Projects', () => { // update the app module to include a ref to the buildable lib updateFile( - `${app1}/src/app/app.module.ts`, + `${app1}/src/app/app-module.ts`, ` import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; import { appRoutes } from './app.routes'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { NxWelcome } from './nx-welcome'; import {${ names(buildableLib).className }Module} from '@${proj}/${buildableLib}'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), ${names(buildableLib).className}Module ], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {} ` ); updateFile( - `${esbuildApp}/src/app/app.module.ts`, + `${esbuildApp}/src/app/app-module.ts`, ` import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; import { appRoutes } from './app.routes'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { NxWelcome } from './nx-welcome'; import {${ names(buildableLib).className }Module} from '@${proj}/${buildableLib}'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), ${names(buildableLib).className}Module ], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {} ` @@ -303,7 +296,7 @@ describe('Angular Projects', () => { // update the buildable lib module to include a ref to the buildable child lib updateFile( - `${buildableLib}/src/lib/${names(buildableLib).fileName}.module.ts`, + `${buildableLib}/src/lib/${names(buildableLib).fileName}-module.ts`, ` import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; @@ -333,6 +326,7 @@ describe('Angular Projects', () => { config.targets.build.options = { ...config.targets.build.options, outputPath: `dist/${esbuildApp}`, + index: `${esbuildApp}/src/index.html`, main: config.targets.build.options.browser, browser: undefined, buildLibsFromSource: false, @@ -397,7 +391,7 @@ describe('Angular Projects', () => { export default replaceTextPlugin;` ); updateFile( - `${esbuildApp}/src/app/app.component.ts`, + `${esbuildApp}/src/app/app.ts`, `import { Component } from '@angular/core'; declare const BUILD_DEFINED: string; @@ -405,9 +399,9 @@ describe('Angular Projects', () => { @Component({ selector: 'app-root', standalone: false, - templateUrl: './app.component.html', + templateUrl: './app.html', }) - export class AppComponent { + export class App { title = 'esbuild-app'; buildDefined = BUILD_DEFINED; }` @@ -437,6 +431,7 @@ describe('Angular Projects', () => { ...config.targets.build.options, main: config.targets.build.options.browser, browser: undefined, + index: `${esbuildApp}/src/index.html`, }; return config; }); @@ -511,7 +506,7 @@ describe('Angular Projects', () => { }) export class ${names(lib).className}Module {}`; - updateFile(`${lib}/src/lib/${lib}.module.ts`, moduleContent); + updateFile(`${lib}/src/lib/${lib}-module.ts`, moduleContent); // ACT const buildOutput = runCLI(`build ${lib}`, { env: { CI: 'false' } }); @@ -536,9 +531,7 @@ describe('Angular Projects', () => { // using the project name as the directory when no directory is provided checkFilesExist( `${libName}/src/index.ts`, - `${libName}/src/lib/${libName.split('/')[1]}/${ - libName.split('/')[1] - }.component.ts` + `${libName}/src/lib/${libName.split('/')[1]}/${libName.split('/')[1]}.ts` ); // check build works expect(() => runCLI(`build ${libName}`)).not.toThrow(); diff --git a/e2e/angular/src/tailwind.test.ts b/e2e/angular/src/tailwind.test.ts index 3de3ca8bb3..b8e107c965 100644 --- a/e2e/angular/src/tailwind.test.ts +++ b/e2e/angular/src/tailwind.test.ts @@ -132,7 +132,7 @@ describe('Tailwind support', () => { buttonBgColor: string = defaultButtonBgColor ) => { updateFile( - `${lib}/src/lib/foo.component.ts`, + `${lib}/src/lib/foo.ts`, `import { Component } from '@angular/core'; @Component({ @@ -145,20 +145,20 @@ describe('Tailwind support', () => { } \`] }) - export class FooComponent {} + export class Foo {} ` ); updateFile( - `${lib}/src/lib/${lib}.module.ts`, + `${lib}/src/lib/${lib}-module.ts`, `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { FooComponent } from './foo.component'; + import { Foo } from './foo'; @NgModule({ imports: [CommonModule], - declarations: [FooComponent], - exports: [FooComponent], + declarations: [Foo], + exports: [Foo], }) export class LibModule {} ` @@ -166,8 +166,8 @@ describe('Tailwind support', () => { updateFile( `${lib}/src/index.ts`, - `export * from './lib/foo.component'; - export * from './lib/${lib}.module'; + `export * from './lib/foo'; + export * from './lib/${lib}-module'; ` ); }; @@ -180,7 +180,7 @@ describe('Tailwind support', () => { const builtComponentContent = readFile( isPublishable ? `dist/${lib}/fesm2022/${project}-${lib}.mjs` - : `dist/${lib}/esm2022/lib/foo.component.mjs` + : `dist/${lib}/esm2022/lib/foo.js` ); let expectedStylesRegex = new RegExp( `styles: \\[\\"\\.custom\\-btn(\\[_ngcontent\\-%COMP%\\])?{margin:${libSpacing.md};padding:${libSpacing.sm}}(\\\\n)?\\"\\]` @@ -356,30 +356,30 @@ describe('Tailwind support', () => { spacing.projectVariant1 ); updateFile( - `${appName}/src/app/app.module.ts`, + `${appName}/src/app/app-module.ts`, `import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { LibModule as LibModule1 } from '@${project}/${buildLibWithTailwind.name}'; import { LibModule as LibModule2 } from '@${project}/${pubLibWithTailwind.name}'; - import { AppComponent } from './app.component'; + import { App } from './app'; @NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, LibModule1, LibModule2], + declarations: [], + imports: [BrowserModule, App, LibModule1, LibModule2], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {} ` ); updateFile( - `${appName}/src/app/app.component.html`, + `${appName}/src/app/app.html`, `` ); updateFile( - `${appName}/src/app/app.component.css`, + `${appName}/src/app/app.css`, `.custom-btn { @apply m-md p-sm; }` diff --git a/e2e/nx-init/src/nx-init-angular.test.ts b/e2e/nx-init/src/nx-init-angular.test.ts index 90b39715da..5c482724f8 100644 --- a/e2e/nx-init/src/nx-init-angular.test.ts +++ b/e2e/nx-init/src/nx-init-angular.test.ts @@ -85,7 +85,7 @@ describe('nx init (Angular CLI - legacy)', () => { expect(coldBuildOutput).toContain( `Successfully ran target build for project ${project}` ); - checkFilesExist(`dist/apps/${project}/browser/main.js`); + checkFilesExist(`dist/${project}/browser/main.js`); // run build again to check is coming from cache const cachedBuildOutput = runCLI(`build ${project} --outputHashing none`); diff --git a/e2e/release/src/release-publishable-libraries.test.ts b/e2e/release/src/release-publishable-libraries.test.ts index a5372d1692..888af9994c 100644 --- a/e2e/release/src/release-publishable-libraries.test.ts +++ b/e2e/release/src/release-publishable-libraries.test.ts @@ -230,7 +230,6 @@ describe('release publishable libraries', () => { XXX.XXX kb fesm2022/proj-{project-name}.mjs XXX.XXX kb fesm2022/proj-{project-name}.mjs.map XXB index.d.ts - XXB lib/{project-name}/{project-name}.component.d.ts XXXB package.json === Tarball Details === name: @proj/{project-name} diff --git a/e2e/workspace-create/src/create-nx-workspace.test.ts b/e2e/workspace-create/src/create-nx-workspace.test.ts index 54fedd2444..be5931ddca 100644 --- a/e2e/workspace-create/src/create-nx-workspace.test.ts +++ b/e2e/workspace-create/src/create-nx-workspace.test.ts @@ -38,7 +38,7 @@ describe('create-nx-workspace', () => { checkFilesExist('package.json'); checkFilesExist('project.json'); - checkFilesExist('src/app/app.module.ts'); + checkFilesExist('src/app/app-module.ts'); checkFilesDoNotExist('src/app/app.routes.ts'); expectCodeIsFormatted(); }); @@ -61,7 +61,7 @@ describe('create-nx-workspace', () => { checkFilesExist('package.json'); checkFilesExist('project.json'); checkFilesExist('src/app/app.routes.ts'); - checkFilesDoNotExist('src/app/app.module.ts'); + checkFilesDoNotExist('src/app/app-module.ts'); expectCodeIsFormatted(); }); diff --git a/package.json b/package.json index 0360547a4b..44ebcfb856 100644 --- a/package.json +++ b/package.json @@ -28,19 +28,21 @@ }, "devDependencies": { "@actions/core": "^1.10.0", - "@angular-devkit/architect": "0.1902.0", - "@angular-devkit/build-angular": "19.2.0", - "@angular-devkit/core": "19.2.0", - "@angular-devkit/schematics": "19.2.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/cli": "~19.2.0", - "@angular/common": "19.2.0", - "@angular/compiler": "19.2.0", - "@angular/compiler-cli": "19.2.0", - "@angular/core": "19.2.0", - "@angular/router": "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", "@astrojs/check": "^0.7.0", "@astrojs/react": "^3.6.2", "@babel/core": "^7.23.2", @@ -114,7 +116,7 @@ "@rspack/dev-server": "1.1.1", "@rspack/plugin-minify": "^0.7.5", "@rspack/plugin-react-refresh": "^1.0.0", - "@schematics/angular": "~19.2.0", + "@schematics/angular": "20.0.0-rc.3", "@storybook/addon-essentials": "8.4.6", "@storybook/addon-interactions": "8.4.6", "@storybook/core-server": "8.4.6", @@ -160,10 +162,10 @@ "@types/tmp": "^0.2.0", "@types/yargs": "17.0.10", "@types/yarnpkg__lockfile": "^1.1.5", - "@typescript-eslint/eslint-plugin": "^8.19.0", - "@typescript-eslint/rule-tester": "^8.19.0", - "@typescript-eslint/type-utils": "^8.19.0", - "@typescript-eslint/utils": "^8.19.0", + "@typescript-eslint/eslint-plugin": "^8.29.0", + "@typescript-eslint/rule-tester": "^8.29.0", + "@typescript-eslint/type-utils": "^8.29.0", + "@typescript-eslint/utils": "^8.29.0", "@vitejs/plugin-react": "^4.2.0", "@webcontainer/api": "1.5.1", "@xstate/immer": "0.3.1", @@ -264,7 +266,7 @@ "mini-css-extract-plugin": "~2.4.7", "minimatch": "9.0.3", "next-sitemap": "^3.1.10", - "ng-packagr": "19.2.0", + "ng-packagr": "20.0.0-rc.1", "npm-package-arg": "11.0.1", "nuxt": "^3.10.0", "nx": "21.1.0-beta.2", @@ -276,7 +278,6 @@ "parse5": "4.0.0", "picocolors": "^1.1.0", "picomatch": "4.0.2", - "piscina": "^4.4.0", "postcss": "8.4.38", "postcss-import": "~14.1.0", "postcss-preset-env": "~7.5.0", @@ -296,7 +297,7 @@ "rollup-plugin-copy": "^3.5.0", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-typescript2": "^0.36.0", - "rxjs": "^7.8.0", + "rxjs": "^7.8.2", "sass": "1.55.0", "sass-embedded": "1.85.1", "sass-loader": "16.0.5", @@ -319,14 +320,14 @@ "tsconfig-paths-webpack-plugin": "4.0.0", "typedoc": "0.25.12", "typedoc-plugin-markdown": "3.17.1", - "typescript": "~5.7.2", - "typescript-eslint": "^8.19.0", + "typescript": "~5.8.2", + "typescript-eslint": "^8.29.0", "unist-builder": "^4.0.0", "use-sync-external-store": "^1.2.0", "verdaccio": "6.0.5", "vite": "6.2.0", "vitest": "3.0.5", - "webpack": "5.98.0", + "webpack": "5.99.8", "webpack-dev-server": "5.2.1", "webpack-merge": "^5.8.0", "webpack-node-externals": "^3.0.0", diff --git a/packages/angular/.eslintrc.json b/packages/angular/.eslintrc.json index fd61a7a4d0..d2cfa514e6 100644 --- a/packages/angular/.eslintrc.json +++ b/packages/angular/.eslintrc.json @@ -80,7 +80,6 @@ "@storybook/angular", "@module-federation/node", "@nguniversal/builders", - "ng-packagr", "injection-js", "browserslist", "cacache", @@ -96,7 +95,8 @@ "stylus", "tailwindcss", "cypress", - "esbuild" + "esbuild", + "piscina" ] } ] diff --git a/packages/angular/docs/component-examples.md b/packages/angular/docs/component-examples.md index 69959968eb..ca083778e9 100644 --- a/packages/angular/docs/component-examples.md +++ b/packages/angular/docs/component-examples.md @@ -3,50 +3,60 @@ {% tabs %} {% tab label="Simple Component" %} -Generate a component named `MyComponent` at `apps/my-app/src/lib/my-component/my-component.component.ts`: +Generate a component named `Card` at `apps/my-app/src/lib/card/card.ts`: ```bash -nx g @nx/angular:component apps/my-app/src/lib/my-component/my-component.ts +nx g @nx/angular:component apps/my-app/src/lib/card/card.ts ``` {% /tab %} {% tab label="Without Providing the File Extension" %} -Generate a component named `MyComponent` at `apps/my-app/src/lib/my-component/my-component.component.ts`: +Generate a component named `Card` at `apps/my-app/src/lib/card/card.ts`: ```bash -nx g @nx/angular:component apps/my-app/src/lib/my-component/my-component +nx g @nx/angular:component apps/my-app/src/lib/card/card ``` {% /tab %} {% tab label="With Different Symbol Name" %} -Generate a component named `CustomComponent` at `apps/my-app/src/lib/my-component/my-component.component.ts`: +Generate a component named `Custom` at `apps/my-app/src/lib/card/card.ts`: ```bash -nx g @nx/angular:component apps/my-app/src/lib/my-component/my-component --name=custom +nx g @nx/angular:component apps/my-app/src/lib/card/card --name=custom +``` + +{% /tab %} + +{% tab label="With a Component Type" %} + +Generate a component named `CardComponent` at `apps/my-app/src/lib/card/card.component.ts`: + +```bash +nx g @nx/angular:component apps/my-app/src/lib/card/card --type=component ``` {% /tab %} {% tab label="Single File Component" %} -Create a component named `my-component` with inline styles and inline template: +Create a component named `Card` with inline styles and inline template: ```bash -nx g @nx/angular:component apps/my-app/src/lib/my-component/my-component --inlineStyle --inlineTemplate +nx g @nx/angular:component apps/my-app/src/lib/card/card --inlineStyle --inlineTemplate ``` {% /tab %} {% tab label="Component with OnPush Change Detection Strategy" %} -Create a component named `my-component` with OnPush Change Detection Strategy: +Create a component named `Card` with `OnPush` Change Detection Strategy: ```bash -nx g @nx/angular:component apps/my-app/src/lib/my-component/my-component --changeDetection=OnPush +nx g @nx/angular:component apps/my-app/src/lib/card/card --changeDetection=OnPush ``` {% /tab %} diff --git a/packages/angular/docs/dev-server-examples.md b/packages/angular/docs/dev-server-examples.md index be060890f0..d1ac3fdac0 100644 --- a/packages/angular/docs/dev-server-examples.md +++ b/packages/angular/docs/dev-server-examples.md @@ -50,12 +50,6 @@ module.exports = (config) => { {% tab label="Providing HTTP request middleware function" %} -{% callout type="warning" title="Overrides" } - -Available for workspaces using Angular version 17.0.0 or greater and with `build` targets using an esbuild-based executor. - -{% /callout %} - The executor accepts an `esbuildMiddleware` option that allows you to provide HTTP require middleware functions that will be used by the Vite development server. ```json {% fileName="apps/my-app/project.json" highlightLines=[8] %} diff --git a/packages/angular/migrations.json b/packages/angular/migrations.json index 9506b2fd42..e8d3ae2327 100644 --- a/packages/angular/migrations.json +++ b/packages/angular/migrations.json @@ -302,6 +302,47 @@ }, "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": { + "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.", + "factory": "./src/migrations/update-21-2-0/update-angular-cli" + }, + "migrate-provide-server-rendering-import": { + "version": "21.2.0-beta.0", + "requires": { + "@angular/core": ">=20.0.0-rc.2" + }, + "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", + "requires": { + "@angular/core": ">=20.0.0-rc.2" + }, + "description": "Replace `provideServerRouting` 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", + "requires": { + "@angular/core": ">=20.0.0-rc.2" + }, + "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", + "requires": { + "@angular/core": ">=20.0.0-rc.2" + }, + "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" } }, "packageJsonUpdates": { @@ -1624,6 +1665,71 @@ "alwaysAddToPackageJson": false } } + }, + "21.2.0": { + "version": "21.2.0-beta.0", + "x-prompt": "Do you want to update the Angular version to v20?", + "requires": { + "@angular/core": ">=19.2.0 <20.0.0-rc.2" + }, + "packages": { + "@angular-devkit/build-angular": { + "version": "20.0.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/core": { + "version": "20.0.0-rc.3", + "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", + "alwaysAddToPackageJson": false + }, + "@schematics/angular": { + "version": "20.0.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/architect": { + "version": "0.2000.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/build-webpack": { + "version": "0.2000.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular/core": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": true + }, + "@angular/material": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": false + }, + "@angular/cdk": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": false + }, + "@angular/google-maps": { + "version": "20.0.0-rc.2", + "alwaysAddToPackageJson": false + }, + "ng-packagr": { + "version": "20.0.0-rc.1", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/angular/ng-package.json b/packages/angular/ng-package.json index a7e877e944..d5527a2d8f 100644 --- a/packages/angular/ng-package.json +++ b/packages/angular/ng-package.json @@ -28,7 +28,6 @@ "magic-string", "enquirer", "find-cache-dir", - "piscina", "webpack" ], "keepLifecycleScripts": true diff --git a/packages/angular/package.json b/packages/angular/package.json index a52e91479a..900b296db8 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -47,32 +47,44 @@ "migrations": "./migrations.json" }, "dependencies": { + "@nx/devkit": "file:../devkit", + "@nx/eslint": "file:../eslint", + "@nx/js": "file:../js", + "@nx/module-federation": "file:../module-federation", + "@nx/rspack": "file:../rspack", + "@nx/web": "file:../web", + "@nx/webpack": "file:../webpack", + "@nx/workspace": "file:../workspace", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^8.0.0", "enquirer": "~2.3.6", + "magic-string": "~0.30.2", "picocolors": "^1.1.0", "picomatch": "4.0.2", - "magic-string": "~0.30.2", "semver": "^7.5.3", "tslib": "^2.3.0", - "webpack-merge": "^5.8.0", - "@nx/devkit": "file:../devkit", - "@nx/js": "file:../js", - "@nx/eslint": "file:../eslint", - "@nx/webpack": "file:../webpack", - "@nx/rspack": "file:../rspack", - "@nx/module-federation": "file:../module-federation", - "@nx/web": "file:../web", - "@nx/workspace": "file:../workspace", - "piscina": "^4.4.0" + "webpack-merge": "^5.8.0" }, "peerDependencies": { - "@angular-devkit/build-angular": ">= 17.0.0 < 20.0.0", - "@angular-devkit/core": ">= 17.0.0 < 20.0.0", - "@angular-devkit/schematics": ">= 17.0.0 < 20.0.0", - "@schematics/angular": ">= 17.0.0 < 20.0.0", + "@angular/build": ">= 18.0.0 < 21.0.0", + "@angular-devkit/build-angular": ">= 18.0.0 < 21.0.0", + "@angular-devkit/core": ">= 18.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 18.0.0 < 21.0.0", + "@schematics/angular": ">= 18.0.0 < 21.0.0", + "ng-packagr": ">= 18.0.0 < 21.0.0", "rxjs": "^6.5.3 || ^7.5.0" }, + "peerDependenciesMeta": { + "@angular/build": { + "optional": true + }, + "@angular-devkit/build-angular": { + "optional": true + }, + "ng-packagr": { + "optional": true + } + }, "publishConfig": { "access": "public" } diff --git a/packages/angular/plugins/component-testing.ts b/packages/angular/plugins/component-testing.ts index 16e72c2780..41a8cde7b6 100644 --- a/packages/angular/plugins/component-testing.ts +++ b/packages/angular/plugins/component-testing.ts @@ -195,7 +195,9 @@ function normalizeBuildTargetOptions( }, buildContext ); - const buildOptions = withSchemaDefaults(options); + const project = + buildContext.projectsConfigurations.projects[buildContext.projectName]; + const buildOptions = withSchemaDefaults(options, project, buildContext.root); // cypress creates a tsconfig if one isn't preset // that contains all the support required for angular and component tests @@ -305,9 +307,18 @@ Note: this may fail, setting the correct 'sourceRoot' for ${buildContext.project }; } -function withSchemaDefaults(options: any): BrowserBuilderSchema { +function withSchemaDefaults( + options: any, + project: ProjectConfiguration, + workspaceRoot: string +): BrowserBuilderSchema { if (!options.main && !options.browser) { - throw new Error('Missing executor options "main" and "browser"'); + const sourceRoot = + project.sourceRoot ?? joinPathFragments(project.root, 'src'); + options.browser = joinPathFragments(sourceRoot, 'main.ts'); + if (!existsSync(join(workspaceRoot, options.browser))) { + throw new Error('Missing executor options "main" and "browser"'); + } } if (!options.index) { throw new Error('Missing executor options "index"'); diff --git a/packages/angular/src/builders/dev-server/dev-server.impl.ts b/packages/angular/src/builders/dev-server/dev-server.impl.ts index 5d7d4a6d5b..eb9771d0e3 100644 --- a/packages/angular/src/builders/dev-server/dev-server.impl.ts +++ b/packages/angular/src/builders/dev-server/dev-server.impl.ts @@ -12,12 +12,13 @@ import { getRootTsConfigPath } from '@nx/js'; import type { DependentBuildableProjectNode } from '@nx/js/src/utils/buildable-libs-utils'; import { WebpackNxBuildCoordinationPlugin } from '@nx/webpack/src/plugins/webpack-nx-build-coordination-plugin'; import { existsSync } from 'fs'; +import { readNxJson } from 'nx/src/config/configuration'; import { isNpmProject } from 'nx/src/project-graph/operators'; import { readCachedProjectConfiguration } from 'nx/src/project-graph/project-graph'; import { relative } from 'path'; import { combineLatest, from } from 'rxjs'; import { switchMap } from 'rxjs/operators'; -import { getInstalledAngularVersionInfo } from '../../executors/utilities/angular-version-utils'; +import { assertBuilderPackageIsInstalled } from '../../executors/utilities/builder-package'; import { loadIndexHtmlTransformer, loadMiddleware, @@ -31,13 +32,7 @@ import { resolveIndexHtmlTransformer, } from '../utilities/webpack'; import { normalizeOptions, validateOptions } from './lib'; -import type { - NormalizedSchema, - Schema, - SchemaWithBrowserTarget, -} from './schema'; -import { readNxJson } from 'nx/src/config/configuration'; - +import type { NormalizedSchema, Schema } from './schema'; type BuildTargetOptions = { tsConfig: string; buildLibsFromSource?: boolean; @@ -158,6 +153,7 @@ export function executeDevServerBuilder( const delegateBuilderOptions = getDelegateBuilderOptions(options); const isUsingWebpackBuilder = ![ + '@angular/build:application', '@angular-devkit/build-angular:application', '@angular-devkit/build-angular:browser-esbuild', '@nx/angular:application', @@ -171,6 +167,7 @@ export function executeDevServerBuilder( * handle `@nx/angular:*` executors. */ patchBuilderContext(context, !isUsingWebpackBuilder, parsedBuildTarget); + assertBuilderPackageIsInstalled('@angular-devkit/build-angular'); return combineLatest([ from(import('@angular-devkit/build-angular')), @@ -259,14 +256,6 @@ function getDelegateBuilderOptions( ...options, }; - const { major: angularMajorVersion } = getInstalledAngularVersionInfo(); - if (angularMajorVersion <= 17) { - ( - delegateBuilderOptions as unknown as SchemaWithBrowserTarget - ).browserTarget = delegateBuilderOptions.buildTarget; - delete delegateBuilderOptions.buildTarget; - } - // delete extra option not supported by the delegate builder delete delegateBuilderOptions.buildLibsFromSource; delete delegateBuilderOptions.watchDependencies; diff --git a/packages/angular/src/builders/dev-server/lib/normalize-options.ts b/packages/angular/src/builders/dev-server/lib/normalize-options.ts index 4559be275c..594172ccce 100644 --- a/packages/angular/src/builders/dev-server/lib/normalize-options.ts +++ b/packages/angular/src/builders/dev-server/lib/normalize-options.ts @@ -1,23 +1,11 @@ import { getInstalledAngularVersionInfo } from '../../../executors/utilities/angular-version-utils'; -import type { - NormalizedSchema, - Schema, - SchemaWithBrowserTarget, - SchemaWithBuildTarget, -} from '../schema'; +import type { NormalizedSchema, Schema } from '../schema'; export function normalizeOptions(schema: Schema): NormalizedSchema { - let buildTarget = (schema as SchemaWithBuildTarget).buildTarget; - if ((schema as SchemaWithBrowserTarget).browserTarget) { - buildTarget ??= (schema as SchemaWithBrowserTarget).browserTarget; - delete (schema as SchemaWithBrowserTarget).browserTarget; - } - const { major: angularMajorVersion } = getInstalledAngularVersionInfo(); return { ...schema, - buildTarget, host: schema.host ?? 'localhost', port: schema.port ?? 4200, liveReload: schema.liveReload ?? true, diff --git a/packages/angular/src/builders/dev-server/lib/validate-options.ts b/packages/angular/src/builders/dev-server/lib/validate-options.ts index f9beebfffa..669ed9d00f 100644 --- a/packages/angular/src/builders/dev-server/lib/validate-options.ts +++ b/packages/angular/src/builders/dev-server/lib/validate-options.ts @@ -6,11 +6,6 @@ import type { Schema } from '../schema'; export function validateOptions(options: Schema): void { const { version: angularVersion } = getInstalledAngularVersionInfo(); - if (lt(angularVersion, '17.2.0') && options.prebundle) { - throw new Error(stripIndents`The "prebundle" option is only supported in Angular >= 17.2.0. You are currently using "${angularVersion}". - You can resolve this error by removing the "prebundle" option or by migrating to Angular 17.2.0.`); - } - if (lt(angularVersion, '18.1.0') && options.inspect) { throw new Error(stripIndents`The "inspect" option is only supported in Angular >= 18.1.0. You are currently using "${angularVersion}". You can resolve this error by removing the "inspect" option or by migrating to Angular 18.1.0.`); diff --git a/packages/angular/src/builders/dev-server/schema.d.ts b/packages/angular/src/builders/dev-server/schema.d.ts index 7ffe17ec38..a8e6b97161 100644 --- a/packages/angular/src/builders/dev-server/schema.d.ts +++ b/packages/angular/src/builders/dev-server/schema.d.ts @@ -1,4 +1,5 @@ -interface BaseSchema { +interface Schema { + buildTarget: string; port?: number; host?: string; proxyConfig?: string; @@ -24,20 +25,7 @@ interface BaseSchema { watchDependencies?: boolean; } -export type SchemaWithBrowserTarget = BaseSchema & { - /** - * @deprecated Use `buildTarget` instead. It will be removed when Angular v20 is released. - */ - browserTarget: string; -}; - -export type SchemaWithBuildTarget = BaseSchema & { - buildTarget: string; -}; - -export type Schema = SchemaWithBrowserTarget | SchemaWithBuildTarget; - -export type NormalizedSchema = SchemaWithBuildTarget & { +export type NormalizedSchema = Schema & { liveReload: boolean; open: boolean; ssl: boolean; diff --git a/packages/angular/src/builders/dev-server/schema.json b/packages/angular/src/builders/dev-server/schema.json index 5ad0b11878..99e1145403 100644 --- a/packages/angular/src/builders/dev-server/schema.json +++ b/packages/angular/src/builders/dev-server/schema.json @@ -14,12 +14,6 @@ } ], "properties": { - "browserTarget": { - "type": "string", - "description": "A browser builder target to serve in the format of `project:target[:configuration]`. Ignored if `buildTarget` is set.", - "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed when Angular v20 is released." - }, "buildTarget": { "type": "string", "description": "A build builder target to serve in the format of `project:target[:configuration]`.", @@ -128,7 +122,7 @@ ] }, "prebundle": { - "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other Webpack-based builders. _Note: this is only supported in Angular versions >= 17.2.0_.", + "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other Webpack-based builders.", "oneOf": [ { "type": "boolean" }, { @@ -147,7 +141,7 @@ }, "buildLibsFromSource": { "type": "boolean", - "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `browserTarget` options, or it will default to `true` if it's also not set in the `browserTarget` options.", + "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `buildTarget` options, or it will default to `true` if it's also not set in the `buildTarget` options.", "x-priority": "important" }, "esbuildMiddleware": { @@ -165,5 +159,5 @@ } }, "additionalProperties": false, - "anyOf": [{ "required": ["buildTarget"] }, { "required": ["browserTarget"] }] + "required": ["buildTarget"] } diff --git a/packages/angular/src/builders/webpack-browser/webpack-browser.impl.ts b/packages/angular/src/builders/webpack-browser/webpack-browser.impl.ts index c487e93c99..dc4c1796ca 100644 --- a/packages/angular/src/builders/webpack-browser/webpack-browser.impl.ts +++ b/packages/angular/src/builders/webpack-browser/webpack-browser.impl.ts @@ -13,6 +13,7 @@ import { getDependencyConfigs } from 'nx/src/tasks-runner/utils'; import { relative } from 'path'; import { from, Observable } from 'rxjs'; import { switchMap } from 'rxjs/operators'; +import { assertBuilderPackageIsInstalled } from '../../executors/utilities/builder-package'; import { createTmpTsConfigForBuildableLibs } from '../utilities/buildable-libs'; import { mergeCustomWebpackConfig, @@ -98,6 +99,7 @@ export function executeWebpackBrowserBuilder( ); } + assertBuilderPackageIsInstalled('@angular-devkit/build-angular'); return from(import('@angular-devkit/build-angular')).pipe( switchMap(({ executeBrowserBuilder }) => executeBrowserBuilder(delegateBuilderOptions, context as any, { diff --git a/packages/angular/src/builders/webpack-server/webpack-server.impl.ts b/packages/angular/src/builders/webpack-server/webpack-server.impl.ts index aba3e42ef9..1d9252f8a1 100644 --- a/packages/angular/src/builders/webpack-server/webpack-server.impl.ts +++ b/packages/angular/src/builders/webpack-server/webpack-server.impl.ts @@ -1,3 +1,5 @@ +import type { BuilderContext } from '@angular-devkit/architect'; +import type { ServerBuilderOutput } from '@angular-devkit/build-angular'; import { joinPathFragments, normalizePath, @@ -7,14 +9,17 @@ import { existsSync } from 'fs'; import { relative } from 'path'; import { Observable, from } from 'rxjs'; import { switchMap } from 'rxjs/operators'; +import { assertBuilderPackageIsInstalled } from '../../executors/utilities/builder-package'; import { createTmpTsConfigForBuildableLibs } from '../utilities/buildable-libs'; import { mergeCustomWebpackConfig } from '../utilities/webpack'; import { Schema } from './schema'; function buildServerApp( options: Schema, - context: import('@angular-devkit/architect').BuilderContext -): Observable { + context: BuilderContext +): Observable { + assertBuilderPackageIsInstalled('@angular-devkit/build-angular'); + const { buildLibsFromSource, customWebpackConfig, ...delegateOptions } = options; // If there is a path to custom webpack config @@ -47,7 +52,7 @@ function buildServerApp( function buildServerAppWithCustomWebpackConfiguration( options: Schema, - context: import('@angular-devkit/architect').BuilderContext, + context: BuilderContext, pathToWebpackConfig: string ) { return from(import('@angular-devkit/build-angular')).pipe( @@ -89,8 +94,8 @@ function buildServerAppWithCustomWebpackConfiguration( export function executeWebpackServerBuilder( options: Schema, - context: import('@angular-devkit/architect').BuilderContext -): Observable { + context: BuilderContext +): Observable { options.buildLibsFromSource ??= true; process.env.NX_BUILD_LIBS_FROM_SOURCE = `${options.buildLibsFromSource}`; diff --git a/packages/angular/src/executors/application/application.impl.ts b/packages/angular/src/executors/application/application.impl.ts index b0a570ab92..275cdc5cd7 100644 --- a/packages/angular/src/executors/application/application.impl.ts +++ b/packages/angular/src/executors/application/application.impl.ts @@ -1,10 +1,10 @@ -import type { buildApplication as buildApplicationFn } from '@angular-devkit/build-angular'; +import type { BuilderOutput } from '@angular-devkit/architect'; import type { ExecutorContext } from '@nx/devkit'; import type { DependentBuildableProjectNode } from '@nx/js/src/utils/buildable-libs-utils'; import { createBuilderContext } from 'nx/src/adapter/ngcli-adapter'; -import { gte } from 'semver'; import { getInstalledAngularVersionInfo } from '../utilities/angular-version-utils'; import { createTmpTsConfigForBuildableLibs } from '../utilities/buildable-libs'; +import { assertBuilderPackageIsInstalled } from '../utilities/builder-package'; import { loadIndexHtmlTransformer, loadPlugins, @@ -16,7 +16,7 @@ import { validateOptions } from './utils/validate-options'; export default async function* applicationExecutor( options: ApplicationExecutorOptions, context: ExecutorContext -): ReturnType { +): AsyncIterable { validateOptions(options); options = normalizeOptions(options); @@ -53,19 +53,20 @@ export default async function* applicationExecutor( context ); - const { version: angularVersion } = getInstalledAngularVersionInfo(); - if (gte(angularVersion, '17.1.0')) { - const { buildApplication } = await import('@angular-devkit/build-angular'); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(); + if (angularMajorVersion >= 20) { + assertBuilderPackageIsInstalled('@angular/build'); + const { buildApplication } = await import('@angular/build'); return yield* buildApplication(delegateExecutorOptions, builderContext, { codePlugins: plugins, indexHtmlTransformer, }); } - const { buildApplication } = require('@angular-devkit/build-angular'); - return yield* buildApplication( - delegateExecutorOptions, - builderContext, - plugins - ); + assertBuilderPackageIsInstalled('@angular-devkit/build-angular'); + const { buildApplication } = await import('@angular-devkit/build-angular'); + return yield* buildApplication(delegateExecutorOptions, builderContext, { + codePlugins: plugins, + indexHtmlTransformer, + }); } diff --git a/packages/angular/src/executors/application/schema.d.ts b/packages/angular/src/executors/application/schema.d.ts index dcb0463e59..ebf821de24 100644 --- a/packages/angular/src/executors/application/schema.d.ts +++ b/packages/angular/src/executors/application/schema.d.ts @@ -1,4 +1,4 @@ -import type { ApplicationBuilderOptions } from '@angular-devkit/build-angular'; +import type { ApplicationBuilderOptions } from '@angular/build'; import type { PluginSpec } from '../utilities/esbuild-extensions'; export interface ApplicationExecutorOptions extends ApplicationBuilderOptions { diff --git a/packages/angular/src/executors/application/schema.json b/packages/angular/src/executors/application/schema.json index 8939f2d3a8..66a6a0c465 100644 --- a/packages/angular/src/executors/application/schema.json +++ b/packages/angular/src/executors/application/schema.json @@ -19,7 +19,6 @@ "description": "The full path for the browser entry point to the application, relative to the current workspace." }, "server": { - "type": "string", "description": "The full path for the server entry point to the application, relative to the current workspace.", "oneOf": [ { @@ -48,7 +47,7 @@ }, "deployUrl": { "type": "string", - "description": "Customize the base path for the URLs of resources in 'index.html' and component stylesheets. This option is only necessary for specific deployment scenarios, such as with Angular Elements or when utilizing different CDN locations. _Note: this is only supported in Angular versions >= 17.3.0_." + "description": "Customize the base path for the URLs of resources in 'index.html' and component stylesheets. This option is only necessary for specific deployment scenarios, such as with Angular Elements or when utilizing different CDN locations." }, "security": { "description": "Security features to protect against XSS and other common attacks. _Note: this is only supported in Angular versions >= 19.0.0_.", @@ -206,7 +205,7 @@ "clearScreen": { "type": "boolean", "default": false, - "description": "Automatically clear the terminal screen during rebuilds. _Note: this is only supported in Angular versions >= 17.2.0_." + "description": "Automatically clear the terminal screen during rebuilds." }, "optimization": { "description": "Enables optimization of the build output. Including minification of scripts and styles, tree-shaking, dead-code elimination, inlining of critical CSS and fonts inlining. For more information, see https://angular.dev/reference/configs/workspace-config#optimization-configuration.", @@ -239,7 +238,7 @@ }, "removeSpecialComments": { "type": "boolean", - "description": "Remove comments in global CSS that contains '@license' or '@preserve' or that starts with '//!' or '/*!'. _Note: this is only supported in Angular versions >= 17.1.0_.", + "description": "Remove comments in global CSS that contains '@license' or '@preserve' or that starts with '//!' or '/*!'.", "default": true } }, @@ -279,19 +278,26 @@ ] }, "loader": { - "description": "Defines the type of loader to use with a specified file extension when used with a JavaScript `import`. `text` inlines the content as a string; `binary` inlines the content as a Uint8Array; `file` emits the file and provides the runtime location of the file; `empty` considers the content to be empty and not include it in bundles. _Note: this is only supported in Angular versions >= 17.1.0_.", + "description": "Defines the type of loader to use with a specified file extension when used with a JavaScript `import`. `text` inlines the content as a string; `binary` inlines the content as a Uint8Array; `file` emits the file and provides the runtime location of the file; `empty` considers the content to be empty and not include it in bundles.", "type": "object", "patternProperties": { "^\\.\\S+$": { "enum": ["text", "binary", "file", "empty"] } } }, "define": { - "description": "Defines global identifiers that will be replaced with a specified constant value when found in any JavaScript or TypeScript code including libraries. The value will be used directly. String values must be put in quotes. Identifiers within Angular metadata such as Component Decorators will not be replaced. _Note: this is only supported in Angular versions >= 17.2.0_.", + "description": "Defines global identifiers that will be replaced with a specified constant value when found in any JavaScript or TypeScript code including libraries. The value will be used directly. String values must be put in quotes. Identifiers within Angular metadata such as Component Decorators will not be replaced.", "type": "object", "additionalProperties": { "type": "string" } }, + "conditions": { + "description": "Custom package resolution conditions used to resolve conditional exports/imports. Defaults to ['module', 'development'/'production']. The following special conditions are always present if the requirements are satisfied: 'default', 'import', 'require', 'browser', 'node'. _Note: this is only supported in Angular versions >= 20.0.0_.", + "type": "array", + "items": { + "type": "string" + } + }, "fileReplacements": { "description": "Replace compilation source files with other compilation source files in the build.", "type": "array", @@ -301,7 +307,7 @@ "default": [] }, "outputPath": { - "description": "Specify the output path relative to workspace root. _Note: the object notation is only supported in Angular versions >= 17.1.0_.", + "description": "Specify the output path relative to workspace root.", "oneOf": [ { "type": "object", @@ -368,6 +374,11 @@ "type": "boolean", "description": "Resolve vendor packages source maps.", "default": false + }, + "sourcesContent": { + "type": "boolean", + "description": "Output original source content for files within the source map. _Note: this is only supported in Angular versions >= 20.0.0_.", + "default": true } }, "additionalProperties": false @@ -500,7 +511,7 @@ "preloadInitial": { "type": "boolean", "default": true, - "description": "Generates 'preload', 'modulepreload', and 'preconnect' link elements for initial application files and resources. _Note: this is only supported in Angular versions >= 17.1.0_." + "description": "Generates 'preload', 'modulepreload', and 'preconnect' link elements for initial application files and resources." } }, "required": ["input"] @@ -636,12 +647,12 @@ } }, "indexHtmlTransformer": { - "description": "Path to a file exposing a default function to transform the `index.html` file. _Note: this is only supported in Angular versions >= 17.1.0_.", + "description": "Path to a file exposing a default function to transform the `index.html` file.", "type": "string" } }, "additionalProperties": false, - "required": ["outputPath", "index", "browser", "tsConfig"], + "required": ["outputPath", "tsConfig"], "definitions": { "assetPattern": { "oneOf": [ diff --git a/packages/angular/src/executors/application/utils/normalize-options.ts b/packages/angular/src/executors/application/utils/normalize-options.ts index f6b6522c8a..34ad28d1ce 100644 --- a/packages/angular/src/executors/application/utils/normalize-options.ts +++ b/packages/angular/src/executors/application/utils/normalize-options.ts @@ -35,5 +35,15 @@ export function normalizeOptions( prerender ??= false; } - return { ...options, appShell, prerender, security }; + let sourceMap = options.sourceMap; + if ( + sourceMap && + typeof sourceMap === 'object' && + sourceMap.sourcesContent !== undefined && + angularMajorVersion < 20 + ) { + delete sourceMap.sourcesContent; + } + + return { ...options, appShell, prerender, security, sourceMap }; } diff --git a/packages/angular/src/executors/application/utils/validate-options.ts b/packages/angular/src/executors/application/utils/validate-options.ts index 832399dfdc..c298c06356 100644 --- a/packages/angular/src/executors/application/utils/validate-options.ts +++ b/packages/angular/src/executors/application/utils/validate-options.ts @@ -5,73 +5,6 @@ import type { ApplicationExecutorOptions } from '../schema'; export function validateOptions(options: ApplicationExecutorOptions): void { const { version: angularVersion } = getInstalledAngularVersionInfo(); - if (lt(angularVersion, '17.1.0')) { - if (options.loader) { - throw new Error( - `The "loader" option requires Angular version 17.1.0 or greater. You are currently using version ${angularVersion}.` - ); - } - - if (options.indexHtmlTransformer) { - throw new Error( - `The "indexHtmlTransformer" option requires Angular version 17.1.0 or greater. You are currently using version ${angularVersion}.` - ); - } - - if ( - typeof options.index === 'object' && - options.index.preloadInitial !== undefined - ) { - throw new Error( - `The "index.preloadInitial" option requires Angular version 17.1.0 or greater. You are currently using version ${angularVersion}.` - ); - } - - if ( - options.optimization && - typeof options.optimization !== 'boolean' && - options.optimization.styles && - typeof options.optimization.styles !== 'boolean' - ) { - if (options.optimization.styles.removeSpecialComments === false) { - throw new Error( - `The "optimization.styles.removeSpecialComments" option requires Angular version 17.1.0 or greater. You are currently using version ${angularVersion}.` - ); - } else if (options.optimization.styles.removeSpecialComments === true) { - // silently remove the option, as it was the default before 17.1.0 - delete options.optimization.styles.removeSpecialComments; - } - } - - if (typeof options.outputPath === 'object') { - throw new Error( - `The "outputPath" option as an object requires Angular version 17.1.0 or greater. You are currently using version ${angularVersion}.` - ); - } - } - - if (lt(angularVersion, '17.2.0')) { - if (options.define) { - throw new Error( - `The "define" option requires Angular version 17.2.0 or greater. You are currently using version ${angularVersion}.` - ); - } - - if (options.clearScreen !== undefined) { - throw new Error( - `The "clearScreen" option requires Angular version 17.2.0 or greater. You are currently using version ${angularVersion}.` - ); - } - } - - if (lt(angularVersion, '17.3.0')) { - if (options.deployUrl) { - throw new Error( - `The "deployUrl" option requires Angular version 17.3.0 or greater. You are currently using version ${angularVersion}.` - ); - } - } - if (lt(angularVersion, '19.0.0')) { if (options.outputMode) { throw new Error( @@ -103,4 +36,22 @@ export function validateOptions(options: ApplicationExecutorOptions): void { ); } } + + if (lt(angularVersion, '20.0.0')) { + if ( + options.sourceMap && + typeof options.sourceMap === 'object' && + options.sourceMap.sourcesContent === false + ) { + throw new Error( + `The "sourceMap.sourcesContent" option requires Angular version 20.0.0 or greater. You are currently using version ${angularVersion}.` + ); + } + + if (options.conditions) { + throw new Error( + `The "conditions" option requires Angular version 20.0.0 or greater. You are currently using version ${angularVersion}.` + ); + } + } } diff --git a/packages/angular/src/executors/extract-i18n/extract-i18n.impl.ts b/packages/angular/src/executors/extract-i18n/extract-i18n.impl.ts index 05842fcf85..152a150fb2 100644 --- a/packages/angular/src/executors/extract-i18n/extract-i18n.impl.ts +++ b/packages/angular/src/executors/extract-i18n/extract-i18n.impl.ts @@ -1,8 +1,7 @@ -import type { ExtractI18nBuilderOptions } from '@angular-devkit/build-angular'; import { parseTargetString, type ExecutorContext } from '@nx/devkit'; import { createBuilderContext } from 'nx/src/adapter/ngcli-adapter'; import { readCachedProjectConfiguration } from 'nx/src/project-graph/project-graph'; -import { getInstalledAngularVersionInfo } from '../utilities/angular-version-utils'; +import { assertBuilderPackageIsInstalled } from '../utilities/builder-package'; import { patchBuilderContext } from '../utilities/patch-builder-context'; import type { ExtractI18nExecutorOptions } from './schema'; @@ -11,14 +10,15 @@ export default async function* extractI18nExecutor( context: ExecutorContext ) { const parsedBuildTarget = parseTargetString(options.buildTarget, context); - const browserTargetProjectConfiguration = readCachedProjectConfiguration( + const buildTargetProjectConfiguration = readCachedProjectConfiguration( parsedBuildTarget.project ); const buildTarget = - browserTargetProjectConfiguration.targets[parsedBuildTarget.target]; + buildTargetProjectConfiguration.targets[parsedBuildTarget.target]; const isUsingEsbuildBuilder = [ + '@angular/build:application', '@angular-devkit/build-angular:application', '@angular-devkit/build-angular:browser-esbuild', '@nx/angular:application', @@ -42,29 +42,10 @@ export default async function* extractI18nExecutor( */ patchBuilderContext(builderContext, isUsingEsbuildBuilder, parsedBuildTarget); + assertBuilderPackageIsInstalled('@angular-devkit/build-angular'); const { executeExtractI18nBuilder } = await import( '@angular-devkit/build-angular' ); - const delegateBuilderOptions = getDelegateBuilderOptions(options); - return await executeExtractI18nBuilder( - delegateBuilderOptions, - builderContext - ); -} - -function getDelegateBuilderOptions( - options: ExtractI18nExecutorOptions -): ExtractI18nBuilderOptions { - const delegateBuilderOptions: ExtractI18nBuilderOptions & { - browserTarget?: string; - } = { ...options }; - - const { major: angularMajorVersion } = getInstalledAngularVersionInfo(); - if (angularMajorVersion <= 17) { - delegateBuilderOptions.browserTarget = delegateBuilderOptions.buildTarget; - delete delegateBuilderOptions.buildTarget; - } - - return delegateBuilderOptions; + return await executeExtractI18nBuilder(options, builderContext); } diff --git a/packages/angular/src/executors/extract-i18n/schema.d.ts b/packages/angular/src/executors/extract-i18n/schema.d.ts index 5b8e2d4760..9d1bc519e3 100644 --- a/packages/angular/src/executors/extract-i18n/schema.d.ts +++ b/packages/angular/src/executors/extract-i18n/schema.d.ts @@ -1,8 +1,3 @@ import type { ExtractI18nBuilderOptions } from '@angular-devkit/build-angular'; -export type ExtractI18nExecutorOptions = Omit< - ExtractI18nBuilderOptions, - 'browserTarget' -> & { - buildTarget: string; -}; +export type ExtractI18nExecutorOptions = ExtractI18nBuilderOptions; diff --git a/packages/angular/src/executors/extract-i18n/schema.json b/packages/angular/src/executors/extract-i18n/schema.json index 79dfffdc3e..7f2425aa1a 100644 --- a/packages/angular/src/executors/extract-i18n/schema.json +++ b/packages/angular/src/executors/extract-i18n/schema.json @@ -38,6 +38,11 @@ "outFile": { "type": "string", "description": "Name of the file to output." + }, + "i18nDuplicateTranslation": { + "type": "string", + "description": "How to handle duplicate translations. _Note: this is only available in Angular 20.0.0 and above._", + "enum": ["error", "warning", "ignore"] } }, "additionalProperties": false, diff --git a/packages/angular/src/executors/extract-i18n/utils/validate-options.ts b/packages/angular/src/executors/extract-i18n/utils/validate-options.ts new file mode 100644 index 0000000000..bad06328ba --- /dev/null +++ b/packages/angular/src/executors/extract-i18n/utils/validate-options.ts @@ -0,0 +1,15 @@ +import { lt } from 'semver'; +import { getInstalledAngularVersionInfo } from '../../utilities/angular-version-utils'; +import type { ExtractI18nExecutorOptions } from '../schema'; + +export function validateOptions(options: ExtractI18nExecutorOptions): void { + const { version: angularVersion } = getInstalledAngularVersionInfo(); + + if (lt(angularVersion, '20.0.0')) { + if (options.i18nDuplicateTranslation) { + throw new Error( + `The "i18nDuplicateTranslation" option requires Angular version 20.0.0 or greater. You are currently using version ${angularVersion}.` + ); + } + } +} diff --git a/packages/angular/src/executors/module-federation-dev-server/lib/normalize-options.ts b/packages/angular/src/executors/module-federation-dev-server/lib/normalize-options.ts index 41d63136db..7cb5f7f47e 100644 --- a/packages/angular/src/executors/module-federation-dev-server/lib/normalize-options.ts +++ b/packages/angular/src/executors/module-federation-dev-server/lib/normalize-options.ts @@ -1,25 +1,14 @@ -import type { - NormalizedSchema, - Schema, - SchemaWithBrowserTarget, - SchemaWithBuildTarget, -} from '../schema'; +import type { NormalizedSchema, Schema } from '../schema'; import { join } from 'path'; import { workspaceRoot } from '@nx/devkit'; export function normalizeOptions(schema: Schema): NormalizedSchema { - let buildTarget = (schema as SchemaWithBuildTarget).buildTarget; - if ((schema as SchemaWithBrowserTarget).browserTarget) { - buildTarget ??= (schema as SchemaWithBrowserTarget).browserTarget; - delete (schema as SchemaWithBrowserTarget).browserTarget; - } schema.buildLibsFromSource ??= true; process.env.NX_BUILD_LIBS_FROM_SOURCE = `${schema.buildLibsFromSource}`; - process.env.NX_BUILD_TARGET = `${buildTarget}`; + process.env.NX_BUILD_TARGET = `${schema.buildTarget}`; return { ...schema, - buildTarget, devRemotes: schema.devRemotes ?? [], host: schema.host ?? 'localhost', port: schema.port ?? 4200, diff --git a/packages/angular/src/executors/module-federation-dev-server/schema.d.ts b/packages/angular/src/executors/module-federation-dev-server/schema.d.ts index 6c9f61969b..3eeb31d007 100644 --- a/packages/angular/src/executors/module-federation-dev-server/schema.d.ts +++ b/packages/angular/src/executors/module-federation-dev-server/schema.d.ts @@ -1,6 +1,7 @@ import type { DevRemoteDefinition } from '../../builders/utilities/module-federation'; -interface BaseSchema { +interface Schema { + buildTarget: string; port?: number; host?: string; proxyConfig?: string; @@ -28,20 +29,7 @@ interface BaseSchema { buildLibsFromSource?: boolean; } -export type SchemaWithBrowserTarget = BaseSchema & { - /** - * @deprecated Use `buildTarget` instead. It will be removed when Angular v20 is released. - */ - browserTarget: string; -}; - -export type SchemaWithBuildTarget = BaseSchema & { - buildTarget: string; -}; - -export type Schema = SchemaWithBrowserTarget | SchemaWithBuildTarget; - -export type NormalizedSchema = SchemaWithBuildTarget & { +export type NormalizedSchema = Schema & { devRemotes: DevRemoteDefinition[]; liveReload: boolean; open: boolean; diff --git a/packages/angular/src/executors/module-federation-dev-server/schema.json b/packages/angular/src/executors/module-federation-dev-server/schema.json index 8ab1793525..f1c10d0583 100644 --- a/packages/angular/src/executors/module-federation-dev-server/schema.json +++ b/packages/angular/src/executors/module-federation-dev-server/schema.json @@ -12,12 +12,6 @@ } ], "properties": { - "browserTarget": { - "type": "string", - "description": "A browser builder target to serve in the format of `project:target[:configuration]`.", - "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed when Angular v20 is released." - }, "buildTarget": { "type": "string", "description": "A build builder target to serve in the format of `project:target[:configuration]`.", @@ -166,18 +160,11 @@ }, "buildLibsFromSource": { "type": "boolean", - "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `browserTarget` options, or it will default to `true` if it's also not set in the `browserTarget` options.", + "description": "Read buildable libraries from source instead of building them separately. If not set, it will take the value specified in the `buildTarget` options, or it will default to `true` if it's also not set in the `buildTarget` options.", "x-priority": "important" } }, "additionalProperties": false, - "anyOf": [ - { - "required": ["buildTarget"] - }, - { - "required": ["browserTarget"] - } - ], + "required": ["buildTarget"], "examplesFile": "../../../docs/module-federation-dev-server-examples.md" } diff --git a/packages/angular/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts b/packages/angular/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts index c53565e683..dbbd4eba08 100644 --- a/packages/angular/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts +++ b/packages/angular/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts @@ -1,24 +1,24 @@ -import { executeSSRDevServerBuilder } from '@angular-devkit/build-angular'; import { type ExecutorContext, logger } from '@nx/devkit'; -import { existsSync } from 'fs'; -import { readProjectsConfigurationFromProjectGraph } from 'nx/src/project-graph/project-graph'; -import { extname, join } from 'path'; -import { - getDynamicMfManifestFile, - validateDevRemotes, -} from '../../builders/utilities/module-federation'; -import type { Schema } from './schema'; -import { startRemoteIterators } from '@nx/module-federation/src/executors/utils'; -import { startRemotes } from './lib/start-dev-remotes'; import { combineAsyncIterables, createAsyncIterable, mapAsyncIterable, } from '@nx/devkit/src/utils/async-iterable'; import { eachValueFrom } from '@nx/devkit/src/utils/rxjs-for-await'; -import { createBuilderContext } from 'nx/src/adapter/ngcli-adapter'; -import { normalizeOptions } from './lib/normalize-options'; +import { startRemoteIterators } from '@nx/module-federation/src/executors/utils'; import { waitForPortOpen } from '@nx/web/src/utils/wait-for-port-open'; +import { existsSync } from 'fs'; +import { createBuilderContext } from 'nx/src/adapter/ngcli-adapter'; +import { readProjectsConfigurationFromProjectGraph } from 'nx/src/project-graph/project-graph'; +import { extname, join } from 'path'; +import { + getDynamicMfManifestFile, + validateDevRemotes, +} from '../../builders/utilities/module-federation'; +import { assertBuilderPackageIsInstalled } from '../utilities/builder-package'; +import { normalizeOptions } from './lib/normalize-options'; +import { startRemotes } from './lib/start-dev-remotes'; +import type { Schema } from './schema'; export async function* moduleFederationSsrDevServerExecutor( schema: Schema, @@ -26,6 +26,11 @@ export async function* moduleFederationSsrDevServerExecutor( ) { const options = normalizeOptions(schema); + assertBuilderPackageIsInstalled('@angular-devkit/build-angular'); + const { executeSSRDevServerBuilder } = await import( + '@angular-devkit/build-angular' + ); + const currIter = eachValueFrom( executeSSRDevServerBuilder( options, diff --git a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.ts b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.ts index f76337a0b5..034041ec82 100644 --- a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.ts +++ b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.ts @@ -1,34 +1,117 @@ import type { DestinationFiles, NgEntryPoint as NgEntryPointBase, -} from 'ng-packagr/lib/ng-package/entry-point/entry-point'; -import type { NgPackageConfig } from 'ng-packagr/ng-package.schema'; -import { dirname } from 'node:path'; +} from 'ng-packagr/src/lib/ng-package/entry-point/entry-point'; +import type { NgPackageConfig } from 'ng-packagr/src/ng-package.schema'; +import { dirname, join, relative } from 'node:path'; import { getNgPackagrVersionInfo } from '../../../../utilities/ng-packagr/ng-packagr-version'; import { importNgPackagrPath } from '../../../../utilities/ng-packagr/package-imports'; +export type NgEntryPointType = NgEntryPointBase & { + primaryDestinationPath?: string; +}; + export function createNgEntryPoint( packageJson: Record, ngPackageJson: NgPackageConfig, basePath: string, secondaryData?: Record -): NgEntryPointBase { +): NgEntryPointType { const { major: ngPackagrMajorVersion } = getNgPackagrVersionInfo(); const { NgEntryPoint: NgEntryPointBase } = importNgPackagrPath< - typeof import('ng-packagr/lib/ng-package/entry-point/entry-point') - >('ng-packagr/lib/ng-package/entry-point/entry-point', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/ng-package/entry-point/entry-point') + >( + 'ng-packagr/src/lib/ng-package/entry-point/entry-point', + ngPackagrMajorVersion + ); + + if (ngPackagrMajorVersion < 20) { + class NgEntryPoint extends NgEntryPointBase { + /** + * Point the FESM2022 files to the ESM2022 files. + */ + public override get destinationFiles(): DestinationFiles { + const result = super.destinationFiles; + result.fesm2022 = result.esm2022; + result.fesm2022Dir = dirname(result.esm2022); + + return result; + } + } + + return new NgEntryPoint( + packageJson, + ngPackageJson, + basePath, + secondaryData + ); + } + + const { ensureUnixPath } = importNgPackagrPath< + typeof import('ng-packagr/src/lib/utils/path') + >('ng-packagr/src/lib/utils/path', ngPackagrMajorVersion); class NgEntryPoint extends NgEntryPointBase { - /** - * Point the FESM2022 files to the ESM2022 files. - */ - public override get destinationFiles(): DestinationFiles { - const result = super.destinationFiles; - result.fesm2022 = result.esm2022; - result.fesm2022Dir = dirname(result.esm2022); + constructor( + public readonly packageJson: Record, + public readonly ngPackageJson: NgPackageConfig, + public readonly basePath: string, + private readonly _secondaryData?: Record + ) { + super(packageJson, ngPackageJson, basePath, _secondaryData); + } - return result; + public get primaryDestinationPath(): string { + return ( + this._secondaryData?.primaryDestinationPath ?? this.destinationPath + ); + } + + public get destinationFiles(): DestinationFiles { + let primaryDestPath = this.destinationPath; + let secondaryDir = ''; + + if (this._secondaryData) { + primaryDestPath = this._secondaryData.primaryDestinationPath; + secondaryDir = relative( + primaryDestPath, + this._secondaryData.destinationPath + ); + } + + const flatModuleFile = this.flatModuleFile; + const pathJoinWithDest = (...paths: string[]) => + join(primaryDestPath, ...paths); + + return { + directory: ensureUnixPath(secondaryDir), + declarations: pathJoinWithDest( + 'tmp-typings', + secondaryDir, + `${flatModuleFile}.d.ts` + ), + // changed to use esm2022 + declarationsBundled: pathJoinWithDest( + 'esm2022', + secondaryDir, + `${flatModuleFile}.d.ts` + ), + declarationsDir: pathJoinWithDest(secondaryDir), + esm2022: pathJoinWithDest( + 'tmp-esm2022', + secondaryDir, + `${flatModuleFile}.js` + ), + // changed to use esm2022 + fesm2022: pathJoinWithDest( + 'esm2022', + secondaryDir, + `${flatModuleFile}.js` + ), + // changed to use esm2022 + fesm2022Dir: pathJoinWithDest('esm2022'), + }; } } diff --git a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.ts b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.ts index 4adf0b9b9c..a4184bd362 100644 --- a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.ts +++ b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.ts @@ -1,4 +1,4 @@ -import type { TransformProvider } from 'ng-packagr/lib/graph/transform.di'; +import type { TransformProvider } from 'ng-packagr/src/lib/graph/transform.di'; import { getNgPackagrVersionInfo } from '../../../../utilities/ng-packagr/ng-packagr-version'; import { importNgPackagrPath } from '../../../../utilities/ng-packagr/package-imports'; import { writeBundlesTransform } from './write-bundles.transform'; @@ -7,17 +7,17 @@ export function getWriteBundlesTransformProvider(): TransformProvider { const { major: ngPackagrMajorVersion } = getNgPackagrVersionInfo(); const { provideTransform } = importNgPackagrPath< - typeof import('ng-packagr/lib/graph/transform.di') - >('ng-packagr/lib/graph/transform.di', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/graph/transform.di') + >('ng-packagr/src/lib/graph/transform.di', ngPackagrMajorVersion); const { WRITE_BUNDLES_TRANSFORM_TOKEN } = importNgPackagrPath< - typeof import('ng-packagr/lib/ng-package/entry-point/write-bundles.di') + typeof import('ng-packagr/src/lib/ng-package/entry-point/write-bundles.di') >( - 'ng-packagr/lib/ng-package/entry-point/write-bundles.di', + 'ng-packagr/src/lib/ng-package/entry-point/write-bundles.di', ngPackagrMajorVersion ); const { OPTIONS_TOKEN } = importNgPackagrPath< - typeof import('ng-packagr/lib/ng-package/options.di') - >('ng-packagr/lib/ng-package/options.di', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/ng-package/options.di') + >('ng-packagr/src/lib/ng-package/options.di', ngPackagrMajorVersion); return provideTransform({ provide: WRITE_BUNDLES_TRANSFORM_TOKEN, diff --git a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.ts b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.ts index 5928b543d5..de1364a7a7 100644 --- a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.ts +++ b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.ts @@ -7,29 +7,29 @@ * - Fake the FESM2022 outputs pointing them to the ESM2022 outputs. */ -import type { NgEntryPoint } from 'ng-packagr/lib/ng-package/entry-point/entry-point'; -import type { NgPackagrOptions } from 'ng-packagr/lib/ng-package/options.di'; +import type { NgEntryPoint } from 'ng-packagr/src/lib/ng-package/entry-point/entry-point'; +import type { NgPackagrOptions } from 'ng-packagr/src/lib/ng-package/options.di'; import { mkdir, writeFile } from 'node:fs/promises'; -import { dirname } from 'node:path'; +import { dirname, join } from 'node:path'; import { getNgPackagrVersionInfo } from '../../../../utilities/ng-packagr/ng-packagr-version'; import { importNgPackagrPath } from '../../../../utilities/ng-packagr/package-imports'; -import { createNgEntryPoint } from './entry-point'; +import { createNgEntryPoint, type NgEntryPointType } from './entry-point'; export const writeBundlesTransform = (_options: NgPackagrOptions) => { const { major: ngPackagrMajorVersion } = getNgPackagrVersionInfo(); const { BuildGraph } = importNgPackagrPath< - typeof import('ng-packagr/lib/graph/build-graph') - >('ng-packagr/lib/graph/build-graph', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/graph/build-graph') + >('ng-packagr/src/lib/graph/build-graph', ngPackagrMajorVersion); const { transformFromPromise } = importNgPackagrPath< - typeof import('ng-packagr/lib/graph/transform') - >('ng-packagr/lib/graph/transform', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/graph/transform') + >('ng-packagr/src/lib/graph/transform', ngPackagrMajorVersion); const { isEntryPoint, isPackage } = importNgPackagrPath< - typeof import('ng-packagr/lib/ng-package/nodes') - >('ng-packagr/lib/ng-package/nodes', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/ng-package/nodes') + >('ng-packagr/src/lib/ng-package/nodes', ngPackagrMajorVersion); const { NgPackage } = importNgPackagrPath< - typeof import('ng-packagr/lib/ng-package/package') - >('ng-packagr/lib/ng-package/package', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/ng-package/package') + >('ng-packagr/src/lib/ng-package/package', ngPackagrMajorVersion); return transformFromPromise(async (graph) => { const updatedGraph = new BuildGraph(); @@ -41,9 +41,13 @@ export const writeBundlesTransform = (_options: NgPackagrOptions) => { entry.data.destinationFiles = entryPoint.destinationFiles; for (const [path, outputCache] of entry.cache.outputCache.entries()) { + const normalizedPath = normalizeEsm2022Path(path, entryPoint); // write the outputs to the file system - await mkdir(dirname(path), { recursive: true }); - await writeFile(path, outputCache.content); + await mkdir(dirname(normalizedPath), { recursive: true }); + await writeFile(normalizedPath, outputCache.content); + } + if (!entry.cache.outputCache.size && entryPoint.isSecondaryEntryPoint) { + await mkdir(entryPoint.destinationPath, { recursive: true }); } } else if (isPackage(entry)) { entry.data = new NgPackage( @@ -61,7 +65,26 @@ export const writeBundlesTransform = (_options: NgPackagrOptions) => { }); }; -function toCustomNgEntryPoint(entryPoint: NgEntryPoint): NgEntryPoint { +function normalizeEsm2022Path( + path: string, + entryPoint: NgEntryPointType +): string { + if (!entryPoint.primaryDestinationPath) { + return path; + } + + if (path.startsWith(join(entryPoint.primaryDestinationPath, 'tmp-esm2022'))) { + return path.replace('tmp-esm2022', 'esm2022'); + } + + if (path.startsWith(join(entryPoint.primaryDestinationPath, 'tmp-typings'))) { + return path.replace('tmp-typings', 'esm2022'); + } + + return path; +} + +function toCustomNgEntryPoint(entryPoint: NgEntryPoint): NgEntryPointType { return createNgEntryPoint( entryPoint.packageJson, entryPoint.ngPackageJson, diff --git a/packages/angular/src/executors/ng-packagr-lite/schema.json b/packages/angular/src/executors/ng-packagr-lite/schema.json index da37fab49f..a47e21e427 100644 --- a/packages/angular/src/executors/ng-packagr-lite/schema.json +++ b/packages/angular/src/executors/ng-packagr-lite/schema.json @@ -31,9 +31,8 @@ }, "poll": { "type": "number", - "description": "Enable and define the file watching poll time period in milliseconds. _Note: this is only supported in Angular versions >= 18.0.0_." + "description": "Enable and define the file watching poll time period in milliseconds." } }, - "additionalProperties": false, - "required": ["project"] + "additionalProperties": false } diff --git a/packages/angular/src/executors/package/package.impl.ts b/packages/angular/src/executors/package/package.impl.ts index f951d2ef5d..34c1980922 100644 --- a/packages/angular/src/executors/package/package.impl.ts +++ b/packages/angular/src/executors/package/package.impl.ts @@ -9,7 +9,6 @@ import type { NgPackagr } from 'ng-packagr'; import { join, resolve } from 'path'; import { from } from 'rxjs'; import { mapTo, switchMap } from 'rxjs/operators'; -import { getInstalledAngularVersionInfo } from '../utilities/angular-version-utils'; import { parseRemappedTsConfigAndMergeDefaults } from '../utilities/typescript'; import { getNgPackagrInstance } from './ng-packagr-adjustments/ng-packagr'; import type { BuildAngularLibraryExecutorOptions } from './schema'; @@ -56,13 +55,10 @@ export function createLibraryExecutor( options: BuildAngularLibraryExecutorOptions, context: ExecutorContext ) { - const { major: angularMajorVersion, version: angularVersion } = - getInstalledAngularVersionInfo(); - if (angularMajorVersion < 18 && options.poll !== undefined) { - throw new Error( - `The "poll" option requires Angular version 18.0.0 or greater. You are currently using version ${angularVersion}.` - ); - } + options.project ??= join( + context.projectsConfigurations.projects[context.projectName].root, + 'ng-package.json' + ); const { dependencies } = calculateProjectBuildableDependencies( context.taskGraph, diff --git a/packages/angular/src/executors/package/schema.d.ts b/packages/angular/src/executors/package/schema.d.ts index eb0248ee02..6e8059ddcb 100644 --- a/packages/angular/src/executors/package/schema.d.ts +++ b/packages/angular/src/executors/package/schema.d.ts @@ -1,4 +1,6 @@ import type { NgPackagrBuilderOptions } from '@angular-devkit/build-angular'; export interface BuildAngularLibraryExecutorOptions - extends NgPackagrBuilderOptions {} + extends NgPackagrBuilderOptions { + project?: string; +} diff --git a/packages/angular/src/executors/package/schema.json b/packages/angular/src/executors/package/schema.json index 540c0578a8..a6de8f01c4 100644 --- a/packages/angular/src/executors/package/schema.json +++ b/packages/angular/src/executors/package/schema.json @@ -31,9 +31,8 @@ }, "poll": { "type": "number", - "description": "Enable and define the file watching poll time period in milliseconds. _Note: this is only supported in Angular versions >= 18.0.0_." + "description": "Enable and define the file watching poll time period in milliseconds." } }, - "additionalProperties": false, - "required": ["project"] + "additionalProperties": false } diff --git a/packages/angular/src/executors/utilities/builder-package.ts b/packages/angular/src/executors/utilities/builder-package.ts new file mode 100644 index 0000000000..c075ae8ead --- /dev/null +++ b/packages/angular/src/executors/utilities/builder-package.ts @@ -0,0 +1,9 @@ +export function assertBuilderPackageIsInstalled(packageName: string): void { + try { + require.resolve(packageName); + } catch { + throw new Error( + `This executor requires the package ${packageName} to be installed. Please make sure it is installed and try again.` + ); + } +} diff --git a/packages/angular/src/executors/utilities/esbuild-extensions.ts b/packages/angular/src/executors/utilities/esbuild-extensions.ts index dcee69217f..cf0055b80a 100644 --- a/packages/angular/src/executors/utilities/esbuild-extensions.ts +++ b/packages/angular/src/executors/utilities/esbuild-extensions.ts @@ -1,12 +1,11 @@ +import type { buildApplication } from '@angular/build'; import { registerTsProject } from '@nx/js/src/internal'; import { loadModule } from './module-loader'; // This is a workaround to make sure we use the same esbuild version as the // Angular DevKit uses. This is only used internally to load the plugins and // forward them to the Angular DevKit builders. -type Plugin = Parameters< - typeof import('@angular-devkit/build-angular').buildApplication ->[2]['codePlugins'][number]; +type Plugin = Parameters[2]['codePlugins'][number]; export type PluginSpec = { path: string; diff --git a/packages/angular/src/executors/utilities/ng-packagr/package-imports.ts b/packages/angular/src/executors/utilities/ng-packagr/package-imports.ts index 49fcec6ebf..53e3a8588b 100644 --- a/packages/angular/src/executors/utilities/ng-packagr/package-imports.ts +++ b/packages/angular/src/executors/utilities/ng-packagr/package-imports.ts @@ -1,11 +1,13 @@ +type NgPackagrImportPath = `ng-packagr/src/${string}`; + export function importNgPackagrPath( - path: string, + path: NgPackagrImportPath, ngPackagrMajorVersion: number ): T { - let finalPath = path; + let finalPath: string = path; - if (ngPackagrMajorVersion >= 20 && !path.startsWith('ng-packagr/src/')) { - finalPath = path.replace(/^ng-packagr\//, 'ng-packagr/src/'); + if (ngPackagrMajorVersion < 20 && path.startsWith('ng-packagr/src/')) { + finalPath = path.replace(/^ng-packagr\/src\//, 'ng-packagr/'); } return require(finalPath); diff --git a/packages/angular/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.ts b/packages/angular/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.ts index 99449fc61c..b8e202f2e6 100644 --- a/packages/angular/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.ts +++ b/packages/angular/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.ts @@ -2,21 +2,15 @@ * Adapted from the original ng-packagr source. * * Changes made: - * - Use our own function to get the TailwindCSS config path to support a - * config at the root of the workspace. + * - Resolve `piscina` from the installed `ng-packagr` package. + * - Additionally search for the TailwindCSS config in the workspace root. */ +import { workspaceRoot } from '@nx/devkit'; import browserslist from 'browserslist'; import { existsSync } from 'fs'; +import { colors } from 'ng-packagr/src/lib/utils/color'; import { dirname, join } from 'path'; -const Piscina = require('piscina'); -import { colors } from 'ng-packagr/lib/utils/color'; -// using this instead of the one from ng-packagr -import { getTailwindConfigPath } from '../tailwindcss'; -import { workspaceRoot } from '@nx/devkit'; -import type { PostcssConfiguration } from 'ng-packagr/lib/styles/postcss-configuration'; -import { gt, gte } from 'semver'; -import { getNgPackagrVersionInfo } from '../ng-packagr-version'; const maxWorkersVariable = process.env['NG_BUILD_MAX_WORKERS']; const maxThreads = @@ -30,7 +24,7 @@ export enum CssUrl { } export class StylesheetProcessor { - private renderWorker: typeof Piscina | undefined; + private renderWorker: any | undefined; constructor( private readonly projectBasePath: string, @@ -91,33 +85,22 @@ export class StylesheetProcessor { const browserslistData = browserslist(undefined, { path: this.basePath }); - const { version: ngPackagrVersion } = getNgPackagrVersionInfo(); - let tailwindConfigPath: string | undefined; - let postcssConfiguration: PostcssConfiguration | undefined; - if (gte(ngPackagrVersion, '18.0.0')) { - const { - findTailwindConfiguration, - generateSearchDirectories, - loadPostcssConfiguration, - } = require('ng-packagr/lib/styles/postcss-configuration'); - let searchDirs = generateSearchDirectories([this.projectBasePath]); - postcssConfiguration = loadPostcssConfiguration(searchDirs); - // (nx-specific): we support loading the TailwindCSS config from the root of the workspace - searchDirs = generateSearchDirectories([ - this.projectBasePath, - workspaceRoot, - ]); - tailwindConfigPath = findTailwindConfiguration(searchDirs); - } else if (gt(ngPackagrVersion, '17.2.0')) { - const { - loadPostcssConfiguration, - } = require('ng-packagr/lib/styles/postcss-configuration'); - postcssConfiguration = loadPostcssConfiguration(this.projectBasePath); - tailwindConfigPath = getTailwindConfigPath( - this.projectBasePath, - workspaceRoot - ); - } + const { + findTailwindConfiguration, + generateSearchDirectories, + loadPostcssConfiguration, + } = require('ng-packagr/lib/styles/postcss-configuration'); + + let searchDirs = generateSearchDirectories([this.projectBasePath]); + const postcssConfiguration = loadPostcssConfiguration(searchDirs); + // (nx-specific): we support loading the TailwindCSS config from the root of the workspace + searchDirs = generateSearchDirectories([ + this.projectBasePath, + workspaceRoot, + ]); + const tailwindConfigPath = findTailwindConfiguration(searchDirs); + + const Piscina = getPiscina(); this.renderWorker = new Piscina({ filename: require.resolve( @@ -143,112 +126,6 @@ export class StylesheetProcessor { } } -/** - * This class is used when ng-packagr version is 17.2.0. The async `loadPostcssConfiguration` function - * introduced in ng-packagr 17.2.0 causes a memory leak due to multiple workers being created. We must - * keep this class to support any workspace that might be using ng-packagr 17.2.0 where that function - * need to be awaited. - */ -export class AsyncStylesheetProcessor { - private renderWorker: typeof Piscina | undefined; - - constructor( - private readonly projectBasePath: string, - private readonly basePath: string, - private readonly cssUrl?: CssUrl, - private readonly includePaths?: string[], - private readonly cacheDirectory?: string | false - ) { - // By default, browserslist defaults are too inclusive - // https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522 - // We change the default query to browsers that Angular support. - // https://angular.io/guide/browser-support - (browserslist.defaults as string[]) = [ - 'last 2 Chrome versions', - 'last 1 Firefox version', - 'last 2 Edge major versions', - 'last 2 Safari major versions', - 'last 2 iOS major versions', - 'Firefox ESR', - ]; - } - - async process({ - filePath, - content, - }: { - filePath: string; - content: string; - }): Promise { - await this.createRenderWorker(); - - return this.renderWorker.run({ content, filePath }); - } - - /** Destory workers in pool. */ - destroy(): void { - void this.renderWorker?.destroy(); - } - - private async createRenderWorker(): Promise { - if (this.renderWorker) { - return; - } - - const styleIncludePaths = [...this.includePaths]; - let prevDir = null; - let currentDir = this.basePath; - - while (currentDir !== prevDir) { - const p = join(currentDir, 'node_modules'); - if (existsSync(p)) { - styleIncludePaths.push(p); - } - - prevDir = currentDir; - currentDir = dirname(prevDir); - } - - const browserslistData = browserslist(undefined, { path: this.basePath }); - - const { version: ngPackagrVersion } = getNgPackagrVersionInfo(); - let postcssConfiguration: PostcssConfiguration | undefined; - if (ngPackagrVersion === '17.2.0') { - const { - loadPostcssConfiguration, - } = require('ng-packagr/lib/styles/postcss-configuration'); - postcssConfiguration = await loadPostcssConfiguration( - this.projectBasePath - ); - } - - this.renderWorker = new Piscina({ - filename: require.resolve( - 'ng-packagr/lib/styles/stylesheet-processor-worker' - ), - maxThreads, - recordTiming: false, - env: { - ...process.env, - FORCE_COLOR: '' + colors.enabled, - }, - workerData: { - postcssConfiguration, - tailwindConfigPath: getTailwindConfigPath( - this.projectBasePath, - workspaceRoot - ), - projectBasePath: this.projectBasePath, - browserslistData, - targets: transformSupportedBrowsersToTargets(browserslistData), - cacheDirectory: this.cacheDirectory, - cssUrl: this.cssUrl, - styleIncludePaths, - }, - }); - } -} - function transformSupportedBrowsersToTargets( supportedBrowsers: string[] ): string[] { @@ -288,3 +165,34 @@ function transformSupportedBrowsersToTargets( return transformed.length ? transformed : undefined; } + +/** + * Loads the `piscina` package from the installed `ng-packagr` package. + */ +function getPiscina() { + const ngPackagrPath = getInstalledNgPackagrPath(); + + try { + // Resolve the main piscina module entry point + const piscinaModulePath = require.resolve('piscina', { + paths: [ngPackagrPath], + }); + + return require(piscinaModulePath); + } catch (error) { + throw new Error( + `Failed to load the \`piscina\` package from \`ng-packagr\` dependencies: ${error.message}` + ); + } +} + +function getInstalledNgPackagrPath(): string { + try { + const ngPackagrPackageJsonPath = require.resolve('ng-packagr/package.json'); + return dirname(ngPackagrPackageJsonPath); + } catch (e) { + throw new Error( + 'The `ng-packagr` package is not installed. The package is required to use this executor. Please install it in your workspace.' + ); + } +} diff --git a/packages/angular/src/executors/utilities/ng-packagr/stylesheet-processor.di.ts b/packages/angular/src/executors/utilities/ng-packagr/stylesheet-processor.di.ts index d498898c80..8999a51f28 100644 --- a/packages/angular/src/executors/utilities/ng-packagr/stylesheet-processor.di.ts +++ b/packages/angular/src/executors/utilities/ng-packagr/stylesheet-processor.di.ts @@ -3,12 +3,11 @@ import { getNgPackagrVersionInfo } from './ng-packagr-version'; import { importNgPackagrPath } from './package-imports'; export function getStylesheetProcessorFactoryProvider(): FactoryProvider { - const { major: ngPackagrMajorVersion, version: ngPackagrVersion } = - getNgPackagrVersionInfo(); + const { major: ngPackagrMajorVersion } = getNgPackagrVersionInfo(); const { STYLESHEET_PROCESSOR_TOKEN } = importNgPackagrPath< - typeof import('ng-packagr/lib/styles/stylesheet-processor.di') - >('ng-packagr/lib/styles/stylesheet-processor.di', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/styles/stylesheet-processor.di') + >('ng-packagr/src/lib/styles/stylesheet-processor.di', ngPackagrMajorVersion); return { provide: STYLESHEET_PROCESSOR_TOKEN, @@ -20,17 +19,8 @@ export function getStylesheetProcessorFactoryProvider(): FactoryProvider { return getStylesheetProcessor(); } - if (ngPackagrVersion !== '17.2.0') { - const { - StylesheetProcessor, - } = require('./pre-v19/stylesheet-processor'); - return StylesheetProcessor; - } - - const { - AsyncStylesheetProcessor, - } = require('./pre-v19/stylesheet-processor'); - return AsyncStylesheetProcessor; + const { StylesheetProcessor } = require('./pre-v19/stylesheet-processor'); + return StylesheetProcessor; }, deps: [], }; diff --git a/packages/angular/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.ts b/packages/angular/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.ts index 5990c33c42..5e9501bffd 100644 --- a/packages/angular/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.ts +++ b/packages/angular/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.ts @@ -7,7 +7,7 @@ import { workspaceRoot } from '@nx/devkit'; import browserslist from 'browserslist'; -import type { NgPackageEntryConfig } from 'ng-packagr/ng-entrypoint.schema'; +import type { NgPackageEntryConfig } from 'ng-packagr/src/ng-entrypoint.schema'; import { getNgPackagrVersionInfo } from '../ng-packagr-version'; import { importNgPackagrPath } from '../package-imports'; @@ -30,15 +30,15 @@ export function getStylesheetProcessor(): new ( const { major: ngPackagrMajorVersion } = getNgPackagrVersionInfo(); const { ComponentStylesheetBundler } = importNgPackagrPath< - typeof import('ng-packagr/lib/styles/component-stylesheets') - >('ng-packagr/lib/styles/component-stylesheets', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/styles/component-stylesheets') + >('ng-packagr/src/lib/styles/component-stylesheets', ngPackagrMajorVersion); const { generateSearchDirectories, getTailwindConfig, loadPostcssConfiguration, } = importNgPackagrPath< - typeof import('ng-packagr/lib/styles/postcss-configuration') - >('ng-packagr/lib/styles/postcss-configuration', ngPackagrMajorVersion); + typeof import('ng-packagr/src/lib/styles/postcss-configuration') + >('ng-packagr/src/lib/styles/postcss-configuration', ngPackagrMajorVersion); class StylesheetProcessor extends ComponentStylesheetBundler { constructor( @@ -53,15 +53,21 @@ export function getStylesheetProcessor(): new ( // By default, browserslist defaults are too inclusive // https://github.com/browserslist/browserslist/blob/83764ea81ffaa39111c204b02c371afa44a4ff07/index.js#L516-L522 // We change the default query to browsers that Angular support. - // https://angular.io/guide/browser-support - (browserslist.defaults as string[]) = [ - 'last 2 Chrome versions', - 'last 1 Firefox version', - 'last 2 Edge major versions', - 'last 2 Safari major versions', - 'last 2 iOS major versions', - 'Firefox ESR', - ]; + // https://angular.dev/reference/versions#browser-support + if (ngPackagrMajorVersion >= 20) { + (browserslist.defaults as string[]) = browserslist(undefined, { + path: require.resolve('ng-packagr/.browserslistrc'), + }); + } else { + (browserslist.defaults as string[]) = [ + 'last 2 Chrome versions', + 'last 1 Firefox version', + 'last 2 Edge major versions', + 'last 2 Safari major versions', + 'last 2 iOS major versions', + 'Firefox ESR', + ]; + } const browserslistData = browserslist(undefined, { path: basePath }); let searchDirs = generateSearchDirectories([projectBasePath]); diff --git a/packages/angular/src/executors/utilities/patch-builder-context.ts b/packages/angular/src/executors/utilities/patch-builder-context.ts index 071a74bb1f..1c93666838 100644 --- a/packages/angular/src/executors/utilities/patch-builder-context.ts +++ b/packages/angular/src/executors/utilities/patch-builder-context.ts @@ -1,9 +1,7 @@ import type { BuilderContext } from '@angular-devkit/architect'; -import type { - ApplicationBuilderOptions, - BrowserBuilderOptions, -} from '@angular-devkit/build-angular'; +import type { BrowserBuilderOptions } from '@angular-devkit/build-angular'; import type { Schema as BrowserEsbuildBuilderOptions } from '@angular-devkit/build-angular/src/builders/browser-esbuild/schema'; +import type { ApplicationBuilderOptions } from '@angular/build'; import type { Target } from '@nx/devkit'; const executorToBuilderMap = new Map([ diff --git a/packages/angular/src/generators/add-linting/__snapshots__/add-linting.spec.ts.snap b/packages/angular/src/generators/add-linting/__snapshots__/add-linting.spec.ts.snap index deedf6d74c..153077a36f 100644 --- a/packages/angular/src/generators/add-linting/__snapshots__/add-linting.spec.ts.snap +++ b/packages/angular/src/generators/add-linting/__snapshots__/add-linting.spec.ts.snap @@ -18,6 +18,7 @@ exports[`addLinting generator should correctly generate the .eslintrc.json file "*.ts", ], "rules": { + "@angular-eslint/component-class-suffix": "off", "@angular-eslint/component-selector": [ "error", { @@ -26,6 +27,7 @@ exports[`addLinting generator should correctly generate the .eslintrc.json file "type": "element", }, ], + "@angular-eslint/directive-class-suffix": "off", "@angular-eslint/directive-selector": [ "error", { diff --git a/packages/angular/src/generators/add-linting/add-linting.spec.ts b/packages/angular/src/generators/add-linting/add-linting.spec.ts index 26a6132adc..344259193b 100644 --- a/packages/angular/src/generators/add-linting/add-linting.spec.ts +++ b/packages/angular/src/generators/add-linting/add-linting.spec.ts @@ -66,7 +66,7 @@ describe('addLinting generator', () => { const { devDependencies } = readJson(tree, 'package.json'); expect(devDependencies['@typescript-eslint/utils']).toMatchInlineSnapshot( - `"^8.19.0"` + `"^8.29.0"` ); delete process.env.ESLINT_USE_FLAT_CONFIG; }); @@ -168,7 +168,9 @@ describe('addLinting generator', () => { prefix: "my-org", style: "kebab-case" } - ] + ], + "@angular-eslint/component-class-suffix": "off", + "@angular-eslint/directive-class-suffix": "off" } }, { @@ -289,7 +291,9 @@ describe('addLinting generator', () => { "prefix": "my-org", "style": "kebab-case" } - ] + ], + "@angular-eslint/component-class-suffix": "off", + "@angular-eslint/directive-class-suffix": "off" } }, { diff --git a/packages/angular/src/generators/add-linting/add-linting.ts b/packages/angular/src/generators/add-linting/add-linting.ts index 782b5c94e2..e96765aa50 100755 --- a/packages/angular/src/generators/add-linting/add-linting.ts +++ b/packages/angular/src/generators/add-linting/add-linting.ts @@ -82,6 +82,10 @@ 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, { @@ -121,6 +125,10 @@ 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', }, }, { diff --git a/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap b/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap index 6792d4ef17..7430053125 100644 --- a/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap +++ b/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap @@ -27,7 +27,6 @@ exports[`app --minimal should generate a correct setup when --bundler=rspack and "styles": [ "./src/styles.css" ], - "scripts": [], "devServer": {}, "ssr": { "entry": "./src/server.ts" @@ -188,7 +187,6 @@ exports[`app --minimal should generate a correct setup when --bundler=rspack inc "styles": [ "./src/styles.css" ], - "scripts": [], "devServer": {} } @@ -228,54 +226,54 @@ exports[`app --minimal should generate a correct setup when --bundler=rspack inc }});" `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps with routing 1`] = ` -"import { NgModule } from '@angular/core'; +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps with routing 1`] = ` +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; @NgModule({ - declarations: [AppComponent], + declarations: [App], imports: [ BrowserModule, RouterModule.forRoot(appRoutes), ], - providers: [], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners()], + bootstrap: [App], }) export class AppModule {} " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps with routing 2`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps with routing 2`] = ` "import { Component } from '@angular/core'; @Component({ selector: 'app-root', standalone: false, - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent {} +export class App {} " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps with routing 3`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps with routing 3`] = ` "import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { RouterModule } from '@angular/router'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [RouterModule.forRoot([])], - declarations: [AppComponent] + declarations: [App] }).compileComponents(); }); it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( @@ -286,56 +284,56 @@ describe('AppComponent', () => { " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps with routing 4`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps with routing 4`] = ` "

Welcome plain

" `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps without routing 1`] = ` -"import { NgModule } from '@angular/core'; +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps without routing 1`] = ` +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; +import { App } from './app'; @NgModule({ - declarations: [AppComponent], + declarations: [App], imports: [ BrowserModule, ], - providers: [], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners()], + bootstrap: [App], }) export class AppModule {} " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps without routing 2`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps without routing 2`] = ` "import { Component } from '@angular/core'; @Component({ selector: 'app-root', standalone: false, - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent {} +export class App {} " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps without routing 3`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps without routing 3`] = ` "import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; +import { App } from './app'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [], - declarations: [AppComponent] + declarations: [App] }).compileComponents(); }); it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( @@ -346,39 +344,39 @@ describe('AppComponent', () => { " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for non-standalone apps without routing 4`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for non-standalone apps without routing 4`] = ` "

Welcome plain

" `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for standalone apps with routing 1`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for standalone apps with routing 1`] = ` "import { Component } from '@angular/core'; import { RouterModule } from '@angular/router'; @Component({ imports: [RouterModule], selector: 'app-root', - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent {} +export class App {} " `; -exports[`app --minimal should skip "nx-welcome.component.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 { AppComponent } from './app.component'; +import { App } from './app'; import { RouterModule } from '@angular/router'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [AppComponent, RouterModule.forRoot([])], + imports: [App, RouterModule.forRoot([])], }).compileComponents(); }); it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( @@ -389,38 +387,38 @@ describe('AppComponent', () => { " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for standalone apps with routing 3`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for standalone apps with routing 3`] = ` "

Welcome plain

" `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for standalone apps without routing 1`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for standalone apps without routing 1`] = ` "import { Component } from '@angular/core'; @Component({ imports: [], selector: 'app-root', - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent {} +export class App {} " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for standalone apps without routing 2`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for standalone apps without routing 2`] = ` "import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; +import { App } from './app'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [AppComponent], + imports: [App], }).compileComponents(); }); it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( @@ -431,7 +429,7 @@ describe('AppComponent', () => { " `; -exports[`app --minimal should skip "nx-welcome.component.ts" file and references for standalone apps without routing 3`] = ` +exports[`app --minimal should skip "nx-welcome.ts" file and references for standalone apps without routing 3`] = ` "

Welcome plain

" `; @@ -439,21 +437,25 @@ exports[`app --minimal should skip "nx-welcome.component.ts" file and references exports[`app --standalone should generate a standalone app correctly with routing 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(App, appConfig).catch((err) => console.error(err) ); " `; exports[`app --standalone should generate a standalone app correctly with routing 2`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; export const appConfig: ApplicationConfig = { - providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; @@ -468,47 +470,41 @@ export const appRoutes: Route[] = []; exports[`app --standalone should generate a standalone app correctly with routing 4`] = ` "import { Component } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @Component({ - imports: [NxWelcomeComponent, RouterModule], + imports: [NxWelcome, RouterModule], selector: 'app-root', - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent { - title = 'standalone'; +export class App { + protected title = 'standalone'; } " `; exports[`app --standalone should generate a standalone app correctly with routing 5`] = ` "import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { App } from './app'; +import { NxWelcome } from './nx-welcome'; import { RouterModule } from '@angular/router'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [AppComponent, NxWelcomeComponent, RouterModule.forRoot([])], + imports: [App, NxWelcome, RouterModule.forRoot([])], }).compileComponents(); }); it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( 'Welcome standalone' ); }); - - it(\`should have as title 'standalone'\`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('standalone'); - }); }); " `; @@ -516,80 +512,66 @@ describe('AppComponent', () => { exports[`app --standalone should generate a standalone app correctly without routing 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(App, appConfig).catch((err) => console.error(err) ); " `; exports[`app --standalone should generate a standalone app correctly without routing 2`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; export const appConfig: ApplicationConfig = { - providers: [provideZoneChangeDetection({ eventCoalescing: true }), ] + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }) + ] }; " `; exports[`app --standalone should generate a standalone app correctly without routing 3`] = ` "import { Component } from '@angular/core'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @Component({ - imports: [NxWelcomeComponent, ], + imports: [NxWelcome, ], selector: 'app-root', - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent { - title = 'standalone'; +export class App { + protected title = 'standalone'; } " `; exports[`app --standalone should generate a standalone app correctly without routing 4`] = ` "import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { App } from './app'; +import { NxWelcome } from './nx-welcome'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [AppComponent, NxWelcomeComponent], + imports: [App, NxWelcome], }).compileComponents(); }); it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( 'Welcome standalone' ); }); - - it(\`should have as title 'standalone'\`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('standalone'); - }); }); " `; -exports[`app --standalone should should not use event coalescing in versions lower than v18 1`] = ` -"import { ApplicationConfig } from '@angular/core'; -import { provideRouter } from '@angular/router'; -import { appRoutes } from './app.routes'; - -export const appConfig: ApplicationConfig = { - providers: [provideRouter(appRoutes) ] -}; -" -`; - exports[`app --strict should enable strict type checking: app tsconfig.json 1`] = ` { "angularCompilerOptions": { @@ -597,14 +579,19 @@ exports[`app --strict should enable strict type checking: app tsconfig.json 1`] "strictInjectionParameters": true, "strictInputAccessModifiers": true, "strictTemplates": true, + "typeCheckHostBindings": true, }, "compilerOptions": { - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, + "experimentalDecorators": true, + "importHelpers": true, + "isolatedModules": true, + "module": "preserve", + "moduleResolution": "bundler", "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, "noImplicitReturns": true, "noPropertyAccessFromIndexSignature": true, + "skipLibCheck": true, "strict": true, "target": "es2022", }, @@ -629,7 +616,6 @@ exports[`app --strict should enable strict type checking: e2e tsconfig.json 1`] { "compilerOptions": { "allowJs": true, - "forceConsistentCasingInFileNames": true, "module": "commonjs", "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, @@ -689,17 +675,18 @@ exports[`app --unit-test-runner vitest should add tsconfig.spec.json 1`] = ` `; exports[`app --unit-test-runner vitest should generate src/test-setup.ts 1`] = ` -"import '@analogjs/vitest-angular/setup-zone'; +"import '@angular/compiler'; +import '@analogjs/vitest-angular/setup-zone'; import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting, -} from '@angular/platform-browser-dynamic/testing'; + BrowserTestingModule, + platformBrowserTesting, +} from '@angular/platform-browser/testing'; import { getTestBed } from '@angular/core/testing'; getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + BrowserTestingModule, + platformBrowserTesting() ); " `; @@ -735,32 +722,86 @@ export default defineConfig(() => ({ " `; -exports[`app angular compat support should import "ApplicationConfig" from "@angular/platform-browser" 1`] = ` -"import { ApplicationConfig } from '@angular/core'; -import { provideRouter } from '@angular/router'; -import { appRoutes } from './app.routes'; +exports[`app angular compat support should generate components with the "component" type for versions lower than v20 1`] = ` +"import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { NxWelcomeComponent } from './nx-welcome.component'; -export const appConfig: ApplicationConfig = { - providers: [provideRouter(appRoutes) ] -}; +@Component({ + imports: [NxWelcomeComponent, RouterModule], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.css', +}) +export class AppComponent { + title = 'myapp'; +} +" +`; + +exports[`app angular compat support should generate components with the "component" type for versions lower than v20 2`] = ` +" + +" +`; + +exports[`app angular compat support should generate components with the "component" type for versions lower than v20 3`] = ` +"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([])], + }).compileComponents(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain( + 'Welcome myapp' + ); + }); + + it(\`should have as title 'myapp'\`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('myapp'); + }); +}); +" +`; + +exports[`app angular compat support should generate components with the "component" type for versions lower than v20 4`] = ` +"import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err) +); " `; exports[`app at the root should accept numbers in the path 1`] = `"src/9-websites/my-app"`; exports[`app format files should format files 1`] = ` -"import { NgModule } from '@angular/core'; +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [BrowserModule, RouterModule.forRoot(appRoutes)], - providers: [], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners()], + bootstrap: [App], }) export class AppModule {} " @@ -772,43 +813,37 @@ exports[`app format files should format files 2`] = ` @Component({ selector: 'app-root', standalone: false, - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent { - title = 'my-app'; +export class App { + protected title = 'my-app'; } " `; exports[`app format files should format files 3`] = ` "import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { App } from './app'; +import { NxWelcome } from './nx-welcome'; import { RouterModule } from '@angular/router'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [RouterModule.forRoot([])], - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], }).compileComponents(); }); it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( 'Welcome my-app' ); }); - - it(\`should have as title 'my-app'\`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('my-app'); - }); }); " `; @@ -854,7 +889,7 @@ exports[`app nested should create project configs 1`] = ` }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:application", + "executor": "@angular/build:application", "options": { "assets": [ { @@ -863,12 +898,10 @@ exports[`app nested should create project configs 1`] = ` }, ], "browser": "my-dir/my-app/src/main.ts", - "index": "my-dir/my-app/src/index.html", "outputPath": "dist/my-dir/my-app", "polyfills": [ "zone.js", ], - "scripts": [], "styles": [ "my-dir/my-app/src/styles.css", ], @@ -879,7 +912,7 @@ exports[`app nested should create project configs 1`] = ` ], }, "extract-i18n": { - "executor": "@angular-devkit/build-angular:extract-i18n", + "executor": "@angular/build:extract-i18n", "options": { "buildTarget": "my-app:build", }, @@ -898,7 +931,7 @@ exports[`app nested should create project configs 1`] = ` }, "continuous": true, "defaultConfiguration": "development", - "executor": "@angular-devkit/build-angular:dev-server", + "executor": "@angular/build:dev-server", }, "serve-static": { "continuous": true, @@ -972,7 +1005,7 @@ exports[`app not nested should create project configs 1`] = ` }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:application", + "executor": "@angular/build:application", "options": { "assets": [ { @@ -981,12 +1014,10 @@ exports[`app not nested should create project configs 1`] = ` }, ], "browser": "my-app/src/main.ts", - "index": "my-app/src/index.html", "outputPath": "dist/my-app", "polyfills": [ "zone.js", ], - "scripts": [], "styles": [ "my-app/src/styles.css", ], @@ -997,7 +1028,7 @@ exports[`app not nested should create project configs 1`] = ` ], }, "extract-i18n": { - "executor": "@angular-devkit/build-angular:extract-i18n", + "executor": "@angular/build:extract-i18n", "options": { "buildTarget": "my-app:build", }, @@ -1016,7 +1047,7 @@ exports[`app not nested should create project configs 1`] = ` }, "continuous": true, "defaultConfiguration": "development", - "executor": "@angular-devkit/build-angular:dev-server", + "executor": "@angular/build:dev-server", }, "serve-static": { "continuous": true, @@ -1060,7 +1091,6 @@ exports[`app not nested should generate files: e2e tsconfig.json 1`] = ` { "compilerOptions": { "allowJs": true, - "forceConsistentCasingInFileNames": true, "module": "commonjs", "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, @@ -1094,15 +1124,13 @@ exports[`app not nested should generate files: tsconfig.app.json 1`] = ` }, "exclude": [ "jest.config.ts", + "src/test-setup.ts", "src/**/*.test.ts", "src/**/*.spec.ts", ], "extends": "./tsconfig.json", - "files": [ - "src/main.ts", - ], "include": [ - "src/**/*.d.ts", + "src/**/*.ts", ], } `; @@ -1114,14 +1142,19 @@ exports[`app not nested should generate files: tsconfig.json 1`] = ` "strictInjectionParameters": true, "strictInputAccessModifiers": true, "strictTemplates": true, + "typeCheckHostBindings": true, }, "compilerOptions": { - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, + "experimentalDecorators": true, + "importHelpers": true, + "isolatedModules": true, + "module": "preserve", + "moduleResolution": "bundler", "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, "noImplicitReturns": true, "noPropertyAccessFromIndexSignature": true, + "skipLibCheck": true, "strict": true, "target": "es2022", }, @@ -1142,17 +1175,61 @@ exports[`app not nested should generate files: tsconfig.json 1`] = ` } `; -exports[`app should generate correct tsconfig.editor.json 1`] = ` -{ - "compilerOptions": {}, - "exclude": [ - "jest.config.ts", - "src/**/*.test.ts", - "src/**/*.spec.ts", - ], - "extends": "./tsconfig.json", - "include": [ - "src/**/*.ts", - ], +exports[`app template generation mode should respect the "type" configured in the component generator defaults 1`] = ` +"import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { NxWelcomeComponent } from './nx-welcome.component'; + +@Component({ + imports: [NxWelcomeComponent, RouterModule], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.css', +}) +export class AppComponent { + protected title = 'myapp'; } +" +`; + +exports[`app template generation mode should respect the "type" configured in the component generator defaults 2`] = ` +" + +" +`; + +exports[`app template generation mode should respect the "type" configured in the component generator defaults 3`] = ` +"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([])], + }).compileComponents(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain( + 'Welcome myapp' + ); + }); +}); +" +`; + +exports[`app template generation mode should respect the "type" configured in the component generator defaults 4`] = ` +"import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err) +); +" `; diff --git a/packages/angular/src/generators/application/application.spec.ts b/packages/angular/src/generators/application/application.spec.ts index fc13143985..d744cb1ba4 100644 --- a/packages/angular/src/generators/application/application.spec.ts +++ b/packages/angular/src/generators/application/application.spec.ts @@ -8,6 +8,7 @@ import { readProjectConfiguration, Tree, updateJson, + updateNxJson, updateProjectConfiguration, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -54,7 +55,7 @@ describe('app', () => { enquirer.prompt = jest .fn() .mockReturnValue(Promise.resolve({ 'standalone-components': true })); - appTree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + appTree = createTreeWithEmptyWorkspace(); }); it('should add angular dependencies', async () => { @@ -68,9 +69,6 @@ describe('app', () => { expect(dependencies['@angular/compiler']).toBe(angularVersion); expect(dependencies['@angular/core']).toBe(angularVersion); expect(dependencies['@angular/platform-browser']).toBe(angularVersion); - expect(dependencies['@angular/platform-browser-dynamic']).toBe( - angularVersion - ); expect(dependencies['@angular/router']).toBe(angularVersion); expect(dependencies['rxjs']).toBeDefined(); expect(dependencies['tslib']).toBeDefined(); @@ -78,19 +76,26 @@ describe('app', () => { expect(devDependencies['@angular/cli']).toBe(angularDevkitVersion); expect(devDependencies['@angular/compiler-cli']).toBe(angularVersion); expect(devDependencies['@angular/language-service']).toBe(angularVersion); - expect(devDependencies['@angular-devkit/build-angular']).toBe( - angularDevkitVersion - ); + expect(devDependencies['@angular/build']).toBe(angularDevkitVersion); // codelyzer should no longer be there by default expect(devDependencies['codelyzer']).toBeUndefined(); }); - it('should generate correct tsconfig.editor.json', async () => { + it('should add both packages for builders when using rspack bundler', async () => { + await generateApp(appTree, 'my-app', { bundler: 'rspack' }); + + const { devDependencies } = readJson(appTree, 'package.json'); + expect(devDependencies['@angular/build']).toBe(angularDevkitVersion); + expect(devDependencies['@angular-devkit/build-angular']).toBe( + angularDevkitVersion + ); + }); + + it('should not generate a tsconfig.editor.json', async () => { await generateApp(appTree); - const tsConfig = readJson(appTree, 'my-app/tsconfig.editor.json'); - expect(tsConfig).toMatchSnapshot(); + expect(appTree.exists('my-app/tsconfig.editor.json')).toBe(false); }); it('should not touch the package.json when run with `--skipPackageJson`', async () => { @@ -109,6 +114,29 @@ describe('app', () => { expect(packageJson).toEqual(initialPackageJson); }); + it('should set emitDecoratorMetadata to false when it is true in the root tsconfig', async () => { + updateJson(appTree, 'tsconfig.base.json', (json) => ({ + ...json, + compilerOptions: { + ...json.compilerOptions, + emitDecoratorMetadata: true, + experimentalDecorators: true, + }, + })); + + await generateApp(appTree, 'my-app', { skipFormat: true }); + + const appTsConfig = readJson(appTree, 'my-app/tsconfig.json'); + expect(appTsConfig.compilerOptions.emitDecoratorMetadata).toBe(false); + }); + + it('should not set emitDecoratorMetadata when it is not true in the root tsconfig', async () => { + await generateApp(appTree, 'my-app', { skipFormat: true }); + + const appTsConfig = readJson(appTree, 'my-app/tsconfig.json'); + expect(appTsConfig.compilerOptions.emitDecoratorMetadata).toBeUndefined(); + }); + describe('not nested', () => { it('should create project configs', async () => { // ACT @@ -125,9 +153,7 @@ describe('app', () => { }); const { targets } = readProjectConfiguration(appTree, 'my-app'); expect(targets.test).toBeFalsy(); - expect( - appTree.exists('my-app/src/app/app.component.spec.ts') - ).toBeFalsy(); + expect(appTree.exists('my-app/src/app/app.spec.ts')).toBeFalsy(); }); it('should remove the e2e target on the application', async () => { @@ -166,9 +192,9 @@ describe('app', () => { expect(appTree.exists('my-app/jest.config.ts')).toBeTruthy(); expect(appTree.exists('my-app/src/main.ts')).toBeTruthy(); - expect(appTree.exists('my-app/src/app/app.module.ts')).toBeTruthy(); - expect(appTree.exists('my-app/src/app/app.component.ts')).toBeTruthy(); - expect(appTree.read('my-app/src/app/app.module.ts', 'utf-8')).toContain( + expect(appTree.exists('my-app/src/app/app-module.ts')).toBeTruthy(); + expect(appTree.exists('my-app/src/app/app.ts')).toBeTruthy(); + expect(appTree.read('my-app/src/app/app-module.ts', 'utf-8')).toContain( 'class AppModule' ); @@ -193,6 +219,32 @@ describe('app', () => { expect(tsconfigE2E).toMatchSnapshot('e2e tsconfig.json'); }); + it('should generate the module file respecting the "typeSeparator" generator default', async () => { + const nxJson = readNxJson(appTree); + nxJson.generators = { + '@nx/angular:module': { + typeSeparator: '.', + }, + }; + updateNxJson(appTree, nxJson); + + await generateApp(appTree); + + expect(appTree.exists('my-app/src/app/app.module.ts')).toBeTruthy(); + expect(appTree.read('my-app/src/main.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { platformBrowser } from '@angular/platform-browser'; + import { AppModule } from './app/app.module'; + + platformBrowser() + .bootstrapModule(AppModule, { + ngZoneEventCoalescing: true + }) + .catch((err) => console.error(err)); + " + `); + }); + it('should setup playwright', async () => { await generateApp(appTree, 'playwright-app', { e2eTestRunner: E2eTestRunner.Playwright, @@ -245,37 +297,6 @@ describe('app', () => { const { defaultProject } = readNxJson(appTree); expect(defaultProject).toBe('some-awesome-project'); }); - - it('should set esModuleInterop when using the application builder', async () => { - await generateApp(appTree, 'my-app'); - - expect( - readJson(appTree, 'my-app/tsconfig.json').compilerOptions - .esModuleInterop - ).toBe(true); - }); - - it('should not set esModuleInterop when using the browser-esbuild builder', async () => { - await generateApp(appTree, 'my-app', { bundler: 'webpack' }); - const project = readProjectConfiguration(appTree, 'my-app'); - project.targets.build.executor = - '@angular-devkit/build-angular:browser-esbuild'; - updateProjectConfiguration(appTree, 'my-app', project); - - expect( - readJson(appTree, 'my-app/tsconfig.json').compilerOptions - .esModuleInterop - ).toBeUndefined(); - }); - - it('should not set esModuleInterop when using the browser builder', async () => { - await generateApp(appTree, 'my-app', { bundler: 'webpack' }); - - expect( - readJson(appTree, 'my-app/tsconfig.json').compilerOptions - .esModuleInterop - ).toBeUndefined(); - }); }); describe('nested', () => { @@ -313,15 +334,15 @@ describe('app', () => { }; await generateApp(appTree, 'my-dir/my-app'); - const appModulePath = 'my-dir/my-app/src/app/app.module.ts'; + const appModulePath = 'my-dir/my-app/src/app/app-module.ts'; expect(appTree.read(appModulePath, 'utf-8')).toContain('class AppModule'); // Make sure these exist [ `my-dir/my-app/jest.config.ts`, 'my-dir/my-app/src/main.ts', - 'my-dir/my-app/src/app/app.module.ts', - 'my-dir/my-app/src/app/app.component.ts', + 'my-dir/my-app/src/app/app-module.ts', + 'my-dir/my-app/src/app/app.ts', 'my-dir/my-app-e2e/cypress.config.ts', ].forEach((path) => { expect(appTree.exists(path)).toBeTruthy(); @@ -339,6 +360,7 @@ describe('app', () => { lookupFn: (json) => json.exclude, expectedValue: [ 'jest.config.ts', + 'src/test-setup.ts', 'src/**/*.test.ts', 'src/**/*.spec.ts', ], @@ -375,7 +397,7 @@ describe('app', () => { describe('at the root', () => { beforeEach(() => { - appTree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + appTree = createTreeWithEmptyWorkspace(); updateJson(appTree, 'nx.json', (json) => ({ ...json, workspaceLayout: { appsDir: '' }, @@ -401,15 +423,15 @@ describe('app', () => { }; await generateApp(appTree, 'my-dir/my-app'); - const appModulePath = 'my-dir/my-app/src/app/app.module.ts'; + const appModulePath = 'my-dir/my-app/src/app/app-module.ts'; expect(appTree.read(appModulePath, 'utf-8')).toContain('class AppModule'); // Make sure these exist [ 'my-dir/my-app/jest.config.ts', 'my-dir/my-app/src/main.ts', - 'my-dir/my-app/src/app/app.module.ts', - 'my-dir/my-app/src/app/app.component.ts', + 'my-dir/my-app/src/app/app-module.ts', + 'my-dir/my-app/src/app/app.ts', 'my-dir/my-app-e2e/cypress.config.ts', ].forEach((path) => { expect(appTree.exists(path)).toBeTruthy(); @@ -427,6 +449,7 @@ describe('app', () => { lookupFn: (json) => json.exclude, expectedValue: [ 'jest.config.ts', + 'src/test-setup.ts', 'src/**/*.test.ts', 'src/**/*.spec.ts', ], @@ -438,25 +461,6 @@ describe('app', () => { }, ].forEach(hasJsonValue); }); - - it('should set esModuleInterop when using the application builder', async () => { - await generateApp(appTree, '.', { name: 'my-app' }); - - expect( - readJson(appTree, 'tsconfig.json').compilerOptions.esModuleInterop - ).toBe(true); - }); - - it('should not set esModuleInterop when using the browser builder', async () => { - await generateApp(appTree, '.', { - name: 'my-app', - bundler: 'webpack', - }); - - expect( - readJson(appTree, 'tsconfig.json').compilerOptions.esModuleInterop - ).toBeUndefined(); - }); }); describe('routing', () => { @@ -465,10 +469,10 @@ describe('app', () => { name: 'myApp', }); expect( - appTree.read('my-dir/my-app/src/app/app.module.ts', 'utf-8') + appTree.read('my-dir/my-app/src/app/app-module.ts', 'utf-8') ).toContain('RouterModule.forRoot'); expect( - appTree.read('my-dir/my-app/src/app/app.component.spec.ts', 'utf-8') + appTree.read('my-dir/my-app/src/app/app.spec.ts', 'utf-8') ).toContain('imports: [RouterModule.forRoot([])]'); }); @@ -477,34 +481,32 @@ describe('app', () => { name: 'myApp', skipTests: true, }); - expect( - appTree.exists('my-dir/my-app/src/app/app.component.spec.ts') - ).toBeFalsy(); + expect(appTree.exists('my-dir/my-app/src/app/app.spec.ts')).toBeFalsy(); }); }); describe('template generation mode', () => { - it('should create Nx specific `app.component.html` template', async () => { + it('should create Nx specific `app.html` template', async () => { await generateApp(appTree, 'my-dir/my-app'); - expect( - appTree.read('my-dir/my-app/src/app/app.component.html', 'utf-8') - ).toContain(''); + expect(appTree.read('my-dir/my-app/src/app/app.html', 'utf-8')).toContain( + '' + ); }); - it("should update `template`'s property of AppComponent with Nx content", async () => { + it("should update `template`'s property of App component with Nx content", async () => { await generateApp(appTree, 'my-dir/my-app', { inlineTemplate: true, }); - expect( - appTree.read('my-dir/my-app/src/app/app.component.ts', 'utf-8') - ).toContain(''); + expect(appTree.read('my-dir/my-app/src/app/app.ts', 'utf-8')).toContain( + '' + ); }); - it('should create Nx specific `nx-welcome.component.ts` file', async () => { + it('should create Nx specific `nx-welcome.ts` file', async () => { await generateApp(appTree, 'my-dir/my-app'); const nxWelcomeComponentText = appTree.read( - 'my-dir/my-app/src/app/nx-welcome.component.ts', + 'my-dir/my-app/src/app/nx-welcome.ts', 'utf-8' ); expect(nxWelcomeComponentText).not.toContain('standalone: true'); @@ -512,38 +514,70 @@ describe('app', () => { expect(nxWelcomeComponentText).toContain('Hello there'); }); - it('should update the AppComponent spec to target Nx content', async () => { + it('should update the App component spec to target Nx content', async () => { await generateApp(appTree, 'my-dir/my-app', { inlineTemplate: true, }); const testFileContent = appTree.read( - 'my-dir/my-app/src/app/app.component.spec.ts', + 'my-dir/my-app/src/app/app.spec.ts', 'utf-8' ); expect(testFileContent).toContain(`querySelector('h1')`); expect(testFileContent).toContain('Welcome my-app'); }); + + it('should respect the "type" configured in the component generator defaults', async () => { + const nxJson = readNxJson(appTree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:component': { type: 'component' }, + }; + updateNxJson(appTree, nxJson); + + await generateApp(appTree, 'myapp', { standalone: true }); + + expect(appTree.exists('myapp/src/app/app.component.ts')).toBe(true); + expect( + appTree.read('myapp/src/app/app.component.ts', 'utf-8') + ).toMatchSnapshot(); + expect(appTree.exists('myapp/src/app/app.component.html')).toBe(true); + expect( + appTree.read('myapp/src/app/app.component.html', 'utf-8') + ).toMatchSnapshot(); + expect(appTree.exists('myapp/src/app/app.component.css')).toBe(true); + expect(appTree.exists('myapp/src/app/app.component.spec.ts')).toBe(true); + expect( + appTree.read('myapp/src/app/app.component.spec.ts', 'utf-8') + ).toMatchSnapshot(); + expect(appTree.exists('myapp/src/app/nx-welcome.component.ts')).toBe( + true + ); + expect( + appTree.read('myapp/src/app/nx-welcome.component.ts', 'utf-8') + ).toContain('export class NxWelcomeComponent {}'); + expect(appTree.read('myapp/src/main.ts', 'utf-8')).toMatchSnapshot(); + }); }); describe('--style scss', () => { it('should generate scss styles', async () => { await generateApp(appTree, 'my-app', { style: 'scss' }); - expect(appTree.exists('my-app/src/app/app.component.scss')).toEqual(true); + expect(appTree.exists('my-app/src/app/app.scss')).toEqual(true); }); }); describe('--style sass', () => { it('should generate sass styles', async () => { await generateApp(appTree, 'my-app', { style: 'sass' }); - expect(appTree.exists('my-app/src/app/app.component.sass')).toEqual(true); + expect(appTree.exists('my-app/src/app/app.sass')).toEqual(true); }); }); describe('--style less', () => { it('should generate less styles', async () => { await generateApp(appTree, 'my-app', { style: 'less' }); - expect(appTree.exists('my-app/src/app/app.component.less')).toEqual(true); + expect(appTree.exists('my-app/src/app/app.less')).toEqual(true); }); }); @@ -555,13 +589,11 @@ describe('app', () => { expect(formatFilesSpy).toHaveBeenCalled(); expect( - appTree.read('my-app/src/app/app.module.ts', 'utf-8') + appTree.read('my-app/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); + expect(appTree.read('my-app/src/app/app.ts', 'utf-8')).toMatchSnapshot(); expect( - appTree.read('my-app/src/app/app.component.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('my-app/src/app/app.component.spec.ts', 'utf-8') + appTree.read('my-app/src/app/app.spec.ts', 'utf-8') ).toMatchSnapshot(); expect( appTree.read('my-app/src/app/app.routes.ts', 'utf-8') @@ -640,6 +672,7 @@ describe('app', () => { "*.ts", ], "rules": { + "@angular-eslint/component-class-suffix": "off", "@angular-eslint/component-selector": [ "error", { @@ -648,6 +681,7 @@ describe('app', () => { "type": "element", }, ], + "@angular-eslint/directive-class-suffix": "off", "@angular-eslint/directive-selector": [ "error", { @@ -709,6 +743,15 @@ describe('app', () => { references.find((r) => r.path.includes('tsconfig.spec.json')) ).toBeTruthy(); }); + + it('should exclude src/test-setup.ts in tsconfig.app.json', async () => { + await generateApp(appTree, 'my-app', { + unitTestRunner: UnitTestRunner.Jest, + }); + + const tsConfig = readJson(appTree, 'my-app/tsconfig.app.json'); + expect(tsConfig.exclude).toContain('src/test-setup.ts'); + }); }); describe('vitest', () => { @@ -787,9 +830,7 @@ describe('app', () => { unitTestRunner: UnitTestRunner.Vitest, }); const { targets } = readProjectConfiguration(appTree, 'my-app'); - expect(targets.build.executor).toBe( - '@angular-devkit/build-angular:application' - ); + expect(targets.build.executor).toBe('@angular/build:application'); }); it('should not override serve configuration when using vitest as a test runner', async () => { @@ -797,9 +838,7 @@ describe('app', () => { unitTestRunner: UnitTestRunner.Vitest, }); const { targets } = readProjectConfiguration(appTree, 'my-app'); - expect(targets.serve.executor).toBe( - '@angular-devkit/build-angular:dev-server' - ); + expect(targets.serve.executor).toBe('@angular/build:dev-server'); }); }); @@ -813,9 +852,7 @@ describe('app', () => { expect(appTree.exists('my-app/tsconfig.spec.json')).toBeFalsy(); expect(appTree.exists('my-app/jest.config.ts')).toBeFalsy(); expect(appTree.exists('my-app/karma.config.js')).toBeFalsy(); - expect( - appTree.exists('my-app/src/app/app.component.spec.ts') - ).toBeFalsy(); + expect(appTree.exists('my-app/src/app/app.spec.ts')).toBeFalsy(); expect( readProjectConfiguration(appTree, 'my-app').targets.test ).toBeUndefined(); @@ -970,14 +1007,14 @@ describe('app', () => { appTree.read('standalone/src/app/app.routes.ts', 'utf-8') ).toMatchSnapshot(); expect( - appTree.read('standalone/src/app/app.component.ts', 'utf-8') + appTree.read('standalone/src/app/app.ts', 'utf-8') ).toMatchSnapshot(); expect( - appTree.read('standalone/src/app/app.component.spec.ts', 'utf-8') + appTree.read('standalone/src/app/app.spec.ts', 'utf-8') ).toMatchSnapshot(); - expect(appTree.exists('standalone/src/app/app.module.ts')).toBeFalsy(); + expect(appTree.exists('standalone/src/app/app-module.ts')).toBeFalsy(); const nxWelcomeComponentText = appTree.read( - 'standalone/src/app/nx-welcome.component.ts', + 'standalone/src/app/nx-welcome.ts', 'utf-8' ); expect(nxWelcomeComponentText).not.toContain('standalone: true'); @@ -997,32 +1034,19 @@ describe('app', () => { appTree.read('standalone/src/app/app.config.ts', 'utf-8') ).toMatchSnapshot(); expect( - appTree.read('standalone/src/app/app.component.ts', 'utf-8') + appTree.read('standalone/src/app/app.ts', 'utf-8') ).toMatchSnapshot(); expect( - appTree.read('standalone/src/app/app.component.spec.ts', 'utf-8') + appTree.read('standalone/src/app/app.spec.ts', 'utf-8') ).toMatchSnapshot(); - expect(appTree.exists('standalone/src/app/app.module.ts')).toBeFalsy(); + expect(appTree.exists('standalone/src/app/app-module.ts')).toBeFalsy(); const nxWelcomeComponentText = appTree.read( - 'standalone/src/app/nx-welcome.component.ts', + 'standalone/src/app/nx-welcome.ts', 'utf-8' ); expect(nxWelcomeComponentText).not.toContain('standalone: true'); expect(nxWelcomeComponentText).not.toContain('standalone: false'); }); - - it('should should not use event coalescing in versions lower than v18', async () => { - updateJson(appTree, 'package.json', (json) => ({ - ...json, - dependencies: { ...json.dependencies, '@angular/core': '~17.0.0' }, - })); - - await generateApp(appTree, 'standalone', { standalone: true }); - - expect( - appTree.read('standalone/src/app/app.config.ts', 'utf-8') - ).toMatchSnapshot(); - }); }); it('should generate correct main.ts', async () => { @@ -1031,10 +1055,10 @@ describe('app', () => { // ASSERT expect(appTree.read('myapp/src/main.ts', 'utf-8')).toMatchInlineSnapshot(` - "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - import { AppModule } from './app/app.module'; + "import { platformBrowser } from '@angular/platform-browser'; + import { AppModule } from './app/app-module'; - platformBrowserDynamic() + platformBrowser() .bootstrapModule(AppModule, { ngZoneEventCoalescing: true }) @@ -1043,25 +1067,6 @@ describe('app', () => { `); }); - it('should should not use event coalescing in versions lower than v18', async () => { - updateJson(appTree, 'package.json', (json) => ({ - ...json, - dependencies: { ...json.dependencies, '@angular/core': '~17.0.0' }, - })); - - await generateApp(appTree, 'myapp'); - - expect(appTree.read('myapp/src/main.ts', 'utf-8')).toMatchInlineSnapshot(` - "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - import { AppModule } from './app/app.module'; - - platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); - " - `); - }); - describe('--directory="." (--root-project)', () => { it('should create files at the root', async () => { await generateApp(appTree, '.', { @@ -1069,8 +1074,8 @@ describe('app', () => { }); expect(appTree.exists('src/main.ts')).toBe(true); - expect(appTree.exists('src/app/app.module.ts')).toBe(true); - expect(appTree.exists('src/app/app.component.ts')).toBe(true); + expect(appTree.exists('src/app/app-module.ts')).toBe(true); + expect(appTree.exists('src/app/app.ts')).toBe(true); expect(appTree.exists('e2e/cypress.config.ts')).toBe(true); expect(readJson(appTree, 'tsconfig.json').extends).toBeUndefined(); const project = readProjectConfiguration(appTree, 'my-app'); @@ -1088,85 +1093,61 @@ describe('app', () => { }); describe('--minimal', () => { - it('should skip "nx-welcome.component.ts" file and references for non-standalone apps without routing', async () => { + it('should skip "nx-welcome.ts" file and references for non-standalone apps without routing', async () => { await generateApp(appTree, 'plain', { minimal: true, routing: false }); + expect(appTree.exists('plain/src/app/nx-welcome.ts')).toBeFalsy(); expect( - appTree.exists('plain/src/app/nx-welcome.component.ts') - ).toBeFalsy(); - expect( - appTree.read('plain/src/app/app.module.ts', 'utf-8') + appTree.read('plain/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); + expect(appTree.read('plain/src/app/app.ts', 'utf-8')).toMatchSnapshot(); expect( - appTree.read('plain/src/app/app.component.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.spec.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.html', 'utf-8') + appTree.read('plain/src/app/app.spec.ts', 'utf-8') ).toMatchSnapshot(); + expect(appTree.read('plain/src/app/app.html', 'utf-8')).toMatchSnapshot(); }); - it('should skip "nx-welcome.component.ts" file and references for non-standalone apps with routing', async () => { + it('should skip "nx-welcome.ts" file and references for non-standalone apps with routing', async () => { await generateApp(appTree, 'plain', { minimal: true }); + expect(appTree.exists('plain/src/app/nx-welcome.ts')).toBeFalsy(); expect( - appTree.exists('plain/src/app/nx-welcome.component.ts') - ).toBeFalsy(); - expect( - appTree.read('plain/src/app/app.module.ts', 'utf-8') + appTree.read('plain/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); + expect(appTree.read('plain/src/app/app.ts', 'utf-8')).toMatchSnapshot(); expect( - appTree.read('plain/src/app/app.component.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.spec.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.html', 'utf-8') + appTree.read('plain/src/app/app.spec.ts', 'utf-8') ).toMatchSnapshot(); + expect(appTree.read('plain/src/app/app.html', 'utf-8')).toMatchSnapshot(); }); - it('should skip "nx-welcome.component.ts" file and references for standalone apps without routing', async () => { + it('should skip "nx-welcome.ts" file and references for standalone apps without routing', async () => { await generateApp(appTree, 'plain', { minimal: true, standalone: true, routing: false, }); + expect(appTree.exists('plain/src/app/nx-welcome.ts')).toBeFalsy(); + expect(appTree.read('plain/src/app/app.ts', 'utf-8')).toMatchSnapshot(); expect( - appTree.exists('plain/src/app/nx-welcome.component.ts') - ).toBeFalsy(); - expect( - appTree.read('plain/src/app/app.component.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.spec.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.html', 'utf-8') + appTree.read('plain/src/app/app.spec.ts', 'utf-8') ).toMatchSnapshot(); + expect(appTree.read('plain/src/app/app.html', 'utf-8')).toMatchSnapshot(); }); - it('should skip "nx-welcome.component.ts" file and references for standalone apps with routing', async () => { + it('should skip "nx-welcome.ts" file and references for standalone apps with routing', async () => { await generateApp(appTree, 'plain', { minimal: true, standalone: true, }); + expect(appTree.exists('plain/src/app/nx-welcome.ts')).toBeFalsy(); + expect(appTree.read('plain/src/app/app.ts', 'utf-8')).toMatchSnapshot(); expect( - appTree.exists('plain/src/app/nx-welcome.component.ts') - ).toBeFalsy(); - expect( - appTree.read('plain/src/app/app.component.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.spec.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - appTree.read('plain/src/app/app.component.html', 'utf-8') + appTree.read('plain/src/app/app.spec.ts', 'utf-8') ).toMatchSnapshot(); + expect(appTree.read('plain/src/app/app.html', 'utf-8')).toMatchSnapshot(); }); it('should generate a correct build target for --bundler=esbuild', async () => { @@ -1176,7 +1157,7 @@ describe('app', () => { const project = readProjectConfiguration(appTree, 'ngesbuild'); expect(project.targets.build.executor).toEqual( - '@angular-devkit/build-angular:application' + '@angular/build:application' ); expect( project.targets.build.configurations.development.buildOptimizer @@ -1321,12 +1302,12 @@ describe('app', () => { describe('angular compat support', () => { beforeEach(() => { - appTree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + appTree = createTreeWithEmptyWorkspace(); updateJson(appTree, 'package.json', (json) => ({ ...json, dependencies: { ...json.dependencies, - '@angular/core': '~17.2.0', + '@angular/core': '~18.2.0', }, })); }); @@ -1336,38 +1317,343 @@ describe('app', () => { const { devDependencies } = readJson(appTree, 'package.json'); expect(devDependencies['@angular-devkit/build-angular']).toEqual( - backwardCompatibleVersions.angularV17.angularDevkitVersion + backwardCompatibleVersions.angularV18.angularDevkitVersion ); expect(devDependencies['@angular-devkit/schematics']).toEqual( - backwardCompatibleVersions.angularV17.angularDevkitVersion + backwardCompatibleVersions.angularV18.angularDevkitVersion ); expect(devDependencies['@schematics/angular']).toEqual( - backwardCompatibleVersions.angularV17.angularDevkitVersion + backwardCompatibleVersions.angularV18.angularDevkitVersion ); }); - it('should import "ApplicationConfig" from "@angular/platform-browser"', async () => { - await generateApp(appTree, 'my-app', { standalone: true }); + it('should disable modern class fields behavior for versions lower than v18.1', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~18.0.0', + }, + })); + + await generateApp(appTree, 'my-app'); + + expect( + readJson(appTree, 'my-app/tsconfig.json').compilerOptions + .useDefineForClassFields + ).toBe(false); + }); + + it('should set the "index" option of the application builder for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.0.0', + }, + })); + + await generateApp(appTree, 'my-app', { bundler: 'esbuild' }); + + const project = readProjectConfiguration(appTree, 'my-app'); + expect(project.targets.build.options.index).toBe('my-app/src/index.html'); + }); + + it('should use builders from "@angular-devkit/build-angular" for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.0.0', + }, + })); + + await generateApp(appTree, 'my-app', { bundler: 'esbuild' }); + + const project = readProjectConfiguration(appTree, 'my-app'); + expect(project.targets.build.executor).toBe( + '@angular-devkit/build-angular:application' + ); + expect(project.targets.serve.executor).toBe( + '@angular-devkit/build-angular:dev-server' + ); + expect(project.targets['extract-i18n'].executor).toBe( + '@angular-devkit/build-angular:extract-i18n' + ); + expect( + readJson(appTree, 'package.json').devDependencies[ + '@angular-devkit/build-angular' + ] + ).toBeDefined(); + }); + + it('should not set provideBrowserGlobalErrorListeners in app.module.ts for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.0.0', + }, + })); + + await generateApp(appTree, 'my-app', { bundler: 'esbuild' }); + + expect( + appTree.read('my-app/src/app/app.module.ts', 'utf-8') + ).not.toContain('provideBrowserGlobalErrorListeners'); + }); + + it('should not set provideBrowserGlobalErrorListeners in standalone app.config.ts for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.0.0', + }, + })); + + await generateApp(appTree, 'my-app', { + bundler: 'esbuild', + standalone: true, + }); expect( appTree.read('my-app/src/app/app.config.ts', 'utf-8') - ).toMatchSnapshot(); + ).not.toContain('provideBrowserGlobalErrorListeners'); }); - it('should import "RouterTestingModule" in test files', async () => { - await generateApp(appTree, 'my-app', { standalone: true }); + it('should not set "typeCheckHostBindings" when strict is true if Angular version is lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.0.0', + }, + })); + await generateApp(appTree, 'my-app', { strict: true }); + + const appTsConfig = readJson(appTree, 'my-app/tsconfig.json'); + expect(appTsConfig.angularCompilerOptions).toMatchInlineSnapshot(` + { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true, + } + `); + }); + + it('should use platformBrowserDynamic for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.0.0', + }, + })); + + await generateApp(appTree, 'myapp'); + + expect(appTree.read('myapp/src/main.ts', 'utf-8')).toMatchInlineSnapshot(` + "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + import { AppModule } from './app/app.module'; + + platformBrowserDynamic() + .bootstrapModule(AppModule, { + ngZoneEventCoalescing: true + }) + .catch((err) => console.error(err)); + " + `); + }); + + it('should generate components with the "component" type for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + + await generateApp(appTree, 'myapp', { standalone: true }); + + expect(appTree.exists('myapp/src/app/app.component.ts')).toBe(true); + expect( + appTree.read('myapp/src/app/app.component.ts', 'utf-8') + ).toMatchSnapshot(); + expect(appTree.exists('myapp/src/app/app.component.html')).toBe(true); + expect( + appTree.read('myapp/src/app/app.component.html', 'utf-8') + ).toMatchSnapshot(); + expect(appTree.exists('myapp/src/app/app.component.css')).toBe(true); + expect(appTree.exists('myapp/src/app/app.component.spec.ts')).toBe(true); + expect( + appTree.read('myapp/src/app/app.component.spec.ts', 'utf-8') + ).toMatchSnapshot(); + expect(appTree.exists('myapp/src/app/nx-welcome.component.ts')).toBe( + true + ); + expect( + appTree.read('myapp/src/app/nx-welcome.component.ts', 'utf-8') + ).toContain('export class NxWelcomeComponent {}'); + expect(appTree.read('myapp/src/main.ts', 'utf-8')).toMatchSnapshot(); + }); + + it('should generate modules with the "." type separator for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + + await generateApp(appTree, 'myapp', { standalone: false }); + + expect(appTree.exists('myapp/src/app/app.module.ts')).toBe(true); + expect(appTree.read('myapp/src/main.ts', 'utf-8')).toMatchInlineSnapshot(` + "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + import { AppModule } from './app/app.module'; + + platformBrowserDynamic() + .bootstrapModule(AppModule, { + ngZoneEventCoalescing: true + }) + .catch((err) => console.error(err)); + " + `); + }); + + it('should set esModuleInterop when using the application builder for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + + await generateApp(appTree, 'my-app', { skipFormat: true }); + + expect( + readJson(appTree, 'my-app/tsconfig.json').compilerOptions + .esModuleInterop + ).toBe(true); + }); + + it('should not set esModuleInterop when using the browser builder for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + + await generateApp(appTree, 'my-app', { + bundler: 'webpack', + skipFormat: true, + }); + + expect( + readJson(appTree, 'my-app/tsconfig.json').compilerOptions + .esModuleInterop + ).toBeUndefined(); + }); + + it('should set "files" compiler option and not include all source files in tsconfig.app.json and generate a tsconfig.editor.json for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + + await generateApp(appTree, 'my-app', { skipFormat: true }); + + expect(appTree.read('my-app/tsconfig.app.json', 'utf-8')) + .toMatchInlineSnapshot(` + "{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "types": [] + }, + "files": [ + "src/main.ts" + ], + "include": [ + "src/**/*.d.ts" + ], + "exclude": [ + "jest.config.ts", + "src/test-setup.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] + } + " + `); + expect(appTree.read('my-app/tsconfig.editor.json', 'utf-8')) + .toMatchInlineSnapshot(` + "{ + "extends": "./tsconfig.json", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": {}, + "exclude": [ + "jest.config.ts", + "src/test-setup.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] + } + " + `); + }); + + it('should not set app component title to protected and should have a test case for the title property for versions lower than v20', async () => { + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + + await generateApp(appTree, 'my-app', { skipFormat: true }); + + expect(appTree.read('my-app/src/app/app.component.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + + @Component({ + selector: 'app-root', + standalone: false, + templateUrl: './app.component.html', + styleUrl: './app.component.css', + }) + export class AppComponent { + title = 'my-app'; + } + " + `); expect(appTree.read('my-app/src/app/app.component.spec.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { TestBed } from '@angular/core/testing'; import { AppComponent } from './app.component'; import { NxWelcomeComponent } from './nx-welcome.component'; - import { RouterTestingModule } from '@angular/router/testing'; + import { RouterModule } from '@angular/router'; describe('AppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [AppComponent, NxWelcomeComponent, RouterTestingModule], + imports: [RouterModule.forRoot([])], + declarations: [AppComponent, NxWelcomeComponent] }).compileComponents(); }); @@ -1389,30 +1675,6 @@ describe('app', () => { " `); }); - - it('should disable modern class fields behavior', async () => { - await generateApp(appTree, 'my-app'); - - expect( - readJson(appTree, 'my-app/tsconfig.json').compilerOptions - .useDefineForClassFields - ).toBe(false); - }); - - it('should configure the correct assets for versions lower than v18', async () => { - updateJson(appTree, 'package.json', (json) => ({ - ...json, - dependencies: { ...json.dependencies, '@angular/core': '~17.0.0' }, - })); - - await generateApp(appTree, '.', { name: 'my-app' }); - - const project = readProjectConfiguration(appTree, 'my-app'); - expect(project.targets.build.options.assets).toStrictEqual([ - './src/favicon.ico', - './src/assets', - ]); - }); }); }); diff --git a/packages/angular/src/generators/application/application.ts b/packages/angular/src/generators/application/application.ts index a81d5e63a1..ac182041b9 100644 --- a/packages/angular/src/generators/application/application.ts +++ b/packages/angular/src/generators/application/application.ts @@ -1,4 +1,5 @@ import { + addDependenciesToPackageJson, formatFiles, generateFiles, GeneratorCallback, @@ -12,11 +13,16 @@ import { import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; import { initGenerator as jsInitGenerator } from '@nx/js'; import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; -import { angularInitGenerator } from '../init/init'; import { convertToRspack } from '../convert-to-rspack/convert-to-rspack'; +import { angularInitGenerator } from '../init/init'; import { setupSsr } from '../setup-ssr/setup-ssr'; import { setupTailwindGenerator } from '../setup-tailwind/setup-tailwind'; import { ensureAngularDependencies } from '../utils/ensure-angular-dependencies'; +import { + getInstalledAngularDevkitVersion, + getInstalledAngularVersionInfo, + versions, +} from '../utils/version-utils'; import { addE2e, addLinting, @@ -25,11 +31,9 @@ import { addUnitTestRunner, createFiles, createProject, - enableStrictTypeChecking, normalizeOptions, - setApplicationStrictDefault, setGeneratorDefaults, - updateEditorTsConfig, + updateTsconfigFiles, } from './lib'; import type { Schema } from './schema'; @@ -82,7 +86,7 @@ export async function applicationGenerator( options, options.e2eTestRunner !== 'none' ? e2ePort : options.port ); - updateEditorTsConfig(tree, options); + updateTsconfigFiles(tree, options); setGeneratorDefaults(tree, options); if (options.rootProject) { @@ -95,12 +99,6 @@ export async function applicationGenerator( addProxyConfig(tree, options); } - if (options.strict) { - enableStrictTypeChecking(tree, options); - } else { - setApplicationStrictDefault(tree, false); - } - if (options.ssr) { await setupSsr(tree, { project: options.name, @@ -134,6 +132,27 @@ export async function applicationGenerator( } } + if (!options.skipPackageJson) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion >= 20) { + const angularDevkitVersion = + getInstalledAngularDevkitVersion(tree) ?? + versions(tree).angularDevkitVersion; + + const devDependencies: Record = {}; + if (options.bundler === 'esbuild') { + devDependencies['@angular/build'] = angularDevkitVersion; + } else if (isRspack) { + devDependencies['@angular/build'] = angularDevkitVersion; + devDependencies['@angular-devkit/build-angular'] = angularDevkitVersion; + } else { + devDependencies['@angular-devkit/build-angular'] = angularDevkitVersion; + } + + addDependenciesToPackageJson(tree, {}, devDependencies, undefined, true); + } + } + if (!options.skipFormat) { await formatFiles(tree); } diff --git a/packages/angular/src/generators/application/files/base-pre18/src/favicon.ico b/packages/angular/src/generators/application/files/base-pre18/src/favicon.ico deleted file mode 100644 index 317ebcb2336e0833a22dddf0ab287849f26fda57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI332;U^%p|z7g|#(P)qFEA@4f!_@qOK2 z_lJl}!lhL!VT_U|uN7%8B2iKH??xhDa;*`g{yjTFWHvXn;2s{4R7kH|pKGdy(7z!K zgftM+Ku7~24TLlh(!g)gz|foI94G^t2^IO$uvX$3(OR0<_5L2sB)lMAMy|+`xodJ{ z_Uh_1m)~h?a;2W{dmhM;u!YGo=)OdmId_B<%^V^{ovI@y`7^g1_V9G}*f# zNzAtvou}I!W1#{M^@ROc(BZ! z+F!!_aR&Px3_reO(EW+TwlW~tv*2zr?iP7(d~a~yA|@*a89IUke+c472NXM0wiX{- zl`UrZC^1XYyf%1u)-Y)jj9;MZ!SLfd2Hl?o|80Su%Z?To_=^g_Jt0oa#CT*tjx>BI z16wec&AOWNK<#i0Qd=1O$fymLRoUR*%;h@*@v7}wApDl^w*h}!sYq%kw+DKDY)@&A z@9$ULEB3qkR#85`lb8#WZw=@})#kQig9oqy^I$dj&k4jU&^2(M3q{n1AKeGUKPFbr z1^<)aH;VsG@J|B&l>UtU#Ejv3GIqERzYgL@UOAWtW<{p#zy`WyJgpCy8$c_e%wYJL zyGHRRx38)HyjU3y{-4z6)pzb>&Q1pR)B&u01F-|&Gx4EZWK$nkUkOI|(D4UHOXg_- zw{OBf!oWQUn)Pe(=f=nt=zkmdjpO^o8ZZ9o_|4tW1ni+Un9iCW47*-ut$KQOww!;u z`0q)$s6IZO!~9$e_P9X!hqLxu`fpcL|2f^I5d4*a@Dq28;@2271v_N+5HqYZ>x;&O z05*7JT)mUe&%S0@UD)@&8SmQrMtsDfZT;fkdA!r(S=}Oz>iP)w=W508=Rc#nNn7ym z1;42c|8($ALY8#a({%1#IXbWn9-Y|0eDY$_L&j{63?{?AH{);EzcqfydD$@-B`Y3<%IIj7S7rK_N}je^=dEk%JQ4c z!tBdTPE3Tse;oYF>cnrapWq*o)m47X1`~6@(!Y29#>-#8zm&LXrXa(3=7Z)ElaQqj z-#0JJy3Fi(C#Rx(`=VXtJ63E2_bZGCz+QRa{W0e2(m3sI?LOcUBx)~^YCqZ{XEPX)C>G>U4tfqeH8L(3|pQR*zbL1 zT9e~4Tb5p9_G}$y4t`i*4t_Mr9QYvL9C&Ah*}t`q*}S+VYh0M6GxTTSXI)hMpMpIq zD1ImYqJLzbj0}~EpE-aH#VCH_udYEW#`P2zYmi&xSPs_{n6tBj=MY|-XrA;SGA_>y zGtU$?HXm$gYj*!N)_nQ59%lQdXtQZS3*#PC-{iB_sm+ytD*7j`D*k(P&IH2GHT}Eh z5697eQECVIGQAUe#eU2I!yI&%0CP#>%6MWV z@zS!p@+Y1i1b^QuuEF*13CuB zu69dve5k7&Wgb+^s|UB08Dr3u`h@yM0NTj4h7MnHo-4@xmyr7(*4$rpPwsCDZ@2be zRz9V^GnV;;?^Lk%ynzq&K(Aix`mWmW`^152Hoy$CTYVehpD-S1-W^#k#{0^L`V6CN+E z!w+xte;2vu4AmVNEFUOBmrBL>6MK@!O2*N|2=d|Y;oN&A&qv=qKn73lDD zI(+oJAdgv>Yr}8(&@ZuAZE%XUXmX(U!N+Z_sjL<1vjy1R+1IeHt`79fnYdOL{$ci7 z%3f0A*;Zt@ED&Gjm|OFTYBDe%bbo*xXAQsFz+Q`fVBH!N2)kaxN8P$c>sp~QXnv>b zwq=W3&Mtmih7xkR$YA)1Yi?avHNR6C99!u6fh=cL|KQ&PwF!n@ud^n(HNIImHD!h87!i*t?G|p0o+eelJ?B@A64_9%SBhNaJ64EvKgD&%LjLCYnNfc; znj?%*p@*?dq#NqcQFmmX($wms@CSAr9#>hUR^=I+=0B)vvGX%T&#h$kmX*s=^M2E!@N9#m?LhMvz}YB+kd zG~mbP|D(;{s_#;hsKK9lbVK&Lo734x7SIFJ9V_}2$@q?zm^7?*XH94w5Qae{7zOMUF z^?%F%)c1Y)Q?Iy?I>knw*8gYW#ok|2gdS=YYZLiD=CW|Nj;n^x!=S#iJ#`~Ld79+xXpVmUK^B(xO_vO!btA9y7w3L3-0j-y4 z?M-V{%z;JI`bk7yFDcP}OcCd*{Q9S5$iGA7*E1@tfkyjAi!;wP^O71cZ^Ep)qrQ)N z#wqw0_HS;T7x3y|`P==i3hEwK%|>fZ)c&@kgKO1~5<5xBSk?iZV?KI6&i72H6S9A* z=U(*e)EqEs?Oc04)V-~K5AUmh|62H4*`UAtItO$O(q5?6jj+K^oD!04r=6#dsxp?~}{`?&sXn#q2 zGuY~7>O2=!u@@Kfu7q=W*4egu@qPMRM>(eyYyaIE<|j%d=iWNdGsx%c!902v#ngNg z@#U-O_4xN$s_9?(`{>{>7~-6FgWpBpqXb`Ydc3OFL#&I}Irse9F_8R@4zSS*Y*o*B zXL?6*Aw!AfkNCgcr#*yj&p3ZDe2y>v$>FUdKIy_2N~}6AbHc7gA3`6$g@1o|dE>vz z4pl(j9;kyMsjaw}lO?(?Xg%4k!5%^t#@5n=WVc&JRa+XT$~#@rldvN3S1rEpU$;XgxVny7mki3 z-Hh|jUCHrUXuLr!)`w>wgO0N%KTB-1di>cj(x3Bav`7v z3G7EIbU$z>`Nad7Rk_&OT-W{;qg)-GXV-aJT#(ozdmnA~Rq3GQ_3mby(>q6Ocb-RgTUhTN)))x>m&eD;$J5Bg zo&DhY36Yg=J=$Z>t}RJ>o|@hAcwWzN#r(WJ52^g$lh^!63@hh+dR$&_dEGu&^CR*< z!oFqSqO@>xZ*nC2oiOd0eS*F^IL~W-rsrO`J`ej{=ou_q^_(<$&-3f^J z&L^MSYWIe{&pYq&9eGaArA~*kAdist/out-tsc", "types": [] }, + <%_ if (angularMajorVersion < 20) { _%> "files": ["src/main.ts"], "include": ["src/**/*.d.ts"], - "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] + <%_ } else { _%> + "include": ["src/**/*.ts"], + <%_ } _%> + "exclude": [ + "jest.config.ts", + "src/test-setup.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] } diff --git a/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ b/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ index c199239a36..fa64dc7574 100644 --- a/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ +++ b/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ @@ -1,8 +1,8 @@ { - "compilerOptions": { - "target": "es2022"<% if (disableModernClassFieldsBehavior) { %>, - "useDefineForClassFields": false<% } %><% if (isUsingApplicationBuilder) { %>, - "esModuleInterop": true<% } %> + "extends": "<%= rootTsConfig %>", + "compilerOptions": {}, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false }, "files": [], "include": [], @@ -13,6 +13,5 @@ { "path": "./tsconfig.app.json" } - ], - "extends": "<%= rootTsConfig %>" + ] } diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/app.component.spec.ts__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/app.component.spec.ts__tpl__ deleted file mode 100644 index 125098f7cd..0000000000 --- a/packages/angular/src/generators/application/files/ng-module/src/app/app.component.spec.ts__tpl__ +++ /dev/null @@ -1,29 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component';<% if(!minimal) { %> -import { NxWelcomeComponent } from './nx-welcome.component';<% } %><% if(routing && useRouterTestingModule) { %> -import { RouterTestingModule } from '@angular/router/testing';<% } %><% if(routing && !useRouterTestingModule) { %> -import { RouterModule } from '@angular/router';<% } %> - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [<% if(routing && useRouterTestingModule) { %>RouterTestingModule<% } %><% if(routing && !useRouterTestingModule) { %>RouterModule.forRoot([])<% } %>], - declarations: [AppComponent<% if(!minimal) { %>, NxWelcomeComponent<% } %>] - }).compileComponents(); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain( - 'Welcome <%= appName %>' - ); - });<% if(!minimal) { %> - - it(`should have as title '<%= appName %>'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('<%= appName %>'); - });<% } %> -}); diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/app.module.ts__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/app.module.ts__tpl__ deleted file mode 100644 index 745b195cc4..0000000000 --- a/packages/angular/src/generators/application/files/ng-module/src/app/app.module.ts__tpl__ +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser';<% if(routing) { %> -import { RouterModule } from '@angular/router';<% } %> -import { AppComponent } from './app.component';<% if(routing) { %> -import { appRoutes } from './app.routes';<% } %><% if(!minimal) { %> -import { NxWelcomeComponent } from './nx-welcome.component';<% } %> - -@NgModule({ - declarations: [AppComponent<% if(!minimal) { %>, NxWelcomeComponent<% } %>], - imports: [ - BrowserModule,<% if(routing) { %> - RouterModule.forRoot(appRoutes),<% } %> - ], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/packages/angular/src/generators/application/files/base-pre18/src/assets/.gitkeep__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.__style__ similarity index 100% rename from packages/angular/src/generators/application/files/base-pre18/src/assets/.gitkeep__tpl__ rename to packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.__style__ diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/app.component.html__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.html__tpl__ similarity index 100% rename from packages/angular/src/generators/application/files/ng-module/src/app/app.component.html__tpl__ rename to packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.html__tpl__ diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.spec.ts__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.spec.ts__tpl__ new file mode 100644 index 0000000000..defc2593af --- /dev/null +++ b/packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.spec.ts__tpl__ @@ -0,0 +1,28 @@ +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';<% } %> + +describe('App<%= componentType %>', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [<% if(routing) { %>RouterModule.forRoot([])<% } %>], + declarations: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %>] + }).compileComponents(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(App<%= componentType %>); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain( + 'Welcome <%= appName %>' + ); + });<% if(!minimal && angularMajorVersion < 20) { %> + + it(`should have as title '<%= appName %>'`, () => { + const fixture = TestBed.createComponent(App<%= componentType %>); + const app = fixture.componentInstance; + expect(app.title).toEqual('<%= appName %>'); + });<% } %> +}); diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/app.component.ts__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.ts__tpl__ similarity index 67% rename from packages/angular/src/generators/application/files/ng-module/src/app/app.component.ts__tpl__ rename to packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.ts__tpl__ index 7005b31d61..68dc398ab5 100644 --- a/packages/angular/src/generators/application/files/ng-module/src/app/app.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.ts__tpl__ @@ -3,12 +3,12 @@ import { Component<% if(viewEncapsulation) { %>, ViewEncapsulation<% } %> } from @Component({ selector: '<%= rootSelector %>',<% if (setStandaloneFalse) { %> standalone: false,<% } if(!inlineTemplate) { %> - templateUrl: './app.component.html',<% } else { %> + templateUrl: './app<%= componentFileSuffix %>.html',<% } else { %> template: `<% if(minimal) { %>

Welcome <%= appName %>

<% } else { %><<%= nxWelcomeSelector %>>><% } %> <% if(routing) { %><% } %>`,<% } %><% if(!inlineStyle) { %> - styleUrl: './app.component.<%= style %>',<% } else { %> + styleUrl: './app<%= componentFileSuffix %>.<%= style %>',<% } else { %> styles: ``,<% } %><% if(viewEncapsulation) { %> encapsulation: ViewEncapsulation.<%= viewEncapsulation %>,<% } %> }) -export class AppComponent {<% if(!minimal) { %> - title = '<%= appName %>'; +export class App<%= componentType %> {<% if(!minimal) { %> + <% if (angularMajorVersion >= 20) { %>protected <% } %>title = '<%= appName %>'; <% } %>} diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/app__moduleTypeSeparator__module.ts__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/app__moduleTypeSeparator__module.ts__tpl__ new file mode 100644 index 0000000000..639986bf7b --- /dev/null +++ b/packages/angular/src/generators/application/files/ng-module/src/app/app__moduleTypeSeparator__module.ts__tpl__ @@ -0,0 +1,17 @@ +import { NgModule<% if (provideGlobalErrorListener) { %>, provideBrowserGlobalErrorListeners<% } %> } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser';<% if(routing) { %> +import { RouterModule } from '@angular/router';<% } %> +import { App<%= componentType %> } from './app<%= componentFileSuffix %>';<% if(routing) { %> +import { appRoutes } from './app.routes';<% } %><% if(!minimal) { %> +import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %> + +@NgModule({ + declarations: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %>], + imports: [ + BrowserModule,<% if(routing) { %> + RouterModule.forRoot(appRoutes),<% } %> + ], + providers: [<% if (provideGlobalErrorListener) { %>provideBrowserGlobalErrorListeners()<% } %>], + bootstrap: [App<%= componentType %>], +}) +export class AppModule {} diff --git a/packages/angular/src/generators/application/files/ng-module/src/main.ts__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/main.ts__tpl__ index b84d7f7305..1604e367d9 100644 --- a/packages/angular/src/generators/application/files/ng-module/src/main.ts__tpl__ +++ b/packages/angular/src/generators/application/files/ng-module/src/main.ts__tpl__ @@ -1,8 +1,16 @@ +<%_ if (usePlatformBrowserDynamic) { _%> import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; +<%_ } else { _%> +import { platformBrowser } from '@angular/platform-browser'; +<%_ } _%> +import { AppModule } from './app/app<%= moduleTypeSeparator %>module'; +<%_ if (usePlatformBrowserDynamic) { _%> platformBrowserDynamic() - .bootstrapModule(AppModule<% if (useEventCoalescing) { %>, { +<%_ } else { _%> +platformBrowser() +<%_ } _%> + .bootstrapModule(AppModule, { ngZoneEventCoalescing: true - }<% } %>) + }) .catch((err) => console.error(err)); diff --git a/packages/angular/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ similarity index 99% rename from packages/angular/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/nx-welcome.component.ts__tpl__ rename to packages/angular/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ index fe42de40b2..1bcaeb8bf3 100644 --- a/packages/angular/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ @@ -806,4 +806,4 @@ nx g @nx/angular:component ui/src/lib/button styles: [], encapsulation: ViewEncapsulation.None, }) -export class NxWelcomeComponent {} +export class NxWelcome<%= componentType %> {} diff --git a/packages/angular/src/generators/application/files/nx-welcome/claimed/standalone/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/nx-welcome/claimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ similarity index 99% rename from packages/angular/src/generators/application/files/nx-welcome/claimed/standalone/src/app/nx-welcome.component.ts__tpl__ rename to packages/angular/src/generators/application/files/nx-welcome/claimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ index dadb9f350d..17ff2237b8 100644 --- a/packages/angular/src/generators/application/files/nx-welcome/claimed/standalone/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/nx-welcome/claimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ @@ -808,4 +808,4 @@ nx g @nx/angular:component ui/src/lib/button styles: [], encapsulation: ViewEncapsulation.None, }) -export class NxWelcomeComponent {} +export class NxWelcome<%= componentType %> {} diff --git a/packages/angular/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ similarity index 99% rename from packages/angular/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/nx-welcome.component.ts__tpl__ rename to packages/angular/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ index 7f89a83a73..8d8cdf3840 100644 --- a/packages/angular/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ @@ -803,4 +803,4 @@ nx g @nx/angular:component ui/src/lib/button styles: [], encapsulation: ViewEncapsulation.None, }) -export class NxWelcomeComponent {} +export class NxWelcome<%= componentType %> {} diff --git a/packages/angular/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ similarity index 99% rename from packages/angular/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/nx-welcome.component.ts__tpl__ rename to packages/angular/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ index 5440c96461..4d60d9b517 100644 --- a/packages/angular/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ @@ -805,4 +805,4 @@ nx g @nx/angular:component ui/src/lib/button styles: [], encapsulation: ViewEncapsulation.None, }) -export class NxWelcomeComponent {} +export class NxWelcome<%= componentType %> {} diff --git a/packages/angular/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ similarity index 99% rename from packages/angular/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/nx-welcome.component.ts__tpl__ rename to packages/angular/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ index 753f3eb98e..ab8cd47ec9 100644 --- a/packages/angular/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ @@ -808,4 +808,4 @@ nx g @nx/angular:component ui/src/lib/button styles: [], encapsulation: ViewEncapsulation.None, }) -export class NxWelcomeComponent {} +export class NxWelcome<%= componentType %> {} diff --git a/packages/angular/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ similarity index 99% rename from packages/angular/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/nx-welcome.component.ts__tpl__ rename to packages/angular/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ index c4d3ef96f9..800d7441b7 100644 --- a/packages/angular/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ @@ -810,4 +810,4 @@ nx g @nx/angular:component ui/src/lib/button styles: [], encapsulation: ViewEncapsulation.None, }) -export class NxWelcomeComponent {} +export class NxWelcome<%= componentType %> {} diff --git a/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.__style__ b/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.__style__ deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.spec.ts__tpl__ b/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.spec.ts__tpl__ deleted file mode 100644 index 0bdbf86cae..0000000000 --- a/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.spec.ts__tpl__ +++ /dev/null @@ -1,28 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component';<% if(!minimal) { %> -import { NxWelcomeComponent } from './nx-welcome.component';<% } %><% if(routing && useRouterTestingModule) { %> -import { RouterTestingModule } from '@angular/router/testing';<% } %><% if(routing && !useRouterTestingModule) { %> -import { RouterModule } from '@angular/router';<% } %> - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AppComponent<% if(!minimal) { %>, NxWelcomeComponent<% } %><% if(routing && useRouterTestingModule) { %>, RouterTestingModule<% } %><% if(routing && !useRouterTestingModule) { %>, RouterModule.forRoot([])<% } %>], - }).compileComponents(); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain( - 'Welcome <%= appName %>' - ); - });<% if(!minimal) { %> - - it(`should have as title '<%= appName %>'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('<%= appName %>'); - });<% } %> -}); diff --git a/packages/angular/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ b/packages/angular/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ index 9655cae80b..409080cccd 100644 --- a/packages/angular/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ +++ b/packages/angular/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ @@ -1,7 +1,11 @@ -import { ApplicationConfig<% if (useEventCoalescing) { %>, provideZoneChangeDetection<% } %> } from '@angular/core';<% if (routing) { %> +import { ApplicationConfig<% if (provideGlobalErrorListener) { %>, provideBrowserGlobalErrorListeners<% } %>, provideZoneChangeDetection } from '@angular/core';<% if (routing) { %> import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes';<% } %> export const appConfig: ApplicationConfig = { - providers: [<% if (useEventCoalescing) { %>provideZoneChangeDetection({ eventCoalescing: true }), <% } %><% if (routing) { %>provideRouter(appRoutes) <% } %>] + providers: [<% if (provideGlobalErrorListener) { %> + provideBrowserGlobalErrorListeners(),<% } %> + provideZoneChangeDetection({ eventCoalescing: true })<% if (routing) { %>, + provideRouter(appRoutes)<% } %> + ] }; diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/app.component.__style__ b/packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.__style__ similarity index 100% rename from packages/angular/src/generators/application/files/ng-module/src/app/app.component.__style__ rename to packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.__style__ diff --git a/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.html__tpl__ b/packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.html__tpl__ similarity index 100% rename from packages/angular/src/generators/application/files/standalone-components/src/app/app.component.html__tpl__ rename to packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.html__tpl__ diff --git a/packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ b/packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ new file mode 100644 index 0000000000..de5d91054f --- /dev/null +++ b/packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ @@ -0,0 +1,27 @@ +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';<% } %> + +describe('App<%= componentType %>', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %><% if(routing) { %>, RouterModule.forRoot([])<% } %>], + }).compileComponents(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(App<%= componentType %>); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain( + 'Welcome <%= appName %>' + ); + });<% if(!minimal && angularMajorVersion < 20) { %> + + it(`should have as title '<%= appName %>'`, () => { + const fixture = TestBed.createComponent(App<%= componentType %>); + const app = fixture.componentInstance; + expect(app.title).toEqual('<%= appName %>'); + });<% } %> +}); diff --git a/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.ts__tpl__ b/packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.ts__tpl__ similarity index 58% rename from packages/angular/src/generators/application/files/standalone-components/src/app/app.component.ts__tpl__ rename to packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.ts__tpl__ index 533bfa9009..88cf293aba 100644 --- a/packages/angular/src/generators/application/files/standalone-components/src/app/app.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.ts__tpl__ @@ -1,17 +1,17 @@ import { Component<% if(viewEncapsulation) { %>, ViewEncapsulation<% } %> } from '@angular/core';<% if(routing) { %> import { RouterModule } from '@angular/router';<% } %><% if(!minimal) { %> -import { NxWelcomeComponent } from './nx-welcome.component';<% } %> +import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %> @Component({<% if (setStandaloneTrue) { %> standalone: true,<% } %> - imports: [<% if(!minimal) { %>NxWelcomeComponent, <% } %><% if(routing) { %>RouterModule<% } %>], + imports: [<% if(!minimal) { %>NxWelcome<%= componentType %>, <% } %><% if(routing) { %>RouterModule<% } %>], selector: '<%= rootSelector %>',<% if(!inlineTemplate) { %> - templateUrl: './app.component.html',<% } else { %> + templateUrl: './app<%= componentFileSuffix %>.html',<% } else { %> template: `<% if(minimal) { %>

Welcome <%= appName %>

<% } else { %><<%= nxWelcomeSelector %>>><% } %> <% if(routing) { %><% } %>`,<% } %><% if(!inlineStyle) { %> - styleUrl: './app.component.<%= style %>',<% } else { %> + styleUrl: './app<%= componentFileSuffix %>.<%= style %>',<% } else { %> styles: ``,<% } %><% if(viewEncapsulation) { %> encapsulation: ViewEncapsulation.<%= viewEncapsulation %>,<% } %> }) -export class AppComponent {<% if(!minimal) { %> - title = '<%= appName %>'; +export class App<%= componentType %> {<% if(!minimal) { %> + <% if (angularMajorVersion >= 20) { %>protected <% } %>title = '<%= appName %>'; <% } %>} diff --git a/packages/angular/src/generators/application/files/standalone-components/src/main.ts__tpl__ b/packages/angular/src/generators/application/files/standalone-components/src/main.ts__tpl__ index 514c89a08e..9587a4df94 100644 --- a/packages/angular/src/generators/application/files/standalone-components/src/main.ts__tpl__ +++ b/packages/angular/src/generators/application/files/standalone-components/src/main.ts__tpl__ @@ -1,7 +1,7 @@ import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App<%= componentType %> } from './app/app<%= componentFileSuffix %>'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(App<%= componentType %>, appConfig).catch((err) => console.error(err) ); diff --git a/packages/angular/src/generators/application/lib/create-files.ts b/packages/angular/src/generators/application/lib/create-files.ts index ee3fb395e5..432b2a5849 100644 --- a/packages/angular/src/generators/application/lib/create-files.ts +++ b/packages/angular/src/generators/application/lib/create-files.ts @@ -1,26 +1,25 @@ -import type { Tree } from '@nx/devkit'; -import { generateFiles, joinPathFragments } from '@nx/devkit'; +import { generateFiles, joinPathFragments, names, type Tree } from '@nx/devkit'; import { getRelativePathToRootTsConfig, getRootTsConfigFileName } from '@nx/js'; -import { lt } from 'semver'; +import { + createNxCloudOnboardingURLForWelcomeApp, + getNxCloudAppOnBoardingUrl, +} from 'nx/src/nx-cloud/utilities/onboarding'; import { UnitTestRunner } from '../../../utils/test-runners'; +import { + getComponentType, + getModuleTypeSeparator, +} from '../../utils/artifact-types'; import { validateHtmlSelector } from '../../utils/selector'; import { updateProjectRootTsConfig } from '../../utils/update-project-root-tsconfig'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema } from './normalized-schema'; -import { - getNxCloudAppOnBoardingUrl, - createNxCloudOnboardingURLForWelcomeApp, -} from 'nx/src/nx-cloud/utilities/onboarding'; export async function createFiles( tree: Tree, options: NormalizedSchema, rootOffset: string ) { - const { major: angularMajorVersion, version: angularVersion } = - getInstalledAngularVersionInfo(tree); - const isUsingApplicationBuilder = options.bundler === 'esbuild'; - const disableModernClassFieldsBehavior = lt(angularVersion, '18.1.0-rc.0'); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); const rootSelector = `${options.prefix}-root`; validateHtmlSelector(rootSelector); @@ -36,6 +35,10 @@ export async function createFiles( onBoardingStatus === 'unclaimed' && (await getNxCloudAppOnBoardingUrl(options.nxCloudToken)); + const componentType = getComponentType(tree); + const componentFileSuffix = componentType ? `.${componentType}` : ''; + const moduleTypeSeparator = getModuleTypeSeparator(tree); + const substitutions = { rootSelector, appName: options.name, @@ -50,13 +53,14 @@ export async function createFiles( rootTsConfig: joinPathFragments(rootOffset, getRootTsConfigFileName(tree)), angularMajorVersion, rootOffset, - isUsingApplicationBuilder, - disableModernClassFieldsBehavior, - useEventCoalescing: angularMajorVersion >= 18, - useRouterTestingModule: angularMajorVersion < 18, - // Angular v19 or higher defaults to true, while v18 or lower defaults to false + // Angular v19 or higher defaults to true, while lower versions default to false setStandaloneFalse: angularMajorVersion >= 19, setStandaloneTrue: angularMajorVersion < 19, + provideGlobalErrorListener: angularMajorVersion >= 20, + usePlatformBrowserDynamic: angularMajorVersion < 20, + componentType: componentType ? names(componentType).className : '', + componentFileSuffix, + moduleTypeSeparator, connectCloudUrl, tutorialUrl: options.standalone ? 'https://nx.dev/getting-started/tutorials/angular-standalone-tutorial?utm_source=nx-project' @@ -73,19 +77,9 @@ export async function createFiles( substitutions ); - if (angularMajorVersion >= 18) { - generateFiles( - tree, - joinPathFragments(__dirname, '../files/base-18+'), - options.appProjectRoot, - substitutions - ); - } else { - generateFiles( - tree, - joinPathFragments(__dirname, '../files/base-pre18'), - options.appProjectRoot, - substitutions + if (angularMajorVersion >= 20) { + tree.delete( + joinPathFragments(options.appProjectRoot, 'tsconfig.editor.json') ); } @@ -134,14 +128,17 @@ export async function createFiles( tree.delete( joinPathFragments( options.appProjectRoot, - '/src/app/app.component.spec.ts' + `src/app/app${componentFileSuffix}.spec.ts` ) ); } if (options.inlineTemplate) { tree.delete( - joinPathFragments(options.appProjectRoot, '/src/app/app.component.html') + joinPathFragments( + options.appProjectRoot, + `src/app/app${componentFileSuffix}.html` + ) ); } @@ -149,7 +146,7 @@ export async function createFiles( tree.delete( joinPathFragments( options.appProjectRoot, - `/src/app/app.component.${options.style}` + `src/app/app${componentFileSuffix}.${options.style}` ) ); } @@ -158,7 +155,7 @@ export async function createFiles( tree.delete( joinPathFragments( options.appProjectRoot, - 'src/app/nx-welcome.component.ts' + `src/app/nx-welcome${componentFileSuffix}.ts` ) ); } diff --git a/packages/angular/src/generators/application/lib/create-project.ts b/packages/angular/src/generators/application/lib/create-project.ts index 1155e15b1b..523a3cb068 100644 --- a/packages/angular/src/generators/application/lib/create-project.ts +++ b/packages/angular/src/generators/application/lib/create-project.ts @@ -1,18 +1,139 @@ -import { addProjectConfiguration, joinPathFragments, Tree } from '@nx/devkit'; +import { + addProjectConfiguration, + joinPathFragments, + type ProjectConfiguration, + type Tree, +} from '@nx/devkit'; +import { addBuildTargetDefaults } from '@nx/devkit/src/generators/target-defaults-utils'; import type { AngularProjectConfiguration } from '../../../utils/types'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema } from './normalized-schema'; -import { addBuildTargetDefaults } from '@nx/devkit/src/generators/target-defaults-utils'; export function createProject(tree: Tree, options: NormalizedSchema) { + let project: ProjectConfiguration; + + if (options.bundler === 'esbuild') { + project = createProjectForEsbuild(tree, options); + } else { + project = createProjectForWebpack(tree, options); + } + + addProjectConfiguration(tree, options.name, project); +} + +function createProjectForEsbuild(tree: Tree, options: NormalizedSchema) { const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); const buildExecutor = - options.bundler === 'webpack' - ? '@angular-devkit/build-angular:browser' + angularMajorVersion >= 20 + ? '@angular/build:application' : '@angular-devkit/build-angular:application'; - const buildMainOptionName = - options.bundler === 'esbuild' ? 'browser' : 'main'; + + addBuildTargetDefaults(tree, buildExecutor); + + let budgets = undefined; + if (options.strict) { + budgets = [ + { type: 'initial', maximumWarning: '500kb', maximumError: '1mb' }, + { + type: 'anyComponentStyle', + maximumWarning: '4kb', + maximumError: '8kb', + }, + ]; + } else { + budgets = [ + { type: 'initial', maximumWarning: '2mb', maximumError: '5mb' }, + { + type: 'anyComponentStyle', + maximumWarning: '6kb', + maximumError: '10kb', + }, + ]; + } + + const inlineStyleLanguage = + options?.style !== 'css' ? options.style : undefined; + + const project: AngularProjectConfiguration = { + name: options.name, + projectType: 'application', + prefix: options.prefix, + root: options.appProjectRoot, + sourceRoot: options.appProjectSourceRoot, + tags: options.parsedTags, + targets: { + build: { + executor: buildExecutor, + outputs: ['{options.outputPath}'], + options: { + outputPath: options.outputPath, + index: + angularMajorVersion >= 20 + ? undefined + : `${options.appProjectSourceRoot}/index.html`, + browser: `${options.appProjectSourceRoot}/main.ts`, + polyfills: ['zone.js'], + tsConfig: joinPathFragments( + options.appProjectRoot, + 'tsconfig.app.json' + ), + inlineStyleLanguage, + assets: [ + { + glob: '**/*', + input: joinPathFragments(options.appProjectRoot, 'public'), + }, + ], + styles: [`${options.appProjectSourceRoot}/styles.${options.style}`], + }, + configurations: { + production: { + budgets, + outputHashing: 'all', + }, + development: { + optimization: false, + extractLicenses: false, + sourceMap: true, + }, + }, + defaultConfiguration: 'production', + }, + serve: { + continuous: true, + executor: + angularMajorVersion >= 20 + ? '@angular/build:dev-server' + : '@angular-devkit/build-angular:dev-server', + options: options.port ? { port: options.port } : undefined, + configurations: { + production: { + buildTarget: `${options.name}:build:production`, + }, + development: { + buildTarget: `${options.name}:build:development`, + }, + }, + defaultConfiguration: 'development', + }, + 'extract-i18n': { + executor: + angularMajorVersion >= 20 + ? '@angular/build:extract-i18n' + : '@angular-devkit/build-angular:extract-i18n', + options: { + buildTarget: `${options.name}:build`, + }, + }, + }, + }; + + return project; +} + +function createProjectForWebpack(tree: Tree, options: NormalizedSchema) { + const buildExecutor = '@angular-devkit/build-angular:browser'; addBuildTargetDefaults(tree, buildExecutor); @@ -54,27 +175,20 @@ export function createProject(tree: Tree, options: NormalizedSchema) { options: { outputPath: options.outputPath, index: `${options.appProjectSourceRoot}/index.html`, - [buildMainOptionName]: `${options.appProjectSourceRoot}/main.ts`, + main: `${options.appProjectSourceRoot}/main.ts`, polyfills: ['zone.js'], tsConfig: joinPathFragments( options.appProjectRoot, 'tsconfig.app.json' ), inlineStyleLanguage, - assets: - angularMajorVersion >= 18 - ? [ - { - glob: '**/*', - input: joinPathFragments(options.appProjectRoot, 'public'), - }, - ] - : [ - `${options.appProjectSourceRoot}/favicon.ico`, - `${options.appProjectSourceRoot}/assets`, - ], + assets: [ + { + glob: '**/*', + input: joinPathFragments(options.appProjectRoot, 'public'), + }, + ], styles: [`${options.appProjectSourceRoot}/styles.${options.style}`], - scripts: [], }, configurations: { production: { @@ -82,12 +196,12 @@ export function createProject(tree: Tree, options: NormalizedSchema) { outputHashing: 'all', }, development: { - buildOptimizer: options.bundler === 'webpack' ? false : undefined, + buildOptimizer: false, optimization: false, - vendorChunk: options.bundler === 'webpack' ? true : undefined, + vendorChunk: true, extractLicenses: false, sourceMap: true, - namedChunks: options.bundler === 'webpack' ? true : undefined, + namedChunks: true, }, }, defaultConfiguration: 'production', @@ -95,11 +209,7 @@ export function createProject(tree: Tree, options: NormalizedSchema) { serve: { continuous: true, executor: '@angular-devkit/build-angular:dev-server', - options: options.port - ? { - port: options.port, - } - : undefined, + options: options.port ? { port: options.port } : undefined, configurations: { production: { buildTarget: `${options.name}:build:production`, @@ -119,5 +229,5 @@ export function createProject(tree: Tree, options: NormalizedSchema) { }, }; - addProjectConfiguration(tree, options.name, project); + return project; } diff --git a/packages/angular/src/generators/application/lib/enable-strict-type-checking.ts b/packages/angular/src/generators/application/lib/enable-strict-type-checking.ts index 7ee14da019..e06aa48525 100644 --- a/packages/angular/src/generators/application/lib/enable-strict-type-checking.ts +++ b/packages/angular/src/generators/application/lib/enable-strict-type-checking.ts @@ -1,5 +1,6 @@ import type { Tree } from '@nx/devkit'; import { updateJson } from '@nx/devkit'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema } from './normalized-schema'; export function enableStrictTypeChecking( @@ -8,7 +9,6 @@ export function enableStrictTypeChecking( ): void { // This matches the settings defined by the Angular CLI https://angular.io/guide/strict-mode const compilerOptions = { - forceConsistentCasingInFileNames: true, strict: true, noImplicitOverride: true, noPropertyAccessFromIndexSignature: true, @@ -18,12 +18,15 @@ export function enableStrictTypeChecking( const appTsConfigPath = `${options.appProjectRoot}/tsconfig.json`; if (host.exists(appTsConfigPath)) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(host); + updateJson(host, appTsConfigPath, (json) => { json.compilerOptions = { ...json.compilerOptions, ...compilerOptions }; json.angularCompilerOptions = { - enableI18nLegacyMessageIdFormat: false, + ...json.angularCompilerOptions, strictInjectionParameters: true, strictInputAccessModifiers: true, + typeCheckHostBindings: angularMajorVersion >= 20 ? true : undefined, strictTemplates: true, }; return json; diff --git a/packages/angular/src/generators/application/lib/index.ts b/packages/angular/src/generators/application/lib/index.ts index 9aca0ca441..10452e650e 100644 --- a/packages/angular/src/generators/application/lib/index.ts +++ b/packages/angular/src/generators/application/lib/index.ts @@ -7,7 +7,6 @@ export * from './create-project'; export * from './enable-strict-type-checking'; export * from './normalize-options'; export * from './normalized-schema'; -export * from './set-app-strict-default'; export * from './set-generator-defaults'; -export * from './update-editor-tsconfig'; +export * from './update-tsconfig-files'; export * from './add-serve-static-target'; diff --git a/packages/angular/src/generators/application/lib/set-app-strict-default.ts b/packages/angular/src/generators/application/lib/set-app-strict-default.ts deleted file mode 100644 index 05cb50a5ae..0000000000 --- a/packages/angular/src/generators/application/lib/set-app-strict-default.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Tree } from '@nx/devkit'; -import { readNxJson, updateNxJson } from '@nx/devkit'; - -export function setApplicationStrictDefault(host: Tree, strict: boolean) { - const nxJson = readNxJson(host); - - nxJson.generators = nxJson.generators || {}; - nxJson.generators['@nx/angular:application'] = - nxJson.generators['@nx/angular:application'] || {}; - nxJson.generators['@nx/angular:application'].strict = - nxJson.generators['@nx/angular:application'].strict ?? strict; - - updateNxJson(host, nxJson); -} diff --git a/packages/angular/src/generators/application/lib/set-generator-defaults.ts b/packages/angular/src/generators/application/lib/set-generator-defaults.ts index 10239a7899..2510442fe0 100644 --- a/packages/angular/src/generators/application/lib/set-generator-defaults.ts +++ b/packages/angular/src/generators/application/lib/set-generator-defaults.ts @@ -13,6 +13,7 @@ export function setGeneratorDefaults( linter: options.linter, style: options.style, unitTestRunner: options.unitTestRunner, + strict: !options.strict ? false : undefined, ...(nxJson.generators['@nx/angular:application'] || {}), }; diff --git a/packages/angular/src/generators/application/lib/update-editor-tsconfig.ts b/packages/angular/src/generators/application/lib/update-editor-tsconfig.ts deleted file mode 100644 index d1e4996ee4..0000000000 --- a/packages/angular/src/generators/application/lib/update-editor-tsconfig.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - joinPathFragments, - readJson, - readProjectConfiguration, - updateJson, - type Tree, -} from '@nx/devkit'; -import { updateAppEditorTsConfigExcludedFiles } from '../../utils/update-app-editor-tsconfig-excluded-files'; -import type { NormalizedSchema } from './normalized-schema'; - -interface TsConfig { - compilerOptions?: { types: string[] }; - exclude?: string[]; -} - -function getCompilerOptionsTypes(tsConfig: TsConfig): string[] { - return tsConfig?.compilerOptions?.types ?? []; -} - -export function updateEditorTsConfig(tree: Tree, options: NormalizedSchema) { - const appTsConfig = readJson( - tree, - joinPathFragments(options.appProjectRoot, 'tsconfig.app.json') - ); - const types = getCompilerOptionsTypes(appTsConfig); - - if (types?.length) { - updateJson( - tree, - joinPathFragments(options.appProjectRoot, 'tsconfig.editor.json'), - (json) => { - json.compilerOptions ??= {}; - json.compilerOptions.types = Array.from(new Set(types)); - return json; - } - ); - } - - const project = readProjectConfiguration(tree, options.name); - updateAppEditorTsConfigExcludedFiles(tree, project); -} diff --git a/packages/angular/src/generators/application/lib/update-tsconfig-files.ts b/packages/angular/src/generators/application/lib/update-tsconfig-files.ts new file mode 100644 index 0000000000..3b4cf9e14c --- /dev/null +++ b/packages/angular/src/generators/application/lib/update-tsconfig-files.ts @@ -0,0 +1,116 @@ +import { + joinPathFragments, + readJson, + readProjectConfiguration, + updateJson, + type Tree, +} from '@nx/devkit'; +import { getRootTsConfigFileName } from '@nx/js'; +import { getNeededCompilerOptionOverrides } from '@nx/js/src/utils/typescript/configuration'; +import { gte, lt } from 'semver'; +import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; +import { updateAppEditorTsConfigExcludedFiles } from '../../utils/update-app-editor-tsconfig-excluded-files'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; +import { enableStrictTypeChecking } from './enable-strict-type-checking'; +import type { NormalizedSchema } from './normalized-schema'; + +interface TsConfig { + compilerOptions?: Record; + exclude?: string[]; + extends?: string | string[]; + references?: { path: string }[]; +} + +export function updateTsconfigFiles(tree: Tree, options: NormalizedSchema) { + enableStrictTypeChecking(tree, options); + updateEditorTsConfig(tree, options); + + const compilerOptions: Record = { + skipLibCheck: true, + experimentalDecorators: true, + importHelpers: true, + target: 'es2022', + moduleResolution: 'bundler', + }; + + const rootTsConfigPath = getRootTsConfigFileName(tree); + + const { major: angularMajorVersion, version: angularVersion } = + getInstalledAngularVersionInfo(tree); + if (lt(angularVersion, '18.1.0')) { + compilerOptions.useDefineForClassFields = false; + } + if (gte(angularVersion, '18.2.0')) { + compilerOptions.isolatedModules = true; + } + if (gte(angularVersion, '19.1.0')) { + // Angular started warning about emitDecoratorMetadata and isolatedModules + // in v19.1.0. If enabled in the root tsconfig, we need to disable it. + if (shouldDisableEmitDecoratorMetadata(tree, rootTsConfigPath)) { + compilerOptions.emitDecoratorMetadata = false; + } + } + if (angularMajorVersion >= 20) { + compilerOptions.module = 'preserve'; + } else { + compilerOptions.module = 'es2022'; + if (options.bundler === 'esbuild') { + compilerOptions.esModuleInterop = true; + } + } + + updateJson(tree, `${options.appProjectRoot}/tsconfig.json`, (json) => { + json.compilerOptions = { + ...json.compilerOptions, + ...compilerOptions, + }; + json.compilerOptions = getNeededCompilerOptionOverrides( + tree, + json.compilerOptions, + rootTsConfigPath + ); + return json; + }); +} + +function updateEditorTsConfig(tree: Tree, options: NormalizedSchema) { + const appTsConfig = readJson( + tree, + joinPathFragments(options.appProjectRoot, 'tsconfig.app.json') + ); + const types = appTsConfig?.compilerOptions?.types ?? []; + + if (types?.length) { + updateJson( + tree, + joinPathFragments(options.appProjectRoot, 'tsconfig.editor.json'), + (json) => { + json.compilerOptions ??= {}; + json.compilerOptions.types = Array.from(new Set(types)); + return json; + } + ); + } + + const project = readProjectConfiguration(tree, options.name); + updateAppEditorTsConfigExcludedFiles(tree, project); +} + +function shouldDisableEmitDecoratorMetadata( + tree: Tree, + tsConfigPath: string +): boolean { + const ts = ensureTypescript(); + const tsSysFromTree: import('typescript').System = { + ...ts.sys, + readFile: (path) => tree.read(path, 'utf-8'), + }; + + const parsed = ts.parseJsonConfigFileContent( + ts.readConfigFile(tsConfigPath, tsSysFromTree.readFile).config, + tsSysFromTree, + tree.root + ); + + return parsed.options.emitDecoratorMetadata === true; +} diff --git a/packages/angular/src/generators/application/schema.json b/packages/angular/src/generators/application/schema.json index d9603fbe36..25010a7b9d 100644 --- a/packages/angular/src/generators/application/schema.json +++ b/packages/angular/src/generators/application/schema.json @@ -177,7 +177,7 @@ "default": false }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" } }, diff --git a/packages/angular/src/generators/component-test/__snapshots__/component-test.spec.ts.snap b/packages/angular/src/generators/component-test/__snapshots__/component-test.spec.ts.snap index 5df4b53b39..9e965da4a6 100644 --- a/packages/angular/src/generators/component-test/__snapshots__/component-test.spec.ts.snap +++ b/packages/angular/src/generators/component-test/__snapshots__/component-test.spec.ts.snap @@ -30,11 +30,11 @@ describe(MyLibComponent.name, () => { exports[`Angular Cypress Component Test Generator should handle component w/o inputs 1`] = ` "import { TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe(MyLibComponent.name, () => { +describe(MyLib.name, () => { beforeEach(() => { - TestBed.overrideComponent(MyLibComponent, { + TestBed.overrideComponent(MyLib, { add: { imports: [], providers: [] @@ -43,7 +43,7 @@ describe(MyLibComponent.name, () => { }); it('renders', () => { - cy.mount(MyLibComponent); + cy.mount(MyLib); }); }); " diff --git a/packages/angular/src/generators/component-test/component-test.spec.ts b/packages/angular/src/generators/component-test/component-test.spec.ts index af46f366a7..16fa20a01a 100644 --- a/packages/angular/src/generators/component-test/component-test.spec.ts +++ b/packages/angular/src/generators/component-test/component-test.spec.ts @@ -36,14 +36,14 @@ describe('Angular Cypress Component Test Generator', () => { skipFormat: true, }); await componentTestGenerator(tree, { - componentName: 'MyLibComponent', - componentFileName: './my-lib.component', + componentName: 'MyLib', + componentFileName: './my-lib', project: 'my-lib', componentDir: 'src/lib/my-lib', skipFormat: true, }); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.cy.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.cy.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -200,11 +200,11 @@ export class MyLibComponent implements OnInit { }); const expected = `import { TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe(MyLibComponent.name, () => { +describe(MyLib.name, () => { beforeEach(() => { - TestBed.overrideComponent(MyLibComponent, { + TestBed.overrideComponent(MyLib, { add: { imports: [], providers: [] @@ -213,34 +213,34 @@ describe(MyLibComponent.name, () => { }); it('renders', () => { - cy.mount(MyLibComponent); + cy.mount(MyLib); }); }); `; await componentTestGenerator(tree, { - componentName: 'MyLibComponent', - componentFileName: './my-lib.component', + componentName: 'MyLib', + componentFileName: './my-lib', project: 'my-lib', componentDir: 'src/lib/my-lib', skipFormat: true, }); expect( tree - .read('my-lib/src/lib/my-lib/my-lib.component.cy.ts', 'utf-8') + .read('my-lib/src/lib/my-lib/my-lib.cy.ts', 'utf-8') .replaceAll(EOL, '\n') ).toEqual(expected); await componentTestGenerator(tree, { - componentName: 'MyLibComponent', - componentFileName: './my-lib.component', + componentName: 'MyLib', + componentFileName: './my-lib', project: 'my-lib', componentDir: 'src/lib/my-lib', skipFormat: true, }); expect( tree - .read('my-lib/src/lib/my-lib/my-lib.component.cy.ts', 'utf-8') + .read('my-lib/src/lib/my-lib/my-lib.cy.ts', 'utf-8') .replaceAll(EOL, '\n') ).toEqual(expected); }); diff --git a/packages/angular/src/generators/component/__snapshots__/component.spec.ts.snap b/packages/angular/src/generators/component/__snapshots__/component.spec.ts.snap index 66c814767c..f443d003e7 100644 --- a/packages/angular/src/generators/component/__snapshots__/component.spec.ts.snap +++ b/packages/angular/src/generators/component/__snapshots__/component.spec.ts.snap @@ -3,45 +3,32 @@ exports[`component Generator --module should import the component correctly to the module file when flat is false 1`] = ` " import { NgModule } from '@angular/core'; -import { ExampleComponent } from './example/example.component'; +import { Example } from './example/example'; @NgModule({ - declarations: [ExampleComponent], - exports: [ExampleComponent] + declarations: [Example], + exports: [Example] }) export class LibModule {} " `; -exports[`component Generator compat should inline styles when --inline-style=true 1`] = ` -"import { Component } from '@angular/core'; - -@Component({ - selector: 'example', - standalone: false, - templateUrl: './example.component.html', - styles: \`\` -}) -export class ExampleComponent {} -" -`; - exports[`component Generator secondary entry points should create the component correctly and export it in the entry point 1`] = ` "import { Component } from '@angular/core'; @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; exports[`component Generator secondary entry points should create the component correctly and export it in the entry point 2`] = ` -"export * from './lib/secondary.module'; -export * from './lib/example/example.component';" +"export * from './lib/secondary-module'; +export * from './lib/example/example';" `; exports[`component Generator should create component files correctly: component 1`] = ` @@ -50,27 +37,27 @@ exports[`component Generator should create component files correctly: component @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css', + templateUrl: './example.html', + styleUrl: './example.css', }) -export class ExampleComponent {} +export class Example {} " `; exports[`component Generator should create component files correctly: component test file 1`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ExampleComponent } from './example.component'; +import { Example } from './example'; -describe('ExampleComponent', () => { - let component: ExampleComponent; - let fixture: ComponentFixture; +describe('Example', () => { + let component: Example; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ExampleComponent], + declarations: [Example], }).compileComponents(); - fixture = TestBed.createComponent(ExampleComponent); + fixture = TestBed.createComponent(Example); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -83,7 +70,7 @@ describe('ExampleComponent', () => { `; exports[`component Generator should create component files correctly: entry point file 1`] = ` -"export * from './lib/lib.module'; +"export * from './lib/lib-module'; " `; @@ -100,16 +87,16 @@ exports[`component Generator should create the component correctly and export it @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; exports[`component Generator should create the component correctly and export it in the entry point when "export=true" 2`] = ` -"export * from './lib/lib.module'; -export * from './lib/example/example.component';" +"export * from './lib/lib-module'; +export * from './lib/example/example';" `; exports[`component Generator should create the component correctly and export it in the entry point when is standalone and "export=true" 1`] = ` @@ -119,10 +106,10 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'example', imports: [CommonModule], - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; @@ -132,10 +119,10 @@ exports[`component Generator should create the component correctly and not expor @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; @@ -146,10 +133,10 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'example', imports: [CommonModule], - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; @@ -159,10 +146,10 @@ exports[`component Generator should create the component correctly and not expor @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; @@ -172,10 +159,10 @@ exports[`component Generator should create the component correctly but not expor @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; @@ -189,24 +176,24 @@ import { CommonModule } from '@angular/common'; templateUrl: './example.component.html', styleUrl: './example.component.css', }) -export class ExampleComponentComponent {} +export class ExampleComponent {} " `; exports[`component Generator should handle path with file extension: component test file 1`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ExampleComponentComponent } from './example.component'; +import { ExampleComponent } from './example.component'; -describe('ExampleComponentComponent', () => { - let component: ExampleComponentComponent; - let fixture: ComponentFixture; +describe('ExampleComponent', () => { + let component: ExampleComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ExampleComponentComponent], + imports: [ExampleComponent], }).compileComponents(); - fixture = TestBed.createComponent(ExampleComponentComponent); + fixture = TestBed.createComponent(ExampleComponent); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -233,10 +220,10 @@ exports[`component Generator should inline styles when --inline-style=true 1`] = @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', + templateUrl: './example.html', styles: \`\` }) -export class ExampleComponent {} +export class Example {} " `; @@ -247,8 +234,8 @@ exports[`component Generator should inline template when --inline-template=true selector: 'example', standalone: false, template: \`

example works!

\`, - styleUrl: './example.component.css' + styleUrl: './example.css' }) -export class ExampleComponent {} +export class Example {} " `; diff --git a/packages/angular/src/generators/component/component.spec.ts b/packages/angular/src/generators/component/component.spec.ts index 0b2b7356a2..574adb668b 100644 --- a/packages/angular/src/generators/component/component.spec.ts +++ b/packages/angular/src/generators/component/component.spec.ts @@ -1,25 +1,26 @@ import { - Tree, addProjectConfiguration, readProjectConfiguration, + type Tree, + updateJson, updateProjectConfiguration, writeJson, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { AngularProjectConfiguration } from '../../utils/types'; +import type { AngularProjectConfiguration } from '../../utils/types'; import { componentGenerator } from './component'; describe('component Generator', () => { it('should create component files correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -29,7 +30,7 @@ describe('component Generator', () => { }) export class LibModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // ACT await componentGenerator(tree, { @@ -39,24 +40,124 @@ describe('component Generator', () => { // ASSERT expect( - tree.read('libs/lib1/src/lib/example/example.component.ts', 'utf-8') + tree.read('libs/lib1/src/lib/example/example.ts', 'utf-8') ).toMatchSnapshot('component'); expect( - tree.read('libs/lib1/src/lib/example/example.component.html', 'utf-8') + tree.read('libs/lib1/src/lib/example/example.html', 'utf-8') ).toMatchSnapshot('template'); expect( - tree.read('libs/lib1/src/lib/example/example.component.css', 'utf-8') + tree.read('libs/lib1/src/lib/example/example.css', 'utf-8') ).toMatchSnapshot('stylesheet'); expect( - tree.read('libs/lib1/src/lib/example/example.component.spec.ts', 'utf-8') + tree.read('libs/lib1/src/lib/example/example.spec.ts', 'utf-8') ).toMatchSnapshot('component test file'); expect(tree.read('libs/lib1/src/index.ts', 'utf-8')).toMatchSnapshot( 'entry point file' ); }); + it('should create component files correctly when the type is provided', async () => { + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'lib1', { + projectType: 'library', + sourceRoot: 'libs/lib1/src', + root: 'libs/lib1', + }); + + await componentGenerator(tree, { + path: 'libs/lib1/src/lib/example/example', + type: 'component', + }); + + expect(tree.read('libs/lib1/src/lib/example/example.component.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Component({ + selector: 'example', + imports: [CommonModule], + templateUrl: './example.component.html', + styleUrl: './example.component.css', + }) + export class ExampleComponent {} + " + `); + expect( + tree.read('libs/lib1/src/lib/example/example.component.html', 'utf-8') + ).toMatchInlineSnapshot(` + "

example works!

+ " + `); + expect( + tree.read('libs/lib1/src/lib/example/example.component.css', 'utf-8') + ).toMatchInlineSnapshot(`""`); + expect( + tree.read('libs/lib1/src/lib/example/example.component.spec.ts', 'utf-8') + ).toMatchInlineSnapshot(` + "import { ComponentFixture, TestBed } from '@angular/core/testing'; + import { ExampleComponent } from './example.component'; + + describe('ExampleComponent', () => { + let component: ExampleComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ExampleComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ExampleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + }); + " + `); + }); + + it('should use ".ng.html" extension when --ngHtml=true', async () => { + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'lib1', { + projectType: 'library', + sourceRoot: 'libs/lib1/src', + root: 'libs/lib1', + }); + + await componentGenerator(tree, { + path: 'libs/lib1/src/lib/example/example', + ngHtml: true, + }); + + expect(tree.exists('libs/lib1/src/lib/example/example.ng.html')).toBe(true); + expect(tree.exists('libs/lib1/src/lib/example/example.html')).toBe(false); + expect(tree.read('libs/lib1/src/lib/example/example.ng.html', 'utf-8')) + .toMatchInlineSnapshot(` + "

example works!

+ " + `); + expect(tree.read('libs/lib1/src/lib/example/example.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Component({ + selector: 'example', + imports: [CommonModule], + templateUrl: './example.ng.html', + styleUrl: './example.css', + }) + export class Example {} + " + `); + }); + it('should export the component as default when exportDefault is true', async () => { - const tree = createTreeWithEmptyWorkspace({}); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', @@ -70,11 +171,11 @@ describe('component Generator', () => { }); expect( - tree.read('libs/lib1/src/lib/example/example.component.ts', 'utf-8') - ).toContain('export default class ExampleComponent {}'); + tree.read('libs/lib1/src/lib/example/example.ts', 'utf-8') + ).toContain('export default class Example {}'); expect( - tree.read('libs/lib1/src/lib/example/example.component.spec.ts', 'utf-8') - ).toContain(`import ExampleComponent from './example.component';`); + tree.read('libs/lib1/src/lib/example/example.spec.ts', 'utf-8') + ).toContain(`import Example from './example';`); }); it('should handle path with file extension', async () => { @@ -108,14 +209,14 @@ describe('component Generator', () => { it('should not generate test file when --skip-tests=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -136,21 +237,21 @@ describe('component Generator', () => { }); // ASSERT - expect( - tree.exists('libs/lib1/src/lib/example/example.component.spec.ts') - ).toBe(false); + expect(tree.exists('libs/lib1/src/lib/example/example.spec.ts')).toBe( + false + ); }); it('should inline template when --inline-template=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -172,23 +273,21 @@ describe('component Generator', () => { // ASSERT expect( - tree.read('libs/lib1/src/lib/example/example.component.ts', 'utf-8') + tree.read('libs/lib1/src/lib/example/example.ts', 'utf-8') ).toMatchSnapshot(); - expect( - tree.exists('libs/lib1/src/lib/example/example.component.html') - ).toBe(false); + expect(tree.exists('libs/lib1/src/lib/example/example.html')).toBe(false); }); it('should inline styles when --inline-style=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -210,23 +309,21 @@ describe('component Generator', () => { // ASSERT expect( - tree.read('libs/lib1/src/lib/example/example.component.ts', 'utf-8') + tree.read('libs/lib1/src/lib/example/example.ts', 'utf-8') ).toMatchSnapshot(); - expect(tree.exists('libs/lib1/src/lib/example/example.component.css')).toBe( - false - ); + expect(tree.exists('libs/lib1/src/lib/example/example.css')).toBe(false); }); it('should not create a style file when --style=none', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -247,33 +344,31 @@ describe('component Generator', () => { }); // ASSERT - expect( - tree.exists('libs/lib1/src/lib/example/example.component.none') - ).toBeFalsy(); - expect(tree.read('libs/lib1/src/lib/example/example.component.ts', 'utf-8')) + expect(tree.exists('libs/lib1/src/lib/example/example.none')).toBeFalsy(); + expect(tree.read('libs/lib1/src/lib/example/example.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { Component } from '@angular/core'; @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html' + templateUrl: './example.html' }) - export class ExampleComponent {} + export class Example {} " `); }); it('should create the component correctly and export it in the entry point when "export=true"', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -283,7 +378,7 @@ describe('component Generator', () => { }) export class LibModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // ACT await componentGenerator(tree, { @@ -295,7 +390,7 @@ describe('component Generator', () => { // ASSERT const componentSource = tree.read( - 'libs/lib1/src/lib/example/example.component.ts', + 'libs/lib1/src/lib/example/example.ts', 'utf-8' ); expect(componentSource).toMatchSnapshot(); @@ -306,14 +401,14 @@ describe('component Generator', () => { it('should create the component correctly and export it in the entry point when is standalone and "export=true"', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -334,27 +429,27 @@ describe('component Generator', () => { // ASSERT const componentSource = tree.read( - 'libs/lib1/src/lib/example/example.component.ts', + 'libs/lib1/src/lib/example/example.ts', 'utf-8' ); expect(componentSource).toMatchSnapshot(); const indexSource = tree.read('libs/lib1/src/index.ts', 'utf-8'); expect(indexSource).toMatchInlineSnapshot( - `"export * from './lib/example/example.component';"` + `"export * from './lib/example/example';"` ); }); it('should create the component correctly and not export it in the entry point when "export=false"', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -364,7 +459,7 @@ describe('component Generator', () => { }) export class LibModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // ACT await componentGenerator(tree, { @@ -376,27 +471,25 @@ describe('component Generator', () => { // ASSERT const componentSource = tree.read( - 'libs/lib1/src/lib/example/example.component.ts', + 'libs/lib1/src/lib/example/example.ts', 'utf-8' ); expect(componentSource).toMatchSnapshot(); const indexSource = tree.read('libs/lib1/src/index.ts', 'utf-8'); - expect(indexSource).not.toContain( - `export * from "./lib/example/example.component";` - ); + expect(indexSource).not.toContain(`export * from "./lib/example/example";`); }); it('should create the component correctly and not export it in the entry point when is standalone and "export=false"', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -406,7 +499,7 @@ describe('component Generator', () => { }) export class LibModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // ACT await componentGenerator(tree, { @@ -417,27 +510,25 @@ describe('component Generator', () => { // ASSERT const componentSource = tree.read( - 'libs/lib1/src/lib/example/example.component.ts', + 'libs/lib1/src/lib/example/example.ts', 'utf-8' ); expect(componentSource).toMatchSnapshot(); const indexSource = tree.read('libs/lib1/src/index.ts', 'utf-8'); - expect(indexSource).not.toContain( - `export * from "./lib/example/example.component";` - ); + expect(indexSource).not.toContain(`export * from "./lib/example/example";`); }); it('should create the component correctly and not export it when "--skip-import=true"', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -447,7 +538,7 @@ describe('component Generator', () => { }) export class LibModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // ACT await componentGenerator(tree, { @@ -459,27 +550,25 @@ describe('component Generator', () => { // ASSERT const componentSource = tree.read( - 'libs/lib1/src/lib/example/example.component.ts', + 'libs/lib1/src/lib/example/example.ts', 'utf-8' ); expect(componentSource).toMatchSnapshot(); const indexSource = tree.read('libs/lib1/src/index.ts', 'utf-8'); - expect(indexSource).not.toContain( - `export * from "./lib/example/example.component";` - ); + expect(indexSource).not.toContain(`export * from "./lib/example/example";`); }); it('should create the component correctly but not export it in the entry point when it does not exist', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -500,7 +589,7 @@ describe('component Generator', () => { // ASSERT const componentSource = tree.read( - 'libs/lib1/src/lib/example/example.component.ts', + 'libs/lib1/src/lib/example/example.ts', 'utf-8' ); expect(componentSource).toMatchSnapshot(); @@ -511,14 +600,14 @@ describe('component Generator', () => { it('should not export the component in the entry point when the module it belongs to is not exported', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -556,7 +645,7 @@ describe('component Generator', () => { path: 'libs/lib1/src/lib/example/example', name: '404', }) - ).rejects.toThrow('Class name "404Component" is invalid.'); + ).rejects.toThrow('Class name "404" is invalid.'); }); describe('--module', () => { @@ -568,10 +657,10 @@ describe('component Generator', () => { './lib', 'lib', ])( - 'should export it in the entry point when "--module" is set to "%s"', + 'should export it in the entry point when "--module" is set to "%s" and using the "." type separator', async (module) => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', @@ -604,22 +693,68 @@ describe('component Generator', () => { // ASSERT const indexSource = tree.read('libs/lib1/src/index.ts', 'utf-8'); - expect(indexSource).toContain( - `export * from './lib/example/example.component';` + expect(indexSource).toContain(`export * from './lib/example/example';`); + } + ); + + it.each([ + './lib-module.ts', + 'lib-module.ts', + './lib-module', + 'lib-module', + './lib', + 'lib', + ])( + 'should export it in the entry point when "--module" is set to "%s" and using the "-" type separator', + async (module) => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'lib1', { + projectType: 'library', + sourceRoot: 'libs/lib1/src', + root: 'libs/lib1', + }); + tree.write( + 'libs/lib1/src/lib/lib-module.ts', + ` + import { NgModule } from '@angular/core'; + + @NgModule({ + declarations: [], + exports: [] + }) + export class LibModule {}` ); + tree.write( + 'libs/lib1/src/index.ts', + `export * from './lib/lib-module';` + ); + + // ACT + await componentGenerator(tree, { + path: 'libs/lib1/src/lib/example/example', + module, + export: true, + standalone: false, + skipFormat: true, + }); + + // ASSERT + const indexSource = tree.read('libs/lib1/src/index.ts', 'utf-8'); + expect(indexSource).toContain(`export * from './lib/example/example';`); } ); it('should import the component correctly to the module file when flat is false', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'shared-ui', { projectType: 'library', sourceRoot: 'libs/shared/ui/src', root: 'libs/shared/ui', }); tree.write( - 'libs/shared/ui/src/lib/lib.module.ts', + 'libs/shared/ui/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -632,7 +767,7 @@ export class LibModule {} ); tree.write( 'libs/shared/ui/src/index.ts', - `export * from './lib/lib.module';` + `export * from './lib/lib-module';` ); // ACT @@ -645,7 +780,7 @@ export class LibModule {} // ASSERT const moduleSource = tree.read( - 'libs/shared/ui/src/lib/lib.module.ts', + 'libs/shared/ui/src/lib/lib-module.ts', 'utf-8' ); expect(moduleSource).toMatchSnapshot(); @@ -653,14 +788,14 @@ export class LibModule {} it('should not export it in the entry point when the module it belong to is not exported', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -671,7 +806,7 @@ export class LibModule {} export class LibModule {}` ); tree.write( - 'libs/lib1/src/lib/not-exported.module.ts', + 'libs/lib1/src/lib/not-exported-module.ts', ` import { NgModule } from '@angular/core'; @@ -681,7 +816,7 @@ export class LibModule {} }) export class NotExportedModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // ACT await componentGenerator(tree, { @@ -695,20 +830,20 @@ export class LibModule {} // ASSERT const indexSource = tree.read('libs/lib1/src/index.ts', 'utf-8'); expect(indexSource).toMatchInlineSnapshot( - `"export * from './lib/lib.module';"` + `"export * from './lib/lib-module';"` ); }); it('should throw an error when the module is not found', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -732,14 +867,14 @@ export class LibModule {} it('should throw an error when there are more than one candidate modules that the component can be added to', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -750,7 +885,7 @@ export class LibModule {} export class LibModule {}` ); tree.write( - 'libs/lib1/src/lib/lib2.module.ts', + 'libs/lib1/src/lib/lib2-module.ts', ` import { NgModule } from '@angular/core'; @@ -789,10 +924,7 @@ export class LibModule {} prefix: 'foo', }); - const content = tree.read( - 'lib1/src/lib/example/example.component.ts', - 'utf-8' - ); + const content = tree.read('lib1/src/lib/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: 'foo-example'/); }); @@ -811,10 +943,7 @@ export class LibModule {} prefix: 'foo', }); - const content = tree.read( - 'lib1/src/lib/one-1/one-1.component.ts', - 'utf-8' - ); + const content = tree.read('lib1/src/lib/one-1/one-1.ts', 'utf-8'); expect(content).toMatch(/selector: 'foo-one-1'/); }); @@ -824,10 +953,7 @@ export class LibModule {} selector: 'one-1', }); - const content = tree.read( - 'lib1/src/lib/example/example.component.ts', - 'utf-8' - ); + const content = tree.read('lib1/src/lib/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: 'one-1'/); }); @@ -842,10 +968,7 @@ export class LibModule {} path: 'lib1/src/lib/example/example', }); - const content = tree.read( - 'lib1/src/lib/example/example.component.ts', - 'utf-8' - ); + const content = tree.read('lib1/src/lib/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: 'bar-example'/); }); @@ -860,10 +983,7 @@ export class LibModule {} path: 'lib1/src/lib/example/example', }); - const content = tree.read( - 'lib1/src/lib/example/example.component.ts', - 'utf-8' - ); + const content = tree.read('lib1/src/lib/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: 'example'/); }); }); @@ -871,14 +991,14 @@ export class LibModule {} describe('secondary entry points', () => { it('should create the component correctly and export it in the entry point', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -888,7 +1008,7 @@ export class LibModule {} }) export class LibModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // secondary entry point writeJson(tree, 'libs/lib1/secondary/ng-package.json', { @@ -896,10 +1016,10 @@ export class LibModule {} }); tree.write( 'libs/lib1/secondary/src/index.ts', - `export * from './lib/secondary.module';` + `export * from './lib/secondary-module';` ); tree.write( - 'libs/lib1/secondary/src/lib/secondary.module.ts', + 'libs/lib1/secondary/src/lib/secondary-module.ts', ` import { NgModule } from '@angular/core'; @@ -920,7 +1040,7 @@ export class LibModule {} // ASSERT const componentSource = tree.read( - 'libs/lib1/secondary/src/lib/example/example.component.ts', + 'libs/lib1/secondary/src/lib/example/example.ts', 'utf-8' ); expect(componentSource).toMatchSnapshot(); @@ -934,14 +1054,14 @@ export class LibModule {} it('should not export the component in the entry point when the module it belongs to is not exported', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); tree.write( - 'libs/lib1/src/lib/lib.module.ts', + 'libs/lib1/src/lib/lib-module.ts', ` import { NgModule } from '@angular/core'; @@ -951,7 +1071,7 @@ export class LibModule {} }) export class LibModule {}` ); - tree.write('libs/lib1/src/index.ts', `export * from './lib/lib.module';`); + tree.write('libs/lib1/src/index.ts', `export * from './lib/lib-module';`); // secondary entry point writeJson(tree, 'libs/lib1/secondary/ng-package.json', { @@ -959,7 +1079,7 @@ export class LibModule {} }); tree.write('libs/lib1/secondary/src/index.ts', ''); tree.write( - 'libs/lib1/secondary/src/lib/secondary.module.ts', + 'libs/lib1/secondary/src/lib/secondary-module.ts', ` import { NgModule } from '@angular/core'; @@ -988,39 +1108,75 @@ export class LibModule {} }); describe('compat', () => { - it('should inline styles when --inline-style=true', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + it('should generate files with the "component" type for versions below v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies['@angular/core'] = '~19.2.0'; + return json; + }); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', root: 'libs/lib1', }); - tree.write( - 'libs/lib1/src/lib/lib.module.ts', - ` - import { NgModule } from '@angular/core'; - - @NgModule({ - declarations: [], - exports: [] - }) - export class LibModule {}` - ); - tree.write('libs/lib1/src/index.ts', ''); await componentGenerator(tree, { path: 'libs/lib1/src/lib/example/example', - inlineStyle: true, - standalone: false, - skipFormat: true, }); expect( tree.read('libs/lib1/src/lib/example/example.component.ts', 'utf-8') - ).toMatchSnapshot(); + ).toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Component({ + selector: 'example', + imports: [CommonModule], + templateUrl: './example.component.html', + styleUrl: './example.component.css', + }) + export class ExampleComponent {} + " + `); expect( - tree.exists('libs/lib1/src/lib/example/example.component.css') - ).toBe(false); + tree.read('libs/lib1/src/lib/example/example.component.html', 'utf-8') + ).toMatchInlineSnapshot(` + "

example works!

+ " + `); + expect( + tree.read('libs/lib1/src/lib/example/example.component.css', 'utf-8') + ).toMatchInlineSnapshot(`""`); + expect( + tree.read( + 'libs/lib1/src/lib/example/example.component.spec.ts', + 'utf-8' + ) + ).toMatchInlineSnapshot(` + "import { ComponentFixture, TestBed } from '@angular/core/testing'; + import { ExampleComponent } from './example.component'; + + describe('ExampleComponent', () => { + let component: ExampleComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ExampleComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ExampleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + }); + " + `); }); }); }); diff --git a/packages/angular/src/generators/component/component.ts b/packages/angular/src/generators/component/component.ts index e6fac9df0c..4801af0f34 100644 --- a/packages/angular/src/generators/component/component.ts +++ b/packages/angular/src/generators/component/component.ts @@ -32,11 +32,12 @@ export async function componentGenerator(tree: Tree, rawOptions: Schema) { viewEncapsulation: options.viewEncapsulation, displayBlock: options.displayBlock, selector: options.selector, - // Angular v19 or higher defaults to true, while v18 or lower defaults to false + // Angular v19 or higher defaults to true, while lower versions default to false setStandalone: (angularMajorVersion >= 19 && !options.standalone) || (angularMajorVersion < 19 && options.standalone), angularMajorVersion, + ngext: options.ngHtml ? '.ng' : '', tpl: '', } ); @@ -69,11 +70,20 @@ export async function componentGenerator(tree: Tree, rawOptions: Schema) { } if (!options.skipImport && !options.standalone) { - const modulePath = findModuleFromOptions( - tree, - options, - options.projectRoot - ); + let modulePath: string; + try { + modulePath = findModuleFromOptions(tree, options, options.projectRoot); + } catch (e) { + modulePath = findModuleFromOptions( + tree, + { + ...options, + moduleExt: '-module.ts', + routingModuleExt: '-routing-module.ts', + }, + options.projectRoot + ); + } addToNgModule( tree, options.directory, diff --git a/packages/angular/src/generators/component/files/__fileName__.ts__tpl__ b/packages/angular/src/generators/component/files/__fileName__.ts__tpl__ index a634911867..82d8689e35 100644 --- a/packages/angular/src/generators/component/files/__fileName__.ts__tpl__ +++ b/packages/angular/src/generators/component/files/__fileName__.ts__tpl__ @@ -6,7 +6,7 @@ import { CommonModule } from '@angular/common';<% } %> standalone: <%= standalone %>,<% } %><% if(standalone) { %> imports: [CommonModule],<%}%><% if(inlineTemplate) { %> template: `

<%= name %> works!

`<% } else { %> - templateUrl: './<%= fileName %>.html'<% } if(inlineStyle) { %>, + templateUrl: './<%= fileName %><%= ngext %>.html'<% } if(inlineStyle) { %>, styles: `<% if(displayBlock){ %> :host { display: block; diff --git a/packages/angular/src/generators/component/files/__fileName__.html__tpl__ b/packages/angular/src/generators/component/files/__fileName____ngext__.html__tpl__ similarity index 100% rename from packages/angular/src/generators/component/files/__fileName__.html__tpl__ rename to packages/angular/src/generators/component/files/__fileName____ngext__.html__tpl__ diff --git a/packages/angular/src/generators/component/lib/component.ts b/packages/angular/src/generators/component/lib/component.ts index c123e07f38..7f78cb78ee 100644 --- a/packages/angular/src/generators/component/lib/component.ts +++ b/packages/angular/src/generators/component/lib/component.ts @@ -40,7 +40,20 @@ export function exportComponentInEntryPoint( } if (!schema.standalone) { - const modulePath = findModuleFromOptions(tree, schema, root); + let modulePath: string; + try { + modulePath = findModuleFromOptions(tree, schema, root); + } catch (e) { + modulePath = findModuleFromOptions( + tree, + { + ...schema, + moduleExt: '-module.ts', + routingModuleExt: '-routing-module.ts', + }, + root + ); + } if (!shouldExportInEntryPoint(tree, entryPointPath, modulePath)) { return; } diff --git a/packages/angular/src/generators/component/lib/module.ts b/packages/angular/src/generators/component/lib/module.ts index 57120371f9..1fea48e30d 100644 --- a/packages/angular/src/generators/component/lib/module.ts +++ b/packages/angular/src/generators/component/lib/module.ts @@ -1,20 +1,37 @@ import type { Tree } from '@nx/devkit'; import { joinPathFragments, normalizePath } from '@nx/devkit'; import { basename, dirname } from 'path'; -import type { NormalizedSchema } from '../schema'; + +export type ModuleOptions = { + directory: string; + module?: string; + moduleExt?: string; + routingModuleExt?: string; +}; // Adapted from https://github.com/angular/angular-cli/blob/732aab5fa7e63618c89dfbbb6f78753f706d7014/packages/schematics/angular/utility/find-module.ts#L29 // to match the logic from the Angular CLI component schematic. -const moduleExt = '.module.ts'; -const routingModuleExt = '-routing.module.ts'; +const MODULE_EXT = '.module.ts'; +const ROUTING_MODULE_EXT = '-routing.module.ts'; export function findModuleFromOptions( tree: Tree, - options: NormalizedSchema, + options: ModuleOptions, projectRoot: string ): string { + const moduleExt = options.moduleExt || MODULE_EXT; + const routingModuleExt = options.routingModuleExt || ROUTING_MODULE_EXT; + if (!options.module) { - return normalizePath(findModule(tree, options.directory, projectRoot)); + return normalizePath( + findModule( + tree, + options.directory, + projectRoot, + moduleExt, + routingModuleExt + ) + ); } else { const modulePath = joinPathFragments(options.directory, options.module); const componentPath = options.directory; @@ -42,7 +59,7 @@ export function findModuleFromOptions( ].map((x) => joinPathFragments(c, x)); for (const sc of candidateFiles) { - if (tree.isFile(sc)) { + if (tree.isFile(sc) && tree.read(sc, 'utf-8').includes('@NgModule')) { return normalizePath(sc); } } @@ -60,7 +77,9 @@ export function findModuleFromOptions( function findModule( tree: Tree, generateDir: string, - projectRoot: string + projectRoot: string, + moduleExt = MODULE_EXT, + routingModuleExt = ROUTING_MODULE_EXT ): string { let dir = generateDir; const projectRootParent = dirname(projectRoot); diff --git a/packages/angular/src/generators/component/lib/normalize-options.ts b/packages/angular/src/generators/component/lib/normalize-options.ts index 01ace8c9e2..a68a1c9bc5 100644 --- a/packages/angular/src/generators/component/lib/normalize-options.ts +++ b/packages/angular/src/generators/component/lib/normalize-options.ts @@ -4,13 +4,18 @@ import { determineArtifactNameAndDirectoryOptions } from '@nx/devkit/src/generat import type { AngularProjectConfiguration } from '../../../utils/types'; import { buildSelector, validateHtmlSelector } from '../../utils/selector'; import { validateClassName } from '../../utils/validations'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema, Schema } from '../schema'; export async function normalizeOptions( tree: Tree, options: Schema ): Promise { - options.type ??= 'component'; + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 20) { + options.type ??= 'component'; + } + const { artifactName: name, directory, @@ -20,7 +25,7 @@ export async function normalizeOptions( } = await determineArtifactNameAndDirectoryOptions(tree, { name: options.name, path: options.path, - suffix: options.type ?? 'component', + suffix: options.type, allowedFileExtensions: ['ts'], fileExtension: 'ts', }); @@ -31,7 +36,7 @@ export async function normalizeOptions( } const { className } = names(name); - const { className: suffixClassName } = names(options.type); + const suffixClassName = options.type ? names(options.type).className : ''; const symbolName = `${className}${suffixClassName}`; validateClassName(symbolName); diff --git a/packages/angular/src/generators/component/schema.d.ts b/packages/angular/src/generators/component/schema.d.ts index 3bf698fe10..be93d54b0f 100644 --- a/packages/angular/src/generators/component/schema.d.ts +++ b/packages/angular/src/generators/component/schema.d.ts @@ -17,6 +17,7 @@ export interface Schema { export?: boolean; exportDefault?: boolean; prefix?: string; + ngHtml?: boolean; skipFormat?: boolean; } diff --git a/packages/angular/src/generators/component/schema.json b/packages/angular/src/generators/component/schema.json index 10f398eb13..385cdd235a 100644 --- a/packages/angular/src/generators/component/schema.json +++ b/packages/angular/src/generators/component/schema.json @@ -95,8 +95,7 @@ }, "type": { "type": "string", - "description": "Adds a developer-defined type to the filename, in the format `name.type.ts`.", - "default": "component" + "description": "Append a custom type to the component's filename. It defaults to 'component' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." }, "export": { "type": "boolean", @@ -109,6 +108,11 @@ "default": false, "description": "Use default export for the component instead of a named export." }, + "ngHtml": { + "type": "boolean", + "default": false, + "description": "Generate component template files with an '.ng.html' file extension instead of '.html'." + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", diff --git a/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.spec.ts b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.spec.ts index 45d42f245f..be99b25418 100644 --- a/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.spec.ts +++ b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.spec.ts @@ -19,8 +19,8 @@ describe('convert-to-application-executor generator', () => { it.each` executor | expected - ${'@angular-devkit/build-angular:browser'} | ${'@angular-devkit/build-angular:application'} - ${'@angular-devkit/build-angular:browser-esbuild'} | ${'@angular-devkit/build-angular:application'} + ${'@angular-devkit/build-angular:browser'} | ${'@angular/build:application'} + ${'@angular-devkit/build-angular:browser-esbuild'} | ${'@angular/build:application'} ${'@nx/angular:webpack-browser'} | ${'@nx/angular:application'} ${'@nx/angular:browser-esbuild'} | ${'@nx/angular:application'} `( @@ -39,6 +39,30 @@ describe('convert-to-application-executor generator', () => { } ); + it.each` + executor | expected + ${'@angular-devkit/build-angular:browser'} | ${'@angular-devkit/build-angular:application'} + ${'@angular-devkit/build-angular:browser-esbuild'} | ${'@angular-devkit/build-angular:application'} + `( + 'should replace "$executor" with "$expected" when using an Angular version lower than 20', + async ({ executor, expected }) => { + updateJson(tree, 'package.json', (json) => { + json.dependencies['@angular/core'] = '19.0.0'; + return json; + }); + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { build: { executor } }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.executor).toBe(expected); + } + ); + it('should not convert the target when using a custom webpack config', async () => { addProjectConfiguration(tree, 'app1', { root: 'app1', @@ -254,62 +278,4 @@ describe('convert-to-application-executor generator', () => { project.targets.build.configurations.development.commonChunk ).toBeUndefined(); }); - - describe('compat', () => { - it('should not convert outputs to the object notation when angular version is lower that 17.1.0', async () => { - updateJson(tree, 'package.json', (json) => { - json.dependencies['@angular/core'] = '17.0.0'; - return json; - }); - addProjectConfiguration(tree, 'app1', { - root: 'app1', - projectType: 'application', - targets: { - build: { - executor: '@angular-devkit/build-angular:browser', - outputs: ['{options.outputPath}'], - options: { - outputPath: 'dist/app1', - }, - }, - }, - }); - - await convertToApplicationExecutor(tree, {}); - - const project = readProjectConfiguration(tree, 'app1'); - expect(project.targets.build.outputs).toStrictEqual([ - '{options.outputPath}', - ]); - expect(project.targets.build.options.outputPath).toBe('dist/app1'); - }); - - it('should remove trailing "/browser" from output path when angular version is lower that 17.1.0', async () => { - updateJson(tree, 'package.json', (json) => { - json.dependencies['@angular/core'] = '17.0.0'; - return json; - }); - addProjectConfiguration(tree, 'app1', { - root: 'app1', - projectType: 'application', - targets: { - build: { - executor: '@angular-devkit/build-angular:browser', - outputs: ['{options.outputPath}'], - options: { - outputPath: 'dist/app1/browser', - }, - }, - }, - }); - - await convertToApplicationExecutor(tree, {}); - - const project = readProjectConfiguration(tree, 'app1'); - expect(project.targets.build.outputs).toStrictEqual([ - '{options.outputPath}', - ]); - expect(project.targets.build.options.outputPath).toBe('dist/app1'); - }); - }); }); diff --git a/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts index 2d724c87ee..1e95cfd7f9 100644 --- a/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts +++ b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts @@ -11,7 +11,6 @@ import { type Tree, } from '@nx/devkit'; import { dirname, join } from 'node:path/posix'; -import { gte, lt } from 'semver'; import { allTargetOptions } from '../../utils/targets'; import { setupSsr } from '../setup-ssr/setup-ssr'; import { validateProject } from '../utils/validations'; @@ -40,26 +39,15 @@ export async function convertToApplicationExecutor( tree: Tree, options: GeneratorOptions ) { - const { version: angularVersion } = getInstalledAngularVersionInfo(tree); - let didAnySucceed = false; if (options.project) { validateProject(tree, options.project); - didAnySucceed = await convertProjectTargets( - tree, - options.project, - angularVersion, - true - ); + didAnySucceed = await convertProjectTargets(tree, options.project, true); } else { const projects = getProjects(tree); for (const [projectName] of projects) { logger.info(`Converting project "${projectName}"...`); - const success = await convertProjectTargets( - tree, - projectName, - angularVersion - ); + const success = await convertProjectTargets(tree, projectName); if (success) { logger.info(`Project "${projectName}" converted successfully.`); @@ -83,7 +71,6 @@ export async function convertToApplicationExecutor( async function convertProjectTargets( tree: Tree, projectName: string, - angularVersion: string, isProvidedProject = false ): Promise { function warnIfProvided(message: string): void { @@ -101,8 +88,7 @@ async function convertProjectTargets( } const { buildTargetName, serverTargetName } = getTargetsToConvert( - project.targets, - angularVersion + project.targets ); if (!buildTargetName) { warnIfProvided( @@ -115,14 +101,21 @@ async function convertProjectTargets( const useNxExecutor = project.targets[buildTargetName].executor.startsWith('@nx/angular:'); - const newExecutor = useNxExecutor - ? '@nx/angular:application' - : '@angular-devkit/build-angular:application'; + let newExecutor: string; + if (useNxExecutor) { + newExecutor = '@nx/angular:application'; + } else { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + newExecutor = + angularMajorVersion >= 20 + ? '@angular/build:application' + : '@angular-devkit/build-angular:application'; + } const buildTarget = project.targets[buildTargetName]; buildTarget.executor = newExecutor; - if (gte(angularVersion, '17.1.0') && buildTarget.outputs) { + if (buildTarget.outputs) { buildTarget.outputs = buildTarget.outputs.map((output) => output === '{options.outputPath}' ? '{options.outputPath.base}' : output ); @@ -146,9 +139,7 @@ async function convertProjectTargets( } let outputPath = options['outputPath']; - if (lt(angularVersion, '17.1.0')) { - options['outputPath'] = outputPath?.replace(/\/browser\/?$/, ''); - } else if (typeof outputPath === 'string') { + if (typeof outputPath === 'string') { if (!/\/browser\/?$/.test(outputPath)) { logger.warn( `The output location of the browser build has been updated from "${outputPath}" to ` + @@ -176,9 +167,6 @@ async function convertProjectTargets( } // Delete removed options - if (lt(angularVersion, '17.3.0')) { - delete options['deployUrl']; - } delete options['vendorChunk']; delete options['commonChunk']; delete options['resourcesOutputPath']; @@ -209,15 +197,25 @@ async function convertProjectTargets( const browserTsConfigJson = readJson(tree, browserTsConfigPath); const serverTsConfigJson = readJson(tree, serverTsConfigPath); + const serverFiles = ['src/main.server.ts', 'src/server.ts']; + if (tree.exists(join(project.root, 'src/app/app.config.server.ts'))) { + serverFiles.push('src/app/app.config.server.ts'); + } + const files = new Set([ ...(browserTsConfigJson.files ?? []), ...(serverTsConfigJson.files ?? []), ]); - - // Server file will be added later by the setup-ssr generator + // Server files will be added later if needed by the setup-ssr generator files.delete('server.ts'); + files.delete('src/server.ts'); + files.delete('src/main.server.ts'); - browserTsConfigJson.files = Array.from(files); + if (files.size) { + browserTsConfigJson.files = Array.from(files); + } else if (browserTsConfigJson.files) { + delete browserTsConfigJson.files; + } browserTsConfigJson.compilerOptions ?? {}; browserTsConfigJson.compilerOptions.types = Array.from( new Set([ @@ -226,6 +224,16 @@ async function convertProjectTargets( ]) ); + if (browserTsConfigJson.exclude?.length) { + const normalizeExclude = (exclude: string) => + exclude.startsWith('./') ? exclude.slice(2) : exclude; + browserTsConfigJson.exclude = browserTsConfigJson.exclude.filter( + (exclude: string) => !serverFiles.includes(normalizeExclude(exclude)) + ); + } + + writeJson(tree, browserTsConfigPath, browserTsConfigJson); + // Delete server tsconfig tree.delete(serverTsConfigPath); } @@ -263,10 +271,7 @@ async function convertProjectTargets( return true; } -function getTargetsToConvert( - targets: Record, - angularVersion: string -): { +function getTargetsToConvert(targets: Record): { buildTargetName?: string; serverTargetName?: string; } { @@ -275,6 +280,7 @@ function getTargetsToConvert( for (const target of Object.keys(targets)) { if ( targets[target].executor === '@nx/angular:application' || + targets[target].executor === '@angular/build:application' || targets[target].executor === '@angular-devkit/build-angular:application' ) { logger.warn( @@ -286,12 +292,6 @@ function getTargetsToConvert( // build target if (executorsToConvert.has(targets[target].executor)) { for (const [, options] of allTargetOptions(targets[target])) { - if (lt(angularVersion, '17.3.0') && options.deployUrl) { - logger.warn( - `The project is using the "deployUrl" option which is not available in the application builder. Skipping conversion.` - ); - return {}; - } if (options.customWebpackConfig) { logger.warn( `The project is using a custom webpack configuration which is not supported by the esbuild-based application executor. Skipping conversion.` diff --git a/packages/angular/src/generators/cypress-component-configuration/__snapshots__/cypress-component-configuration.spec.ts.snap b/packages/angular/src/generators/cypress-component-configuration/__snapshots__/cypress-component-configuration.spec.ts.snap index 3d1e8a58be..aa07fee091 100644 --- a/packages/angular/src/generators/cypress-component-configuration/__snapshots__/cypress-component-configuration.spec.ts.snap +++ b/packages/angular/src/generators/cypress-component-configuration/__snapshots__/cypress-component-configuration.spec.ts.snap @@ -37,11 +37,11 @@ Cypress.Commands.add('mount', mount);" exports[`Cypress Component Testing Configuration should work with complex component 1`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingOneComponent } from './something-one.component'; +import { SomethingOne } from './something-one'; -describe(SomethingOneComponent.name, () => { +describe(SomethingOne.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingOneComponent, { + TestBed.overrideComponent(SomethingOne, { add: { imports: [], providers: [] @@ -50,7 +50,7 @@ describe(SomethingOneComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingOneComponent); + cy.mount(SomethingOne); }); }); " @@ -58,11 +58,11 @@ describe(SomethingOneComponent.name, () => { exports[`Cypress Component Testing Configuration should work with complex component 2`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingTwoComponent } from './something-two.component'; +import { SomethingTwo } from './something-two'; -describe(SomethingTwoComponent.name, () => { +describe(SomethingTwo.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingTwoComponent, { + TestBed.overrideComponent(SomethingTwo, { add: { imports: [], providers: [] @@ -71,7 +71,7 @@ describe(SomethingTwoComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingTwoComponent); + cy.mount(SomethingTwo); }); }); " @@ -79,11 +79,11 @@ describe(SomethingTwoComponent.name, () => { exports[`Cypress Component Testing Configuration should work with complex component 3`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingThreeComponent } from './something-three.component'; +import { SomethingThree } from './something-three'; -describe(SomethingThreeComponent.name, () => { +describe(SomethingThree.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingThreeComponent, { + TestBed.overrideComponent(SomethingThree, { add: { imports: [], providers: [] @@ -92,7 +92,7 @@ describe(SomethingThreeComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingThreeComponent); + cy.mount(SomethingThree); }); }); " @@ -100,11 +100,11 @@ describe(SomethingThreeComponent.name, () => { exports[`Cypress Component Testing Configuration should work with complex standalone component 1`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingOneComponent } from './something-one.component'; +import { SomethingOne } from './something-one'; -describe(SomethingOneComponent.name, () => { +describe(SomethingOne.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingOneComponent, { + TestBed.overrideComponent(SomethingOne, { add: { imports: [], providers: [], @@ -113,7 +113,7 @@ describe(SomethingOneComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingOneComponent); + cy.mount(SomethingOne); }); }); " @@ -121,11 +121,11 @@ describe(SomethingOneComponent.name, () => { exports[`Cypress Component Testing Configuration should work with complex standalone component 2`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingTwoComponent } from './something-two.component'; +import { SomethingTwo } from './something-two'; -describe(SomethingTwoComponent.name, () => { +describe(SomethingTwo.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingTwoComponent, { + TestBed.overrideComponent(SomethingTwo, { add: { imports: [], providers: [], @@ -134,7 +134,7 @@ describe(SomethingTwoComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingTwoComponent); + cy.mount(SomethingTwo); }); }); " @@ -142,11 +142,11 @@ describe(SomethingTwoComponent.name, () => { exports[`Cypress Component Testing Configuration should work with complex standalone component 3`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingThreeComponent } from './something-three.component'; +import { SomethingThree } from './something-three'; -describe(SomethingThreeComponent.name, () => { +describe(SomethingThree.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingThreeComponent, { + TestBed.overrideComponent(SomethingThree, { add: { imports: [], providers: [], @@ -155,7 +155,7 @@ describe(SomethingThreeComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingThreeComponent); + cy.mount(SomethingThree); }); }); " @@ -163,11 +163,11 @@ describe(SomethingThreeComponent.name, () => { exports[`Cypress Component Testing Configuration should work with secondary entry point libs 1`] = ` "import { TestBed } from '@angular/core/testing'; -import { FancyButtonComponent } from './fancy-button.component'; +import { FancyButton } from './fancy-button'; -describe(FancyButtonComponent.name, () => { +describe(FancyButton.name, () => { beforeEach(() => { - TestBed.overrideComponent(FancyButtonComponent, { + TestBed.overrideComponent(FancyButton, { add: { imports: [], providers: [] @@ -176,7 +176,7 @@ describe(FancyButtonComponent.name, () => { }); it('renders', () => { - cy.mount(FancyButtonComponent); + cy.mount(FancyButton); }); }); " @@ -184,11 +184,11 @@ describe(FancyButtonComponent.name, () => { exports[`Cypress Component Testing Configuration should work with secondary entry point libs 2`] = ` "import { TestBed } from '@angular/core/testing'; -import { StandaloneFancyButtonComponent } from './standalone-fancy-button.component'; +import { StandaloneFancyButton } from './standalone-fancy-button'; -describe(StandaloneFancyButtonComponent.name, () => { +describe(StandaloneFancyButton.name, () => { beforeEach(() => { - TestBed.overrideComponent(StandaloneFancyButtonComponent, { + TestBed.overrideComponent(StandaloneFancyButton, { add: { imports: [], providers: [] @@ -197,7 +197,7 @@ describe(StandaloneFancyButtonComponent.name, () => { }); it('renders', () => { - cy.mount(StandaloneFancyButtonComponent); + cy.mount(StandaloneFancyButton); }); }); " @@ -205,11 +205,11 @@ describe(StandaloneFancyButtonComponent.name, () => { exports[`Cypress Component Testing Configuration should work with simple components 1`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingOneComponent } from './something-one.component'; +import { SomethingOne } from './something-one'; -describe(SomethingOneComponent.name, () => { +describe(SomethingOne.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingOneComponent, { + TestBed.overrideComponent(SomethingOne, { add: { imports: [], providers: [] @@ -218,7 +218,7 @@ describe(SomethingOneComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingOneComponent); + cy.mount(SomethingOne); }); }); " @@ -226,11 +226,11 @@ describe(SomethingOneComponent.name, () => { exports[`Cypress Component Testing Configuration should work with simple components 2`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingTwoComponent } from './something-two.component'; +import { SomethingTwo } from './something-two'; -describe(SomethingTwoComponent.name, () => { +describe(SomethingTwo.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingTwoComponent, { + TestBed.overrideComponent(SomethingTwo, { add: { imports: [], providers: [] @@ -239,7 +239,7 @@ describe(SomethingTwoComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingTwoComponent); + cy.mount(SomethingTwo); }); }); " @@ -247,11 +247,11 @@ describe(SomethingTwoComponent.name, () => { exports[`Cypress Component Testing Configuration should work with simple components 3`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingThreeComponent } from './something-three.component'; +import { SomethingThree } from './something-three'; -describe(SomethingThreeComponent.name, () => { +describe(SomethingThree.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingThreeComponent, { + TestBed.overrideComponent(SomethingThree, { add: { imports: [], providers: [] @@ -260,7 +260,7 @@ describe(SomethingThreeComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingThreeComponent); + cy.mount(SomethingThree); }); }); " @@ -268,11 +268,11 @@ describe(SomethingThreeComponent.name, () => { exports[`Cypress Component Testing Configuration should work with standalone component 1`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingOneComponent } from './something-one.component'; +import { SomethingOne } from './something-one'; -describe(SomethingOneComponent.name, () => { +describe(SomethingOne.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingOneComponent, { + TestBed.overrideComponent(SomethingOne, { add: { imports: [], providers: [], @@ -281,7 +281,7 @@ describe(SomethingOneComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingOneComponent); + cy.mount(SomethingOne); }); }); " @@ -289,11 +289,11 @@ describe(SomethingOneComponent.name, () => { exports[`Cypress Component Testing Configuration should work with standalone component 2`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingTwoComponent } from './something-two.component'; +import { SomethingTwo } from './something-two'; -describe(SomethingTwoComponent.name, () => { +describe(SomethingTwo.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingTwoComponent, { + TestBed.overrideComponent(SomethingTwo, { add: { imports: [], providers: [], @@ -302,7 +302,7 @@ describe(SomethingTwoComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingTwoComponent); + cy.mount(SomethingTwo); }); }); " @@ -310,11 +310,11 @@ describe(SomethingTwoComponent.name, () => { exports[`Cypress Component Testing Configuration should work with standalone component 3`] = ` "import { TestBed } from '@angular/core/testing'; -import { SomethingThreeComponent } from './something-three.component'; +import { SomethingThree } from './something-three'; -describe(SomethingThreeComponent.name, () => { +describe(SomethingThree.name, () => { beforeEach(() => { - TestBed.overrideComponent(SomethingThreeComponent, { + TestBed.overrideComponent(SomethingThree, { add: { imports: [], providers: [], @@ -323,7 +323,7 @@ describe(SomethingThreeComponent.name, () => { }); it('renders', () => { - cy.mount(SomethingThreeComponent); + cy.mount(SomethingThree); }); }); " diff --git a/packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.spec.ts b/packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.spec.ts index 7884f01f24..cb184e03b4 100644 --- a/packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.spec.ts +++ b/packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.spec.ts @@ -6,6 +6,7 @@ import { readJson, readProjectConfiguration, Tree, + updateJson, updateProjectConfiguration, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -420,6 +421,14 @@ describe('Cypress Component Testing Configuration', () => { }); it('should exclude Cypress-related files from tsconfig.editor.json for applications', async () => { + // the tsconfig.editor.json is only generated for versions lower than v20 + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); await generateTestApplication(tree, { directory: 'fancy-app', bundler: 'webpack', @@ -735,14 +744,11 @@ describe('Cypress Component Testing Configuration', () => { }); expect( - tree.read( - 'secondary/src/lib/button/fancy-button.component.cy.ts', - 'utf-8' - ) + tree.read('secondary/src/lib/button/fancy-button.cy.ts', 'utf-8') ).toMatchSnapshot(); expect( tree.read( - 'secondary/src/lib/button/standalone-fancy-button.component.cy.ts', + 'secondary/src/lib/button/standalone-fancy-button.cy.ts', 'utf-8' ) ).toMatchSnapshot(); @@ -756,15 +762,15 @@ describe('Cypress Component Testing Configuration', () => { }); await setup(tree, { project: 'cool-lib', name: 'abc', standalone: false }); tree.write( - 'cool-lib/src/lib/abc-one/abc-one.component.cy.ts', + 'cool-lib/src/lib/abc-one/abc-one.cy.ts', `const msg = 'should not overwrite abc-one';` ); tree.write( - 'cool-lib/src/lib/abc-two/abc-two.component.cy.ts', + 'cool-lib/src/lib/abc-two/abc-two.cy.ts', `const msg = 'should not overwrite abc-two';` ); tree.write( - 'cool-lib/src/lib/abc-three/abc-three.component.cy.ts', + 'cool-lib/src/lib/abc-three/abc-three.cy.ts', `const msg = 'should not overwrite abc-three';` ); projectGraph = { @@ -917,11 +923,7 @@ async function setup( }); if (options.withInputs) { - const cmpPath = joinPathFragments( - options.basePath, - name, - `${name}.component.ts` - ); + const cmpPath = joinPathFragments(options.basePath, name, `${name}.ts`); const oldContent = tree.read(cmpPath, 'utf-8'); const newContent = oldContent.replace( @@ -953,20 +955,18 @@ function getCmpsFromTree( `${options.name}-three`, ].map((n) => { expect( - tree.exists(joinPathFragments(options.basePath, n, `${n}.component.ts`)) + tree.exists(joinPathFragments(options.basePath, n, `${n}.ts`)) ).toBeTruthy(); expect( - tree.exists( - joinPathFragments(options.basePath, n, `${n}.component.cy.ts`) - ) + tree.exists(joinPathFragments(options.basePath, n, `${n}.cy.ts`)) ).toBeTruthy(); return { cmp: tree.read( - joinPathFragments(options.basePath, n, `${n}.component.ts`), + joinPathFragments(options.basePath, n, `${n}.ts`), 'utf-8' ), cy: tree.read( - joinPathFragments(options.basePath, n, `${n}.component.cy.ts`), + joinPathFragments(options.basePath, n, `${n}.cy.ts`), 'utf-8' ), }; diff --git a/packages/angular/src/generators/directive/__snapshots__/directive.spec.ts.snap b/packages/angular/src/generators/directive/__snapshots__/directive.spec.ts.snap index 9c4af9e590..249f81b8cf 100644 --- a/packages/angular/src/generators/directive/__snapshots__/directive.spec.ts.snap +++ b/packages/angular/src/generators/directive/__snapshots__/directive.spec.ts.snap @@ -2,11 +2,11 @@ exports[`directive generator --no-standalone should export the directive correctly when directory is nested deeper 1`] = ` "import { NgModule } from '@angular/core'; -import { TestDirective } from './my-directives/test/test.directive'; +import { Test } from './my-directives/test/test'; @NgModule({ imports: [], - declarations: [TestDirective], - exports: [TestDirective], + declarations: [Test], + exports: [Test], }) export class TestModule {} " @@ -19,18 +19,18 @@ exports[`directive generator --no-standalone should generate a directive with te selector: '[test]', standalone: false, }) -export class TestDirective { +export class Test { constructor() {} } " `; exports[`directive generator --no-standalone should generate a directive with test files and attach to the NgModule automatically 2`] = ` -"import { TestDirective } from './test.directive'; +"import { Test } from './test'; -describe('TestDirective', () => { +describe('Test', () => { it('should create an instance', () => { - const directive = new TestDirective(); + const directive = new Test(); expect(directive).toBeTruthy(); }); }); @@ -39,10 +39,10 @@ describe('TestDirective', () => { exports[`directive generator --no-standalone should generate a directive with test files and attach to the NgModule automatically 3`] = ` "import { NgModule } from '@angular/core'; -import { TestDirective } from './test.directive'; +import { Test } from './test'; @NgModule({ imports: [], - declarations: [TestDirective], + declarations: [Test], exports: [], }) export class TestModule {} @@ -55,10 +55,10 @@ exports[`directive generator --no-standalone should import the directive correct exports[`directive generator --no-standalone should import the directive correctly 3`] = ` "import { NgModule } from '@angular/core'; -import { TestDirective } from './test.directive'; +import { Test } from './test'; @NgModule({ imports: [], - declarations: [TestDirective], + declarations: [Test], exports: [], }) export class TestModule {} @@ -72,18 +72,18 @@ exports[`directive generator --no-standalone should import the directive correct selector: '[test]', standalone: false }) -export class TestDirective { +export class Test { constructor() {} } " `; exports[`directive generator --no-standalone should import the directive correctly when directory is nested deeper 2`] = ` -"import { TestDirective } from './test.directive'; +"import { Test } from './test'; -describe('TestDirective', () => { +describe('Test', () => { it('should create an instance', () => { - const directive = new TestDirective(); + const directive = new Test(); expect(directive).toBeTruthy(); }); }); @@ -92,10 +92,10 @@ describe('TestDirective', () => { exports[`directive generator --no-standalone should import the directive correctly when directory is nested deeper 3`] = ` "import { NgModule } from '@angular/core'; -import { TestDirective } from './my-directives/test/test.directive'; +import { Test } from './my-directives/test/test'; @NgModule({ imports: [], - declarations: [TestDirective], + declarations: [Test], exports: [], }) export class TestModule {} @@ -108,18 +108,18 @@ exports[`directive generator should generate correctly 1`] = ` @Directive({ selector: '[test]', }) -export class TestDirective { +export class Test { constructor() {} } " `; exports[`directive generator should generate correctly 2`] = ` -"import { TestDirective } from './test.directive'; +"import { Test } from './test'; -describe('TestDirective', () => { +describe('Test', () => { it('should create an instance', () => { - const directive = new TestDirective(); + const directive = new Test(); expect(directive).toBeTruthy(); }); }); @@ -132,18 +132,18 @@ exports[`directive generator should handle path with file extension 1`] = ` @Directive({ selector: '[test]', }) -export class TestDirective { +export class Test { constructor() {} } " `; exports[`directive generator should handle path with file extension 2`] = ` -"import { TestDirective } from './test.directive'; +"import { Test } from './test.directive'; -describe('TestDirective', () => { +describe('Test', () => { it('should create an instance', () => { - const directive = new TestDirective(); + const directive = new Test(); expect(directive).toBeTruthy(); }); }); diff --git a/packages/angular/src/generators/directive/directive.spec.ts b/packages/angular/src/generators/directive/directive.spec.ts index 1dab48dbc6..f9aa4dc44d 100644 --- a/packages/angular/src/generators/directive/directive.spec.ts +++ b/packages/angular/src/generators/directive/directive.spec.ts @@ -1,6 +1,7 @@ import { addProjectConfiguration, readProjectConfiguration, + updateJson, updateProjectConfiguration, type Tree, } from '@nx/devkit'; @@ -27,12 +28,40 @@ describe('directive generator', () => { await generateDirectiveWithDefaultOptions(tree, { skipFormat: false }); // ASSERT - expect( - tree.read('test/src/app/test.directive.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read('test/src/app/test.directive.spec.ts', 'utf-8') - ).toMatchSnapshot(); + expect(tree.read('test/src/app/test.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('test/src/app/test.spec.ts', 'utf-8')).toMatchSnapshot(); + }); + + it('should generate correctly with the provided "directive" type', async () => { + await generateDirectiveWithDefaultOptions(tree, { + type: 'directive', + skipFormat: false, + }); + + expect(tree.read('test/src/app/test.directive.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Directive } from '@angular/core'; + + @Directive({ + selector: '[test]', + }) + export class TestDirective { + constructor() {} + } + " + `); + expect(tree.read('test/src/app/test.directive.spec.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { TestDirective } from './test.directive'; + + describe('TestDirective', () => { + it('should create an instance', () => { + const directive = new TestDirective(); + expect(directive).toBeTruthy(); + }); + }); + " + `); }); it('should handle path with file extension', async () => { @@ -57,9 +86,17 @@ describe('directive generator', () => { await generateDirectiveWithDefaultOptions(tree); // ASSERT - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( - 'TestDirective' - ); + expect(tree.read('test/src/app/test-module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + @NgModule({ + imports: [], + declarations: [], + exports: [], + }) + export class TestModule {} + " + `); }); it('should not generate test file when skipTests=true', async () => { @@ -73,14 +110,14 @@ describe('directive generator', () => { // ASSERT expect( - tree.exists('test/src/app/my-directives/test/test.directive.spec.ts') + tree.exists('test/src/app/my-directives/test/test.spec.ts') ).toBeFalsy(); }); it('should error when the class name is invalid', async () => { await expect( generateDirectiveWithDefaultOptions(tree, { name: '404' }) - ).rejects.toThrow('Class name "404Directive" is invalid.'); + ).rejects.toThrow('Class name "404" is invalid.'); }); describe('--no-standalone', () => { @@ -98,14 +135,10 @@ describe('directive generator', () => { }); // ASSERT + expect(tree.read('test/src/app/test.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('test/src/app/test.spec.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('test/src/app/test.directive.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read('test/src/app/test.directive.spec.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -118,14 +151,12 @@ describe('directive generator', () => { }); // ASSERT + expect(tree.read('test/src/app/test/test.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('test/src/app/test/test.directive.ts', 'utf-8') + tree.read('test/src/app/test/test.spec.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('test/src/app/test/test.directive.spec.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -140,16 +171,13 @@ describe('directive generator', () => { // ASSERT expect( - tree.read('test/src/app/my-directives/test/test.directive.ts', 'utf-8') + tree.read('test/src/app/my-directives/test/test.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read( - 'test/src/app/my-directives/test/test.directive.spec.ts', - 'utf-8' - ) + tree.read('test/src/app/my-directives/test/test.spec.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -165,7 +193,7 @@ describe('directive generator', () => { // ASSERT expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -180,7 +208,7 @@ describe('directive generator', () => { }); // ASSERT - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + expect(tree.read('test/src/app/test-module.ts', 'utf-8')).not.toContain( 'TestDirective' ); }); @@ -194,10 +222,7 @@ describe('directive generator', () => { prefix: 'foo', }); - const content = tree.read( - 'test/src/app/example/example.directive.ts', - 'utf-8' - ); + const content = tree.read('test/src/app/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: '\[fooExample\]'/); }); @@ -213,10 +238,7 @@ describe('directive generator', () => { name: 'example', }); - const content = tree.read( - 'test/src/app/example/example.directive.ts', - 'utf-8' - ); + const content = tree.read('test/src/app/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: '\[barExample\]'/); }); @@ -232,10 +254,7 @@ describe('directive generator', () => { name: 'example', }); - const content = tree.read( - 'test/src/app/example/example.directive.ts', - 'utf-8' - ); + const content = tree.read('test/src/app/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: '\[example\]'/); }); @@ -246,18 +265,54 @@ describe('directive generator', () => { selector: 'mySelector', }); - const content = tree.read( - 'test/src/app/example/example.directive.ts', - 'utf-8' - ); + const content = tree.read('test/src/app/example/example.ts', 'utf-8'); expect(content).toMatch(/selector: '\[mySelector\]'/); }); }); + + describe('compat', () => { + it('should generate the files with the "directive" type for versions lower than v20', async () => { + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + + await generateDirectiveWithDefaultOptions(tree, { skipFormat: false }); + + expect(tree.read('test/src/app/test.directive.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Directive } from '@angular/core'; + + @Directive({ + selector: '[test]', + }) + export class TestDirective { + constructor() {} + } + " + `); + expect(tree.read('test/src/app/test.directive.spec.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { TestDirective } from './test.directive'; + + describe('TestDirective', () => { + it('should create an instance', () => { + const directive = new TestDirective(); + expect(directive).toBeTruthy(); + }); + }); + " + `); + }); + }); }); function addModule(tree: Tree) { tree.write( - 'test/src/app/test.module.ts', + 'test/src/app/test-module.ts', `import { NgModule } from '@angular/core'; @NgModule({ imports: [], diff --git a/packages/angular/src/generators/directive/directive.ts b/packages/angular/src/generators/directive/directive.ts index b178e151fa..8e9424b877 100644 --- a/packages/angular/src/generators/directive/directive.ts +++ b/packages/angular/src/generators/directive/directive.ts @@ -19,7 +19,7 @@ export async function directiveGenerator(tree: Tree, schema: Schema) { symbolName: options.symbolName, fileName: options.fileName, standalone: options.standalone, - // Angular v19 or higher defaults to true, while v18 or lower defaults to false + // Angular v19 or higher defaults to true, while lower versions default to false setStandalone: (angularMajorVersion >= 19 && !options.standalone) || (angularMajorVersion < 19 && options.standalone), diff --git a/packages/angular/src/generators/directive/lib/normalize-options.ts b/packages/angular/src/generators/directive/lib/normalize-options.ts index 50baeb4833..e43e4e5ee7 100644 --- a/packages/angular/src/generators/directive/lib/normalize-options.ts +++ b/packages/angular/src/generators/directive/lib/normalize-options.ts @@ -4,12 +4,18 @@ import { determineArtifactNameAndDirectoryOptions } from '@nx/devkit/src/generat import type { AngularProjectConfiguration } from '../../../utils/types'; import { buildSelector, validateHtmlSelector } from '../../utils/selector'; import { validateClassName } from '../../utils/validations'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema, Schema } from '../schema'; export async function normalizeOptions( tree: Tree, options: Schema ): Promise { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 20) { + options.type ??= 'directive'; + } + const { artifactName: name, directory, @@ -19,13 +25,13 @@ export async function normalizeOptions( } = await determineArtifactNameAndDirectoryOptions(tree, { name: options.name, path: options.path, - suffix: 'directive', + suffix: options.type, allowedFileExtensions: ['ts'], fileExtension: 'ts', }); const { className } = names(name); - const { className: suffixClassName } = names('directive'); + const suffixClassName = options.type ? names(options.type).className : ''; const symbolName = `${className}${suffixClassName}`; validateClassName(symbolName); diff --git a/packages/angular/src/generators/directive/schema.d.ts b/packages/angular/src/generators/directive/schema.d.ts index 29745e8a1d..df5fe0d2b6 100644 --- a/packages/angular/src/generators/directive/schema.d.ts +++ b/packages/angular/src/generators/directive/schema.d.ts @@ -8,6 +8,7 @@ export interface Schema { standalone?: boolean; module?: string; export?: boolean; + type?: string; skipFormat?: boolean; } diff --git a/packages/angular/src/generators/directive/schema.json b/packages/angular/src/generators/directive/schema.json index 3100479eef..08adce8e8a 100644 --- a/packages/angular/src/generators/directive/schema.json +++ b/packages/angular/src/generators/directive/schema.json @@ -12,11 +12,15 @@ "command": "nx g @nx/angular:directive mylib/src/lib/foo.directive.ts" }, { - "description": "Generate a directive without providing the file extension. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive without providing the file extension. It results in the directive `Foo` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:directive mylib/src/lib/foo" }, { - "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `CustomDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive with a given type/suffix. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "command": "nx g @nx/angular:directive mylib/src/lib/foo --type=directive" + }, + { + "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `Custom` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:directive mylib/src/lib/foo --name=custom" } ], @@ -78,6 +82,10 @@ "default": false, "description": "The declaring NgModule exports this directive." }, + "type": { + "type": "string", + "description": "Append a custom type to the directive's filename. It defaults to 'directive' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." + }, "skipFormat": { "type": "boolean", "default": false, diff --git a/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap b/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap index a1c03bfb80..9558a57cc3 100644 --- a/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap +++ b/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap @@ -1,79 +1,35 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Host App Generator --ssr compat should generate the correct app component spec file using RouterTestingModule 1`] = ` -"import { fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Router } from '@angular/router'; - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - RouterTestingModule.withRoutes([ - { path: '', component: NxWelcomeComponent }, - ]), - AppComponent, - NxWelcomeComponent, - ], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(\`should have as title 'host'\`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('host'); - }); - - it('should render title', fakeAsync(() => { - const fixture = TestBed.createComponent(AppComponent); - const router = TestBed.inject(Router); - fixture.ngZone?.run(() => router.navigate([''])); - tick(); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain( - 'Welcome host' - ); - })); -}); -" -`; - exports[`Host App Generator --ssr should generate the correct files 1`] = ` -"import { NgModule } from '@angular/core'; +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule, provideClientHydration, withEventReplay, } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [BrowserModule, RouterModule.forRoot(appRoutes)], - providers: [provideClientHydration(withEventReplay())], - bootstrap: [AppComponent], + providers: [ + provideBrowserGlobalErrorListeners(), + provideClientHydration(withEventReplay()), + ], + bootstrap: [App], }) export class AppModule {} " `; exports[`Host App Generator --ssr should generate the correct files 2`] = ` -"import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; +"import { platformBrowser } from '@angular/platform-browser'; +import { AppModule } from './app/app-module'; -platformBrowserDynamic() +platformBrowser() .bootstrapModule(AppModule, { ngZoneEventCoalescing: true, }) @@ -198,13 +154,13 @@ module.exports = withModuleFederationForSSR(config, { dts: false }); `; exports[`Host App Generator --ssr should generate the correct files 8`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; export const appRoutes: Route[] = [ { path: '', - component: NxWelcomeComponent, + component: NxWelcome, }, ]; " @@ -260,20 +216,18 @@ exports[`Host App Generator --ssr should generate the correct files 10`] = ` exports[`Host App Generator --ssr should generate the correct files for standalone 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => - console.error(err) -); +bootstrapApplication(App, appConfig).catch((err) => console.error(err)); " `; exports[`Host App Generator --ssr should generate the correct files for standalone 2`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; import { config } from './app/app.config.server'; -const bootstrap = () => bootstrapApplication(AppComponent, config); +const bootstrap = () => bootstrapApplication(App, config); export default bootstrap; " @@ -391,20 +345,24 @@ module.exports = withModuleFederationForSSR(config, { dts: false }); `; exports[`Host App Generator --ssr should generate the correct files for standalone 7`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; export const appRoutes: Route[] = [ { path: '', - component: NxWelcomeComponent, + component: NxWelcome, }, ]; " `; exports[`Host App Generator --ssr should generate the correct files for standalone 8`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { + ApplicationConfig, + provideBrowserGlobalErrorListeners, + provideZoneChangeDetection, +} from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { @@ -415,6 +373,7 @@ import { export const appConfig: ApplicationConfig = { providers: [ provideClientHydration(withEventReplay()), + provideBrowserGlobalErrorListeners(), provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes), ], @@ -424,7 +383,7 @@ export const appConfig: ApplicationConfig = { exports[`Host App Generator --ssr should generate the correct files for standalone 9`] = ` "import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; -import { provideServerRendering } from '@angular/platform-server'; +import { provideServerRendering } from '@angular/ssr'; import { appConfig } from './app.config'; const serverConfig: ApplicationConfig = { @@ -485,20 +444,18 @@ exports[`Host App Generator --ssr should generate the correct files for standalo exports[`Host App Generator --ssr should generate the correct files for standalone when --typescript=true 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => - console.error(err) -); +bootstrapApplication(App, appConfig).catch((err) => console.error(err)); " `; exports[`Host App Generator --ssr should generate the correct files for standalone when --typescript=true 2`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; import { config } from './app/app.config.server'; -const bootstrap = () => bootstrapApplication(AppComponent, config); +const bootstrap = () => bootstrapApplication(App, config); export default bootstrap; " @@ -618,19 +575,23 @@ export default withModuleFederationForSSR(config, { dts: false }); `; exports[`Host App Generator --ssr should generate the correct files for standalone when --typescript=true 7`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; export const appRoutes: Route[] = [ { path: '', - component: NxWelcomeComponent + component: NxWelcome },]; " `; exports[`Host App Generator --ssr should generate the correct files for standalone when --typescript=true 8`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { + ApplicationConfig, + provideBrowserGlobalErrorListeners, + provideZoneChangeDetection, +} from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { @@ -641,6 +602,7 @@ import { export const appConfig: ApplicationConfig = { providers: [ provideClientHydration(withEventReplay()), + provideBrowserGlobalErrorListeners(), provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes), ], @@ -650,7 +612,7 @@ export const appConfig: ApplicationConfig = { exports[`Host App Generator --ssr should generate the correct files for standalone when --typescript=true 9`] = ` "import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; -import { provideServerRendering } from '@angular/platform-server'; +import { provideServerRendering } from '@angular/ssr'; import { appConfig } from './app.config'; const serverConfig: ApplicationConfig = { @@ -709,32 +671,35 @@ exports[`Host App Generator --ssr should generate the correct files for standalo `; exports[`Host App Generator --ssr should generate the correct files when --typescript=true 1`] = ` -"import { NgModule } from '@angular/core'; +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule, provideClientHydration, withEventReplay, } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [BrowserModule, RouterModule.forRoot(appRoutes)], - providers: [provideClientHydration(withEventReplay())], - bootstrap: [AppComponent], + providers: [ + provideBrowserGlobalErrorListeners(), + provideClientHydration(withEventReplay()), + ], + bootstrap: [App], }) export class AppModule {} " `; exports[`Host App Generator --ssr should generate the correct files when --typescript=true 2`] = ` -"import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; +"import { platformBrowser } from '@angular/platform-browser'; +import { AppModule } from './app/app-module'; -platformBrowserDynamic() +platformBrowser() .bootstrapModule(AppModule, { ngZoneEventCoalescing: true, }) @@ -861,13 +826,13 @@ export default withModuleFederationForSSR(config, { dts: false }); `; exports[`Host App Generator --ssr should generate the correct files when --typescript=true 8`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; export const appRoutes: Route[] = [ { path: '', - component: NxWelcomeComponent + component: NxWelcome },]; " `; @@ -1000,9 +965,9 @@ export default withModuleFederation(config, { dts: false }); exports[`Host App Generator should generate a host with remotes using standalone components 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(App, appConfig).catch((err) => console.error(err) ); " @@ -1011,53 +976,53 @@ bootstrapApplication(AppComponent, appConfig).catch((err) => exports[`Host App Generator should generate a host with remotes using standalone components 2`] = ` "import { Component } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @Component({ - imports: [NxWelcomeComponent, RouterModule], + imports: [NxWelcome, RouterModule], selector: 'app-root', - templateUrl: './app.component.html', - styleUrl: './app.component.css', + templateUrl: './app.html', + styleUrl: './app.css', }) -export class AppComponent { - title = 'host'; +export class App { + protected title = 'host'; } " `; exports[`Host App Generator should generate the correct app component spec file 1`] = ` "import { fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { App } from './app'; +import { NxWelcome } from './nx-welcome'; import { Router, RouterModule } from '@angular/router'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ RouterModule.forRoot([ - { path: '', component: NxWelcomeComponent }, + { path: '', component: NxWelcome }, ]), - AppComponent, - NxWelcomeComponent, + App, + NxWelcome, ], }).compileComponents(); }); it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const app = fixture.componentInstance; expect(app).toBeTruthy(); }); it(\`should have as title 'host'\`, () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const app = fixture.componentInstance; expect(app.title).toEqual('host'); }); it('should render title', fakeAsync(() => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const router = TestBed.inject(Router); fixture.ngZone?.run(() => router.navigate([''])); tick(); @@ -1073,37 +1038,37 @@ describe('AppComponent', () => { exports[`Host App Generator should generate the correct app component spec file with a directory 1`] = ` "import { fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { App } from './app'; +import { NxWelcome } from './nx-welcome'; import { Router, RouterModule } from '@angular/router'; -describe('AppComponent', () => { +describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ RouterModule.forRoot([ - { path: '', component: NxWelcomeComponent }, + { path: '', component: NxWelcome }, ]), - AppComponent, - NxWelcomeComponent, + App, + NxWelcome, ], }).compileComponents(); }); it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const app = fixture.componentInstance; expect(app).toBeTruthy(); }); it(\`should have as title 'dashboard'\`, () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const app = fixture.componentInstance; expect(app.title).toEqual('dashboard'); }); it('should render title', fakeAsync(() => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const router = TestBed.inject(Router); fixture.ngZone?.run(() => router.navigate([''])); tick(); diff --git a/packages/angular/src/generators/host/host.spec.ts b/packages/angular/src/generators/host/host.spec.ts index 5a6455b53e..56068297f1 100644 --- a/packages/angular/src/generators/host/host.spec.ts +++ b/packages/angular/src/generators/host/host.spec.ts @@ -15,7 +15,7 @@ import { describe('Host App Generator', () => { it('should generate a host app with no remotes', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -30,7 +30,7 @@ describe('Host App Generator', () => { }); it('should generate a host app with no remotes when --typescript=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -46,7 +46,7 @@ describe('Host App Generator', () => { it('should generate a host app with a remote', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestRemoteApplication(tree, { directory: 'remote', @@ -70,7 +70,7 @@ describe('Host App Generator', () => { }); it('should generate a host app with a remote when --typesscript=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestRemoteApplication(tree, { directory: 'remote', @@ -95,7 +95,7 @@ describe('Host App Generator', () => { it('should generate a host and any remotes that dont exist with correct routing setup', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT @@ -113,7 +113,7 @@ describe('Host App Generator', () => { expect( tree.read('host-app/module-federation.config.js', 'utf-8') ).toContain(`'remote1','remote2'`); - expect(tree.read('host-app/src/app/app.component.html', 'utf-8')) + expect(tree.read('host-app/src/app/app.html', 'utf-8')) .toMatchInlineSnapshot(` "
  • Home
  • @@ -127,7 +127,7 @@ describe('Host App Generator', () => { it('should generate a host and any remotes that dont exist with correct routing setup when --typescript=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT @@ -145,7 +145,7 @@ describe('Host App Generator', () => { expect( tree.read('host-app/module-federation.config.ts', 'utf-8') ).toContain(`'remote1','remote2'`); - expect(tree.read('host-app/src/app/app.component.html', 'utf-8')) + expect(tree.read('host-app/src/app/app.html', 'utf-8')) .toMatchInlineSnapshot(` "
    • Home
    • @@ -159,7 +159,7 @@ describe('Host App Generator', () => { it('should generate a host, integrate existing remotes and generate any remotes that dont exist', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestRemoteApplication(tree, { directory: 'remote1', typescriptConfiguration: false, @@ -187,7 +187,7 @@ describe('Host App Generator', () => { it('should generate a host, integrate existing remotes and generate any remotes that dont exist when --typescript=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestRemoteApplication(tree, { directory: 'remote1', typescriptConfiguration: true, @@ -215,7 +215,7 @@ describe('Host App Generator', () => { it('should generate a host, integrate existing remotes and generate any remotes that dont exist, in a directory', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestRemoteApplication(tree, { directory: 'remote1', typescriptConfiguration: false, @@ -243,7 +243,7 @@ describe('Host App Generator', () => { it('should generate a host, integrate existing remotes and generate any remotes that dont exist, in a directory when --typescript=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestRemoteApplication(tree, { directory: 'remote1', typescriptConfiguration: true, @@ -271,7 +271,7 @@ describe('Host App Generator', () => { it('should generate a host with remotes using standalone components', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -281,16 +281,14 @@ describe('Host App Generator', () => { }); // ASSERT - expect(tree.exists(`host/src/app/app.module.ts`)).toBeFalsy(); + expect(tree.exists(`host/src/app/app-module.ts`)).toBeFalsy(); expect(tree.read(`host/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); - expect( - tree.read(`host/src/app/app.component.ts`, 'utf-8') - ).toMatchSnapshot(); + expect(tree.read(`host/src/app/app.ts`, 'utf-8')).toMatchSnapshot(); }); it('should generate the correct app component spec file', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -300,14 +298,12 @@ describe('Host App Generator', () => { }); // ASSERT - expect( - tree.read(`host/src/app/app.component.spec.ts`, 'utf-8') - ).toMatchSnapshot(); + expect(tree.read(`host/src/app/app.spec.ts`, 'utf-8')).toMatchSnapshot(); }); it('should generate the correct app component spec file with a directory', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -318,13 +314,13 @@ describe('Host App Generator', () => { // ASSERT expect( - tree.read(`test/dashboard/src/app/app.component.spec.ts`, 'utf-8') + tree.read(`test/dashboard/src/app/app.spec.ts`, 'utf-8') ).toMatchSnapshot(); }); it('should not generate an e2e project when e2eTestRunner is none', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -344,7 +340,7 @@ describe('Host App Generator', () => { describe('--ssr', () => { it('should generate the correct files', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -357,7 +353,7 @@ describe('Host App Generator', () => { // ASSERT const project = readProjectConfiguration(tree, 'test'); expect( - tree.read(`test/src/app/app.module.ts`, 'utf-8') + tree.read(`test/src/app/app-module.ts`, 'utf-8') ).toMatchSnapshot(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( @@ -380,7 +376,7 @@ describe('Host App Generator', () => { it('should generate the correct files when --typescript=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -394,7 +390,7 @@ describe('Host App Generator', () => { // ASSERT const project = readProjectConfiguration(tree, 'test'); expect( - tree.read(`test/src/app/app.module.ts`, 'utf-8') + tree.read(`test/src/app/app-module.ts`, 'utf-8') ).toMatchSnapshot(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( @@ -417,7 +413,7 @@ describe('Host App Generator', () => { it('should generate the correct files for standalone', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -428,7 +424,7 @@ describe('Host App Generator', () => { // ASSERT const project = readProjectConfiguration(tree, 'test'); - expect(tree.exists(`test/src/app/app.module.ts`)).toBeFalsy(); + expect(tree.exists(`test/src/app/app-module.ts`)).toBeFalsy(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( tree.read(`test/src/bootstrap.server.ts`, 'utf-8') @@ -456,7 +452,7 @@ describe('Host App Generator', () => { it('should generate the correct files for standalone when --typescript=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestHostApplication(tree, { @@ -468,7 +464,7 @@ describe('Host App Generator', () => { // ASSERT const project = readProjectConfiguration(tree, 'test'); - expect(tree.exists(`test/src/app/app.module.ts`)).toBeFalsy(); + expect(tree.exists(`test/src/app/app-module.ts`)).toBeFalsy(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( tree.read(`test/src/bootstrap.server.ts`, 'utf-8') @@ -493,32 +489,10 @@ describe('Host App Generator', () => { expect(project.targets.server).toMatchSnapshot(); expect(project.targets['serve-ssr']).toMatchSnapshot(); }); - - describe('compat', () => { - it('should generate the correct app component spec file using RouterTestingModule', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - '@angular/core': '17.0.0', - }, - })); - - await generateTestHostApplication(tree, { - directory: 'host', - remotes: ['remote1'], - skipFormat: true, - }); - - expect( - tree.read(`host/src/app/app.component.spec.ts`, 'utf-8') - ).toMatchSnapshot(); - }); - }); }); it('should not touch the package.json when run with `--skipPackageJson`', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); let initialPackageJson; updateJson(tree, 'package.json', (json) => { json.dependencies = {}; @@ -554,6 +528,141 @@ describe('Host App Generator', () => { unitTestRunner: UnitTestRunner.None, typescriptConfiguration: false, }) - ).rejects.toThrowError(`Invalid remote name provided: ${remote}.`); + ).rejects.toThrow(`Invalid remote name provided: ${remote}.`); + }); + + describe('compat', () => { + it('should generate components with the "component" type for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + + await generateTestHostApplication(tree, { + directory: 'host', + remotes: ['remote1'], + skipFormat: true, + }); + + expect(tree.read('host/src/app/app.component.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { RouterModule } from '@angular/router'; + import { NxWelcomeComponent } from './nx-welcome.component'; + + @Component({ + imports: [NxWelcomeComponent, RouterModule], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.css', + }) + export class AppComponent { + title = 'host'; + } + " + `); + expect(tree.read('host/src/app/app.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NxWelcomeComponent } from './nx-welcome.component'; + import { Route } from '@angular/router'; + + export const appRoutes: Route[] = [ + { + path: 'remote1', + loadChildren: () => import('remote1/Routes').then(m => m!.remoteRoutes) + }, + { + path: '', + component: NxWelcomeComponent + },]; + " + `); + expect( + tree.read('remote1/src/app/remote-entry/entry.component.ts', 'utf-8') + ).toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { NxWelcomeComponent } from './nx-welcome.component'; + + @Component({ + imports: [CommonModule, NxWelcomeComponent], + selector: 'app-remote1-entry', + template: \`\` + }) + export class RemoteEntryComponent {} + " + `); + expect(tree.read('remote1/src/app/remote-entry/entry.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Route } from '@angular/router'; + import { RemoteEntryComponent } from './entry.component'; + + export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];" + `); + }); + + it('should generate modules with the "." type separator for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + + await generateTestHostApplication(tree, { + directory: 'host', + remotes: ['remote1'], + standalone: false, + skipFormat: true, + }); + + expect(tree.read('host/src/app/app.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { RouterModule } from '@angular/router'; + import { AppComponent } from './app.component'; + import { appRoutes } from './app.routes'; + import { NxWelcomeComponent } from './nx-welcome.component'; + + @NgModule({ + declarations: [AppComponent, NxWelcomeComponent], + imports: [ + BrowserModule, + RouterModule.forRoot(appRoutes), + ], + providers: [], + bootstrap: [AppComponent], + }) + export class AppModule {} + " + `); + expect(tree.read('remote1/src/app/remote-entry/entry.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { RouterModule } from '@angular/router'; + + import { RemoteEntryComponent } from './entry.component'; + import { NxWelcomeComponent } from './nx-welcome.component'; + import { remoteRoutes } from './entry.routes'; + + @NgModule({ + declarations: [RemoteEntryComponent, NxWelcomeComponent], + imports: [ + CommonModule, + RouterModule.forChild(remoteRoutes), + ], + providers: [], + }) + export class RemoteEntryModule {}" + `); + }); }); }); diff --git a/packages/angular/src/generators/host/schema.json b/packages/angular/src/generators/host/schema.json index 9148f30df5..5633cf88e2 100644 --- a/packages/angular/src/generators/host/schema.json +++ b/packages/angular/src/generators/host/schema.json @@ -178,7 +178,7 @@ "x-priority": "important" }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" }, "typescriptConfiguration": { diff --git a/packages/angular/src/generators/init/init.ts b/packages/angular/src/generators/init/init.ts index 4641dac634..95dfb65bd0 100755 --- a/packages/angular/src/generators/init/init.ts +++ b/packages/angular/src/generators/init/init.ts @@ -11,7 +11,11 @@ import { import { addPlugin } from '@nx/devkit/src/utils/add-plugin'; import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; import { createNodesV2 } from '../../plugins/plugin'; -import { getInstalledPackageVersion, versions } from '../utils/version-utils'; +import { + getInstalledAngularDevkitVersion, + getInstalledPackageVersion, + versions, +} from '../utils/version-utils'; import { Schema } from './schema'; export async function angularInitGenerator( @@ -61,7 +65,7 @@ function installAngularDevkitCoreIfMissing( if (!packageVersion) { const pkgVersions = versions(tree); const devkitVersion = - getInstalledPackageVersion(tree, '@angular-devkit/build-angular') ?? + getInstalledAngularDevkitVersion(tree) ?? pkgVersions.angularDevkitVersion; try { diff --git a/packages/angular/src/generators/library-secondary-entry-point/__snapshots__/library-secondary-entry-point.spec.ts.snap b/packages/angular/src/generators/library-secondary-entry-point/__snapshots__/library-secondary-entry-point.spec.ts.snap index ec2e3fad9f..b407609b76 100644 --- a/packages/angular/src/generators/library-secondary-entry-point/__snapshots__/library-secondary-entry-point.spec.ts.snap +++ b/packages/angular/src/generators/library-secondary-entry-point/__snapshots__/library-secondary-entry-point.spec.ts.snap @@ -6,7 +6,7 @@ exports[`librarySecondaryEntryPoint generator --skipModule should not generate a `; exports[`librarySecondaryEntryPoint generator should format files 1`] = ` -"export * from './lib/testing.module'; +"export * from './lib/testing-module'; " `; @@ -22,6 +22,6 @@ export class TestingModule {} `; exports[`librarySecondaryEntryPoint generator should generate files for the secondary entry point 1`] = ` -"export * from './lib/testing.module'; +"export * from './lib/testing-module'; " `; diff --git a/packages/angular/src/generators/library-secondary-entry-point/files/src/index.ts__tmpl__ b/packages/angular/src/generators/library-secondary-entry-point/files/src/index.ts__tmpl__ index 32c51366a5..a9d8e0a84d 100644 --- a/packages/angular/src/generators/library-secondary-entry-point/files/src/index.ts__tmpl__ +++ b/packages/angular/src/generators/library-secondary-entry-point/files/src/index.ts__tmpl__ @@ -1 +1 @@ -<% if (!skipModule) { %>export * from './lib/<%= fileName %>.module';<% } else { %>export const greeting = 'Hello World!';<% } %> +<% if (!skipModule) { %>export * from './lib/<%= fileName %><%= moduleTypeSeparator %>module';<% } else { %>export const greeting = 'Hello World!';<% } %> diff --git a/packages/angular/src/generators/library-secondary-entry-point/files/src/lib/__fileName__.module.ts__tmpl__ b/packages/angular/src/generators/library-secondary-entry-point/files/src/lib/__fileName____moduleTypeSeparator__module.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/library-secondary-entry-point/files/src/lib/__fileName__.module.ts__tmpl__ rename to packages/angular/src/generators/library-secondary-entry-point/files/src/lib/__fileName____moduleTypeSeparator__module.ts__tmpl__ diff --git a/packages/angular/src/generators/library-secondary-entry-point/lib/add-files.ts b/packages/angular/src/generators/library-secondary-entry-point/lib/add-files.ts index e525539509..c954e8b910 100644 --- a/packages/angular/src/generators/library-secondary-entry-point/lib/add-files.ts +++ b/packages/angular/src/generators/library-secondary-entry-point/lib/add-files.ts @@ -14,6 +14,7 @@ export function addFiles( { ...options, ...nameVariants, + moduleTypeSeparator: options.moduleTypeSeparator, tmpl: '', } ); @@ -22,7 +23,7 @@ export function addFiles( tree.delete( joinPathFragments( options.entryPointDestination, - `src/lib/${nameVariants.fileName}.module.ts` + `src/lib/${nameVariants.fileName}${options.moduleTypeSeparator}module.ts` ) ); } diff --git a/packages/angular/src/generators/library-secondary-entry-point/lib/normalize-options.ts b/packages/angular/src/generators/library-secondary-entry-point/lib/normalize-options.ts index 585b150a4d..5415393dba 100644 --- a/packages/angular/src/generators/library-secondary-entry-point/lib/normalize-options.ts +++ b/packages/angular/src/generators/library-secondary-entry-point/lib/normalize-options.ts @@ -3,9 +3,10 @@ import { joinPathFragments, names, readJson, - Tree, + type Tree, } from '@nx/devkit'; -import { GeneratorOptions, NormalizedGeneratorOptions } from '../schema'; +import { getModuleTypeSeparator } from '../../utils/artifact-types'; +import type { GeneratorOptions, NormalizedGeneratorOptions } from '../schema'; export function normalizeOptions( tree: Tree, @@ -42,6 +43,7 @@ export function normalizeOptions( joinPathFragments(libraryProject.root, 'package.json') ); const secondaryEntryPoint = `${mainEntryPoint}/${options.name}`; + const moduleTypeSeparator = getModuleTypeSeparator(tree); return { ...options, @@ -51,5 +53,6 @@ export function normalizeOptions( libraryProject, secondaryEntryPoint, skipModule: options.skipModule ?? false, + moduleTypeSeparator, }; } diff --git a/packages/angular/src/generators/library-secondary-entry-point/library-secondary-entry-point.spec.ts b/packages/angular/src/generators/library-secondary-entry-point/library-secondary-entry-point.spec.ts index 1c6f10309c..e5c61c2c84 100644 --- a/packages/angular/src/generators/library-secondary-entry-point/library-secondary-entry-point.spec.ts +++ b/packages/angular/src/generators/library-secondary-entry-point/library-secondary-entry-point.spec.ts @@ -1,7 +1,14 @@ import 'nx/src/internal-testing-utils/mock-project-graph'; import * as devkit from '@nx/devkit'; -import { addProjectConfiguration, readJson, Tree } from '@nx/devkit'; +import { + addProjectConfiguration, + readJson, + readNxJson, + Tree, + updateJson, + updateNxJson, +} from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { generateTestLibrary } from '../utils/testing'; import { librarySecondaryEntryPointGenerator } from './library-secondary-entry-point'; @@ -10,7 +17,7 @@ describe('librarySecondaryEntryPoint generator', () => { let tree: Tree; beforeEach(() => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + tree = createTreeWithEmptyWorkspace(); }); it('should throw when the library does not exist in the workspace', async () => { @@ -78,13 +85,47 @@ describe('librarySecondaryEntryPoint generator', () => { expect(tree.exists('libs/lib1/testing/README.md')).toBeTruthy(); expect(tree.exists('libs/lib1/testing/src/index.ts')).toBeTruthy(); expect( - tree.exists('libs/lib1/testing/src/lib/testing.module.ts') + tree.exists('libs/lib1/testing/src/lib/testing-module.ts') ).toBeTruthy(); expect( tree.read('libs/lib1/testing/src/index.ts', 'utf-8') ).toMatchSnapshot(); }); + it('should generate the module file respecting the "typeSeparator" generator default', async () => { + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:module': { + typeSeparator: '.', + }, + }; + updateNxJson(tree, nxJson); + addProjectConfiguration(tree, 'lib1', { + root: 'libs/lib1', + projectType: 'library', + }); + tree.write( + 'libs/lib1/package.json', + JSON.stringify({ name: '@my-org/lib1' }) + ); + + await librarySecondaryEntryPointGenerator(tree, { + name: 'testing', + library: 'lib1', + skipFormat: true, + }); + + expect(tree.exists('libs/lib1/testing/src/lib/testing.module.ts')).toBe( + true + ); + expect(tree.read('libs/lib1/testing/src/index.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "export * from './lib/testing.module'; + " + `); + }); + it('should configure the entry file', async () => { addProjectConfiguration(tree, 'lib1', { root: 'libs/lib1', @@ -205,7 +246,7 @@ describe('librarySecondaryEntryPoint generator', () => { tree.read('libs/lib1/testing/src/index.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('libs/lib1/testing/src/lib/testing.module.ts', 'utf-8') + tree.read('libs/lib1/testing/src/lib/testing-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -228,7 +269,7 @@ describe('librarySecondaryEntryPoint generator', () => { }); expect( - tree.exists('libs/lib1/testing/src/lib/testing.module.ts') + tree.exists('libs/lib1/testing/src/lib/testing-module.ts') ).toBeFalsy(); expect(tree.exists('libs/lib1/testing/ng-package.json')).toBeTruthy(); expect(tree.exists('libs/lib1/testing/README.md')).toBeTruthy(); @@ -238,4 +279,40 @@ describe('librarySecondaryEntryPoint generator', () => { ).toMatchSnapshot(); }); }); + + describe('compat', () => { + it('should generate the module file with the "." type separator for versions lower than v20', async () => { + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + + addProjectConfiguration(tree, 'lib1', { + root: 'libs/lib1', + projectType: 'library', + }); + tree.write( + 'libs/lib1/package.json', + JSON.stringify({ name: '@my-org/lib1' }) + ); + + await librarySecondaryEntryPointGenerator(tree, { + name: 'testing', + library: 'lib1', + skipFormat: true, + }); + + expect(tree.exists('libs/lib1/testing/src/lib/testing.module.ts')).toBe( + true + ); + expect(tree.read('libs/lib1/testing/src/index.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "export * from './lib/testing.module'; + " + `); + }); + }); }); diff --git a/packages/angular/src/generators/library-secondary-entry-point/schema.d.ts b/packages/angular/src/generators/library-secondary-entry-point/schema.d.ts index 0ecca58162..cc7bac6a5f 100644 --- a/packages/angular/src/generators/library-secondary-entry-point/schema.d.ts +++ b/packages/angular/src/generators/library-secondary-entry-point/schema.d.ts @@ -13,4 +13,5 @@ export interface NormalizedGeneratorOptions extends GeneratorOptions { mainEntryPoint: string; secondaryEntryPoint: string; skipModule: boolean; + moduleTypeSeparator: '-' | '.'; } diff --git a/packages/angular/src/generators/library/__snapshots__/library.spec.ts.snap b/packages/angular/src/generators/library/__snapshots__/library.spec.ts.snap index 422ff3f9f3..a591a2a9de 100644 --- a/packages/angular/src/generators/library/__snapshots__/library.spec.ts.snap +++ b/packages/angular/src/generators/library/__snapshots__/library.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`lib --standalone should generate a library with a standalone component and have it flat 1`] = `"export * from './lib/my-lib.component';"`; +exports[`lib --standalone should generate a library with a standalone component and have it flat 1`] = `"export * from './lib/my-lib';"`; exports[`lib --standalone should generate a library with a standalone component and have it flat 2`] = ` "import { Component } from '@angular/core'; @@ -9,27 +9,27 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'lib-my-lib', imports: [CommonModule], - templateUrl: './my-lib.component.html', - styleUrl: './my-lib.component.css' + templateUrl: './my-lib.html', + styleUrl: './my-lib.css' }) -export class MyLibComponent {} +export class MyLib {} " `; exports[`lib --standalone should generate a library with a standalone component and have it flat 3`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe('MyLibComponent', () => { - let component: MyLibComponent; - let fixture: ComponentFixture; +describe('MyLib', () => { + let component: MyLib; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MyLibComponent] + imports: [MyLib] }).compileComponents(); - fixture = TestBed.createComponent(MyLibComponent); + fixture = TestBed.createComponent(MyLib); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -44,7 +44,7 @@ describe('MyLibComponent', () => { exports[`lib --standalone should generate a library with a standalone component and have it flat with routing setup 1`] = ` "export * from './lib/lib.routes'; -export * from './lib/my-lib.component';" +export * from './lib/my-lib';" `; exports[`lib --standalone should generate a library with a standalone component and have it flat with routing setup 2`] = ` @@ -54,27 +54,27 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'lib-my-lib', imports: [CommonModule], - templateUrl: './my-lib.component.html', - styleUrl: './my-lib.component.css' + templateUrl: './my-lib.html', + styleUrl: './my-lib.css' }) -export class MyLibComponent {} +export class MyLib {} " `; exports[`lib --standalone should generate a library with a standalone component and have it flat with routing setup 3`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe('MyLibComponent', () => { - let component: MyLibComponent; - let fixture: ComponentFixture; +describe('MyLib', () => { + let component: MyLib; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MyLibComponent] + imports: [MyLib] }).compileComponents(); - fixture = TestBed.createComponent(MyLibComponent); + fixture = TestBed.createComponent(MyLib); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -88,15 +88,15 @@ describe('MyLibComponent', () => { exports[`lib --standalone should generate a library with a standalone component and have it flat with routing setup 4`] = ` "import { Route } from '@angular/router'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; export const myLibRoutes: Route[] = [ - { path: '', component: MyLibComponent } + { path: '', component: MyLib } ]; " `; -exports[`lib --standalone should generate a library with a standalone component as entry point 1`] = `"export * from './lib/my-lib/my-lib.component';"`; +exports[`lib --standalone should generate a library with a standalone component as entry point 1`] = `"export * from './lib/my-lib/my-lib';"`; exports[`lib --standalone should generate a library with a standalone component as entry point 2`] = ` "import { Component } from '@angular/core'; @@ -105,27 +105,27 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'lib-my-lib', imports: [CommonModule], - templateUrl: './my-lib.component.html', - styleUrl: './my-lib.component.css' + templateUrl: './my-lib.html', + styleUrl: './my-lib.css' }) -export class MyLibComponent {} +export class MyLib {} " `; exports[`lib --standalone should generate a library with a standalone component as entry point 3`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe('MyLibComponent', () => { - let component: MyLibComponent; - let fixture: ComponentFixture; +describe('MyLib', () => { + let component: MyLib; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MyLibComponent] + imports: [MyLib] }).compileComponents(); - fixture = TestBed.createComponent(MyLibComponent); + fixture = TestBed.createComponent(MyLib); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -137,7 +137,7 @@ describe('MyLibComponent', () => { " `; -exports[`lib --standalone should generate a library with a standalone component as entry point and set up view encapsulation and change detection 1`] = `"export * from './lib/my-lib/my-lib.component';"`; +exports[`lib --standalone should generate a library with a standalone component as entry point and set up view encapsulation and change detection 1`] = `"export * from './lib/my-lib/my-lib';"`; exports[`lib --standalone should generate a library with a standalone component as entry point and set up view encapsulation and change detection 2`] = ` "import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; @@ -151,11 +151,11 @@ import { CommonModule } from '@angular/common'; encapsulation: ViewEncapsulation.ShadowDom, changeDetection: ChangeDetectionStrategy.OnPush }) -export class MyLibComponent {} +export class MyLib {} " `; -exports[`lib --standalone should generate a library with a standalone component as entry point and skip tests 1`] = `"export * from './lib/my-lib/my-lib.component';"`; +exports[`lib --standalone should generate a library with a standalone component as entry point and skip tests 1`] = `"export * from './lib/my-lib/my-lib';"`; exports[`lib --standalone should generate a library with a standalone component as entry point and skip tests 2`] = ` "import { Component } from '@angular/core'; @@ -167,11 +167,11 @@ import { CommonModule } from '@angular/common'; template: \`

      MyLib works!

      \`, styles: \`\` }) -export class MyLibComponent {} +export class MyLib {} " `; -exports[`lib --standalone should generate a library with a standalone component as entry point following SFC pattern 1`] = `"export * from './lib/my-lib/my-lib.component';"`; +exports[`lib --standalone should generate a library with a standalone component as entry point following SFC pattern 1`] = `"export * from './lib/my-lib/my-lib';"`; exports[`lib --standalone should generate a library with a standalone component as entry point following SFC pattern 2`] = ` "import { Component } from '@angular/core'; @@ -183,24 +183,24 @@ import { CommonModule } from '@angular/common'; template: \`

      MyLib works!

      \`, styles: \`\` }) -export class MyLibComponent {} +export class MyLib {} " `; exports[`lib --standalone should generate a library with a standalone component as entry point following SFC pattern 3`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe('MyLibComponent', () => { - let component: MyLibComponent; - let fixture: ComponentFixture; +describe('MyLib', () => { + let component: MyLib; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MyLibComponent] + imports: [MyLib] }).compileComponents(); - fixture = TestBed.createComponent(MyLibComponent); + fixture = TestBed.createComponent(MyLib); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -215,15 +215,15 @@ describe('MyLibComponent', () => { exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup 1`] = ` "export * from './lib/lib.routes'; -export * from './lib/my-lib/my-lib.component';" +export * from './lib/my-lib/my-lib';" `; exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup 2`] = ` "import { Route } from '@angular/router'; -import { MyLibComponent } from './my-lib/my-lib.component'; +import { MyLib } from './my-lib/my-lib'; export const myLibRoutes: Route[] = [ - { path: '', component: MyLibComponent } + { path: '', component: MyLib } ]; " `; @@ -235,27 +235,27 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'lib-my-lib', imports: [CommonModule], - templateUrl: './my-lib.component.html', - styleUrl: './my-lib.component.css' + templateUrl: './my-lib.html', + styleUrl: './my-lib.css' }) -export class MyLibComponent {} +export class MyLib {} " `; exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup 4`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe('MyLibComponent', () => { - let component: MyLibComponent; - let fixture: ComponentFixture; +describe('MyLib', () => { + let component: MyLib; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MyLibComponent] + imports: [MyLib] }).compileComponents(); - fixture = TestBed.createComponent(MyLibComponent); + fixture = TestBed.createComponent(MyLib); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -270,15 +270,15 @@ describe('MyLibComponent', () => { exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup and attach it to parent module as a lazy child 1`] = ` "export * from './lib/lib.routes'; -export * from './lib/my-lib/my-lib.component';" +export * from './lib/my-lib/my-lib';" `; exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup and attach it to parent module as a lazy child 2`] = ` "import { Route } from '@angular/router'; -import { MyLibComponent } from './my-lib/my-lib.component'; +import { MyLib } from './my-lib/my-lib'; export const myLibRoutes: Route[] = [ - { path: '', component: MyLibComponent } + { path: '', component: MyLib } ]; " `; @@ -294,15 +294,15 @@ export const appRoutes: Route[] = [ exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup and attach it to parent module as direct child 1`] = ` "export * from './lib/lib.routes'; -export * from './lib/my-lib/my-lib.component';" +export * from './lib/my-lib/my-lib';" `; exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup and attach it to parent module as direct child 2`] = ` "import { Route } from '@angular/router'; -import { MyLibComponent } from './my-lib/my-lib.component'; +import { MyLib } from './my-lib/my-lib'; export const myLibRoutes: Route[] = [ - { path: '', component: MyLibComponent } + { path: '', component: MyLib } ]; " `; @@ -318,28 +318,28 @@ export const appRoutes: Route[] = [ exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup and attach it to standalone parent routes as a lazy child 1`] = ` "import { Route } from '@angular/router'; -import { MyLibComponent } from './my-lib/my-lib.component'; +import { MyLib } from './my-lib/my-lib'; export const myLibRoutes: Route[] = [ { path: 'second', loadChildren: () => import('@proj/second').then(m => m.secondRoutes) }, - { path: '', component: MyLibComponent } + { path: '', component: MyLib } ]; " `; exports[`lib --standalone should generate a library with a standalone component as entry point with routing setup and attach it to standalone parent routes as direct child 1`] = ` "import { Route } from '@angular/router'; -import { MyLibComponent } from './my-lib/my-lib.component'; +import { MyLib } from './my-lib/my-lib'; import { secondRoutes } from '@proj/second'; export const myLibRoutes: Route[] = [ { path: 'second', children: secondRoutes }, - { path: '', component: MyLibComponent } + { path: '', component: MyLib } ]; " `; -exports[`lib --standalone should generate a library with a standalone component in a directory 1`] = `"export * from './lib/my-lib/my-lib.component';"`; +exports[`lib --standalone should generate a library with a standalone component in a directory 1`] = `"export * from './lib/my-lib/my-lib';"`; exports[`lib --standalone should generate a library with a standalone component in a directory 2`] = ` "import { Component } from '@angular/core'; @@ -348,27 +348,27 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'lib-my-lib', imports: [CommonModule], - templateUrl: './my-lib.component.html', - styleUrl: './my-lib.component.css' + templateUrl: './my-lib.html', + styleUrl: './my-lib.css' }) -export class MyLibComponent {} +export class MyLib {} " `; exports[`lib --standalone should generate a library with a standalone component in a directory 3`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe('MyLibComponent', () => { - let component: MyLibComponent; - let fixture: ComponentFixture; +describe('MyLib', () => { + let component: MyLib; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MyLibComponent] + imports: [MyLib] }).compileComponents(); - fixture = TestBed.createComponent(MyLibComponent); + fixture = TestBed.createComponent(MyLib); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -380,7 +380,7 @@ describe('MyLibComponent', () => { " `; -exports[`lib --standalone should generate a library with a standalone component in a directory with a simple name 1`] = `"export * from './lib/my-lib/my-lib.component';"`; +exports[`lib --standalone should generate a library with a standalone component in a directory with a simple name 1`] = `"export * from './lib/my-lib/my-lib';"`; exports[`lib --standalone should generate a library with a standalone component in a directory with a simple name 2`] = ` "import { Component } from '@angular/core'; @@ -389,27 +389,27 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'lib-my-lib', imports: [CommonModule], - templateUrl: './my-lib.component.html', - styleUrl: './my-lib.component.css' + templateUrl: './my-lib.html', + styleUrl: './my-lib.css' }) -export class MyLibComponent {} +export class MyLib {} " `; exports[`lib --standalone should generate a library with a standalone component in a directory with a simple name 3`] = ` "import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MyLibComponent } from './my-lib.component'; +import { MyLib } from './my-lib'; -describe('MyLibComponent', () => { - let component: MyLibComponent; - let fixture: ComponentFixture; +describe('MyLib', () => { + let component: MyLib; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MyLibComponent] + imports: [MyLib] }).compileComponents(); - fixture = TestBed.createComponent(MyLibComponent); + fixture = TestBed.createComponent(MyLib); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -421,7 +421,7 @@ describe('MyLibComponent', () => { " `; -exports[`lib --standalone should generate a library with a valid selector for the standalone component when library name has a slash 1`] = `"export * from './lib/auth/common/auth/common.component';"`; +exports[`lib --standalone should generate a library with a valid selector for the standalone component when library name has a slash 1`] = `"export * from './lib/auth/common/auth/common';"`; exports[`lib --standalone should generate a library with a valid selector for the standalone component when library name has a slash 2`] = ` "import { Component } from '@angular/core'; @@ -430,10 +430,10 @@ import { CommonModule } from '@angular/common'; @Component({ selector: 'lib-auth-common', imports: [CommonModule], - templateUrl: './common.component.html', - styleUrl: './common.component.css' + templateUrl: './common.html', + styleUrl: './common.css' }) -export class AuthCommonComponent {} +export class AuthCommon {} " `; @@ -467,7 +467,7 @@ exports[`lib router lazy should update the parent module 1`] = ` "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; @NgModule({ imports: [ BrowserModule, @@ -478,8 +478,8 @@ import { AppComponent } from './app.component'; }, ]), ], - declarations: [AppComponent], - bootstrap: [AppComponent], + declarations: [App], + bootstrap: [App], }) export class AppModule {} " @@ -489,7 +489,7 @@ exports[`lib router lazy should update the parent module 3`] = ` "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; @NgModule({ imports: [ BrowserModule, @@ -508,8 +508,8 @@ import { AppComponent } from './app.component'; }, ]), ], - declarations: [AppComponent], - bootstrap: [AppComponent], + declarations: [App], + bootstrap: [App], }) export class AppModule {} " @@ -520,14 +520,14 @@ exports[`lib router lazy should update the parent module even if the route is de import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; const routes = [{ path: 'my-lib', loadChildren: () => import('@proj/my-lib').then(m => m.MyLibModule) }]; @NgModule({ imports: [BrowserModule, RouterModule.forRoot(routes)], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} " diff --git a/packages/angular/src/generators/library/files/base/tsconfig.json__tpl__ b/packages/angular/src/generators/library/files/base/tsconfig.json__tpl__ index 04102d98f1..cc86607c01 100644 --- a/packages/angular/src/generators/library/files/base/tsconfig.json__tpl__ +++ b/packages/angular/src/generators/library/files/base/tsconfig.json__tpl__ @@ -1,7 +1,8 @@ { - "compilerOptions": { - "target": "es2022"<% if (disableModernClassFieldsBehavior) { %>, - "useDefineForClassFields": false<% } %> + "extends": "<%= rootTsConfig %>", + "compilerOptions": {}, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false }, "files": [], "include": [], @@ -9,6 +10,5 @@ { "path": "./tsconfig.lib.json" } - ], - "extends": "<%= rootTsConfig %>" + ] } diff --git a/packages/angular/src/generators/library/files/ng-module/src/index.ts__tpl__ b/packages/angular/src/generators/library/files/ng-module/src/index.ts__tpl__ index 8d8502946f..524e652be8 100644 --- a/packages/angular/src/generators/library/files/ng-module/src/index.ts__tpl__ +++ b/packages/angular/src/generators/library/files/ng-module/src/index.ts__tpl__ @@ -1,2 +1,2 @@ -<% if (!skipModule) { %>export * from './lib/<%= libFileName %>.module';<% } %><% if(routing) { %> +<% if (!skipModule) { %>export * from './lib/<%= libFileName %><%= moduleTypeSeparator %>module';<% } %><% if(routing) { %> export * from './lib/lib.routes';<% } %> diff --git a/packages/angular/src/generators/library/files/ng-module/src/lib/__libFileName__.module.ts__tpl__ b/packages/angular/src/generators/library/files/ng-module/src/lib/__libFileName____moduleTypeSeparator__module.ts__tpl__ similarity index 100% rename from packages/angular/src/generators/library/files/ng-module/src/lib/__libFileName__.module.ts__tpl__ rename to packages/angular/src/generators/library/files/ng-module/src/lib/__libFileName____moduleTypeSeparator__module.ts__tpl__ diff --git a/packages/angular/src/generators/library/files/standalone-components/src/lib/lib.routes.ts__tpl__ b/packages/angular/src/generators/library/files/standalone-components/src/lib/lib.routes.ts__tpl__ index 295f0ae9e9..d6db24a0dc 100644 --- a/packages/angular/src/generators/library/files/standalone-components/src/lib/lib.routes.ts__tpl__ +++ b/packages/angular/src/generators/library/files/standalone-components/src/lib/lib.routes.ts__tpl__ @@ -1,6 +1,6 @@ import { Route } from '@angular/router'; -import { <%= libClassName %>Component } from './<%= pathToComponent %>.component'; +import { <%= libClassName %><%= componentType %> } from './<%= pathToComponent %><%= componentFileSuffix %>'; export const <%= libPropertyName %>Routes: Route[] = [ - { path: '', component: <%= libClassName %>Component } + { path: '', component: <%= libClassName %><%= componentType %> } ]; diff --git a/packages/angular/src/generators/library/lib/add-standalone-component.ts b/packages/angular/src/generators/library/lib/add-standalone-component.ts index dd1507f49e..7769e38c90 100644 --- a/packages/angular/src/generators/library/lib/add-standalone-component.ts +++ b/packages/angular/src/generators/library/lib/add-standalone-component.ts @@ -21,6 +21,7 @@ export async function addStandaloneComponent( ), standalone: true, export: true, + type: componentOptions.type, skipFormat: true, }); diff --git a/packages/angular/src/generators/library/lib/create-files.ts b/packages/angular/src/generators/library/lib/create-files.ts index 33b33da182..ea88d786ec 100644 --- a/packages/angular/src/generators/library/lib/create-files.ts +++ b/packages/angular/src/generators/library/lib/create-files.ts @@ -6,7 +6,7 @@ import { offsetFromRoot, } from '@nx/devkit'; import { getRootTsConfigFileName } from '@nx/js'; -import { lt, parse } from 'semver'; +import { parse } from 'semver'; import { UnitTestRunner } from '../../../utils/test-runners'; import type { AngularProjectConfiguration } from '../../../utils/types'; import { getInstalledAngularVersion } from '../../utils/version-utils'; @@ -28,7 +28,13 @@ export function createFiles( const version = getInstalledAngularVersion(tree); const { major, minor } = parse(version); - const disableModernClassFieldsBehavior = lt(version, '18.1.0-rc.0'); + + const componentType = options.componentOptions.type + ? names(options.componentOptions.type).className + : ''; + const componentFileSuffix = options.componentOptions.type + ? `.${options.componentOptions.type}` + : ''; const substitutions = { libName: options.libraryOptions.name, @@ -44,7 +50,9 @@ export function createFiles( importPath: options.libraryOptions.importPath, rootOffset, angularPeerDepVersion: `^${major}.${minor}.0`, - disableModernClassFieldsBehavior, + componentType, + componentFileSuffix, + moduleTypeSeparator: options.libraryOptions.moduleTypeSeparator, tpl: '', }; @@ -71,12 +79,7 @@ export function createFiles( ); if (options.libraryOptions.skipModule) { - tree.delete( - joinPathFragments( - project.sourceRoot, - `lib/${options.libraryOptions.fileName}.module.ts` - ) - ); + tree.delete(options.libraryOptions.modulePath); } } diff --git a/packages/angular/src/generators/library/lib/enable-strict-type-checking.ts b/packages/angular/src/generators/library/lib/enable-strict-type-checking.ts deleted file mode 100644 index 8ada56d655..0000000000 --- a/packages/angular/src/generators/library/lib/enable-strict-type-checking.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { Tree } from '@nx/devkit'; -import { readNxJson, updateJson, updateNxJson } from '@nx/devkit'; -import { NormalizedSchema } from './normalized-schema'; - -/** - * Enable Strict Mode in the library and spec TS Config - * */ -export function enableStrictTypeChecking( - host: Tree, - options: NormalizedSchema['libraryOptions'] -) { - updateTsConfig(host, options); -} - -export function setLibraryStrictDefault(host: Tree, isStrict: boolean) { - // set the default so future libraries use it - // unless the user has previously set this value - const nxJson = readNxJson(host); - - nxJson.generators = nxJson.generators || {}; - - nxJson.generators['@nx/angular:library'] = - nxJson.generators['@nx/angular:library'] || {}; - - nxJson.generators['@nx/angular:library'].strict = - nxJson.generators['@nx/angular:library'].strict ?? isStrict; - updateNxJson(host, nxJson); -} - -function updateTsConfig( - host: Tree, - options: NormalizedSchema['libraryOptions'] -) { - // Update the settings in the tsconfig.app.json to enable strict type checking. - // This matches the settings defined by the Angular CL https://angular.io/guide/strict-mode - updateJson(host, `${options.projectRoot}/tsconfig.json`, (json) => { - // update the TypeScript settings - json.compilerOptions = { - ...(json.compilerOptions ?? {}), - forceConsistentCasingInFileNames: true, - strict: true, - noImplicitOverride: true, - noPropertyAccessFromIndexSignature: true, - noImplicitReturns: true, - noFallthroughCasesInSwitch: true, - }; - - // update Angular Template Settings - json.angularCompilerOptions = { - ...(json.angularCompilerOptions ?? {}), - enableI18nLegacyMessageIdFormat: false, - strictInjectionParameters: true, - strictInputAccessModifiers: true, - strictTemplates: true, - }; - - return json; - }); -} diff --git a/packages/angular/src/generators/library/lib/normalize-options.ts b/packages/angular/src/generators/library/lib/normalize-options.ts index b9da4e4782..d8623f3aca 100644 --- a/packages/angular/src/generators/library/lib/normalize-options.ts +++ b/packages/angular/src/generators/library/lib/normalize-options.ts @@ -1,11 +1,15 @@ -import { names, Tree } from '@nx/devkit'; +import { names, type Tree } from '@nx/devkit'; import { determineProjectNameAndRootOptions, ensureRootProjectName, } from '@nx/devkit/src/generators/project-name-and-root-utils'; import { UnitTestRunner } from '../../../utils/test-runners'; -import { Schema } from '../schema'; -import { NormalizedSchema } from './normalized-schema'; +import { + getComponentType, + getModuleTypeSeparator, +} from '../../utils/artifact-types'; +import type { Schema } from '../schema'; +import type { NormalizedSchema } from './normalized-schema'; export async function normalizeOptions( host: Tree, @@ -49,7 +53,8 @@ export async function normalizeOptions( const parsedTags = options.tags ? options.tags.split(',').map((s) => s.trim()) : []; - const modulePath = `${projectRoot}/src/lib/${fileName}.module.ts`; + const moduleTypeSeparator = getModuleTypeSeparator(host); + const modulePath = `${projectRoot}/src/lib/${fileName}${moduleTypeSeparator}module.ts`; const ngCliSchematicLibRoot = projectName; const allNormalizedOptions = { @@ -70,6 +75,7 @@ export async function normalizeOptions( standaloneComponentName: `${ names(projectNames.projectSimpleName).className }Component`, + moduleTypeSeparator, }; const { @@ -86,6 +92,8 @@ export async function normalizeOptions( ...libraryOptions } = allNormalizedOptions; + const componentType = getComponentType(host); + return { libraryOptions, componentOptions: { @@ -101,6 +109,7 @@ export async function normalizeOptions( selector, skipSelector, flat, + type: componentType, }, }; } diff --git a/packages/angular/src/generators/library/lib/normalized-schema.ts b/packages/angular/src/generators/library/lib/normalized-schema.ts index edad7ddf5a..efe305eada 100644 --- a/packages/angular/src/generators/library/lib/normalized-schema.ts +++ b/packages/angular/src/generators/library/lib/normalized-schema.ts @@ -37,6 +37,7 @@ export interface NormalizedSchema { parsedTags: string[]; ngCliSchematicLibRoot: string; standaloneComponentName: string; + moduleTypeSeparator: '-' | '.'; }; componentOptions: { name: string; @@ -51,5 +52,6 @@ export interface NormalizedSchema { selector?: string; skipSelector?: boolean; flat?: boolean; + type?: string; }; } diff --git a/packages/angular/src/generators/library/lib/set-generator-defaults.ts b/packages/angular/src/generators/library/lib/set-generator-defaults.ts index 49833624a1..6d82af767b 100644 --- a/packages/angular/src/generators/library/lib/set-generator-defaults.ts +++ b/packages/angular/src/generators/library/lib/set-generator-defaults.ts @@ -11,6 +11,7 @@ export function setGeneratorDefaults( nxJson.generators['@nx/angular:library'] = { linter: options.libraryOptions.linter, unitTestRunner: options.libraryOptions.unitTestRunner, + strict: !options.libraryOptions.strict ? false : undefined, ...(nxJson.generators['@nx/angular:library'] || {}), }; diff --git a/packages/angular/src/generators/library/lib/update-tsconfig-files.ts b/packages/angular/src/generators/library/lib/update-tsconfig-files.ts new file mode 100644 index 0000000000..b6af10ad39 --- /dev/null +++ b/packages/angular/src/generators/library/lib/update-tsconfig-files.ts @@ -0,0 +1,118 @@ +import { joinPathFragments, type Tree, updateJson } from '@nx/devkit'; +import { + addTsConfigPath, + extractTsConfigBase, + getRelativePathToRootTsConfig, + getRootTsConfigFileName, +} from '@nx/js'; +import { getNeededCompilerOptionOverrides } from '@nx/js/src/utils/typescript/configuration'; +import { lt } from 'semver'; +import { updateProjectRootTsConfig } from '../../utils/update-project-root-tsconfig'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; +import type { NormalizedSchema } from './normalized-schema'; + +export function updateTsConfigFiles( + tree: Tree, + options: NormalizedSchema['libraryOptions'] +) { + extractTsConfigBase(tree); + updateProjectConfig(tree, options); + updateProjectIvyConfig(tree, options); + addTsConfigPath(tree, options.importPath, [ + joinPathFragments(options.projectRoot, './src', 'index.ts'), + ]); + + const compilerOptions: Record = { + skipLibCheck: true, + experimentalDecorators: true, + importHelpers: true, + target: 'es2022', + ...(options.strict + ? { + strict: true, + noImplicitOverride: true, + noPropertyAccessFromIndexSignature: true, + noImplicitReturns: true, + noFallthroughCasesInSwitch: true, + } + : {}), + }; + + const { major: angularMajorVersion, version: angularVersion } = + getInstalledAngularVersionInfo(tree); + if (lt(angularVersion, '18.1.0')) { + compilerOptions.useDefineForClassFields = false; + } + if (angularMajorVersion >= 20) { + compilerOptions.module = 'preserve'; + } else { + compilerOptions.moduleResolution = 'bundler'; + compilerOptions.module = 'es2022'; + } + + updateJson(tree, `${options.projectRoot}/tsconfig.json`, (json) => { + json.compilerOptions = { + ...json.compilerOptions, + ...compilerOptions, + }; + json.compilerOptions = getNeededCompilerOptionOverrides( + tree, + json.compilerOptions, + getRootTsConfigFileName(tree) + ); + + if (options.strict) { + json.angularCompilerOptions = { + ...json.angularCompilerOptions, + strictInjectionParameters: true, + strictInputAccessModifiers: true, + typeCheckHostBindings: angularMajorVersion >= 20 ? true : undefined, + strictTemplates: true, + }; + } + + return json; + }); +} + +function updateProjectConfig( + host: Tree, + options: NormalizedSchema['libraryOptions'] +) { + updateJson(host, `${options.projectRoot}/tsconfig.lib.json`, (json) => { + json.include = ['src/**/*.ts']; + json.exclude = [ + ...new Set([ + ...(json.exclude || []), + 'jest.config.ts', + 'src/**/*.test.ts', + 'src/**/*.spec.ts', + ]), + ]; + return json; + }); + + // tsconfig.json + updateProjectRootTsConfig( + host, + options.projectRoot, + getRelativePathToRootTsConfig(host, options.projectRoot) + ); +} + +function updateProjectIvyConfig( + host: Tree, + options: NormalizedSchema['libraryOptions'] +) { + if (options.buildable || options.publishable) { + return updateJson( + host, + `${options.projectRoot}/tsconfig.lib.prod.json`, + (json) => { + json.angularCompilerOptions['compilationMode'] = + options.compilationMode === 'full' ? undefined : 'partial'; + return json; + } + ); + } +} diff --git a/packages/angular/src/generators/library/lib/update-tsconfig.ts b/packages/angular/src/generators/library/lib/update-tsconfig.ts deleted file mode 100644 index 45bf7d41e2..0000000000 --- a/packages/angular/src/generators/library/lib/update-tsconfig.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { Tree } from '@nx/devkit'; -import { updateJson } from '@nx/devkit'; -import { getRelativePathToRootTsConfig } from '@nx/js'; -import { NormalizedSchema } from './normalized-schema'; -import { - extractTsConfigBase, - updateProjectRootTsConfig, -} from '../../utils/update-project-root-tsconfig'; - -function updateProjectConfig( - host: Tree, - options: NormalizedSchema['libraryOptions'] -) { - updateJson(host, `${options.projectRoot}/tsconfig.lib.json`, (json) => { - json.include = ['src/**/*.ts']; - json.exclude = [ - ...new Set([ - ...(json.exclude || []), - 'jest.config.ts', - 'src/**/*.test.ts', - 'src/**/*.spec.ts', - ]), - ]; - return json; - }); - - // tsconfig.json - updateProjectRootTsConfig( - host, - options.projectRoot, - getRelativePathToRootTsConfig(host, options.projectRoot) - ); -} - -function updateProjectIvyConfig( - host: Tree, - options: NormalizedSchema['libraryOptions'] -) { - if (options.buildable || options.publishable) { - return updateJson( - host, - `${options.projectRoot}/tsconfig.lib.prod.json`, - (json) => { - json.angularCompilerOptions['compilationMode'] = - options.compilationMode === 'full' ? undefined : 'partial'; - return json; - } - ); - } -} - -export function updateTsConfig( - host: Tree, - options: NormalizedSchema['libraryOptions'] -) { - extractTsConfigBase(host); - updateProjectConfig(host, options); - updateProjectIvyConfig(host, options); -} diff --git a/packages/angular/src/generators/library/library.spec.ts b/packages/angular/src/generators/library/library.spec.ts index d1315931af..34ce47dc49 100644 --- a/packages/angular/src/generators/library/library.spec.ts +++ b/packages/angular/src/generators/library/library.spec.ts @@ -6,9 +6,11 @@ import { parseJson, ProjectGraph, readJson, + readNxJson, readProjectConfiguration, Tree, updateJson, + updateNxJson, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { createApp } from '../../utils/nx-devkit/testing'; @@ -79,9 +81,6 @@ describe('lib', () => { expect(dependencies['@angular/compiler']).toBe(angularVersion); expect(dependencies['@angular/core']).toBe(angularVersion); expect(dependencies['@angular/platform-browser']).toBe(angularVersion); - expect(dependencies['@angular/platform-browser-dynamic']).toBe( - angularVersion - ); expect(dependencies['@angular/router']).toBe(angularVersion); expect(dependencies['rxjs']).toBeDefined(); expect(dependencies['tslib']).toBeDefined(); @@ -89,14 +88,23 @@ describe('lib', () => { expect(devDependencies['@angular/cli']).toBe(angularDevkitVersion); expect(devDependencies['@angular/compiler-cli']).toBe(angularVersion); expect(devDependencies['@angular/language-service']).toBe(angularVersion); - expect(devDependencies['@angular-devkit/build-angular']).toBe( - angularDevkitVersion - ); + // @angular/build should no be installed unless using vitest, as no other + // task requires it + expect(devDependencies['@angular/build']).toBeUndefined(); // codelyzer should no longer be there by default expect(devDependencies['codelyzer']).toBeUndefined(); }); + it('should add @angular/build when using vitest', async () => { + await runLibraryGeneratorWithOpts({ + unitTestRunner: UnitTestRunner.Vitest, + }); + + const { devDependencies } = readJson(tree, 'package.json'); + expect(devDependencies['@angular/build']).toBe(angularDevkitVersion); + }); + it('should not touch the package.json when run with `--skipPackageJson`', async () => { let initialPackageJson; updateJson(tree, 'package.json', (json) => { @@ -205,7 +213,7 @@ describe('lib', () => { }); // ASSERT - const moduleFileExists = tree.exists('my-lib/src/lib/my-lib.module.ts'); + const moduleFileExists = tree.exists('my-lib/src/lib/my-lib-module.ts'); expect(moduleFileExists).toBeFalsy(); const indexApi = tree.read('my-lib/src/index.ts', 'utf-8'); expect(indexApi).toMatchInlineSnapshot(` @@ -302,9 +310,13 @@ describe('lib', () => { strictInjectionParameters: true, strictInputAccessModifiers: true, strictTemplates: true, + typeCheckHostBindings: true, }, compilerOptions: { - forceConsistentCasingInFileNames: true, + experimentalDecorators: true, + importHelpers: true, + module: 'preserve', + skipLibCheck: true, noFallthroughCasesInSwitch: true, noPropertyAccessFromIndexSignature: true, noImplicitOverride: true, @@ -357,7 +369,7 @@ describe('lib', () => { await runLibraryGeneratorWithOpts(); // ASSERT - expect(tree.read('my-lib/src/lib/my-lib.component.spec.ts')).toBeFalsy(); + expect(tree.read('my-lib/src/lib/my-lib.spec.ts')).toBeFalsy(); expect(tree.read('my-lib/src/lib/my-lib.service.spec.ts')).toBeFalsy(); }); @@ -427,29 +439,40 @@ describe('lib', () => { // ASSERT expect(tree.exists(`my-lib/jest.config.ts`)).toBeTruthy(); expect(tree.exists('my-lib/src/index.ts')).toBeTruthy(); - expect(tree.exists('my-lib/src/lib/my-lib.module.ts')).toBeTruthy(); + expect(tree.exists('my-lib/src/lib/my-lib-module.ts')).toBeTruthy(); - expect(tree.exists('my-lib/src/lib/my-lib.component.ts')).toBeFalsy(); - expect( - tree.exists('my-lib/src/lib/my-lib.component.spec.ts') - ).toBeFalsy(); + expect(tree.exists('my-lib/src/lib/my-lib.ts')).toBeFalsy(); + expect(tree.exists('my-lib/src/lib/my-lib.spec.ts')).toBeFalsy(); expect(tree.exists('my-lib/src/lib/my-lib.service.ts')).toBeFalsy(); expect(tree.exists('my-lib/src/lib/my-lib.service.spec.ts')).toBeFalsy(); expect(tree.exists(`my-lib2/jest.config.ts`)).toBeTruthy(); expect(tree.exists('my-lib2/src/index.ts')).toBeTruthy(); - expect(tree.exists('my-lib2/src/lib/my-lib2.module.ts')).toBeTruthy(); + expect(tree.exists('my-lib2/src/lib/my-lib2-module.ts')).toBeTruthy(); - expect(tree.exists('my-lib2/src/lib/my-lib2.component.ts')).toBeFalsy(); - expect( - tree.exists('my-lib2/src/lib/my-lib2.component.spec.ts') - ).toBeFalsy(); + expect(tree.exists('my-lib2/src/lib/my-lib2.ts')).toBeFalsy(); + expect(tree.exists('my-lib2/src/lib/my-lib2.spec.ts')).toBeFalsy(); expect(tree.exists('my-lib2/src/lib/my-lib2.service.ts')).toBeFalsy(); expect( tree.exists('my-lib2/src/lib/my-lib2.service.spec.ts') ).toBeFalsy(); }); + it('should generate the module file respecting the "typeSeparator" generator default', async () => { + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:module': { + typeSeparator: '.', + }, + }; + updateNxJson(tree, nxJson); + + await runLibraryGeneratorWithOpts(); + + expect(tree.exists('my-lib/src/lib/my-lib.module.ts')).toBeTruthy(); + }); + it('should not install any e2e test runners', async () => { // ACT await runLibraryGeneratorWithOpts({ @@ -508,15 +531,11 @@ describe('lib', () => { expect(tree.exists(`my-dir/my-lib/jest.config.ts`)).toBeTruthy(); expect(tree.exists('my-dir/my-lib/src/index.ts')).toBeTruthy(); expect( - tree.exists('my-dir/my-lib/src/lib/my-lib.module.ts') + tree.exists('my-dir/my-lib/src/lib/my-lib-module.ts') ).toBeTruthy(); - expect( - tree.exists('my-dir/my-lib/src/lib/my-lib.component.ts') - ).toBeFalsy(); - expect( - tree.exists('my-dir/my-lib/src/lib/my-lib.component.spec.ts') - ).toBeFalsy(); + expect(tree.exists('my-dir/my-lib/src/lib/my-lib.ts')).toBeFalsy(); + expect(tree.exists('my-dir/my-lib/src/lib/my-lib.spec.ts')).toBeFalsy(); expect( tree.exists('my-dir/my-lib/src/lib/my-lib.service.ts') ).toBeFalsy(); @@ -527,15 +546,11 @@ describe('lib', () => { expect(tree.exists(`my-dir/my-lib2/jest.config.ts`)).toBeTruthy(); expect(tree.exists('my-dir/my-lib2/src/index.ts')).toBeTruthy(); expect( - tree.exists('my-dir/my-lib2/src/lib/my-lib2.module.ts') + tree.exists('my-dir/my-lib2/src/lib/my-lib2-module.ts') ).toBeTruthy(); - expect( - tree.exists('my-dir/my-lib2/src/lib/my-lib2.component.ts') - ).toBeFalsy(); - expect( - tree.exists('my-dir/my-lib2/src/lib/my-lib2.component.spec.ts') - ).toBeFalsy(); + expect(tree.exists('my-dir/my-lib2/src/lib/my-lib2.ts')).toBeFalsy(); + expect(tree.exists('my-dir/my-lib2/src/lib/my-lib2.spec.ts')).toBeFalsy(); expect( tree.exists('my-dir/my-lib2/src/lib/my-lib2.service.ts') ).toBeFalsy(); @@ -635,7 +650,7 @@ describe('lib', () => { importPath: '@myorg/lib', }); - const libModulePath = 'my-dir/my-lib/src/lib/my-lib.module.ts'; + const libModulePath = 'my-dir/my-lib/src/lib/my-lib-module.ts'; expect(tree.read(libModulePath, 'utf-8')).toContain('class MyLibModule'); // Make sure these exist @@ -645,7 +660,7 @@ describe('lib', () => { 'my-dir/my-lib/project.json', 'my-dir/my-lib/tsconfig.lib.prod.json', 'my-dir/my-lib/src/index.ts', - 'my-dir/my-lib/src/lib/my-lib.module.ts', + 'my-dir/my-lib/src/lib/my-lib-module.ts', ].forEach((path) => { expect(tree.exists(path)).toBeTruthy(); }); @@ -684,7 +699,9 @@ describe('lib', () => { "prefix": "lib", "style": "kebab-case" } - ] + ], + "@angular-eslint/component-class-suffix": "off", + "@angular-eslint/directive-class-suffix": "off" } }, { @@ -775,17 +792,17 @@ describe('lib', () => { // ASSERT expect( - tree.exists('my-dir/my-lib/src/lib/my-lib.module.ts') + tree.exists('my-dir/my-lib/src/lib/my-lib-module.ts') ).toBeTruthy(); expect( - tree.read('my-dir/my-lib/src/lib/my-lib.module.ts', 'utf-8') + tree.read('my-dir/my-lib/src/lib/my-lib-module.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.exists('my-dir/my-lib2/src/lib/my-lib2.module.ts') + tree.exists('my-dir/my-lib2/src/lib/my-lib2-module.ts') ).toBeTruthy(); expect( - tree.read('my-dir/my-lib2/src/lib/my-lib2.module.ts', 'utf-8') + tree.read('my-dir/my-lib2/src/lib/my-lib2-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -798,12 +815,12 @@ describe('lib', () => { directory: 'my-dir/my-lib', routing: true, lazy: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', skipFormat: false, }); const moduleContents = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); const tsConfigLibJson = parseJson( tree.read('my-dir/my-lib/tsconfig.lib.json').toString() @@ -815,12 +832,12 @@ describe('lib', () => { routing: true, lazy: true, simpleName: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', skipFormat: false, }); const moduleContents2 = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); const tsConfigLibJson2 = parseJson( tree.read('my-dir/my-lib2/tsconfig.lib.json').toString() @@ -832,12 +849,12 @@ describe('lib', () => { routing: true, lazy: true, simpleName: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', skipFormat: false, }); const moduleContents3 = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); const tsConfigLibJson3 = parseJson( tree.read('my-dir/my-lib3/tsconfig.lib.json').toString() @@ -857,7 +874,7 @@ describe('lib', () => { "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; @NgModule({ imports: [ BrowserModule, @@ -872,8 +889,8 @@ describe('lib', () => { }, ]), ], - declarations: [AppComponent], - bootstrap: [AppComponent], + declarations: [App], + bootstrap: [App], }) export class AppModule {} " @@ -900,19 +917,19 @@ describe('lib', () => { // ARRANGE createApp(tree, 'myapp'); tree.write( - 'myapp/src/app/app.module.ts', + 'myapp/src/app/app-module.ts', ` import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; const routes = []; @NgModule({ imports: [BrowserModule, RouterModule.forRoot(routes)], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} ` @@ -923,12 +940,12 @@ describe('lib', () => { directory: 'my-dir/my-lib', routing: true, lazy: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', }); // ASSERT const moduleContents = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); expect(moduleContents).toMatchSnapshot(); @@ -951,20 +968,20 @@ describe('lib', () => { }); // ASSERT expect( - tree.exists('my-dir/my-lib/src/lib/my-lib.module.ts') + tree.exists('my-dir/my-lib/src/lib/my-lib-module.ts') ).toBeTruthy(); expect( - tree.read('my-dir/my-lib/src/lib/my-lib.module.ts').toString() + tree.read('my-dir/my-lib/src/lib/my-lib-module.ts').toString() ).toContain('RouterModule'); expect( tree.read('my-dir/my-lib/src/lib/lib.routes.ts').toString() ).toContain('const myLibRoutes: Route[] = '); expect( - tree.exists('my-dir/my-lib2/src/lib/my-lib2.module.ts') + tree.exists('my-dir/my-lib2/src/lib/my-lib2-module.ts') ).toBeTruthy(); expect( - tree.read('my-dir/my-lib2/src/lib/my-lib2.module.ts').toString() + tree.read('my-dir/my-lib2/src/lib/my-lib2-module.ts').toString() ).toContain('RouterModule'); expect( tree.read('my-dir/my-lib2/src/lib/lib.routes.ts').toString() @@ -980,11 +997,11 @@ describe('lib', () => { name: 'my-lib', directory: 'my-dir/my-lib', routing: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', }); const moduleContents = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); await runLibraryGeneratorWithOpts({ @@ -992,23 +1009,23 @@ describe('lib', () => { directory: 'my-dir/my-lib2', simpleName: true, routing: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', }); const moduleContents2 = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); await runLibraryGeneratorWithOpts({ name: 'my-lib3', directory: 'my-dir/my-lib3', routing: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', simpleName: true, }); const moduleContents3 = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); // ASSERT @@ -1044,19 +1061,19 @@ describe('lib', () => { // ARRANGE createApp(tree, 'myapp'); tree.write( - 'myapp/src/app/app.module.ts', + 'myapp/src/app/app-module.ts', ` import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; const routes = []; @NgModule({ imports: [BrowserModule, RouterModule.forRoot(routes)], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} ` @@ -1067,12 +1084,12 @@ describe('lib', () => { name: 'my-lib', directory: 'my-dir/my-lib', routing: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', }); // ASSERT const moduleContents = tree - .read('myapp/src/app/app.module.ts') + .read('myapp/src/app/app-module.ts') .toString(); expect(moduleContents).toContain('RouterModule.forRoot(routes)'); @@ -1091,7 +1108,7 @@ describe('lib', () => { }); // ASSERT - expect(tree.exists('my-lib/src/lib/my-lib.module.spec.ts')).toBeFalsy(); + expect(tree.exists('my-lib/src/lib/my-lib-module.spec.ts')).toBeFalsy(); expect(tree.exists('my-lib/src/test.ts')).toBeFalsy(); expect(tree.exists('my-lib/src/test.ts')).toBeFalsy(); expect(tree.exists('my-lib/tsconfig.spec.json')).toBeFalsy(); @@ -1133,9 +1150,7 @@ describe('lib', () => { publishable: true, importPath: '@myorg/lib', }) - ).rejects.toThrowError( - 'You already have a library using the import path' - ); + ).rejects.toThrow('You already have a library using the import path'); }); it('should fail if no importPath has been used', async () => { @@ -1144,7 +1159,7 @@ describe('lib', () => { runLibraryGeneratorWithOpts({ publishable: true, }) - ).rejects.toThrowError( + ).rejects.toThrow( 'For publishable libs you have to provide a proper "--importPath"' ); }); @@ -1167,7 +1182,6 @@ describe('lib', () => { const { generators } = readJson(tree, 'nx.json'); // check that the TypeScript compiler options have been updated - expect(compilerOptions.forceConsistentCasingInFileNames).toBe(true); expect(compilerOptions.strict).toBe(true); expect(compilerOptions.noImplicitOverride).toBe(true); expect(compilerOptions.noPropertyAccessFromIndexSignature).toBe(true); @@ -1235,7 +1249,9 @@ describe('lib', () => { prefix: "lib", style: "kebab-case" } - ] + ], + "@angular-eslint/component-class-suffix": "off", + "@angular-eslint/directive-class-suffix": "off" } }, { @@ -1275,6 +1291,7 @@ describe('lib', () => { "*.ts", ], "rules": { + "@angular-eslint/component-class-suffix": "off", "@angular-eslint/component-selector": [ "error", { @@ -1283,6 +1300,7 @@ describe('lib', () => { "type": "element", }, ], + "@angular-eslint/directive-class-suffix": "off", "@angular-eslint/directive-selector": [ "error", { @@ -1335,6 +1353,7 @@ describe('lib', () => { "*.ts", ], "rules": { + "@angular-eslint/component-class-suffix": "off", "@angular-eslint/component-selector": [ "error", { @@ -1343,6 +1362,7 @@ describe('lib', () => { "type": "element", }, ], + "@angular-eslint/directive-class-suffix": "off", "@angular-eslint/directive-selector": [ "error", { @@ -1482,13 +1502,71 @@ describe('lib', () => { expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.spec.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.spec.ts', 'utf-8') ).toMatchSnapshot(); }); + it('should generate a library with a standalone component respecting the "type" option in the component generator defaults', async () => { + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:component': { + ...nxJson.generators?.['@nx/angular:component'], + type: 'component', + }, + }; + updateNxJson(tree, nxJson); + + await runLibraryGeneratorWithOpts({ standalone: true, skipFormat: true }); + + expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchInlineSnapshot( + `"export * from './lib/my-lib/my-lib.component';"` + ); + expect(tree.read('my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Component({ + selector: 'lib-my-lib', + imports: [CommonModule], + templateUrl: './my-lib.component.html', + styleUrl: './my-lib.component.css' + }) + export class MyLibComponent {} + " + `); + expect( + tree.read('my-lib/src/lib/my-lib/my-lib.component.spec.ts', 'utf-8') + ).toMatchInlineSnapshot(` + "import { ComponentFixture, TestBed } from '@angular/core/testing'; + import { MyLibComponent } from './my-lib.component'; + + describe('MyLibComponent', () => { + let component: MyLibComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MyLibComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(MyLibComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + }); + " + `); + }); + it('should generate a library with a valid selector for the standalone component when library name has a slash', async () => { await runLibraryGeneratorWithOpts({ standalone: true, @@ -1497,10 +1575,7 @@ describe('lib', () => { expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read( - 'my-lib/src/lib/auth/common/auth/common.component.ts', - 'utf-8' - ) + tree.read('my-lib/src/lib/auth/common/auth/common.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -1508,11 +1583,9 @@ describe('lib', () => { await runLibraryGeneratorWithOpts({ standalone: true, flat: true }); expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('my-lib/src/lib/my-lib.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib.component.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read('my-lib/src/lib/my-lib.component.spec.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib.spec.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -1526,13 +1599,10 @@ describe('lib', () => { tree.read('my-dir/my-lib/src/index.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('my-dir/my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8') + tree.read('my-dir/my-lib/src/lib/my-lib/my-lib.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read( - 'my-dir/my-lib/src/lib/my-lib/my-lib.component.spec.ts', - 'utf-8' - ) + tree.read('my-dir/my-lib/src/lib/my-lib/my-lib.spec.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -1547,13 +1617,10 @@ describe('lib', () => { tree.read('my-dir/my-lib/src/index.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('my-dir/my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8') + tree.read('my-dir/my-lib/src/lib/my-lib/my-lib.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read( - 'my-dir/my-lib/src/lib/my-lib/my-lib.component.spec.ts', - 'utf-8' - ) + tree.read('my-dir/my-lib/src/lib/my-lib/my-lib.spec.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -1565,25 +1632,23 @@ describe('lib', () => { }); expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('my-lib/src/lib/my-lib.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib.component.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read('my-lib/src/lib/my-lib.component.spec.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib.spec.ts', 'utf-8') ).toMatchSnapshot(); expect( tree.read('my-lib/src/lib/lib.routes.ts', 'utf-8') ).toMatchSnapshot(); - expect(tree.children('my-lib/src/lib')).toMatchInlineSnapshot(` + expect(tree.children('my-lib/src/lib').sort()).toMatchInlineSnapshot(` [ "lib.routes.ts", - "my-lib.component.css", - "my-lib.component.html", - "my-lib.component.spec.ts", - "my-lib.component.ts", + "my-lib.css", + "my-lib.html", + "my-lib.spec.ts", + "my-lib.ts", ] `); - expect(tree.children('my-lib/src')).toMatchInlineSnapshot(` + expect(tree.children('my-lib/src').sort()).toMatchInlineSnapshot(` [ "index.ts", "lib", @@ -1600,10 +1665,10 @@ describe('lib', () => { tree.read('my-lib/src/lib/lib.routes.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.spec.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.spec.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -1766,10 +1831,10 @@ describe('lib', () => { expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.spec.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.spec.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -1783,11 +1848,9 @@ describe('lib', () => { expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.ts', 'utf-8') ).toMatchSnapshot(); - expect( - tree.exists('my-lib/src/lib/my-lib/my-lib.component.spec.ts') - ).toBeFalsy(); + expect(tree.exists('my-lib/src/lib/my-lib/my-lib.spec.ts')).toBeFalsy(); }); it('should generate a library with a standalone component as entry point and set up view encapsulation and change detection', async () => { @@ -1801,23 +1864,21 @@ describe('lib', () => { expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8') + tree.read('my-lib/src/lib/my-lib/my-lib.ts', 'utf-8') ).toMatchSnapshot(); }); }); describe('angular compat support', () => { - beforeEach(() => { + it('should disable modern class fields behavior in versions lower than v18.1', async () => { updateJson(tree, 'package.json', (json) => ({ ...json, dependencies: { ...json.dependencies, - '@angular/core': '~17.2.0', + '@angular/core': '~18.0.0', }, })); - }); - it('should disable modern class fields behavior', async () => { await runLibraryGeneratorWithOpts(); expect( @@ -1825,5 +1886,148 @@ describe('lib', () => { .useDefineForClassFields ).toBe(false); }); + + it('should not set "typeCheckHostBindings" when strict is true if Angular version is lower than v20', async () => { + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.0.0', + }, + })); + + await runLibraryGeneratorWithOpts(); + + expect(readJson(tree, 'my-lib/tsconfig.json').angularCompilerOptions) + .toMatchInlineSnapshot(` + { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true, + } + `); + }); + + it('should generate components with the "component" type for versions lower than v20', async () => { + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + await generateTestApplication(tree, { + directory: 'app1', + routing: true, + standalone: true, + skipFormat: true, + }); + + await runLibraryGeneratorWithOpts({ + standalone: true, + routing: true, + lazy: true, + parent: 'app1/src/app/app.routes.ts', + skipFormat: true, + }); + + expect(tree.read('my-lib/src/index.ts', 'utf-8')).toMatchInlineSnapshot(` + "export * from './lib/lib.routes'; + + export * from './lib/my-lib/my-lib.component';" + `); + expect(tree.read('my-lib/src/lib/my-lib/my-lib.component.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Component({ + selector: 'lib-my-lib', + imports: [CommonModule], + templateUrl: './my-lib.component.html', + styleUrl: './my-lib.component.css' + }) + export class MyLibComponent {} + " + `); + expect(tree.exists('my-lib/src/lib/my-lib/my-lib.component.html')).toBe( + true + ); + expect(tree.exists('my-lib/src/lib/my-lib/my-lib.component.css')).toBe( + true + ); + expect( + tree.read('my-lib/src/lib/my-lib/my-lib.component.spec.ts', 'utf-8') + ).toMatchInlineSnapshot(` + "import { ComponentFixture, TestBed } from '@angular/core/testing'; + import { MyLibComponent } from './my-lib.component'; + + describe('MyLibComponent', () => { + let component: MyLibComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MyLibComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(MyLibComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + }); + " + `); + expect(tree.read('my-lib/src/lib/lib.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Route } from '@angular/router'; + import { MyLibComponent } from './my-lib/my-lib.component'; + + export const myLibRoutes: Route[] = [ + { path: '', component: MyLibComponent } + ]; + " + `); + expect(tree.read('app1/src/app/app.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Route } from '@angular/router'; + + export const appRoutes: Route[] = [ + { path: 'my-lib', loadChildren: () => import('@proj/my-lib').then(m => m.myLibRoutes) },]; + " + `); + }); + + it('should generate modules with the "." type separator for versions lower than v20', async () => { + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~19.2.0', + }, + })); + + await runLibraryGeneratorWithOpts({ + standalone: false, + skipFormat: true, + }); + + expect(tree.read('my-lib/src/lib/my-lib.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @NgModule({ + imports: [CommonModule], + }) + export class MyLibModule {} + " + `); + }); }); }); diff --git a/packages/angular/src/generators/library/library.ts b/packages/angular/src/generators/library/library.ts index 37b064af18..7f74cece78 100644 --- a/packages/angular/src/generators/library/library.ts +++ b/packages/angular/src/generators/library/library.ts @@ -3,36 +3,32 @@ import { formatFiles, GeneratorCallback, installPackagesTask, - joinPathFragments, + runTasksInSerial, Tree, } from '@nx/devkit'; -import { addTsConfigPath, initGenerator as jsInitGenerator } from '@nx/js'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; +import { initGenerator as jsInitGenerator } from '@nx/js'; +import { releaseTasks } from '@nx/js/src/generators/library/utils/add-release-config'; +import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; import init from '../../generators/init/init'; +import { UnitTestRunner } from '../../utils/test-runners'; import addLintingGenerator from '../add-linting/add-linting'; import setupTailwindGenerator from '../setup-tailwind/setup-tailwind'; -import { versions } from '../utils/version-utils'; +import { addJest } from '../utils/add-jest'; +import { addVitest } from '../utils/add-vitest'; import { addBuildableLibrariesPostCssDependencies } from '../utils/dependencies'; +import { ensureAngularDependencies } from '../utils/ensure-angular-dependencies'; +import { versions } from '../utils/version-utils'; import { addModule } from './lib/add-module'; +import { addProject } from './lib/add-project'; import { addStandaloneComponent } from './lib/add-standalone-component'; -import { - enableStrictTypeChecking, - setLibraryStrictDefault, -} from './lib/enable-strict-type-checking'; +import { createFiles } from './lib/create-files'; import { normalizeOptions } from './lib/normalize-options'; import { NormalizedSchema } from './lib/normalized-schema'; -import { updateLibPackageNpmScope } from './lib/update-lib-package-npm-scope'; -import { updateTsConfig } from './lib/update-tsconfig'; -import { Schema } from './schema'; -import { createFiles } from './lib/create-files'; -import { addProject } from './lib/add-project'; -import { addJest } from '../utils/add-jest'; import { setGeneratorDefaults } from './lib/set-generator-defaults'; -import { ensureAngularDependencies } from '../utils/ensure-angular-dependencies'; -import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; -import { UnitTestRunner } from '../../utils/test-runners'; -import { addVitest } from '../utils/add-vitest'; -import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; -import { releaseTasks } from '@nx/js/src/generators/library/utils/add-release-config'; +import { updateLibPackageNpmScope } from './lib/update-lib-package-npm-scope'; +import { updateTsConfigFiles } from './lib/update-tsconfig-files'; +import { Schema } from './schema'; export async function libraryGenerator( tree: Tree, @@ -76,7 +72,7 @@ export async function libraryGenerator( const project = await addProject(tree, libraryOptions); createFiles(tree, options, project); - updateTsConfig(tree, libraryOptions); + updateTsConfigFiles(tree, libraryOptions); await addUnitTestRunner(tree, libraryOptions); updateNpmScopeIfBuildableOrPublishable(tree, libraryOptions); setGeneratorDefaults(tree, options); @@ -87,7 +83,6 @@ export async function libraryGenerator( await addStandaloneComponent(tree, options); } - setStrictMode(tree, libraryOptions); await addLinting(tree, libraryOptions); if (libraryOptions.addTailwind) { @@ -112,23 +107,19 @@ export async function libraryGenerator( true ); addBuildableLibrariesPostCssDependencies(tree); - if (libraryOptions.publishable) { - await releaseTasks(tree); - } } - addTsConfigPath(tree, libraryOptions.importPath, [ - joinPathFragments(libraryOptions.projectRoot, './src', 'index.ts'), - ]); - if (!libraryOptions.skipFormat) { await formatFiles(tree); } - return () => { - installPackagesTask(tree); - logShowProjectCommand(libraryOptions.name); - }; + const tasks: GeneratorCallback[] = [() => installPackagesTask(tree)]; + if (libraryOptions.publishable) { + tasks.push(await releaseTasks(tree)); + } + tasks.push(() => logShowProjectCommand(libraryOptions.name)); + + return runTasksInSerial(...tasks); } async function addUnitTestRunner( @@ -164,17 +155,6 @@ function updateNpmScopeIfBuildableOrPublishable( } } -function setStrictMode( - host: Tree, - options: NormalizedSchema['libraryOptions'] -) { - if (options.strict) { - enableStrictTypeChecking(host, options); - } else { - setLibraryStrictDefault(host, options.strict); - } -} - async function addLinting( host: Tree, options: NormalizedSchema['libraryOptions'] diff --git a/packages/angular/src/generators/move/lib/update-module-name.ts b/packages/angular/src/generators/move/lib/update-module-name.ts index 89157ab1a7..f73bc14461 100644 --- a/packages/angular/src/generators/move/lib/update-module-name.ts +++ b/packages/angular/src/generators/move/lib/update-module-name.ts @@ -44,33 +44,41 @@ export function updateModuleName( const findModuleName = new RegExp(`\\b${moduleName.from}`, 'g'); - const moduleFile = { - from: `${oldProjectName}.module`, - to: `${unscopedNewProjectName}.module`, - }; - - const findFileName = new RegExp(`\\b${moduleFile.from}`, 'g'); - - const filesToRename = [ + const moduleFiles = [ { - from: `${project.sourceRoot}/lib/${moduleFile.from}.ts`, - to: `${project.sourceRoot}/lib/${moduleFile.to}.ts`, + from: `${oldProjectName}.module`, + fromRegex: new RegExp(`\\b${oldProjectName}\\.module`, 'g'), + to: `${unscopedNewProjectName}.module`, }, { - from: `${project.sourceRoot}/lib/${moduleFile.from}.spec.ts`, - to: `${project.sourceRoot}/lib/${moduleFile.to}.spec.ts`, + from: `${oldProjectName}-module`, + fromRegex: new RegExp(`\\b${oldProjectName}-module`, 'g'), + to: `${unscopedNewProjectName}-module`, }, - ].filter((rename) => rename.from !== rename.to); + ]; + + const filesToRename = moduleFiles.flatMap((moduleFile) => + [ + { + from: `${project.sourceRoot}/lib/${moduleFile.from}.ts`, + to: `${project.sourceRoot}/lib/${moduleFile.to}.ts`, + }, + { + from: `${project.sourceRoot}/lib/${moduleFile.from}.spec.ts`, + to: `${project.sourceRoot}/lib/${moduleFile.to}.spec.ts`, + }, + ].filter((rename) => rename.from !== rename.to) + ); if (filesToRename.length === 0) { return; } const replacements = [ - { - regex: findFileName, + ...moduleFiles.map((moduleFile) => ({ + regex: moduleFile.fromRegex, replaceWith: moduleFile.to, - }, + })), { regex: findModuleName, replaceWith: moduleName.to, diff --git a/packages/angular/src/generators/move/lib/update-secondary-entry-points.ts b/packages/angular/src/generators/move/lib/update-secondary-entry-points.ts index 8406f6c534..db9b746d41 100644 --- a/packages/angular/src/generators/move/lib/update-secondary-entry-points.ts +++ b/packages/angular/src/generators/move/lib/update-secondary-entry-points.ts @@ -13,9 +13,6 @@ const libraryExecutors = [ '@angular/build:ng-packagr', '@nx/angular:ng-packagr-lite', '@nx/angular:package', - // TODO(v17): remove when @nrwl/* scope is removed - '@nrwl/angular:ng-packagr-lite', - '@nrwl/angular:package', ]; export function updateSecondaryEntryPoints( diff --git a/packages/angular/src/generators/move/move.spec.ts b/packages/angular/src/generators/move/move.spec.ts index 62f5f32b42..27fc45c37d 100644 --- a/packages/angular/src/generators/move/move.spec.ts +++ b/packages/angular/src/generators/move/move.spec.ts @@ -1,7 +1,7 @@ import 'nx/src/internal-testing-utils/mock-project-graph'; import * as devkit from '@nx/devkit'; -import { ProjectGraph, readJson, Tree } from '@nx/devkit'; +import { type ProjectGraph, readJson, type Tree, updateJson } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { UnitTestRunner } from '../../utils/test-runners'; import { librarySecondaryEntryPointGenerator } from '../library-secondary-entry-point/library-secondary-entry-point'; @@ -30,7 +30,7 @@ describe('@nx/angular:move', () => { } beforeEach(async () => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + tree = createTreeWithEmptyWorkspace(); await generateTestLibrary(tree, { directory: 'my-lib', @@ -59,7 +59,7 @@ describe('@nx/angular:move', () => { skipFormat: true, }); - expect(tree.exists('mynewlib/src/lib/mynewlib.module.ts')).toEqual(true); + expect(tree.exists('mynewlib/src/lib/mynewlib-module.ts')).toEqual(true); }); it('should update ng-package.json dest property', async () => { @@ -121,8 +121,8 @@ describe('@nx/angular:move', () => { skipFormat: true, }); - expect(tree.exists('my/lib/src/lib/my-lib.module.ts')).toBe(true); - const moduleFile = tree.read('my/lib/src/lib/my-lib.module.ts', 'utf-8'); + expect(tree.exists('my/lib/src/lib/my-lib-module.ts')).toBe(true); + const moduleFile = tree.read('my/lib/src/lib/my-lib-module.ts', 'utf-8'); expect(moduleFile).toContain(`export class MyLibModule {}`); }); @@ -138,7 +138,7 @@ describe('@nx/angular:move', () => { unitTestRunner: UnitTestRunner.Jest, }); tree.write( - 'my-lib/src/lib/my-lib.module.ts', + 'my-lib/src/lib/my-lib-module.ts', `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; @@ -149,7 +149,7 @@ describe('@nx/angular:move', () => { ); tree.write( - 'my-lib/src/lib/my-lib.module.spec.ts', + 'my-lib/src/lib/my-lib-module.spec.ts', `import { async, TestBed } from '@angular/core/testing'; import { MyLibModule } from './my-lib.module'; @@ -166,7 +166,7 @@ describe('@nx/angular:move', () => { });` ); tree.write( - 'my-lib2/src/lib/my-lib2.module.ts', + 'my-lib2/src/lib/my-lib2-module.ts', `import { MyLibModule } from '@proj/my-lib'; export class MyLib2Module extends MyLibModule {} @@ -185,21 +185,21 @@ describe('@nx/angular:move', () => { skipFormat: true, }); - expect(tree.exists('shared/my-lib/src/lib/shared-my-lib.module.ts')).toBe( + expect(tree.exists('shared/my-lib/src/lib/shared-my-lib-module.ts')).toBe( true ); expect( - tree.exists('shared/my-lib/src/lib/shared-my-lib.module.spec.ts') + tree.exists('shared/my-lib/src/lib/shared-my-lib-module.spec.ts') ).toBe(true); const moduleFile = tree.read( - 'shared/my-lib/src/lib/shared-my-lib.module.ts', + 'shared/my-lib/src/lib/shared-my-lib-module.ts', 'utf-8' ); expect(moduleFile).toContain(`export class SharedMyLibModule {}`); const moduleSpecFile = tree.read( - 'shared/my-lib/src/lib/shared-my-lib.module.spec.ts', + 'shared/my-lib/src/lib/shared-my-lib-module.spec.ts', 'utf-8' ); expect(moduleSpecFile).toContain( @@ -224,7 +224,7 @@ describe('@nx/angular:move', () => { }); const importerFile = tree.read( - 'my-lib2/src/lib/my-lib2.module.ts', + 'my-lib2/src/lib/my-lib2-module.ts', 'utf-8' ); expect(importerFile).toContain( @@ -248,7 +248,7 @@ describe('@nx/angular:move', () => { const indexFile = tree.read('shared/my-lib/src/index.ts', 'utf-8'); expect(indexFile).toContain( - `export * from './lib/shared-my-lib.module';` + `export * from './lib/shared-my-lib-module';` ); }); }); @@ -285,11 +285,11 @@ describe('@nx/angular:move', () => { }); expect( - tree.exists('my-destination/src/lib/my-destination.module.ts') + tree.exists('my-destination/src/lib/my-destination-module.ts') ).toBe(true); const moduleFile = tree.read( - 'my-destination/src/lib/my-destination.module.ts', + 'my-destination/src/lib/my-destination-module.ts', 'utf-8' ); expect(moduleFile).toContain(`export class MyDestinationModule {}`); @@ -331,7 +331,7 @@ describe('@nx/angular:move', () => { const indexFile = tree.read('my-destination/src/index.ts', 'utf-8'); expect(indexFile).toContain( - `export * from './lib/my-destination.module';` + `export * from './lib/my-destination-module';` ); }); @@ -359,10 +359,118 @@ describe('@nx/angular:move', () => { }); const moduleFile = tree.read( - 'my-lib-demo/src/lib/my-lib-demo.module.ts', + 'my-lib-demo/src/lib/my-lib-demo-module.ts', 'utf-8' ); expect(moduleFile).toContain(`export class MyLibDemoModule {}`); }); }); + + describe('legacy "." module type separator', () => { + beforeEach(async () => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should move project that uses "." module type separator', async () => { + updateJson(tree, 'nx.json', (json) => { + json.generators = { + ...json.generators, + '@nx/angular:module': { + typeSeparator: '.', + }, + }; + return json; + }); + addProjectToGraph('my-lib'); + await generateTestLibrary(tree, { + directory: 'my-lib', + buildable: true, + standalone: false, + skipFormat: true, + }); + + await angularMoveGenerator(tree, { + projectName: 'my-lib', + destination: 'my-new-lib', + newProjectName: 'my-new-lib', + updateImportPath: true, + skipFormat: true, + }); + + expect(tree.exists('my-lib/src/lib/my-lib.module.ts')).toBe(false); + expect(tree.read('my-new-lib/src/lib/my-new-lib.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @NgModule({ + imports: [CommonModule], + }) + export class MyNewLibModule {} + " + `); + expect(tree.exists('my-lib/ng-package.json')).toBe(false); + expect(tree.read('my-new-lib/ng-package.json', 'utf-8')) + .toMatchInlineSnapshot(` + "{ + "$schema": "../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../dist/my-new-lib", + "lib": { + "entryFile": "src/index.ts" + } + } + " + `); + }); + + it('should move project when angular version is lower than v20', async () => { + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + addProjectToGraph('my-lib'); + await generateTestLibrary(tree, { + directory: 'my-lib', + buildable: true, + standalone: false, + skipFormat: true, + }); + + await angularMoveGenerator(tree, { + projectName: 'my-lib', + destination: 'my-new-lib', + newProjectName: 'my-new-lib', + updateImportPath: true, + skipFormat: true, + }); + + expect(tree.exists('my-lib/src/lib/my-lib.module.ts')).toBe(false); + expect(tree.read('my-new-lib/src/lib/my-new-lib.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @NgModule({ + imports: [CommonModule], + }) + export class MyNewLibModule {} + " + `); + expect(tree.exists('my-lib/ng-package.json')).toBe(false); + expect(tree.read('my-new-lib/ng-package.json', 'utf-8')) + .toMatchInlineSnapshot(` + "{ + "$schema": "../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../dist/my-new-lib", + "lib": { + "entryFile": "src/index.ts" + } + } + " + `); + }); + }); }); diff --git a/packages/angular/src/generators/ng-add/migrators/builders/angular-devkit-karma.migrator.ts b/packages/angular/src/generators/ng-add/migrators/builders/angular-devkit-karma.migrator.ts index cbd00ad6bf..0d5e5b180a 100644 --- a/packages/angular/src/generators/ng-add/migrators/builders/angular-devkit-karma.migrator.ts +++ b/packages/angular/src/generators/ng-add/migrators/builders/angular-devkit-karma.migrator.ts @@ -22,7 +22,7 @@ export class AngularDevkitKarmaMigrator extends BuilderMigrator { ) { super( tree, - ['@angular-devkit/build-angular:karma'], + ['@angular/build:karma', '@angular-devkit/build-angular:karma'], 'karma', project, projectConfig, diff --git a/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.spec.ts b/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.spec.ts index 074795923e..8f10deffa6 100644 --- a/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.spec.ts +++ b/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.spec.ts @@ -139,7 +139,7 @@ describe('app migrator', () => { `The "build" target is using a builder "@not/supported:builder" that's not currently supported by the automated migration. The target will be skipped.`, ]); expect(result[0].hint).toMatchInlineSnapshot( - `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:application", "@angular-devkit/build-angular:browser", "@angular-devkit/build-angular:browser-esbuild", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:prerender", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders:ssr-dev-server", "@angular-devkit/build-angular:ssr-dev-server", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` + `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular/build:application", "@angular-devkit/build-angular:application", "@angular-devkit/build-angular:browser", "@angular-devkit/build-angular:browser-esbuild", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular/build:extract-i18n", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:prerender", "@angular/build:dev-server", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders:ssr-dev-server", "@angular-devkit/build-angular:ssr-dev-server", "@angular/build:karma", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` ); }); @@ -162,7 +162,7 @@ describe('app migrator', () => { `The "test" target is using a builder "@other/not-supported:builder" that's not currently supported by the automated migration. The target will be skipped.`, ]); expect(result[0].hint).toMatchInlineSnapshot( - `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:application", "@angular-devkit/build-angular:browser", "@angular-devkit/build-angular:browser-esbuild", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:prerender", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders:ssr-dev-server", "@angular-devkit/build-angular:ssr-dev-server", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` + `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular/build:application", "@angular-devkit/build-angular:application", "@angular-devkit/build-angular:browser", "@angular-devkit/build-angular:browser-esbuild", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular/build:extract-i18n", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:prerender", "@angular/build:dev-server", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders:ssr-dev-server", "@angular-devkit/build-angular:ssr-dev-server", "@angular/build:karma", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` ); }); @@ -181,7 +181,7 @@ describe('app migrator', () => { `The "my-build" target is using a builder "@not/supported:builder" that's not currently supported by the automated migration. The target will be skipped.`, ]); expect(result[0].hint).toMatchInlineSnapshot( - `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:application", "@angular-devkit/build-angular:browser", "@angular-devkit/build-angular:browser-esbuild", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:prerender", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders:ssr-dev-server", "@angular-devkit/build-angular:ssr-dev-server", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` + `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular/build:application", "@angular-devkit/build-angular:application", "@angular-devkit/build-angular:browser", "@angular-devkit/build-angular:browser-esbuild", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular/build:extract-i18n", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:prerender", "@angular/build:dev-server", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders:ssr-dev-server", "@angular-devkit/build-angular:ssr-dev-server", "@angular/build:karma", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` ); }); @@ -710,6 +710,7 @@ describe('app migrator', () => { const { targets } = readProjectConfiguration(tree, 'app1'); expect(targets.build).toStrictEqual({ executor: '@angular-devkit/build-angular:browser', + outputs: ['{options.outputPath}'], options: { outputPath: 'dist/apps/app1', index: 'apps/app1/src/index.html', @@ -785,6 +786,7 @@ describe('app migrator', () => { const { targets } = readProjectConfiguration(tree, 'app1'); expect(targets.build).toStrictEqual({ executor: '@angular-devkit/build-angular:application', + outputs: ['{options.outputPath}'], options: { outputPath: 'dist/apps/app1', index: 'apps/app1/src/index.html', @@ -853,6 +855,7 @@ describe('app migrator', () => { const { targets } = readProjectConfiguration(tree, 'app1'); expect(targets.build).toStrictEqual({ executor: '@angular-devkit/build-angular:browser', + outputs: ['{options.outputPath}'], options: { outputPath: 'dist/apps/app1', index: 'apps/app1/src/index.html', @@ -910,6 +913,7 @@ describe('app migrator', () => { const { targets } = readProjectConfiguration(tree, 'app1'); expect(targets.myCustomBuildTarget).toStrictEqual({ executor: '@angular-devkit/build-angular:browser', + outputs: ['{options.outputPath}'], options: { outputPath: 'dist/apps/app1', index: 'apps/app1/src/index.html', @@ -954,6 +958,7 @@ describe('app migrator', () => { const { targets } = readProjectConfiguration(tree, 'app1'); expect(targets.build).toStrictEqual({ executor: '@angular-devkit/build-angular:browser', + outputs: ['{options.outputPath}'], options: { outputPath: 'dist/apps/app1/browser' }, }); }); diff --git a/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.ts b/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.ts index 20328c4086..da100678b7 100644 --- a/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.ts +++ b/packages/angular/src/generators/ng-add/migrators/projects/app.migrator.ts @@ -1,4 +1,4 @@ -import type { Tree } from '@nx/devkit'; +import type { TargetConfiguration, Tree } from '@nx/devkit'; import { joinPathFragments, offsetFromRoot, @@ -34,6 +34,7 @@ type SupportedTargets = const supportedTargets: Record = { build: { builders: [ + '@angular/build:application', '@angular-devkit/build-angular:application', '@angular-devkit/build-angular:browser', '@angular-devkit/build-angular:browser-esbuild', @@ -46,14 +47,24 @@ const supportedTargets: Record = { '@cypress/schematic:cypress', ], }, - i18n: { builders: ['@angular-devkit/build-angular:extract-i18n'] }, + i18n: { + builders: [ + '@angular/build:extract-i18n', + '@angular-devkit/build-angular:extract-i18n', + ], + }, prerender: { builders: [ '@nguniversal/builders:prerender', '@angular-devkit/build-angular:prerender', ], }, - serve: { builders: ['@angular-devkit/build-angular:dev-server'] }, + serve: { + builders: [ + '@angular/build:dev-server', + '@angular-devkit/build-angular:dev-server', + ], + }, server: { builders: ['@angular-devkit/build-angular:server'] }, serveSsr: { builders: [ @@ -231,14 +242,48 @@ export class AppMigrator extends ProjectMigrator { this.updateTsConfigFileUsedByServerTarget(projectOffsetFromRoot); } - private convertBuildOptions(buildOptions: any): void { - buildOptions.outputPath = - buildOptions.outputPath && - joinPathFragments( - 'dist', - this.project.newRoot, - this.targetNames.server ? 'browser' : '' - ); + private convertBuildOptions( + buildOptions: any, + target: TargetConfiguration, + updateOutputs: boolean = true + ): void { + const { executor } = target; + const isApplicationBuilder = + executor === '@angular/build:application' || + executor === '@angular-devkit/build-angular:application'; + + if (updateOutputs) { + if (buildOptions.outputPath) { + if (isApplicationBuilder) { + if (typeof buildOptions.outputPath === 'string') { + buildOptions.outputPath = joinPathFragments( + 'dist', + this.project.newRoot + ); + } else if (buildOptions.outputPath.base) { + buildOptions.outputPath.base = joinPathFragments( + 'dist', + this.project.newRoot + ); + } + } else { + buildOptions.outputPath = joinPathFragments( + 'dist', + this.project.newRoot, + this.targetNames.server ? 'browser' : '' + ); + } + } else if (isApplicationBuilder) { + buildOptions.outputPath = joinPathFragments('dist', this.projectName); + } + + if (typeof buildOptions.outputPath === 'string') { + target.outputs = ['{options.outputPath}']; + } else if (buildOptions.outputPath?.base) { + target.outputs = ['{options.outputPath.base}']; + } + } + if (buildOptions.index) { if (typeof buildOptions.index === 'string') { buildOptions.index = this.convertAsset(buildOptions.index); @@ -355,9 +400,9 @@ export class AppMigrator extends ProjectMigrator { } } - this.convertBuildOptions(buildTarget.options ?? {}); + this.convertBuildOptions(buildTarget.options ?? {}, buildTarget); Object.values(buildTarget.configurations ?? {}).forEach((config) => - this.convertBuildOptions(config) + this.convertBuildOptions(config, buildTarget, false) ); } diff --git a/packages/angular/src/generators/ng-add/migrators/projects/lib.migrator.spec.ts b/packages/angular/src/generators/ng-add/migrators/projects/lib.migrator.spec.ts index 1da9a98458..bfaefebf3c 100644 --- a/packages/angular/src/generators/ng-add/migrators/projects/lib.migrator.spec.ts +++ b/packages/angular/src/generators/ng-add/migrators/projects/lib.migrator.spec.ts @@ -140,7 +140,7 @@ describe('lib migrator', () => { `The "build" target is using a builder "@not/supported:builder" that's not currently supported by the automated migration. The target will be skipped.`, ]); expect(result[0].hint).toMatchInlineSnapshot( - `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:ng-packagr", "@angular/build:ng-packagr", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` + `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:ng-packagr", "@angular/build:ng-packagr", "@angular/build:karma", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` ); }); @@ -163,7 +163,7 @@ describe('lib migrator', () => { `The "test" target is using a builder "@other/not-supported:builder" that's not currently supported by the automated migration. The target will be skipped.`, ]); expect(result[0].hint).toMatchInlineSnapshot( - `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:ng-packagr", "@angular/build:ng-packagr", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` + `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:ng-packagr", "@angular/build:ng-packagr", "@angular/build:karma", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` ); }); @@ -182,7 +182,7 @@ describe('lib migrator', () => { `The "my-build" target is using a builder "@not/supported:builder" that's not currently supported by the automated migration. The target will be skipped.`, ]); expect(result[0].hint).toMatchInlineSnapshot( - `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:ng-packagr", "@angular/build:ng-packagr", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` + `"Make sure to manually migrate the target configuration and any possible associated files. Alternatively, you could revert the migration, change the builder to one of the builders supported by the automated migration ("@angular-devkit/build-angular:ng-packagr", "@angular/build:ng-packagr", "@angular/build:karma", "@angular-devkit/build-angular:karma" and "@angular-eslint/builder:lint"), and run the migration again."` ); }); diff --git a/packages/angular/src/generators/ngrx-feature-store/__snapshots__/ngrx-feature-store.spec.ts.snap b/packages/angular/src/generators/ngrx-feature-store/__snapshots__/ngrx-feature-store.spec.ts.snap index 29a35dc18c..1266514837 100644 --- a/packages/angular/src/generators/ngrx-feature-store/__snapshots__/ngrx-feature-store.spec.ts.snap +++ b/packages/angular/src/generators/ngrx-feature-store/__snapshots__/ngrx-feature-store.spec.ts.snap @@ -6,7 +6,7 @@ export * from './lib/+state/users/users.models'; export * from './lib/+state/users/users.selectors'; export * from './lib/+state/users/users.reducer'; export * from './lib/+state/users/users.actions'; -export * from './lib/feature-module.module'; +export * from './lib/feature-module-module'; " `; @@ -646,7 +646,7 @@ export * from './lib/+state/users.models'; export * from './lib/+state/users.selectors'; export * from './lib/+state/users.reducer'; export * from './lib/+state/users.actions'; -export * from './lib/feature-module.module'; +export * from './lib/feature-module-module'; " `; @@ -662,7 +662,7 @@ export * from './lib/+state/users.facade'; export * from './lib/+state/users.models'; export { UsersActions, UsersFeature, UsersSelectors }; -export * from './lib/feature-module.module'; +export * from './lib/feature-module-module'; " `; @@ -1088,7 +1088,7 @@ describe('Users Selectors', () => { exports[`ngrx-feature-store Standalone APIs should generate the files with the correct content 11`] = ` "import { Route } from '@angular/router'; -import { FeatureComponent } from './feature/feature.component'; +import { Feature } from './feature/feature'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; @@ -1096,7 +1096,7 @@ import { UsersEffects } from './+state/users.effects'; import { UsersFacade } from './+state/users.facade'; export const featureRoutes: Route[] = [ - { path: '', component: FeatureComponent , providers: [UsersFacade, provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]} + { path: '', component: Feature , providers: [UsersFacade, provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]} ]; " `; @@ -1109,7 +1109,7 @@ export * from './lib/+state/users.reducer'; export * from './lib/+state/users.actions'; export * from './lib/lib.routes'; -export * from './lib/feature/feature.component';" +export * from './lib/feature/feature';" `; exports[`ngrx-feature-store Standalone APIs should have the correct entry point when --barrels=true 1`] = ` @@ -1126,5 +1126,5 @@ export * from './lib/+state/users.models'; export { UsersActions, UsersFeature, UsersSelectors }; export * from './lib/lib.routes'; -export * from './lib/feature/feature.component';" +export * from './lib/feature/feature';" `; diff --git a/packages/angular/src/generators/ngrx-feature-store/ngrx-feature-store.spec.ts b/packages/angular/src/generators/ngrx-feature-store/ngrx-feature-store.spec.ts index 55334679a1..a8ba6ac853 100644 --- a/packages/angular/src/generators/ngrx-feature-store/ngrx-feature-store.spec.ts +++ b/packages/angular/src/generators/ngrx-feature-store/ngrx-feature-store.spec.ts @@ -9,7 +9,7 @@ import { ngrxVersion } from '../../utils/versions'; describe('ngrx-feature-store', () => { describe('NgModule', () => { - const parent = 'feature-module/src/lib/feature-module.module.ts'; + const parent = 'feature-module/src/lib/feature-module-module.ts'; it('should error when parent cannot be found', async () => { // ARRANGE const tree = createTreeWithEmptyWorkspace(); @@ -23,8 +23,8 @@ describe('ngrx-feature-store', () => { parent, skipFormat: true, }) - ).rejects.toThrowError( - `Parent does not exist: feature-module/src/lib/feature-module.module.ts.` + ).rejects.toThrow( + `Parent does not exist: feature-module/src/lib/feature-module-module.ts.` ); }); @@ -333,9 +333,7 @@ describe('ngrx-feature-store', () => { parent, skipFormat: true, }) - ).rejects.toThrowError( - `Parent does not exist: feature/src/lib/lib.routes.ts` - ); + ).rejects.toThrow(`Parent does not exist: feature/src/lib/lib.routes.ts`); }); it('should update package.json', async () => { diff --git a/packages/angular/src/generators/ngrx-root-store/__snapshots__/ngrx-root-store.spec.ts.snap b/packages/angular/src/generators/ngrx-root-store/__snapshots__/ngrx-root-store.spec.ts.snap index 56a631eec9..c6b4722ccf 100644 --- a/packages/angular/src/generators/ngrx-root-store/__snapshots__/ngrx-root-store.spec.ts.snap +++ b/packages/angular/src/generators/ngrx-root-store/__snapshots__/ngrx-root-store.spec.ts.snap @@ -1,12 +1,12 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`NgRxRootStoreGenerator NgModule should add a facade when --facade=true 1`] = ` -"import { NgModule } from '@angular/core'; +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; @@ -15,7 +15,7 @@ import { UsersEffects } from './+state/users.effects'; import { UsersFacade } from './+state/users.facade'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes), @@ -34,8 +34,8 @@ import { UsersFacade } from './+state/users.facade'; StoreModule.forFeature(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), EffectsModule.forFeature([UsersEffects]), ], - providers: [UsersFacade], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners(), UsersFacade], + bootstrap: [App], }) export class AppModule {} " @@ -73,12 +73,12 @@ export class UsersFacade { `; exports[`NgRxRootStoreGenerator NgModule should add a root module and root state when --minimal=false 1`] = ` -"import { NgModule } from '@angular/core'; +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; @@ -86,7 +86,7 @@ import * as fromUsers from './+state/users.reducer'; import { UsersEffects } from './+state/users.effects'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes), @@ -105,8 +105,8 @@ import { UsersEffects } from './+state/users.effects'; StoreModule.forFeature(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), EffectsModule.forFeature([UsersEffects]), ], - providers: [], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners()], + bootstrap: [App], }) export class AppModule {} " @@ -358,18 +358,18 @@ describe('Users Selectors', () => { `; exports[`NgRxRootStoreGenerator NgModule should add an empty root module when --minimal=true 1`] = ` -"import { NgModule } from '@angular/core'; +"import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes), @@ -383,27 +383,27 @@ import { StoreRouterConnectingModule } from '@ngrx/router-store'; }), StoreRouterConnectingModule.forRoot(), ], - providers: [], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners()], + bootstrap: [App], }) export class AppModule {} " `; exports[`NgRxRootStoreGenerator NgModule should instrument the store devtools when "addDevTools: true" 1`] = ` -"import { NgModule, isDevMode } from '@angular/core'; +"import { NgModule, provideBrowserGlobalErrorListeners, isDevMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { appRoutes } from './app.routes'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import { StoreDevtoolsModule } from '@ngrx/store-devtools'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes), @@ -418,15 +418,15 @@ import { StoreRouterConnectingModule } from '@ngrx/router-store'; }), StoreRouterConnectingModule.forRoot(), ], - providers: [], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners()], + bootstrap: [App], }) export class AppModule {} " `; exports[`NgRxRootStoreGenerator Standalone APIs should add a facade when --facade=true 1`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; @@ -436,7 +436,11 @@ import { UsersEffects } from './+state/users.effects'; import { UsersFacade } from './+state/users.facade'; export const appConfig: ApplicationConfig = { - providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),UsersFacade,provideStore(),provideEffects(),provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),UsersFacade,provideStore(),provideEffects(), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; @@ -473,7 +477,7 @@ export class UsersFacade { `; exports[`NgRxRootStoreGenerator Standalone APIs should add a root module and root state when --minimal=false 1`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; @@ -482,7 +486,11 @@ import * as fromUsers from './+state/users.reducer'; import { UsersEffects } from './+state/users.effects'; export const appConfig: ApplicationConfig = { - providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),provideStore(),provideEffects(),provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),provideStore(),provideEffects(), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; @@ -722,20 +730,24 @@ describe('Users Selectors', () => { `; exports[`NgRxRootStoreGenerator Standalone APIs should add an empty root module when --minimal=true 1`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; export const appConfig: ApplicationConfig = { - providers: [provideStore(),provideEffects(),provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideStore(),provideEffects(), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; exports[`NgRxRootStoreGenerator Standalone APIs should instrument the store devtools when "addDevTools: true" 1`] = ` -"import { ApplicationConfig, provideZoneChangeDetection, isDevMode } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection, isDevMode } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore } from '@ngrx/store'; @@ -743,7 +755,11 @@ import { provideEffects } from '@ngrx/effects'; import { provideStoreDevtools } from '@ngrx/store-devtools'; export const appConfig: ApplicationConfig = { - providers: [provideStore(),provideStoreDevtools({ logOnly: !isDevMode() }),provideEffects(),provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideStore(),provideStoreDevtools({ logOnly: !isDevMode() }),provideEffects(), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; diff --git a/packages/angular/src/generators/ngrx-root-store/lib/normalize-options.ts b/packages/angular/src/generators/ngrx-root-store/lib/normalize-options.ts index 42df1dac64..13785601e7 100644 --- a/packages/angular/src/generators/ngrx-root-store/lib/normalize-options.ts +++ b/packages/angular/src/generators/ngrx-root-store/lib/normalize-options.ts @@ -35,8 +35,13 @@ export function normalizeOptions( project.sourceRoot, 'app/app.config.ts' ); - const appMainPath = + let appMainPath = project.targets.build.options.main ?? project.targets.build.options.browser; + if (!appMainPath) { + const sourceRoot = + project.sourceRoot ?? joinPathFragments(project.root, 'src'); + appMainPath = joinPathFragments(sourceRoot, 'main.ts'); + } /** If NgModule App * -> Use App Module @@ -45,10 +50,10 @@ export function normalizeOptions( * --> If so, use that * --> If not, use main.ts */ - const ngModulePath = joinPathFragments( - project.sourceRoot, - 'app/app.module.ts' - ); + let ngModulePath = joinPathFragments(project.sourceRoot, 'app/app.module.ts'); + if (!tree.exists(ngModulePath)) { + ngModulePath = joinPathFragments(project.sourceRoot, 'app/app-module.ts'); + } const parent = !isStandalone && tree.exists(ngModulePath) ? ngModulePath diff --git a/packages/angular/src/generators/ngrx-root-store/ngrx-root-store.spec.ts b/packages/angular/src/generators/ngrx-root-store/ngrx-root-store.spec.ts index f2efe3c98d..5a2a28e4d4 100644 --- a/packages/angular/src/generators/ngrx-root-store/ngrx-root-store.spec.ts +++ b/packages/angular/src/generators/ngrx-root-store/ngrx-root-store.spec.ts @@ -19,7 +19,7 @@ describe('NgRxRootStoreGenerator', () => { name: '', skipFormat: true, }) - ).rejects.toThrowError(); + ).rejects.toThrow(); }); it('should error when minimal false, but name is undefined or falsy', async () => { @@ -35,7 +35,7 @@ describe('NgRxRootStoreGenerator', () => { name: undefined, skipFormat: true, }) - ).rejects.toThrowError(); + ).rejects.toThrow(); }); it('should add an empty root module when --minimal=true', async () => { @@ -52,7 +52,7 @@ describe('NgRxRootStoreGenerator', () => { // ASSERT expect( - tree.read('my-app/src/app/app.module.ts', 'utf-8') + tree.read('my-app/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); expect(tree.exists('/my-app/src/app/+state/users.actions.ts')).toBe( false @@ -88,7 +88,7 @@ describe('NgRxRootStoreGenerator', () => { // ASSERT expect( - tree.read('my-app/src/app/app.module.ts', 'utf-8') + tree.read('my-app/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); expect( tree.read('/my-app/src/app/+state/users.actions.ts', 'utf-8') @@ -125,7 +125,7 @@ describe('NgRxRootStoreGenerator', () => { // ASSERT expect( - tree.read('my-app/src/app/app.module.ts', 'utf-8') + tree.read('my-app/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); expect( tree.read('/my-app/src/app/+state/users.facade.ts', 'utf-8') @@ -147,7 +147,7 @@ describe('NgRxRootStoreGenerator', () => { // ASSERT expect( - tree.read('my-app/src/app/app.module.ts', 'utf-8') + tree.read('my-app/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -242,7 +242,7 @@ describe('NgRxRootStoreGenerator', () => { name: '', skipFormat: true, }) - ).rejects.toThrowError(); + ).rejects.toThrow(); }); it('should error when minimal false, but name is undefined or falsy', async () => { @@ -258,7 +258,7 @@ describe('NgRxRootStoreGenerator', () => { name: undefined, skipFormat: true, }) - ).rejects.toThrowError(); + ).rejects.toThrow(); }); it('should add an empty root module when --minimal=true', async () => { diff --git a/packages/angular/src/generators/ngrx/__snapshots__/ngrx.spec.ts.snap b/packages/angular/src/generators/ngrx/__snapshots__/ngrx.spec.ts.snap index 98d812a7df..a2621799fe 100644 --- a/packages/angular/src/generators/ngrx/__snapshots__/ngrx.spec.ts.snap +++ b/packages/angular/src/generators/ngrx/__snapshots__/ngrx.spec.ts.snap @@ -251,7 +251,7 @@ exports[`ngrx NgModule Syntax should add a root module with feature module when "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; @@ -265,8 +265,8 @@ import { StoreRouterConnectingModule } from '@ngrx/router-store'; strictStateImmutability: true } }), EffectsModule.forRoot([UsersEffects]), StoreRouterConnectingModule.forRoot(), StoreModule.forFeature(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer)], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} " @@ -276,7 +276,7 @@ exports[`ngrx NgModule Syntax should add a root module with feature module when "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; @@ -290,8 +290,8 @@ import { StoreRouterConnectingModule } from '@ngrx/router-store'; strictStateImmutability: true } }), EffectsModule.forRoot([UsersEffects]), StoreRouterConnectingModule.forRoot(), StoreModule.forFeature(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer)], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} " @@ -301,7 +301,7 @@ exports[`ngrx NgModule Syntax should add an empty root module when minimal and r "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; @@ -313,8 +313,8 @@ import { StoreRouterConnectingModule } from '@ngrx/router-store'; strictStateImmutability: true } }), EffectsModule.forRoot([]), StoreRouterConnectingModule.forRoot()], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} " @@ -324,7 +324,7 @@ exports[`ngrx NgModule Syntax should format files 1`] = ` "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; @@ -336,8 +336,8 @@ import { UsersEffects } from './+state/users.effects'; StoreModule.forFeature(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), EffectsModule.forFeature([UsersEffects]), ], - declarations: [AppComponent], - bootstrap: [AppComponent], + declarations: [App], + bootstrap: [App], }) export class AppModule {} " @@ -663,11 +663,11 @@ exports[`ngrx NgModule Syntax should not generate imports when skipImport is tru "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; @NgModule({ imports: [BrowserModule, RouterModule.forRoot([])], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} " @@ -685,7 +685,7 @@ export * from './lib/+state/super-users.facade'; export * from './lib/+state/super-users.models'; export { SuperUsersActions, SuperUsersFeature, SuperUsersSelectors }; -export * from './lib/flights.module'; +export * from './lib/flights-module'; " `; @@ -694,7 +694,7 @@ exports[`ngrx NgModule Syntax should update the entry point file with no facade export * from './lib/+state/super-users.selectors'; export * from './lib/+state/super-users.reducer'; export * from './lib/+state/super-users.actions'; -export * from './lib/flights.module'; +export * from './lib/flights-module'; " `; @@ -704,59 +704,59 @@ export * from './lib/+state/super-users.models'; export * from './lib/+state/super-users.selectors'; export * from './lib/+state/super-users.reducer'; export * from './lib/+state/super-users.actions'; -export * from './lib/flights.module'; +export * from './lib/flights-module'; " `; exports[`ngrx Standalone APIs should add a feature module when route is non-empty 1`] = ` "import { Routes } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; import { UsersEffects } from './+state/users.effects'; -export const appRoutes: Routes = [{ path: 'home', component: NxWelcomeComponent , providers: [provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; +export const appRoutes: Routes = [{ path: 'home', component: NxWelcome , providers: [provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; " `; exports[`ngrx Standalone APIs should add a feature module when route is set to default 1`] = ` "import { Routes } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; import { UsersEffects } from './+state/users.effects'; -export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent , providers: [provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; +export const appRoutes: Routes = [{ path: '', component: NxWelcome , providers: [provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; " `; exports[`ngrx Standalone APIs should add a feature module when route is undefined 1`] = ` "import { Routes } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; import { UsersEffects } from './+state/users.effects'; -export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent , providers: [provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; +export const appRoutes: Routes = [{ path: '', component: NxWelcome , providers: [provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; " `; exports[`ngrx Standalone APIs should add a root module with feature module when minimal is set to false 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(App, appConfig).catch((err) => console.error(err) ); " `; exports[`ngrx Standalone APIs should add a root module with feature module when minimal is set to false 2`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; @@ -765,7 +765,11 @@ import * as fromUsers from './+state/users.reducer'; import { UsersEffects } from './+state/users.effects'; export const appConfig: ApplicationConfig = { - providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),provideEffects(),provideStore(),provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),provideEffects(),provideStore(), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; @@ -773,23 +777,27 @@ export const appConfig: ApplicationConfig = { exports[`ngrx Standalone APIs should add an empty provideStore when minimal and root are set to true 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(App, appConfig).catch((err) => console.error(err) ); " `; exports[`ngrx Standalone APIs should add an empty provideStore when minimal and root are set to true 2`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; export const appConfig: ApplicationConfig = { - providers: [provideEffects(),provideStore(),provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideEffects(),provideStore(), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; @@ -797,16 +805,16 @@ export const appConfig: ApplicationConfig = { exports[`ngrx Standalone APIs should add facade provider when facade is true 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { App } from './app/app'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(App, appConfig).catch((err) => console.error(err) ); " `; exports[`ngrx Standalone APIs should add facade provider when facade is true 2`] = ` -"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +"import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; @@ -816,21 +824,25 @@ import { UsersEffects } from './+state/users.effects'; import { UsersFacade } from './+state/users.facade'; export const appConfig: ApplicationConfig = { - providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),provideEffects(),provideStore(),UsersFacade,provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideEffects(UsersEffects),provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer),provideEffects(),provideStore(),UsersFacade, + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `; exports[`ngrx Standalone APIs should add facade provider when facade is true and --root is false 1`] = ` "import { Routes } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; import * as fromUsers from './+state/users.reducer'; import { UsersEffects } from './+state/users.effects'; import { UsersFacade } from './+state/users.facade'; -export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent , providers: [UsersFacade, provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; +export const appRoutes: Routes = [{ path: '', component: NxWelcome , providers: [UsersFacade, provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(UsersEffects)]}]; " `; diff --git a/packages/angular/src/generators/ngrx/ngrx.spec.ts b/packages/angular/src/generators/ngrx/ngrx.spec.ts index 7f0cb55799..742088cafa 100644 --- a/packages/angular/src/generators/ngrx/ngrx.spec.ts +++ b/packages/angular/src/generators/ngrx/ngrx.spec.ts @@ -25,7 +25,7 @@ describe('ngrx', () => { const defaultOptions: NgRxGeneratorOptions = { directory: '+state', minimal: true, - parent: 'myapp/src/app/app.module.ts', + parent: 'myapp/src/app/app-module.ts', name: 'users', skipFormat: true, }; @@ -41,7 +41,7 @@ describe('ngrx', () => { const defaultModuleOptions: NgRxGeneratorOptions = { directory: '+state', minimal: true, - module: 'myapp/src/app/app.module.ts', + module: 'myapp/src/app/app-module.ts', name: 'users', skipFormat: true, }; @@ -54,14 +54,14 @@ describe('ngrx', () => { describe('NgModule Syntax', () => { beforeEach(() => { jest.clearAllMocks(); - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + tree = createTreeWithEmptyWorkspace(); createApp(tree, 'myapp'); appConfig = getAppConfig(); statePath = `${dirname(appConfig.appModule)}/+state`; }); it('should error when the module could not be found', async () => { - const modulePath = 'not-existing.module.ts'; + const modulePath = 'not-existing-module.ts'; await expect( ngrxGenerator(tree, { @@ -72,7 +72,7 @@ describe('ngrx', () => { }); it('should error when the module could not be found using --module', async () => { - const modulePath = 'not-existing.module.ts'; + const modulePath = 'not-existing-module.ts'; await expect( ngrxGenerator(tree, { @@ -90,7 +90,7 @@ describe('ngrx', () => { }); expect( - tree.read('myapp/src/app/app.module.ts', 'utf-8') + tree.read('myapp/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -123,7 +123,7 @@ describe('ngrx', () => { }); expect( - tree.read('myapp/src/app/app.module.ts', 'utf-8') + tree.read('myapp/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -135,7 +135,7 @@ describe('ngrx', () => { }); expect( - tree.read('myapp/src/app/app.module.ts', 'utf-8') + tree.read('myapp/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -144,12 +144,12 @@ describe('ngrx', () => { await ngrxGenerator(tree, { ...defaultOptions, - module: 'no-router-app/src/app/app.module.ts', + module: 'no-router-app/src/app/app-module.ts', root: true, }); const appModule = tree.read( - 'no-router-app/src/app/app.module.ts', + 'no-router-app/src/app/app-module.ts', 'utf-8' ); expect(appModule).not.toContain('StoreRouterConnectingModule.forRoot()'); @@ -163,7 +163,7 @@ describe('ngrx', () => { facade: true, }); - expect(tree.read('myapp/src/app/app.module.ts', 'utf-8')).toContain( + expect(tree.read('myapp/src/app/app-module.ts', 'utf-8')).toContain( 'providers: [UsersFacade]' ); }); @@ -176,7 +176,7 @@ describe('ngrx', () => { facade: false, }); - expect(tree.read('myapp/src/app/app.module.ts', 'utf-8')).not.toContain( + expect(tree.read('myapp/src/app/app-module.ts', 'utf-8')).not.toContain( 'providers: [UsersFacade]' ); }); @@ -189,7 +189,7 @@ describe('ngrx', () => { facade: true, }); - expect(tree.read('myapp/src/app/app.module.ts', 'utf-8')).not.toContain( + expect(tree.read('myapp/src/app/app-module.ts', 'utf-8')).not.toContain( 'providers: [UsersFacade]' ); }); @@ -208,7 +208,7 @@ describe('ngrx', () => { expectFileToExist('myapp/src/app/+state/users.selectors.ts'); expectFileToExist('myapp/src/app/+state/users.selectors.spec.ts'); expect( - tree.read('myapp/src/app/app.module.ts', 'utf-8') + tree.read('myapp/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -426,7 +426,7 @@ describe('ngrx', () => { expect(devkit.formatFiles).toHaveBeenCalled(); expect( - tree.read('myapp/src/app/app.module.ts', 'utf-8') + tree.read('myapp/src/app/app-module.ts', 'utf-8') ).toMatchSnapshot(); expect( tree.read('myapp/src/app/+state/users.actions.ts', 'utf-8') @@ -512,23 +512,20 @@ describe('ngrx', () => { describe('Standalone APIs', () => { beforeEach(async () => { jest.clearAllMocks(); - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'my-app', standalone: true, routing: true, skipFormat: true, }); - tree.write( - 'my-app/src/app/app.component.html', - '' - ); + tree.write('my-app/src/app/app.html', ''); tree.write( 'my-app/src/app/app.routes.ts', `import { Routes } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; -export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent }]; +export const appRoutes: Routes = [{ path: '', component: NxWelcome }]; ` ); }); @@ -601,9 +598,9 @@ export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent }]; tree.write( 'my-app/src/app/app.routes.ts', `import { Routes } from '@angular/router'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; -export const appRoutes: Routes = [{ path: 'home', component: NxWelcomeComponent }]; +export const appRoutes: Routes = [{ path: 'home', component: NxWelcome }]; ` ); @@ -664,7 +661,7 @@ export const appRoutes: Routes = [{ path: 'home', component: NxWelcomeComponent describe('angular compat support', () => { beforeEach(async () => { jest.clearAllMocks(); - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'myapp', standalone: false, @@ -674,35 +671,35 @@ export const appRoutes: Routes = [{ path: 'home', component: NxWelcomeComponent ...json, dependencies: { ...json.dependencies, - '@angular/core': '17.0.0', + '@angular/core': '18.0.0', }, })); }); - it('should install the ngrx 17 packages', async () => { + it('should install the ngrx 18 packages', async () => { await ngrxGenerator(tree, defaultOptions); const packageJson = devkit.readJson(tree, 'package.json'); expect(packageJson.dependencies['@ngrx/store']).toEqual( - backwardCompatibleVersions.angularV17.ngrxVersion + backwardCompatibleVersions.angularV18.ngrxVersion ); expect(packageJson.dependencies['@ngrx/effects']).toEqual( - backwardCompatibleVersions.angularV17.ngrxVersion + backwardCompatibleVersions.angularV18.ngrxVersion ); expect(packageJson.dependencies['@ngrx/entity']).toEqual( - backwardCompatibleVersions.angularV17.ngrxVersion + backwardCompatibleVersions.angularV18.ngrxVersion ); expect(packageJson.dependencies['@ngrx/router-store']).toEqual( - backwardCompatibleVersions.angularV17.ngrxVersion + backwardCompatibleVersions.angularV18.ngrxVersion ); expect(packageJson.dependencies['@ngrx/component-store']).toEqual( - backwardCompatibleVersions.angularV17.ngrxVersion + backwardCompatibleVersions.angularV18.ngrxVersion ); expect(packageJson.devDependencies['@ngrx/schematics']).toEqual( - backwardCompatibleVersions.angularV17.ngrxVersion + backwardCompatibleVersions.angularV18.ngrxVersion ); expect(packageJson.devDependencies['@ngrx/store-devtools']).toEqual( - backwardCompatibleVersions.angularV17.ngrxVersion + backwardCompatibleVersions.angularV18.ngrxVersion ); expect(packageJson.devDependencies['jasmine-marbles']).toBeDefined(); }); @@ -710,7 +707,7 @@ export const appRoutes: Routes = [{ path: 'home', component: NxWelcomeComponent describe('rxjs v6 support', () => { beforeEach(async () => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'myapp', standalone: false, diff --git a/packages/angular/src/generators/ngrx/schema.json b/packages/angular/src/generators/ngrx/schema.json index def96bfc43..2033536f18 100644 --- a/packages/angular/src/generators/ngrx/schema.json +++ b/packages/angular/src/generators/ngrx/schema.json @@ -8,11 +8,11 @@ "type": "object", "examples": [ { - "command": "nx g @nx/angular:ngrx --root --parent=apps/my-app/src/app/app.module.ts --facade=false placeholder", + "command": "nx g @nx/angular:ngrx --root --parent=apps/my-app/src/app/app-module.ts --facade=false placeholder", "description": "Add root ngrx configration to the `my-app` application" }, { - "command": "nx g @nx/angular:ngrx --parent=libs/my-lib/src/lib/my-lib.module.ts --facade=true --root=false users", + "command": "nx g @nx/angular:ngrx --parent=libs/my-lib/src/lib/my-lib-module.ts --facade=true --root=false users", "description": "Add a `users` state with a facade to the `my-lib` library. It will be tracked under the default `+state` folder in the lib" }, { @@ -42,7 +42,7 @@ }, "parent": { "type": "string", - "description": "The path to the file where the state will be registered. For NgModule usage, this will be your `app.module.ts` for your root state, or your Feature Module for feature state. For Standalone API usage, this will be your `app.config.ts` file for your root state, or the Routes definition file for your feature state. The host directory will create/use the new state directory.", + "description": "The path to the file where the state will be registered. For NgModule usage, this will be your `app-module.ts` for your root state, or your Feature Module for feature state. For Standalone API usage, this will be your `app.config.ts` file for your root state, or the Routes definition file for your feature state. The host directory will create/use the new state directory.", "x-prompt": "What is the path to the module or Routes definition where this NgRx state should be registered?", "x-priority": "important" }, diff --git a/packages/angular/src/generators/pipe/__snapshots__/pipe.spec.ts.snap b/packages/angular/src/generators/pipe/__snapshots__/pipe.spec.ts.snap index 8fe79ad3e9..cd9e9c1c03 100644 --- a/packages/angular/src/generators/pipe/__snapshots__/pipe.spec.ts.snap +++ b/packages/angular/src/generators/pipe/__snapshots__/pipe.spec.ts.snap @@ -2,7 +2,7 @@ exports[`pipe generator --no-standalone should export the pipe correctly when directory is nested deeper 1`] = ` "import { NgModule } from '@angular/core'; -import { TestPipe } from './my-pipes/test/test.pipe'; +import { TestPipe } from './my-pipes/test/test-pipe'; @NgModule({ imports: [], declarations: [TestPipe], @@ -28,7 +28,7 @@ export class TestPipe implements PipeTransform { `; exports[`pipe generator --no-standalone should generate a pipe with test files and attach to the NgModule automatically 2`] = ` -"import { TestPipe } from './test.pipe'; +"import { TestPipe } from './test-pipe'; describe('TestPipe', () => { it('create an instance', () => { @@ -41,7 +41,7 @@ describe('TestPipe', () => { exports[`pipe generator --no-standalone should generate a pipe with test files and attach to the NgModule automatically 3`] = ` "import { NgModule } from '@angular/core'; -import { TestPipe } from './test.pipe'; +import { TestPipe } from './test-pipe'; @NgModule({ imports: [], declarations: [TestPipe], @@ -67,7 +67,7 @@ export class TestPipe implements PipeTransform { `; exports[`pipe generator --no-standalone should import the pipe correctly when files are flat 2`] = ` -"import { TestPipe } from './test.pipe'; +"import { TestPipe } from './test-pipe'; describe('TestPipe', () => { it('create an instance', () => { @@ -80,7 +80,7 @@ describe('TestPipe', () => { exports[`pipe generator --no-standalone should import the pipe correctly when files are flat 3`] = ` "import { NgModule } from '@angular/core'; -import { TestPipe } from './test/test.pipe'; +import { TestPipe } from './test/test-pipe'; @NgModule({ imports: [], declarations: [TestPipe], @@ -106,7 +106,7 @@ export class TestPipe implements PipeTransform { `; exports[`pipe generator --no-standalone should import the pipe correctly when files are flat but deeply nested 2`] = ` -"import { TestPipe } from './test.pipe'; +"import { TestPipe } from './test-pipe'; describe('TestPipe', () => { it('create an instance', () => { @@ -119,7 +119,7 @@ describe('TestPipe', () => { exports[`pipe generator --no-standalone should import the pipe correctly when files are flat but deeply nested 3`] = ` "import { NgModule } from '@angular/core'; -import { TestPipe } from './my-pipes/test/test.pipe'; +import { TestPipe } from './my-pipes/test/test-pipe'; @NgModule({ imports: [], declarations: [TestPipe], @@ -144,7 +144,7 @@ export class TestPipe implements PipeTransform { `; exports[`pipe generator should generate correctly 2`] = ` -"import { TestPipe } from './test.pipe'; +"import { TestPipe } from './test-pipe'; describe('TestPipe', () => { it('create an instance', () => { diff --git a/packages/angular/src/generators/pipe/lib/normalize-options.ts b/packages/angular/src/generators/pipe/lib/normalize-options.ts index 9ee2ca660d..ea353088c7 100644 --- a/packages/angular/src/generators/pipe/lib/normalize-options.ts +++ b/packages/angular/src/generators/pipe/lib/normalize-options.ts @@ -2,12 +2,16 @@ import type { Tree } from '@nx/devkit'; import { names } from '@nx/devkit'; import { determineArtifactNameAndDirectoryOptions } from '@nx/devkit/src/generators/artifact-name-and-directory-utils'; import { validateClassName } from '../../utils/validations'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema, Schema } from '../schema'; export async function normalizeOptions( tree: Tree, options: Schema ): Promise { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + options.typeSeparator ??= angularMajorVersion < 20 ? '.' : '-'; + const { artifactName: name, directory, @@ -18,6 +22,7 @@ export async function normalizeOptions( name: options.name, path: options.path, suffix: 'pipe', + suffixSeparator: options.typeSeparator, allowedFileExtensions: ['ts'], fileExtension: 'ts', }); diff --git a/packages/angular/src/generators/pipe/pipe.spec.ts b/packages/angular/src/generators/pipe/pipe.spec.ts index a06524b165..2c6049713d 100644 --- a/packages/angular/src/generators/pipe/pipe.spec.ts +++ b/packages/angular/src/generators/pipe/pipe.spec.ts @@ -1,4 +1,4 @@ -import { addProjectConfiguration, Tree } from '@nx/devkit'; +import { addProjectConfiguration, type Tree, updateJson } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { pipeGenerator } from './pipe'; import type { Schema } from './schema'; @@ -21,12 +21,46 @@ describe('pipe generator', () => { await generatePipeWithDefaultOptions(tree, { skipFormat: false }); // ASSERT - expect(tree.read('test/src/app/test.pipe.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('test/src/app/test-pipe.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('test/src/app/test.pipe.spec.ts', 'utf-8') + tree.read('test/src/app/test-pipe.spec.ts', 'utf-8') ).toMatchSnapshot(); }); + it('should generate files with the provided type separator', async () => { + await generatePipeWithDefaultOptions(tree, { + typeSeparator: '.', + skipFormat: false, + }); + + expect(tree.read('test/src/app/test.pipe.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Pipe, PipeTransform } from '@angular/core'; + + @Pipe({ + name: 'test', + }) + export class TestPipe implements PipeTransform { + transform(value: unknown, ...args: unknown[]): unknown { + return null; + } + } + " + `); + expect(tree.read('test/src/app/test.pipe.spec.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { TestPipe } from './test.pipe'; + + describe('TestPipe', () => { + it('create an instance', () => { + const pipe = new TestPipe(); + expect(pipe).toBeTruthy(); + }); + }); + " + `); + }); + it('should handle path with file extension', async () => { await generatePipeWithDefaultOptions(tree, { path: 'test/src/app/test.pipe.ts', @@ -47,7 +81,7 @@ describe('pipe generator', () => { await generatePipeWithDefaultOptions(tree, { standalone: true }); // ASSERT - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + expect(tree.read('test/src/app/test-module.ts', 'utf-8')).not.toContain( 'TestPipe' ); }); @@ -61,7 +95,7 @@ describe('pipe generator', () => { // ASSERT expect( - tree.exists('test/src/app/my-pipes/test/test.pipe.spec.ts') + tree.exists('test/src/app/my-pipes/test/test-pipe.spec.ts') ).toBeFalsy(); }); @@ -86,12 +120,12 @@ describe('pipe generator', () => { }); // ASSERT - expect(tree.read('test/src/app/test.pipe.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('test/src/app/test-pipe.ts', 'utf-8')).toMatchSnapshot(); expect( - tree.read('test/src/app/test.pipe.spec.ts', 'utf-8') + tree.read('test/src/app/test-pipe.spec.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -106,13 +140,13 @@ describe('pipe generator', () => { // ASSERT expect( - tree.read('test/src/app/test/test.pipe.ts', 'utf-8') + tree.read('test/src/app/test/test-pipe.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('test/src/app/test/test.pipe.spec.ts', 'utf-8') + tree.read('test/src/app/test/test-pipe.spec.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -127,13 +161,13 @@ describe('pipe generator', () => { // ASSERT expect( - tree.read('test/src/app/my-pipes/test/test.pipe.ts', 'utf-8') + tree.read('test/src/app/my-pipes/test/test-pipe.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('test/src/app/my-pipes/test/test.pipe.spec.ts', 'utf-8') + tree.read('test/src/app/my-pipes/test/test-pipe.spec.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -149,7 +183,7 @@ describe('pipe generator', () => { // ASSERT expect( - tree.read('test/src/app/test.module.ts', 'utf-8') + tree.read('test/src/app/test-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -164,16 +198,57 @@ describe('pipe generator', () => { }); // ASSERT - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + expect(tree.read('test/src/app/test-module.ts', 'utf-8')).not.toContain( 'TestPipe' ); }); }); + + describe('compat', () => { + it('should generate the files with the "." type separator for versions below v20', async () => { + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + + await generatePipeWithDefaultOptions(tree, { skipFormat: false }); + + expect(tree.read('test/src/app/test.pipe.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Pipe, PipeTransform } from '@angular/core'; + + @Pipe({ + name: 'test', + }) + export class TestPipe implements PipeTransform { + transform(value: unknown, ...args: unknown[]): unknown { + return null; + } + } + " + `); + expect(tree.read('test/src/app/test.pipe.spec.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { TestPipe } from './test.pipe'; + + describe('TestPipe', () => { + it('create an instance', () => { + const pipe = new TestPipe(); + expect(pipe).toBeTruthy(); + }); + }); + " + `); + }); + }); }); function addModule(tree: Tree) { tree.write( - 'test/src/app/test.module.ts', + 'test/src/app/test-module.ts', `import { NgModule } from '@angular/core'; @NgModule({ imports: [], diff --git a/packages/angular/src/generators/pipe/pipe.ts b/packages/angular/src/generators/pipe/pipe.ts index 8b8ca40eb7..93fcaa7964 100644 --- a/packages/angular/src/generators/pipe/pipe.ts +++ b/packages/angular/src/generators/pipe/pipe.ts @@ -25,7 +25,7 @@ export async function pipeGenerator(tree: Tree, rawOptions: Schema) { fileName: options.fileName, selector: pipeNames.propertyName, standalone: options.standalone, - // Angular v19 or higher defaults to true, while v18 or lower defaults to false + // Angular v19 or higher defaults to true, while lower versions default to false setStandalone: (angularMajorVersion >= 19 && !options.standalone) || (angularMajorVersion < 19 && options.standalone), diff --git a/packages/angular/src/generators/pipe/schema.d.ts b/packages/angular/src/generators/pipe/schema.d.ts index 15d061553d..8e7c61c16b 100644 --- a/packages/angular/src/generators/pipe/schema.d.ts +++ b/packages/angular/src/generators/pipe/schema.d.ts @@ -6,6 +6,7 @@ export interface Schema { standalone?: boolean; module?: string; export?: boolean; + typeSeparator?: string; skipFormat?: boolean; } diff --git a/packages/angular/src/generators/pipe/schema.json b/packages/angular/src/generators/pipe/schema.json index a3769b07c7..07ac833265 100644 --- a/packages/angular/src/generators/pipe/schema.json +++ b/packages/angular/src/generators/pipe/schema.json @@ -12,11 +12,15 @@ "command": "nx g @nx/angular:pipe mylib/src/lib/foo.pipe.ts" }, { - "description": "Generate a pipe without providing the file extension. It results in the pipe `FooPipe` at `mylib/src/lib/foo.pipe.ts`", + "description": "Generate a pipe without providing the file extension. It results in the pipe `FooPipe` at `mylib/src/lib/foo-pipe.ts`", "command": "nx g @nx/angular:pipe mylib/src/lib/foo" }, { - "description": "Generate a pipe with the exported symbol different from the file name. It results in the pipe `CustomPipe` at `mylib/src/lib/foo.pipe.ts`", + "description": "Generate a pipe with a different type separator. It results in the pipe `FooPipe` at `mylib/src/lib/foo.pipe.ts`", + "command": "nx g @nx/angular:pipe mylib/src/lib/foo --typeSeparator=." + }, + { + "description": "Generate a pipe with the exported symbol different from the file name. It results in the pipe `CustomPipe` at `mylib/src/lib/foo-pipe.ts`", "command": "nx g @nx/angular:pipe mylib/src/lib/foo --name=custom" } ], @@ -59,6 +63,11 @@ "default": false, "description": "The declaring NgModule exports this pipe." }, + "typeSeparator": { + "type": "string", + "enum": ["-", "."], + "description": "The separator character to use before the type within the generated file's name. For example, if you set the option to `.`, the file will be named `example.pipe.ts`. It defaults to '-' for Angular v20+. For versions below v20, it defaults to '.'." + }, "skipFormat": { "type": "boolean", "default": false, diff --git a/packages/angular/src/generators/remote/__snapshots__/remote.spec.ts.snap b/packages/angular/src/generators/remote/__snapshots__/remote.spec.ts.snap index 206398909b..38c7f6a23f 100644 --- a/packages/angular/src/generators/remote/__snapshots__/remote.spec.ts.snap +++ b/packages/angular/src/generators/remote/__snapshots__/remote.spec.ts.snap @@ -4,10 +4,10 @@ exports[`MF Remote App Generator --ssr should generate the correct files 1`] = ` "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; @NgModule({ - declarations: [AppComponent], + declarations: [App], imports: [ BrowserModule, RouterModule.forRoot( @@ -15,7 +15,7 @@ import { AppComponent } from './app.component'; { path: '', loadChildren: () => - import('./remote-entry/entry.module').then( + import('./remote-entry/entry-module').then( (m) => m.RemoteEntryModule ), }, @@ -24,17 +24,17 @@ import { AppComponent } from './app.component'; ), ], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {} " `; exports[`MF Remote App Generator --ssr should generate the correct files 2`] = ` -"import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; +"import { platformBrowser } from '@angular/platform-browser'; +import { AppModule } from './app/app-module'; -platformBrowserDynamic() +platformBrowser() .bootstrapModule(AppModule, { ngZoneEventCoalescing: true, }) @@ -136,7 +136,7 @@ exports[`MF Remote App Generator --ssr should generate the correct files 6`] = ` module.exports = { name: 'test', exposes: { - './Module': 'test/src/app/remote-entry/entry.module.ts', + './Module': 'test/src/app/remote-entry/entry-module.ts', }, }; " @@ -163,7 +163,7 @@ exports[`MF Remote App Generator --ssr should generate the correct files 8`] = ` standalone: false, template: \`\`, }) -export class RemoteEntryComponent {} +export class RemoteEntry {} " `; @@ -174,7 +174,7 @@ export const appRoutes: Route[] = [ { path: '', loadChildren: () => - import('./remote-entry/entry.module').then((m) => m.RemoteEntryModule), + import('./remote-entry/entry-module').then((m) => m.RemoteEntryModule), }, ]; " @@ -182,11 +182,9 @@ export const appRoutes: Route[] = [ exports[`MF Remote App Generator --ssr should generate the correct files 10`] = ` "import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry } from './entry'; -export const remoteRoutes: Route[] = [ - { path: '', component: RemoteEntryComponent }, -]; +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry }]; " `; @@ -221,11 +219,9 @@ exports[`MF Remote App Generator --ssr should generate the correct files 11`] = exports[`MF Remote App Generator --ssr should generate the correct files 12`] = ` "import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry } from './entry'; -export const remoteRoutes: Route[] = [ - { path: '', component: RemoteEntryComponent }, -]; +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry }]; " `; @@ -246,28 +242,28 @@ exports[`MF Remote App Generator --ssr should generate the correct files when -- "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { App } from './app'; @NgModule({ - declarations: [AppComponent], + declarations: [App], imports: [ BrowserModule, RouterModule.forRoot([{ path: '', - loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule) + loadChildren: () => import('./remote-entry/entry-module').then(m => m.RemoteEntryModule) }], { initialNavigation: 'enabledBlocking' }), ], providers: [], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppModule {}" `; exports[`MF Remote App Generator --ssr should generate the correct files when --typescriptConfiguration=true 2`] = ` -"import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; +"import { platformBrowser } from '@angular/platform-browser'; +import { AppModule } from './app/app-module'; -platformBrowserDynamic() +platformBrowser() .bootstrapModule(AppModule, { ngZoneEventCoalescing: true, }) @@ -365,7 +361,7 @@ exports[`MF Remote App Generator --ssr should generate the correct files when -- const config: ModuleFederationConfig = { name: 'test', exposes: { - './Module': 'test/src/app/remote-entry/entry.module.ts', + './Module': 'test/src/app/remote-entry/entry-module.ts', }, }; @@ -397,7 +393,7 @@ exports[`MF Remote App Generator --ssr should generate the correct files when -- standalone: false, template: \`\` }) -export class RemoteEntryComponent {} +export class RemoteEntry {} " `; @@ -405,15 +401,15 @@ exports[`MF Remote App Generator --ssr should generate the correct files when -- "import { Route } from '@angular/router'; export const appRoutes: Route[] = [ - { path: '', loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule) },]; + { path: '', loadChildren: () => import('./remote-entry/entry-module').then(m => m.RemoteEntryModule) },]; " `; exports[`MF Remote App Generator --ssr should generate the correct files when --typescriptConfiguration=true 10`] = ` "import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry } from './entry'; -export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];" +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry }];" `; exports[`MF Remote App Generator --ssr should generate the correct files when --typescriptConfiguration=true 11`] = ` @@ -447,9 +443,9 @@ exports[`MF Remote App Generator --ssr should generate the correct files when -- exports[`MF Remote App Generator --ssr should generate the correct files when --typescriptConfiguration=true 12`] = ` "import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry } from './entry'; -export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];" +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry }];" `; exports[`MF Remote App Generator --ssr should generate the correct files when --typescriptConfiguration=true 13`] = ` @@ -546,11 +542,9 @@ export default withModuleFederation(config, { dts: false }); exports[`MF Remote App Generator should generate the a remote setup for standalone components 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { RemoteEntryComponent } from './app/remote-entry/entry.component'; +import { RemoteEntry } from './app/remote-entry/entry'; -bootstrapApplication(RemoteEntryComponent, appConfig).catch((err) => - console.error(err) -); +bootstrapApplication(RemoteEntry, appConfig).catch((err) => console.error(err)); " `; @@ -570,14 +564,14 @@ module.exports = { exports[`MF Remote App Generator should generate the a remote setup for standalone components 3`] = ` "import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @Component({ - imports: [CommonModule, NxWelcomeComponent], + imports: [CommonModule, NxWelcome], selector: 'app-test-entry', template: \`\`, }) -export class RemoteEntryComponent {} +export class RemoteEntry {} " `; @@ -596,20 +590,18 @@ export const appRoutes: Route[] = [ exports[`MF Remote App Generator should generate the a remote setup for standalone components 5`] = ` "import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry } from './entry'; -export const remoteRoutes: Route[] = [ - { path: '', component: RemoteEntryComponent }, -]; +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry }]; " `; exports[`MF Remote App Generator should generate the a remote setup for standalone components when --typescriptConfiguration=true 1`] = ` "import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { RemoteEntryComponent } from './app/remote-entry/entry.component'; +import { RemoteEntry } from './app/remote-entry/entry'; -bootstrapApplication(RemoteEntryComponent, appConfig).catch((err) => +bootstrapApplication(RemoteEntry, appConfig).catch((err) => console.error(err) ); " @@ -635,14 +627,14 @@ export default config; exports[`MF Remote App Generator should generate the a remote setup for standalone components when --typescriptConfiguration=true 3`] = ` "import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { NxWelcome } from './nx-welcome'; @Component({ - imports: [CommonModule, NxWelcomeComponent], + imports: [CommonModule, NxWelcome], selector: 'app-test-entry', template: \`\` }) -export class RemoteEntryComponent {} +export class RemoteEntry {} " `; @@ -656,7 +648,7 @@ export const appRoutes: Route[] = [ exports[`MF Remote App Generator should generate the a remote setup for standalone components when --typescriptConfiguration=true 5`] = ` "import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry } from './entry'; -export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];" +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry }];" `; diff --git a/packages/angular/src/generators/remote/files/standalone/src/bootstrap.server.ts__tmpl__ b/packages/angular/src/generators/remote/files/standalone/src/bootstrap.server.ts__tmpl__ index 93b6fc501d..8d29dce84f 100644 --- a/packages/angular/src/generators/remote/files/standalone/src/bootstrap.server.ts__tmpl__ +++ b/packages/angular/src/generators/remote/files/standalone/src/bootstrap.server.ts__tmpl__ @@ -1,7 +1,7 @@ -import {bootstrapApplication} from '@angular/platform-browser'; -import {RemoteEntryComponent} from './app/remote-entry/entry.component'; -import {config} from './app/app.config.server'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { RemoteEntry<%= componentType %> } from './app/remote-entry/entry<%= componentFileSuffix %>'; +import { config } from './app/app.config.server'; -const bootstrap = () => bootstrapApplication(RemoteEntryComponent, config); +const bootstrap = () => bootstrapApplication(RemoteEntry<%= componentType %>, config); export default bootstrap; diff --git a/packages/angular/src/generators/remote/lib/update-ssr-setup.ts b/packages/angular/src/generators/remote/lib/update-ssr-setup.ts index e8c1459338..8fd6fc3eb8 100644 --- a/packages/angular/src/generators/remote/lib/update-ssr-setup.ts +++ b/packages/angular/src/generators/remote/lib/update-ssr-setup.ts @@ -3,6 +3,7 @@ import { addDependenciesToPackageJson, generateFiles, joinPathFragments, + names, readProjectConfiguration, updateProjectConfiguration, } from '@nx/devkit'; @@ -12,6 +13,7 @@ import { moduleFederationNodeVersion, typesCorsVersion, } from '../../../utils/versions'; +import { getComponentType } from '../../utils/artifact-types'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; export async function updateSsrSetup( @@ -77,6 +79,9 @@ export async function updateSsrSetup( ); if (standalone) { + const componentType = getComponentType(tree); + const componentFileSuffix = componentType ? `.${componentType}` : ''; + generateFiles( tree, joinPathFragments(__dirname, '../files/standalone'), @@ -84,6 +89,8 @@ export async function updateSsrSetup( { appName, standalone, + componentType: componentType ? names(componentType).className : '', + componentFileSuffix, tmpl: '', } ); diff --git a/packages/angular/src/generators/remote/remote.spec.ts b/packages/angular/src/generators/remote/remote.spec.ts index 5647dc6ceb..ccc91e3b0f 100644 --- a/packages/angular/src/generators/remote/remote.spec.ts +++ b/packages/angular/src/generators/remote/remote.spec.ts @@ -1,24 +1,25 @@ import 'nx/src/internal-testing-utils/mock-project-graph'; -import { E2eTestRunner } from '../../utils/test-runners'; import { getProjects, readJson, readNxJson, readProjectConfiguration, updateJson, + updateNxJson, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { getRootTsConfigPathInTree } from '@nx/js'; +import { E2eTestRunner } from '../../utils/test-runners'; import { generateTestHostApplication, generateTestRemoteApplication, } from '../utils/testing'; -import { getRootTsConfigPathInTree } from '@nx/js'; describe('MF Remote App Generator', () => { it('should generate a remote mf app with no host', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -32,6 +33,65 @@ describe('MF Remote App Generator', () => { // ASSERT expect(tree.read('test/webpack.config.js', 'utf-8')).toMatchSnapshot(); const tsconfigJson = readJson(tree, getRootTsConfigPathInTree(tree)); + expect(tsconfigJson.compilerOptions.paths['test/Module']).toEqual([ + 'test/src/app/remote-entry/entry-module.ts', + ]); + }); + + it('should generate the module file with the "typeSeparator" generator default', async () => { + const tree = createTreeWithEmptyWorkspace(); + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:module': { + typeSeparator: '.', + }, + }; + updateNxJson(tree, nxJson); + + await generateTestRemoteApplication(tree, { + directory: 'test', + port: 4201, + typescriptConfiguration: false, + standalone: false, + skipFormat: true, + }); + + expect(tree.read('test/module-federation.config.js', 'utf-8')) + .toMatchInlineSnapshot(` + "/** + * Nx requires a default export of the config to allow correct resolution of the module federation graph. + **/ + module.exports = { + name: 'test', + exposes: { + './Module': 'test/src/app/remote-entry/entry.module.ts', + }, + }; + " + `); + expect(tree.read(`test/src/app/app.module.ts`, 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { RouterModule } from '@angular/router'; + import { App } from './app'; + + @NgModule({ + declarations: [App], + imports: [ + BrowserModule, + RouterModule.forRoot([{ + path: '', + loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule) + }], { initialNavigation: 'enabledBlocking' }), + ], + providers: [], + bootstrap: [App], + }) + export class AppModule {}" + `); + const tsconfigJson = readJson(tree, getRootTsConfigPathInTree(tree)); expect(tsconfigJson.compilerOptions.paths['test/Module']).toEqual([ 'test/src/app/remote-entry/entry.module.ts', ]); @@ -39,7 +99,7 @@ describe('MF Remote App Generator', () => { it('should generate a remote mf app with no host when --typescriptConfiguration=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -56,7 +116,7 @@ describe('MF Remote App Generator', () => { it('should generate a remote mf app with a host', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestHostApplication(tree, { directory: 'host', @@ -81,7 +141,7 @@ describe('MF Remote App Generator', () => { it('should generate a remote mf app with a host when --typescriptConfiguration=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestHostApplication(tree, { directory: 'host', @@ -106,7 +166,7 @@ describe('MF Remote App Generator', () => { it('should error when a remote app is attempted to be generated with an incorrect host', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT try { @@ -126,7 +186,7 @@ describe('MF Remote App Generator', () => { it('should generate a remote mf app and automatically find the next port available', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestRemoteApplication(tree, { directory: 'existing', port: 4201, @@ -148,7 +208,7 @@ describe('MF Remote App Generator', () => { it('should generate a remote mf app and automatically find the next port available even when there are no other targets', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -164,7 +224,7 @@ describe('MF Remote App Generator', () => { it('should not set the remote as the default project', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -181,7 +241,7 @@ describe('MF Remote App Generator', () => { it('should generate the a remote setup for standalone components', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -190,17 +250,17 @@ describe('MF Remote App Generator', () => { }); // ASSERT - expect(tree.exists(`test/src/app/app.module.ts`)).toBeFalsy(); - expect(tree.exists(`test/src/app/app.component.ts`)).toBeFalsy(); + expect(tree.exists(`test/src/app/app-module.ts`)).toBeFalsy(); + expect(tree.exists(`test/src/app/app.ts`)).toBeFalsy(); expect( - tree.exists(`test/src/app/remote-entry/entry.module.ts`) + tree.exists(`test/src/app/remote-entry/entry-module.ts`) ).toBeFalsy(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( tree.read(`test/module-federation.config.js`, 'utf-8') ).toMatchSnapshot(); expect( - tree.read(`test/src/app/remote-entry/entry.component.ts`, 'utf-8') + tree.read(`test/src/app/remote-entry/entry.ts`, 'utf-8') ).toMatchSnapshot(); expect(tree.read(`test/src/app/app.routes.ts`, 'utf-8')).toMatchSnapshot(); expect( @@ -214,7 +274,7 @@ describe('MF Remote App Generator', () => { it('should generate the a remote setup for standalone components when --typescriptConfiguration=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -224,17 +284,17 @@ describe('MF Remote App Generator', () => { }); // ASSERT - expect(tree.exists(`test/src/app/app.module.ts`)).toBeFalsy(); - expect(tree.exists(`test/src/app/app.component.ts`)).toBeFalsy(); + expect(tree.exists(`test/src/app/app-module.ts`)).toBeFalsy(); + expect(tree.exists(`test/src/app/app.ts`)).toBeFalsy(); expect( - tree.exists(`test/src/app/remote-entry/entry.module.ts`) + tree.exists(`test/src/app/remote-entry/entry-module.ts`) ).toBeFalsy(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( tree.read(`test/module-federation.config.ts`, 'utf-8') ).toMatchSnapshot(); expect( - tree.read(`test/src/app/remote-entry/entry.component.ts`, 'utf-8') + tree.read(`test/src/app/remote-entry/entry.ts`, 'utf-8') ).toMatchSnapshot(); expect(tree.read(`test/src/app/app.routes.ts`, 'utf-8')).toMatchSnapshot(); expect( @@ -244,7 +304,7 @@ describe('MF Remote App Generator', () => { it('should not generate an e2e project when e2eTestRunner is none', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -261,7 +321,7 @@ describe('MF Remote App Generator', () => { it('should generate a correct app component when inline template is used', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -272,8 +332,7 @@ describe('MF Remote App Generator', () => { }); // ASSERT - expect(tree.read('test/src/app/app.component.ts', 'utf-8')) - .toMatchInlineSnapshot(` + expect(tree.read('test/src/app/app.ts', 'utf-8')).toMatchInlineSnapshot(` "import { Component } from '@angular/core'; @Component({ @@ -282,13 +341,13 @@ describe('MF Remote App Generator', () => { template: '' }) - export class AppComponent {}" + export class App {}" `); }); it('should update the index.html to use the remote entry component selector for root when standalone', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -306,7 +365,7 @@ describe('MF Remote App Generator', () => { describe('--ssr', () => { it('should generate the correct files', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -319,10 +378,10 @@ describe('MF Remote App Generator', () => { // ASSERT const project = readProjectConfiguration(tree, 'test'); expect( - tree.exists(`test/src/app/remote-entry/entry.module.ts`) + tree.exists(`test/src/app/remote-entry/entry-module.ts`) ).toBeTruthy(); expect( - tree.read(`test/src/app/app.module.ts`, 'utf-8') + tree.read(`test/src/app/app-module.ts`, 'utf-8') ).toMatchSnapshot(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( @@ -337,7 +396,7 @@ describe('MF Remote App Generator', () => { tree.read(`test/webpack.server.config.js`, 'utf-8') ).toMatchSnapshot(); expect( - tree.read(`test/src/app/remote-entry/entry.component.ts`, 'utf-8') + tree.read(`test/src/app/remote-entry/entry.ts`, 'utf-8') ).toMatchSnapshot(); expect( tree.read(`test/src/app/app.routes.ts`, 'utf-8') @@ -354,7 +413,7 @@ describe('MF Remote App Generator', () => { it('should generate the correct files when --typescriptConfiguration=true', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); // ACT await generateTestRemoteApplication(tree, { @@ -368,10 +427,10 @@ describe('MF Remote App Generator', () => { // ASSERT const project = readProjectConfiguration(tree, 'test'); expect( - tree.exists(`test/src/app/remote-entry/entry.module.ts`) + tree.exists(`test/src/app/remote-entry/entry-module.ts`) ).toBeTruthy(); expect( - tree.read(`test/src/app/app.module.ts`, 'utf-8') + tree.read(`test/src/app/app-module.ts`, 'utf-8') ).toMatchSnapshot(); expect(tree.read(`test/src/bootstrap.ts`, 'utf-8')).toMatchSnapshot(); expect( @@ -386,7 +445,7 @@ describe('MF Remote App Generator', () => { tree.read(`test/webpack.server.config.ts`, 'utf-8') ).toMatchSnapshot(); expect( - tree.read(`test/src/app/remote-entry/entry.component.ts`, 'utf-8') + tree.read(`test/src/app/remote-entry/entry.ts`, 'utf-8') ).toMatchSnapshot(); expect( tree.read(`test/src/app/app.routes.ts`, 'utf-8') @@ -403,7 +462,7 @@ describe('MF Remote App Generator', () => { }); it('should not touch the package.json when run with `--skipPackageJson`', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); let initialPackageJson; updateJson(tree, 'package.json', (json) => { json.dependencies = {}; @@ -426,7 +485,7 @@ describe('MF Remote App Generator', () => { }); it('should error when an invalid remote name is passed to the remote generator', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await expect( generateTestRemoteApplication(tree, { @@ -439,4 +498,128 @@ describe('MF Remote App Generator', () => { The regular expression used is ^[a-zA-Z_$][a-zA-Z_$0-9]*$.] `); }); + + describe('compat', () => { + it('should generate components with the "component" type for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + await generateTestHostApplication(tree, { + directory: 'host', + typescriptConfiguration: false, + skipFormat: true, + }); + + await generateTestRemoteApplication(tree, { + directory: 'test', + host: 'host', + typescriptConfiguration: false, + skipFormat: true, + }); + + expect(tree.read('host/src/app/app.component.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { RouterModule } from '@angular/router'; + import { NxWelcomeComponent } from './nx-welcome.component'; + + @Component({ + imports: [NxWelcomeComponent, RouterModule], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.css', + }) + export class AppComponent { + title = 'host'; + } + " + `); + expect(tree.read('test/src/app/remote-entry/entry.component.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { NxWelcomeComponent } from './nx-welcome.component'; + + @Component({ + imports: [CommonModule, NxWelcomeComponent], + selector: 'app-test-entry', + template: \`\` + }) + export class RemoteEntryComponent {} + " + `); + expect(tree.read('test/src/app/remote-entry/entry.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Route } from '@angular/router'; + import { RemoteEntryComponent } from './entry.component'; + + export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];" + `); + }); + + it('should generate modules with the "." type separator for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + + await generateTestRemoteApplication(tree, { + directory: 'test', + standalone: false, + typescriptConfiguration: false, + skipFormat: true, + }); + + expect(tree.read('test/src/app/app.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { RouterModule } from '@angular/router'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [AppComponent], + imports: [ + BrowserModule, + RouterModule.forRoot([{ + path: '', + loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule) + }], { initialNavigation: 'enabledBlocking' }), + ], + providers: [], + bootstrap: [AppComponent], + }) + export class AppModule {}" + `); + expect(tree.read('test/src/app/remote-entry/entry.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { RouterModule } from '@angular/router'; + + import { RemoteEntryComponent } from './entry.component'; + import { NxWelcomeComponent } from './nx-welcome.component'; + import { remoteRoutes } from './entry.routes'; + + @NgModule({ + declarations: [RemoteEntryComponent, NxWelcomeComponent], + imports: [ + CommonModule, + RouterModule.forChild(remoteRoutes), + ], + providers: [], + }) + export class RemoteEntryModule {}" + `); + }); + }); }); diff --git a/packages/angular/src/generators/remote/schema.json b/packages/angular/src/generators/remote/schema.json index 252147d9de..d98914e253 100644 --- a/packages/angular/src/generators/remote/schema.json +++ b/packages/angular/src/generators/remote/schema.json @@ -171,7 +171,7 @@ "default": false }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" }, "typescriptConfiguration": { diff --git a/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.spec.ts b/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.spec.ts index fe015a7d1b..65787b41c1 100644 --- a/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.spec.ts +++ b/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.spec.ts @@ -6,7 +6,7 @@ import { convertDirectiveToScam } from './convert-directive-to-scam'; describe('convertDirectiveToScam', () => { it('should create the scam directive inline correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -26,18 +26,19 @@ describe('convertDirectiveToScam', () => { convertDirectiveToScam(tree, { path: 'apps/app1/src/app/example/example', directory: 'apps/app1/src/app/example', - fileName: 'example.directive', - filePath: 'apps/app1/src/app/example/example.directive.ts', + fileName: 'example', + filePath: 'apps/app1/src/app/example/example.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example/example-module.ts', export: false, inlineScam: true, - symbolName: 'ExampleDirective', + symbolName: 'Example', }); // ASSERT const directiveSource = tree.read( - 'apps/app1/src/app/example/example.directive.ts', + 'apps/app1/src/app/example/example.ts', 'utf-8' ); expect(directiveSource).toMatchInlineSnapshot(` @@ -48,23 +49,23 @@ describe('convertDirectiveToScam', () => { selector: '[example]', standalone: false }) - export class ExampleDirective { + export class Example { constructor() {} } @NgModule({ imports: [CommonModule], - declarations: [ExampleDirective], - exports: [ExampleDirective], + declarations: [Example], + exports: [Example], }) - export class ExampleDirectiveModule {} + export class ExampleModule {} " `); }); it('should create the scam directive separately correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -84,31 +85,32 @@ describe('convertDirectiveToScam', () => { convertDirectiveToScam(tree, { path: 'apps/app1/src/app/example/example', directory: 'apps/app1/src/app/example', - fileName: 'example.directive', - filePath: 'apps/app1/src/app/example/example.directive.ts', + fileName: 'example', + filePath: 'apps/app1/src/app/example/example.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example/example-module.ts', export: false, inlineScam: false, - symbolName: 'ExampleDirective', + symbolName: 'Example', }); // ASSERT const directiveModuleSource = tree.read( - 'apps/app1/src/app/example/example.module.ts', + 'apps/app1/src/app/example/example-module.ts', 'utf-8' ); expect(directiveModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExampleDirective } from './example.directive'; + import { Example } from './example'; @NgModule({ imports: [CommonModule], - declarations: [ExampleDirective], - exports: [ExampleDirective], + declarations: [Example], + exports: [Example], }) - export class ExampleDirectiveModule {} + export class ExampleModule {} " `); }); diff --git a/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.ts b/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.ts index 648c16e55e..699d7e3c3f 100644 --- a/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.ts +++ b/packages/angular/src/generators/scam-directive/lib/convert-directive-to-scam.ts @@ -1,5 +1,4 @@ import type { Tree } from '@nx/devkit'; -import { joinPathFragments, names } from '@nx/devkit'; import { insertImport } from '@nx/js'; import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; import type { NormalizedSchema } from '../schema'; @@ -52,13 +51,8 @@ export function convertDirectiveToScam( return; } - const scamFilePath = joinPathFragments( - options.directory, - `${options.name}.module.ts` - ); - tree.write( - scamFilePath, + options.modulePath, getModuleFileContent(options.symbolName, options.fileName) ); } diff --git a/packages/angular/src/generators/scam-directive/lib/normalize-options.ts b/packages/angular/src/generators/scam-directive/lib/normalize-options.ts index f8392cddd3..c81245b977 100644 --- a/packages/angular/src/generators/scam-directive/lib/normalize-options.ts +++ b/packages/angular/src/generators/scam-directive/lib/normalize-options.ts @@ -1,13 +1,20 @@ import type { Tree } from '@nx/devkit'; -import { names } from '@nx/devkit'; +import { joinPathFragments, names } from '@nx/devkit'; import { determineArtifactNameAndDirectoryOptions } from '@nx/devkit/src/generators/artifact-name-and-directory-utils'; +import { getModuleTypeSeparator } from '../../utils/artifact-types'; import { validateClassName } from '../../utils/validations'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema, Schema } from '../schema'; export async function normalizeOptions( tree: Tree, options: Schema ): Promise { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 20) { + options.type ??= 'directive'; + } + const { artifactName: name, directory, @@ -17,16 +24,22 @@ export async function normalizeOptions( } = await determineArtifactNameAndDirectoryOptions(tree, { name: options.name, path: options.path, - suffix: 'directive', + suffix: options.type, allowedFileExtensions: ['ts'], fileExtension: 'ts', }); const { className } = names(name); - const { className: suffixClassName } = names('directive'); + const suffixClassName = options.type ? names(options.type).className : ''; const symbolName = `${className}${suffixClassName}`; validateClassName(symbolName); + const moduleTypeSeparator = getModuleTypeSeparator(tree); + const modulePath = joinPathFragments( + directory, + `${name}${moduleTypeSeparator}module.ts` + ); + return { ...options, export: options.export ?? true, @@ -37,5 +50,6 @@ export async function normalizeOptions( name, symbolName, projectName, + modulePath, }; } diff --git a/packages/angular/src/generators/scam-directive/scam-directive.spec.ts b/packages/angular/src/generators/scam-directive/scam-directive.spec.ts index b2bcea3694..378c63b17b 100644 --- a/packages/angular/src/generators/scam-directive/scam-directive.spec.ts +++ b/packages/angular/src/generators/scam-directive/scam-directive.spec.ts @@ -1,11 +1,17 @@ -import { addProjectConfiguration, writeJson } from '@nx/devkit'; +import { + addProjectConfiguration, + readNxJson, + updateJson, + updateNxJson, + writeJson, +} from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { scamDirectiveGenerator } from './scam-directive'; describe('SCAM Directive Generator', () => { it('should create the inline scam directive correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -21,14 +27,50 @@ describe('SCAM Directive Generator', () => { }); // ASSERT - const directiveSource = tree.read( - 'apps/app1/src/app/example.directive.ts', - 'utf-8' - ); + const directiveSource = tree.read('apps/app1/src/app/example.ts', 'utf-8'); expect(directiveSource).toMatchInlineSnapshot(` "import { Directive, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; + @Directive({ + selector: '[example]', + standalone: false + }) + export class Example { + constructor() {} + } + + @NgModule({ + imports: [CommonModule], + declarations: [Example], + exports: [Example], + }) + export class ExampleModule {} + " + `); + }); + + it('should create the inline scam directive with the provided "directive" type', async () => { + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamDirectiveGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example', + inlineScam: true, + type: 'directive', + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example.directive.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Directive, NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + @Directive({ selector: '[example]', standalone: false @@ -49,7 +91,7 @@ describe('SCAM Directive Generator', () => { it('should create the separate scam directive correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -66,26 +108,63 @@ describe('SCAM Directive Generator', () => { // ASSERT const directiveModuleSource = tree.read( - 'apps/app1/src/app/example.module.ts', + 'apps/app1/src/app/example-module.ts', 'utf-8' ); expect(directiveModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExampleDirective } from './example.directive'; + import { Example } from './example'; @NgModule({ imports: [CommonModule], - declarations: [ExampleDirective], - exports: [ExampleDirective], + declarations: [Example], + exports: [Example], }) - export class ExampleDirectiveModule {} + export class ExampleModule {} + " + `); + }); + + it('should create the module respecting the "typeSeparator" generator default', async () => { + const tree = createTreeWithEmptyWorkspace(); + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:module': { typeSeparator: '.' }, + }; + updateNxJson(tree, nxJson); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamDirectiveGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example', + inlineScam: false, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { Example } from './example'; + + @NgModule({ + imports: [CommonModule], + declarations: [Example], + exports: [Example], + }) + export class ExampleModule {} " `); }); it('should handle path with file extension', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -111,23 +190,23 @@ describe('SCAM Directive Generator', () => { selector: '[example]', standalone: false }) - export class ExampleDirective { + export class Example { constructor() {} } @NgModule({ imports: [CommonModule], - declarations: [ExampleDirective], - exports: [ExampleDirective], + declarations: [Example], + exports: [Example], }) - export class ExampleDirectiveModule {} + export class ExampleModule {} " `); }); it('should create the scam directive correctly and export it for a secondary entrypoint', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', @@ -149,20 +228,20 @@ describe('SCAM Directive Generator', () => { // ASSERT const directiveModuleSource = tree.read( - 'libs/lib1/feature/src/lib/example/example.module.ts', + 'libs/lib1/feature/src/lib/example/example-module.ts', 'utf-8' ); expect(directiveModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExampleDirective } from './example.directive'; + import { Example } from './example'; @NgModule({ imports: [CommonModule], - declarations: [ExampleDirective], - exports: [ExampleDirective], + declarations: [Example], + exports: [Example], }) - export class ExampleDirectiveModule {} + export class ExampleModule {} " `); const secondaryEntryPointSource = tree.read( @@ -170,8 +249,8 @@ describe('SCAM Directive Generator', () => { 'utf-8' ); expect(secondaryEntryPointSource).toMatchInlineSnapshot(` - "export * from './lib/example/example.directive'; - export * from './lib/example/example.module';" + "export * from './lib/example/example'; + export * from './lib/example/example-module';" `); }); @@ -188,13 +267,13 @@ describe('SCAM Directive Generator', () => { name: '404', path: 'apps/app1/src/app/example', }) - ).rejects.toThrow('Class name "404Directive" is invalid.'); + ).rejects.toThrow('Class name "404" is invalid.'); }); describe('--path', () => { - it('should not throw when the path does not exist under project', async () => { + it('should not throw when the path exists under project', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -211,7 +290,7 @@ describe('SCAM Directive Generator', () => { // ASSERT const directiveSource = tree.read( - 'apps/app1/src/app/random/example/example.directive.ts', + 'apps/app1/src/app/random/example/example.ts', 'utf-8' ); expect(directiveSource).toMatchInlineSnapshot(` @@ -222,23 +301,23 @@ describe('SCAM Directive Generator', () => { selector: '[example]', standalone: false }) - export class ExampleDirective { + export class Example { constructor() {} } @NgModule({ imports: [CommonModule], - declarations: [ExampleDirective], - exports: [ExampleDirective], + declarations: [Example], + exports: [Example], }) - export class ExampleDirectiveModule {} + export class ExampleModule {} " `); }); it('should not matter if the path starts with a slash', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -255,7 +334,7 @@ describe('SCAM Directive Generator', () => { // ASSERT const directiveSource = tree.read( - 'apps/app1/src/app/random/example/example.directive.ts', + 'apps/app1/src/app/random/example/example.ts', 'utf-8' ); expect(directiveSource).toMatchInlineSnapshot(` @@ -266,23 +345,23 @@ describe('SCAM Directive Generator', () => { selector: '[example]', standalone: false }) - export class ExampleDirective { + export class Example { constructor() {} } @NgModule({ imports: [CommonModule], - declarations: [ExampleDirective], - exports: [ExampleDirective], + declarations: [Example], + exports: [Example], }) - export class ExampleDirectiveModule {} + export class ExampleModule {} " `); }); it('should throw when the path does not exist under project', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -302,4 +381,89 @@ describe('SCAM Directive Generator', () => { ); }); }); + + describe('compat', () => { + it('should generate the scam directive with the "directive" type for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamDirectiveGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example', + inlineScam: true, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example.directive.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Directive, NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Directive({ + selector: '[example]', + standalone: false + }) + export class ExampleDirective { + constructor() {} + } + + @NgModule({ + imports: [CommonModule], + declarations: [ExampleDirective], + exports: [ExampleDirective], + }) + export class ExampleDirectiveModule {} + " + `); + }); + + it('should generate the module with the "." type separator for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamDirectiveGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example', + inlineScam: false, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { ExampleDirective } from './example.directive'; + + @NgModule({ + imports: [CommonModule], + declarations: [ExampleDirective], + exports: [ExampleDirective], + }) + export class ExampleDirectiveModule {} + " + `); + }); + }); }); diff --git a/packages/angular/src/generators/scam-directive/schema.d.ts b/packages/angular/src/generators/scam-directive/schema.d.ts index ed335ab8df..dbd9f90e32 100644 --- a/packages/angular/src/generators/scam-directive/schema.d.ts +++ b/packages/angular/src/generators/scam-directive/schema.d.ts @@ -6,6 +6,7 @@ export interface Schema { prefix?: string; selector?: string; export?: boolean; + type?: string; skipFormat?: boolean; } @@ -18,4 +19,5 @@ export interface NormalizedSchema extends Schema { inlineScam: boolean; symbolName: string; projectName: string; + modulePath: string; } diff --git a/packages/angular/src/generators/scam-directive/schema.json b/packages/angular/src/generators/scam-directive/schema.json index a4de0a5cab..3ab64b789e 100644 --- a/packages/angular/src/generators/scam-directive/schema.json +++ b/packages/angular/src/generators/scam-directive/schema.json @@ -10,11 +10,15 @@ "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo.directive.ts" }, { - "description": "Generate a directive without providing the file extension. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive without providing the file extension. It results in the directive `Foo` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo" }, { - "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `CustomDirective` at `mylib/src/lib/foo.directive.ts`", + "description": "Generate a directive with a given type/suffix. It results in the directive `FooDirective` at `mylib/src/lib/foo.directive.ts`", + "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo --type=directive" + }, + { + "description": "Generate a directive with the exported symbol different from the file name. It results in the directive `Custom` at `mylib/src/lib/foo.ts`", "command": "nx g @nx/angular:scam-directive mylib/src/lib/foo --name=custom" } ], @@ -70,6 +74,10 @@ "default": true, "x-priority": "important" }, + "type": { + "type": "string", + "description": "Append a custom type to the directive's filename. It defaults to 'directive' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", diff --git a/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.spec.ts b/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.spec.ts index da73325d1b..80a381e7d6 100644 --- a/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.spec.ts +++ b/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.spec.ts @@ -6,7 +6,7 @@ import { convertPipeToScam } from './convert-pipe-to-scam'; describe('convertPipeToScam', () => { it('should create the scam pipe inline correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -26,10 +26,11 @@ describe('convertPipeToScam', () => { convertPipeToScam(tree, { path: 'apps/app1/src/app/example/example', directory: 'apps/app1/src/app/example', - fileName: 'example.pipe', - filePath: 'apps/app1/src/app/example/example.pipe.ts', + fileName: 'example-pipe', + filePath: 'apps/app1/src/app/example/example-pipe.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example/example-module.ts', export: false, inlineScam: true, symbolName: 'ExamplePipe', @@ -37,7 +38,7 @@ describe('convertPipeToScam', () => { // ASSERT const pipeSource = tree.read( - 'apps/app1/src/app/example/example.pipe.ts', + 'apps/app1/src/app/example/example-pipe.ts', 'utf-8' ); expect(pipeSource).toMatchInlineSnapshot(` @@ -66,7 +67,7 @@ describe('convertPipeToScam', () => { it('should create the scam pipe separately correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -85,10 +86,11 @@ describe('convertPipeToScam', () => { convertPipeToScam(tree, { path: 'apps/app1/src/app/example/example', directory: 'apps/app1/src/app/example', - fileName: 'example.pipe', - filePath: 'apps/app1/src/app/example/example.pipe.ts', + fileName: 'example-pipe', + filePath: 'apps/app1/src/app/example/example-pipe.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example/example-module.ts', export: false, inlineScam: false, symbolName: 'ExamplePipe', @@ -96,13 +98,13 @@ describe('convertPipeToScam', () => { // ASSERT const pipeModuleSource = tree.read( - 'apps/app1/src/app/example/example.module.ts', + 'apps/app1/src/app/example/example-module.ts', 'utf-8' ); expect(pipeModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExamplePipe } from './example.pipe'; + import { ExamplePipe } from './example-pipe'; @NgModule({ imports: [CommonModule], diff --git a/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.ts b/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.ts index 55b6a14174..cc5c056162 100644 --- a/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.ts +++ b/packages/angular/src/generators/scam-pipe/lib/convert-pipe-to-scam.ts @@ -1,5 +1,4 @@ import type { Tree } from '@nx/devkit'; -import { joinPathFragments, names } from '@nx/devkit'; import { insertImport } from '@nx/js'; import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; import type { NormalizedSchema } from '../schema'; @@ -49,13 +48,8 @@ export function convertPipeToScam(tree: Tree, options: NormalizedSchema) { return; } - const scamFilePath = joinPathFragments( - options.directory, - `${options.name}.module.ts` - ); - tree.write( - scamFilePath, + options.modulePath, getModuleFileContent(options.symbolName, options.fileName) ); } diff --git a/packages/angular/src/generators/scam-pipe/lib/normalize-options.ts b/packages/angular/src/generators/scam-pipe/lib/normalize-options.ts index b1aaf04842..d764fc65c0 100644 --- a/packages/angular/src/generators/scam-pipe/lib/normalize-options.ts +++ b/packages/angular/src/generators/scam-pipe/lib/normalize-options.ts @@ -1,13 +1,18 @@ import type { Tree } from '@nx/devkit'; -import { names } from '@nx/devkit'; +import { joinPathFragments, names } from '@nx/devkit'; import { determineArtifactNameAndDirectoryOptions } from '@nx/devkit/src/generators/artifact-name-and-directory-utils'; +import { getModuleTypeSeparator } from '../../utils/artifact-types'; import { validateClassName } from '../../utils/validations'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema, Schema } from '../schema'; export async function normalizeOptions( tree: Tree, options: Schema ): Promise { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + options.typeSeparator ??= angularMajorVersion < 20 ? '.' : '-'; + const { artifactName: name, directory, @@ -18,6 +23,7 @@ export async function normalizeOptions( name: options.name, path: options.path, suffix: 'pipe', + suffixSeparator: options.typeSeparator, allowedFileExtensions: ['ts'], fileExtension: 'ts', }); @@ -27,6 +33,12 @@ export async function normalizeOptions( const symbolName = `${className}${suffixClassName}`; validateClassName(symbolName); + const moduleTypeSeparator = getModuleTypeSeparator(tree); + const modulePath = joinPathFragments( + directory, + `${name}${moduleTypeSeparator}module.ts` + ); + return { ...options, export: options.export ?? true, @@ -37,5 +49,6 @@ export async function normalizeOptions( name, symbolName, projectName, + modulePath, }; } diff --git a/packages/angular/src/generators/scam-pipe/scam-pipe.spec.ts b/packages/angular/src/generators/scam-pipe/scam-pipe.spec.ts index dcd5ae25d5..e3ed96720c 100644 --- a/packages/angular/src/generators/scam-pipe/scam-pipe.spec.ts +++ b/packages/angular/src/generators/scam-pipe/scam-pipe.spec.ts @@ -1,11 +1,17 @@ -import { addProjectConfiguration, writeJson } from '@nx/devkit'; +import { + addProjectConfiguration, + readNxJson, + updateJson, + updateNxJson, + writeJson, +} from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { scamPipeGenerator } from './scam-pipe'; describe('SCAM Pipe Generator', () => { it('should create the inline scam pipe correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -21,6 +27,50 @@ describe('SCAM Pipe Generator', () => { }); // ASSERT + const pipeSource = tree.read( + 'apps/app1/src/app/example/example-pipe.ts', + 'utf-8' + ); + expect(pipeSource).toMatchInlineSnapshot(` + "import { Pipe, PipeTransform, NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Pipe({ + name: 'example', + standalone: false + }) + export class ExamplePipe implements PipeTransform { + transform(value: unknown, ...args: unknown[]): unknown { + return null; + } + } + + @NgModule({ + imports: [CommonModule], + declarations: [ExamplePipe], + exports: [ExamplePipe], + }) + export class ExamplePipeModule {} + " + `); + }); + + it('should create the inline scam pipe file with the provided type separator', async () => { + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamPipeGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example/example', + inlineScam: true, + typeSeparator: '.', + skipFormat: true, + }); + const pipeSource = tree.read( 'apps/app1/src/app/example/example.pipe.ts', 'utf-8' @@ -51,7 +101,7 @@ describe('SCAM Pipe Generator', () => { it('should create the separate scam pipe correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -68,13 +118,50 @@ describe('SCAM Pipe Generator', () => { // ASSERT const pipeModuleSource = tree.read( - 'apps/app1/src/app/example/example.module.ts', + 'apps/app1/src/app/example/example-module.ts', 'utf-8' ); expect(pipeModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExamplePipe } from './example.pipe'; + import { ExamplePipe } from './example-pipe'; + + @NgModule({ + imports: [CommonModule], + declarations: [ExamplePipe], + exports: [ExamplePipe], + }) + export class ExamplePipeModule {} + " + `); + }); + + it('should create the module respecting the "typeSeparator" generator default', async () => { + const tree = createTreeWithEmptyWorkspace(); + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:module': { typeSeparator: '.' }, + }; + updateNxJson(tree, nxJson); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamPipeGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example/example', + inlineScam: false, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example/example.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { ExamplePipe } from './example-pipe'; @NgModule({ imports: [CommonModule], @@ -87,7 +174,7 @@ describe('SCAM Pipe Generator', () => { }); it('should handle path with file extension', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -131,7 +218,7 @@ describe('SCAM Pipe Generator', () => { it('should create the scam pipe correctly and export it for a secondary entrypoint', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', @@ -153,13 +240,13 @@ describe('SCAM Pipe Generator', () => { // ASSERT const pipeModuleSource = tree.read( - 'libs/lib1/feature/src/lib/example/example.module.ts', + 'libs/lib1/feature/src/lib/example/example-module.ts', 'utf-8' ); expect(pipeModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExamplePipe } from './example.pipe'; + import { ExamplePipe } from './example-pipe'; @NgModule({ imports: [CommonModule], @@ -174,8 +261,8 @@ describe('SCAM Pipe Generator', () => { 'utf-8' ); expect(secondaryEntryPointSource).toMatchInlineSnapshot(` - "export * from './lib/example/example.pipe'; - export * from './lib/example/example.module';" + "export * from './lib/example/example-pipe'; + export * from './lib/example/example-module';" `); }); @@ -196,9 +283,9 @@ describe('SCAM Pipe Generator', () => { }); describe('--path', () => { - it('should not throw when the path does not exist under project', async () => { + it('should not throw when the path exists under project', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -215,7 +302,7 @@ describe('SCAM Pipe Generator', () => { // ASSERT const pipeSource = tree.read( - 'apps/app1/src/app/random/example/example.pipe.ts', + 'apps/app1/src/app/random/example/example-pipe.ts', 'utf-8' ); expect(pipeSource).toMatchInlineSnapshot(` @@ -244,7 +331,7 @@ describe('SCAM Pipe Generator', () => { it('should not matter if the path starts with a slash', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -261,7 +348,7 @@ describe('SCAM Pipe Generator', () => { // ASSERT const pipeSource = tree.read( - 'apps/app1/src/app/random/example/example.pipe.ts', + 'apps/app1/src/app/random/example/example-pipe.ts', 'utf-8' ); expect(pipeSource).toMatchInlineSnapshot(` @@ -290,7 +377,7 @@ describe('SCAM Pipe Generator', () => { it('should throw when the path does not exist under project', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -310,4 +397,91 @@ describe('SCAM Pipe Generator', () => { ); }); }); + + describe('compat', () => { + it('should generate scam pipe file with the "." type separator for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamPipeGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example/example', + inlineScam: true, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example/example.pipe.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Pipe, PipeTransform, NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Pipe({ + name: 'example', + standalone: false + }) + export class ExamplePipe implements PipeTransform { + transform(value: unknown, ...args: unknown[]): unknown { + return null; + } + } + + @NgModule({ + imports: [CommonModule], + declarations: [ExamplePipe], + exports: [ExamplePipe], + }) + export class ExamplePipeModule {} + " + `); + }); + + it('should generate the module file with the "." type separator for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamPipeGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example/example', + inlineScam: false, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example/example.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { ExamplePipe } from './example.pipe'; + + @NgModule({ + imports: [CommonModule], + declarations: [ExamplePipe], + exports: [ExamplePipe], + }) + export class ExamplePipeModule {} + " + `); + }); + }); }); diff --git a/packages/angular/src/generators/scam-pipe/schema.d.ts b/packages/angular/src/generators/scam-pipe/schema.d.ts index 1d8c717ba8..968d0d4f24 100644 --- a/packages/angular/src/generators/scam-pipe/schema.d.ts +++ b/packages/angular/src/generators/scam-pipe/schema.d.ts @@ -4,6 +4,7 @@ export interface Schema { skipTests?: boolean; inlineScam?: boolean; export?: boolean; + typeSeparator?: string; skipFormat?: boolean; } @@ -16,4 +17,5 @@ export interface NormalizedSchema extends Schema { inlineScam: boolean; projectName: string; symbolName: string; + modulePath: string; } diff --git a/packages/angular/src/generators/scam-pipe/schema.json b/packages/angular/src/generators/scam-pipe/schema.json index 7f3ce2b740..43f219e703 100644 --- a/packages/angular/src/generators/scam-pipe/schema.json +++ b/packages/angular/src/generators/scam-pipe/schema.json @@ -51,6 +51,11 @@ "default": true, "x-priority": "important" }, + "typeSeparator": { + "type": "string", + "enum": ["-", "."], + "description": "The separator character to use before the type within the generated file's name. For example, if you set the option to `.`, the file will be named `example.pipe.ts`. It defaults to '-' for Angular v20+. For versions below v20, it defaults to '.'." + }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", diff --git a/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.spec.ts b/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.spec.ts index 6a0c364a65..e9a02a0980 100644 --- a/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.spec.ts +++ b/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.spec.ts @@ -17,22 +17,21 @@ describe('scam-to-standalone', () => { tree.write( 'foo/src/app/mymodule.module.ts', - `import { BarComponentModule } from './bar/bar.component'; + `import { BarModule } from './bar/bar'; import { ExtraBarComponentModule } from './bar/extra-bar.component'; @NgModule({ - imports: [BarComponentModule, ExtraBarComponentModule] + imports: [BarModule, ExtraBarComponentModule] }) export class MyModule {}` ); await scamToStandalone(tree, { - component: 'src/app/bar/bar.component.ts', + component: 'src/app/bar/bar.ts', project: 'foo', }); - expect(tree.read('foo/src/app/bar/bar.component.ts', 'utf-8')) - .toMatchInlineSnapshot(` + expect(tree.read('foo/src/app/bar/bar.ts', 'utf-8')).toMatchInlineSnapshot(` "import { Component, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; @@ -40,40 +39,40 @@ describe('scam-to-standalone', () => { imports: [CommonModule], selector: 'app-bar', standalone: false, - templateUrl: './bar.component.html', - styleUrl: './bar.component.css', + templateUrl: './bar.html', + styleUrl: './bar.css', }) - export class BarComponent {} + export class Bar {} " `); expect(tree.read('foo/src/app/mymodule.module.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { BarComponent } from './bar/bar.component'; + "import { Bar } from './bar/bar'; import { ExtraBarComponentModule } from './bar/extra-bar.component'; @NgModule({ - imports: [BarComponent, ExtraBarComponentModule], + imports: [Bar, ExtraBarComponentModule], }) export class MyModule {} " `); - expect(tree.read('foo/src/app/bar/bar.component.spec.ts', 'utf-8')) + expect(tree.read('foo/src/app/bar/bar.spec.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { ComponentFixture, TestBed } from '@angular/core/testing'; - import { BarComponent } from './bar.component'; + import { Bar } from './bar'; - describe('BarComponent', () => { - let component: BarComponent; - let fixture: ComponentFixture; + describe('Bar', () => { + let component: Bar; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [BarComponent], + imports: [Bar], }).compileComponents(); - fixture = TestBed.createComponent(BarComponent); + fixture = TestBed.createComponent(Bar); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/packages/angular/src/generators/scam/lib/convert-component-to-scam.spec.ts b/packages/angular/src/generators/scam/lib/convert-component-to-scam.spec.ts index 42a175bda2..e0db361432 100644 --- a/packages/angular/src/generators/scam/lib/convert-component-to-scam.spec.ts +++ b/packages/angular/src/generators/scam/lib/convert-component-to-scam.spec.ts @@ -6,7 +6,7 @@ import { convertComponentToScam } from './convert-component-to-scam'; describe('convertComponentToScam', () => { it('should create the scam inline correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -26,18 +26,19 @@ describe('convertComponentToScam', () => { convertComponentToScam(tree, { path: 'apps/app1/src/app/example/example', directory: 'apps/app1/src/app/example', - fileName: 'example.component', - filePath: 'apps/app1/src/app/example/example.component.ts', + fileName: 'example', + filePath: 'apps/app1/src/app/example/example.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example/example-module.ts', export: false, inlineScam: true, - symbolName: 'ExampleComponent', + symbolName: 'Example', }); // ASSERT const componentSource = tree.read( - 'apps/app1/src/app/example/example.component.ts', + 'apps/app1/src/app/example/example.ts', 'utf-8' ); expect(componentSource).toMatchInlineSnapshot(` @@ -47,24 +48,24 @@ describe('convertComponentToScam', () => { @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) - export class ExampleComponent {} + export class Example {} @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} " `); }); it('should create the scam separately correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -84,38 +85,39 @@ describe('convertComponentToScam', () => { convertComponentToScam(tree, { path: 'apps/app1/src/app/example/example', directory: 'apps/app1/src/app/example', - fileName: 'example.component', - filePath: 'apps/app1/src/app/example/example.component.ts', + fileName: 'example', + filePath: 'apps/app1/src/app/example/example.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example/example-module.ts', export: false, inlineScam: false, - symbolName: 'ExampleComponent', + symbolName: 'Example', }); // ASSERT const componentModuleSource = tree.read( - 'apps/app1/src/app/example/example.module.ts', + 'apps/app1/src/app/example/example-module.ts', 'utf-8' ); expect(componentModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExampleComponent } from './example.component'; + import { Example } from './example'; @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} " `); }); it('should create the scam inline correctly when --type', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -140,6 +142,7 @@ describe('convertComponentToScam', () => { filePath: 'apps/app1/src/app/example.random.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example-module.ts', export: false, inlineScam: true, type: 'random', @@ -175,7 +178,7 @@ describe('convertComponentToScam', () => { it('should create the scam separately correctly when --type', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -200,6 +203,7 @@ describe('convertComponentToScam', () => { filePath: 'apps/app1/src/app/example.random.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/app/example-module.ts', export: false, inlineScam: false, type: 'random', @@ -208,7 +212,7 @@ describe('convertComponentToScam', () => { // ASSERT const componentModuleSource = tree.read( - 'apps/app1/src/app/example.module.ts', + 'apps/app1/src/app/example-module.ts', 'utf-8' ); expect(componentModuleSource).toMatchInlineSnapshot(` diff --git a/packages/angular/src/generators/scam/lib/convert-component-to-scam.ts b/packages/angular/src/generators/scam/lib/convert-component-to-scam.ts index 09394c1cff..e2fb051f41 100644 --- a/packages/angular/src/generators/scam/lib/convert-component-to-scam.ts +++ b/packages/angular/src/generators/scam/lib/convert-component-to-scam.ts @@ -1,5 +1,4 @@ import type { Tree } from '@nx/devkit'; -import { joinPathFragments, names } from '@nx/devkit'; import { insertImport } from '@nx/js'; import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; import type { NormalizedSchema } from '../schema'; @@ -50,13 +49,8 @@ export function convertComponentToScam(tree: Tree, options: NormalizedSchema) { return; } - const moduleFilePath = joinPathFragments( - options.directory, - `${options.name}.module.ts` - ); - tree.write( - moduleFilePath, + options.modulePath, getModuleFileContent(options.symbolName, options.fileName) ); } diff --git a/packages/angular/src/generators/scam/lib/normalize-options.ts b/packages/angular/src/generators/scam/lib/normalize-options.ts index 8970112677..b0cad4be24 100644 --- a/packages/angular/src/generators/scam/lib/normalize-options.ts +++ b/packages/angular/src/generators/scam/lib/normalize-options.ts @@ -1,14 +1,20 @@ import type { Tree } from '@nx/devkit'; -import { names } from '@nx/devkit'; +import { joinPathFragments, names } from '@nx/devkit'; import { determineArtifactNameAndDirectoryOptions } from '@nx/devkit/src/generators/artifact-name-and-directory-utils'; +import { getModuleTypeSeparator } from '../../utils/artifact-types'; import { validateClassName } from '../../utils/validations'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema, Schema } from '../schema'; export async function normalizeOptions( tree: Tree, options: Schema ): Promise { - options.type ??= 'component'; + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 20) { + options.type ??= 'component'; + } + const { artifactName: name, directory, @@ -18,16 +24,22 @@ export async function normalizeOptions( } = await determineArtifactNameAndDirectoryOptions(tree, { name: options.name, path: options.path, - suffix: options.type ?? 'component', + suffix: options.type, allowedFileExtensions: ['ts'], fileExtension: 'ts', }); const { className } = names(name); - const { className: suffixClassName } = names(options.type); + const suffixClassName = options.type ? names(options.type).className : ''; const symbolName = `${className}${suffixClassName}`; validateClassName(symbolName); + const moduleTypeSeparator = getModuleTypeSeparator(tree); + const modulePath = joinPathFragments( + directory, + `${name}${moduleTypeSeparator}module.ts` + ); + return { ...options, export: options.export ?? true, @@ -38,5 +50,6 @@ export async function normalizeOptions( name, symbolName, projectName, + modulePath, }; } diff --git a/packages/angular/src/generators/scam/scam.spec.ts b/packages/angular/src/generators/scam/scam.spec.ts index 4f0fe2205f..b1438603c4 100644 --- a/packages/angular/src/generators/scam/scam.spec.ts +++ b/packages/angular/src/generators/scam/scam.spec.ts @@ -1,11 +1,17 @@ -import { addProjectConfiguration, writeJson } from '@nx/devkit'; +import { + addProjectConfiguration, + readNxJson, + updateJson, + updateNxJson, + writeJson, +} from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { scamGenerator } from './scam'; describe('SCAM Generator', () => { it('should create the inline scam correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -22,7 +28,7 @@ describe('SCAM Generator', () => { // ASSERT const componentSource = tree.read( - 'apps/app1/src/app/example/example.component.ts', + 'apps/app1/src/app/example/example.ts', 'utf-8' ); expect(componentSource).toMatchInlineSnapshot(` @@ -32,24 +38,24 @@ describe('SCAM Generator', () => { @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) - export class ExampleComponent {} + export class Example {} @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} " `); }); it('should create the separate scam correctly', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -66,26 +72,63 @@ describe('SCAM Generator', () => { // ASSERT const componentModuleSource = tree.read( - 'apps/app1/src/app/example/example.module.ts', + 'apps/app1/src/app/example/example-module.ts', 'utf-8' ); expect(componentModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExampleComponent } from './example.component'; + import { Example } from './example'; @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} + " + `); + }); + + it('should create the module respecting the "typeSeparator" generator default', async () => { + const tree = createTreeWithEmptyWorkspace(); + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:module': { typeSeparator: '.' }, + }; + updateNxJson(tree, nxJson); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example/example', + inlineScam: false, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example/example.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { Example } from './example'; + + @NgModule({ + imports: [CommonModule], + declarations: [Example], + exports: [Example], + }) + export class ExampleModule {} " `); }); it('should handle path with file extension', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -113,21 +156,21 @@ describe('SCAM Generator', () => { templateUrl: './example.component.html', styleUrl: './example.component.css' }) - export class ExampleComponent {} + export class Example {} @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} " `); }); it('should create the scam correctly and export it for a secondary entrypoint', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'lib1', { projectType: 'library', sourceRoot: 'libs/lib1/src', @@ -149,20 +192,20 @@ describe('SCAM Generator', () => { // ASSERT const componentModuleSource = tree.read( - 'libs/lib1/feature/src/lib/example/example.module.ts', + 'libs/lib1/feature/src/lib/example/example-module.ts', 'utf-8' ); expect(componentModuleSource).toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; - import { ExampleComponent } from './example.component'; + import { Example } from './example'; @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} " `); const secondaryEntryPointSource = tree.read( @@ -170,8 +213,8 @@ describe('SCAM Generator', () => { 'utf-8' ); expect(secondaryEntryPointSource).toMatchInlineSnapshot(` - "export * from './lib/example/example.component'; - export * from './lib/example/example.module';" + "export * from './lib/example/example'; + export * from './lib/example/example-module';" `); }); @@ -188,13 +231,13 @@ describe('SCAM Generator', () => { name: '404', path: 'apps/app1/src/app/example/example', }) - ).rejects.toThrow('Class name "404Component" is invalid.'); + ).rejects.toThrow('Class name "404" is invalid.'); }); describe('--path', () => { - it('should not throw when the directory does not exist under project', async () => { + it('should not throw when the directory exists under project', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -211,7 +254,7 @@ describe('SCAM Generator', () => { // ASSERT const componentSource = tree.read( - 'apps/app1/src/app/random/example/example.component.ts', + 'apps/app1/src/app/random/example/example.ts', 'utf-8' ); expect(componentSource).toMatchInlineSnapshot(` @@ -221,24 +264,24 @@ describe('SCAM Generator', () => { @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) - export class ExampleComponent {} + export class Example {} @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} " `); }); it('should not matter if the directory starts with a slash', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -255,7 +298,7 @@ describe('SCAM Generator', () => { // ASSERT const componentSource = tree.read( - 'apps/app1/src/app/random/example/example.component.ts', + 'apps/app1/src/app/random/example/example.ts', 'utf-8' ); expect(componentSource).toMatchInlineSnapshot(` @@ -265,24 +308,24 @@ describe('SCAM Generator', () => { @Component({ selector: 'example', standalone: false, - templateUrl: './example.component.html', - styleUrl: './example.component.css' + templateUrl: './example.html', + styleUrl: './example.css' }) - export class ExampleComponent {} + export class Example {} @NgModule({ imports: [CommonModule], - declarations: [ExampleComponent], - exports: [ExampleComponent], + declarations: [Example], + exports: [Example], }) - export class ExampleComponentModule {} + export class ExampleModule {} " `); }); it('should throw when the directory does not exist under project', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); addProjectConfiguration(tree, 'app1', { projectType: 'application', sourceRoot: 'apps/app1/src', @@ -302,4 +345,86 @@ describe('SCAM Generator', () => { ); }); }); + + describe('compat', () => { + it('should generate the component with the "component" type for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies['@angular/core'] = '~19.2.0'; + return json; + }); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example/example', + inlineScam: true, + skipFormat: true, + }); + + const componentSource = tree.read( + 'apps/app1/src/app/example/example.component.ts', + 'utf-8' + ); + expect(componentSource).toMatchInlineSnapshot(` + "import { Component, NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + + @Component({ + selector: 'example', + standalone: false, + templateUrl: './example.component.html', + styleUrl: './example.component.css' + }) + export class ExampleComponent {} + + @NgModule({ + imports: [CommonModule], + declarations: [ExampleComponent], + exports: [ExampleComponent], + }) + export class ExampleComponentModule {} + " + `); + }); + + it('should generate the module file with the "." type separator for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies['@angular/core'] = '~19.2.0'; + return json; + }); + addProjectConfiguration(tree, 'app1', { + projectType: 'application', + sourceRoot: 'apps/app1/src', + root: 'apps/app1', + }); + + await scamGenerator(tree, { + name: 'example', + path: 'apps/app1/src/app/example/example', + inlineScam: false, + skipFormat: true, + }); + + expect(tree.read('apps/app1/src/app/example/example.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { ExampleComponent } from './example.component'; + + @NgModule({ + imports: [CommonModule], + declarations: [ExampleComponent], + exports: [ExampleComponent], + }) + export class ExampleComponentModule {} + " + `); + }); + }); }); diff --git a/packages/angular/src/generators/scam/schema.d.ts b/packages/angular/src/generators/scam/schema.d.ts index 621e09425c..6489f9e0bd 100644 --- a/packages/angular/src/generators/scam/schema.d.ts +++ b/packages/angular/src/generators/scam/schema.d.ts @@ -26,4 +26,5 @@ export interface NormalizedSchema extends Schema { symbolName: string; export: boolean; inlineScam: boolean; + modulePath: string; } diff --git a/packages/angular/src/generators/scam/schema.json b/packages/angular/src/generators/scam/schema.json index 22c1e96213..dea7e9c9e1 100644 --- a/packages/angular/src/generators/scam/schema.json +++ b/packages/angular/src/generators/scam/schema.json @@ -94,8 +94,7 @@ }, "type": { "type": "string", - "description": "Adds a developer-defined type to the filename, in the format `name.type.ts`.", - "default": "component" + "description": "Append a custom type to the component's filename. It defaults to 'component' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified." }, "prefix": { "type": "string", diff --git a/packages/angular/src/generators/setup-mf/__snapshots__/setup-mf.spec.ts.snap b/packages/angular/src/generators/setup-mf/__snapshots__/setup-mf.spec.ts.snap index c3b35d31fb..8d96173439 100644 --- a/packages/angular/src/generators/setup-mf/__snapshots__/setup-mf.spec.ts.snap +++ b/packages/angular/src/generators/setup-mf/__snapshots__/setup-mf.spec.ts.snap @@ -21,7 +21,7 @@ fetch('/module-federation.manifest.json') `; exports[`Init MF --federationType=dynamic should wire up existing remote to dynamic host correctly 1`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; import { loadRemote } from '@module-federation/enhanced/runtime'; @@ -32,13 +32,13 @@ export const appRoutes: Route[] = [ }, { path: '', - component: NxWelcomeComponent + component: NxWelcome },]; " `; exports[`Init MF --federationType=dynamic should wire up existing remote to dynamic host correctly when --typescriptConfiguration=true 1`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; import { loadRemote } from '@module-federation/enhanced/runtime'; @@ -49,13 +49,13 @@ export const appRoutes: Route[] = [ }, { path: '', - component: NxWelcomeComponent + component: NxWelcome },]; " `; exports[`Init MF should add a remote application and add it to a specified host applications router config 1`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; export const appRoutes: Route[] = [ @@ -69,7 +69,7 @@ export const appRoutes: Route[] = [ }, { path: '', - component: NxWelcomeComponent + component: NxWelcome },]; " `; @@ -175,7 +175,7 @@ export default config; `; exports[`Init MF should add a remote to dynamic host correctly 1`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; import { loadRemote } from '@module-federation/enhanced/runtime'; @@ -186,13 +186,13 @@ export const appRoutes: Route[] = [ }, { path: '', - component: NxWelcomeComponent + component: NxWelcome },]; " `; exports[`Init MF should add a remote to dynamic host correctly when --typescriptConfiguration=true 1`] = ` -"import { NxWelcomeComponent } from './nx-welcome.component'; +"import { NxWelcome } from './nx-welcome'; import { Route } from '@angular/router'; import { loadRemote } from '@module-federation/enhanced/runtime'; @@ -203,7 +203,7 @@ export const appRoutes: Route[] = [ }, { path: '', - component: NxWelcomeComponent + component: NxWelcome },]; " `; @@ -264,7 +264,7 @@ exports[`Init MF should create webpack and mf configs correctly 4`] = ` module.exports = { name: 'remote1', exposes: { - './Module': 'remote1/src/app/remote-entry/entry.module.ts', + './Module': 'remote1/src/app/remote-entry/entry-module.ts', }, }; " @@ -329,7 +329,7 @@ exports[`Init MF should create webpack and mf configs correctly when --typescrip const config: ModuleFederationConfig = { name: 'remote1', exposes: { - './Module': 'remote1/src/app/remote-entry/entry.module.ts', + './Module': 'remote1/src/app/remote-entry/entry-module.ts', }, }; @@ -348,7 +348,7 @@ exports[`Init MF should generate the remote entry component correctly when prefi standalone: false, template: \`\` }) -export class RemoteEntryComponent {} +export class RemoteEntry {} " `; @@ -360,7 +360,7 @@ exports[`Init MF should generate the remote entry module and component correctly standalone: false, template: \`\`, }) -export class RemoteEntryComponent {} +export class RemoteEntry {} " `; @@ -368,14 +368,14 @@ exports[`Init MF should generate the remote entry module and component correctly "import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { RemoteEntryComponent } from './entry.component'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { RemoteEntry } from './entry'; +import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [RemoteEntryComponent, NxWelcomeComponent], + declarations: [RemoteEntry, NxWelcome], imports: [CommonModule], providers: [], - exports: [RemoteEntryComponent], + exports: [RemoteEntry], }) export class RemoteEntryModule {} " diff --git a/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.module.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/entry-module-files/__entryModuleFileName__.ts__tmpl__ similarity index 56% rename from packages/angular/src/generators/setup-mf/files/entry-module-files/entry.module.ts__tmpl__ rename to packages/angular/src/generators/setup-mf/files/entry-module-files/__entryModuleFileName__.ts__tmpl__ index 82fc12618d..cfa6df9d99 100644 --- a/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.module.ts__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/entry-module-files/__entryModuleFileName__.ts__tmpl__ @@ -2,17 +2,17 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common';<% if(routing) { %> import { RouterModule } from '@angular/router';<% } %> -import { RemoteEntryComponent } from './entry.component'; -import { NxWelcomeComponent } from './nx-welcome.component';<% if(routing) { %> +import { RemoteEntry<%= componentType %> } from './entry<%= componentFileSuffix %>'; +import { <%= nxWelcomeSymbolName %> } from './<%= nxWelcomeFileName %>';<% if(routing) { %> import { remoteRoutes } from './entry.routes';<% } %> @NgModule({ - declarations: [RemoteEntryComponent, NxWelcomeComponent], + declarations: [RemoteEntry<%= componentType %>, <%= nxWelcomeSymbolName %>], imports: [ CommonModule,<% if(routing) { %> RouterModule.forChild(remoteRoutes),<% } %> ], providers: [],<% if(!routing) { %> - exports: [RemoteEntryComponent],<% } %> + exports: [RemoteEntry<%= componentType %>],<% } %> }) export class RemoteEntryModule {} \ No newline at end of file diff --git a/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.routes.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.routes.ts__tmpl__ index 76cdef4997..a997287e1a 100644 --- a/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.routes.ts__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.routes.ts__tmpl__ @@ -1,4 +1,4 @@ import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry<%= componentType %> } from './entry<%= componentFileSuffix %>'; -export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }]; \ No newline at end of file +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry<%= componentType %> }]; \ No newline at end of file diff --git a/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.component.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/entry-module-files/entry__componentFileSuffix__.ts__tmpl__ similarity index 88% rename from packages/angular/src/generators/setup-mf/files/entry-module-files/entry.component.ts__tmpl__ rename to packages/angular/src/generators/setup-mf/files/entry-module-files/entry__componentFileSuffix__.ts__tmpl__ index 04d0b9e1a2..440aea2585 100644 --- a/packages/angular/src/generators/setup-mf/files/entry-module-files/entry.component.ts__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/entry-module-files/entry__componentFileSuffix__.ts__tmpl__ @@ -7,4 +7,4 @@ import { Component } from '@angular/core'; selector: '<%= appName %>-entry', template: ``<% } %> }) -export class RemoteEntryComponent {} +export class RemoteEntry<%= componentType %> {} diff --git a/packages/angular/src/generators/setup-mf/files/host-files/__appFileName__.spec.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/host-files/__appFileName__.spec.ts__tmpl__ new file mode 100644 index 0000000000..c528bc61b9 --- /dev/null +++ b/packages/angular/src/generators/setup-mf/files/host-files/__appFileName__.spec.ts__tmpl__ @@ -0,0 +1,43 @@ +import { fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { <%= appSymbolName %> } from './<%= appFileName %>'; +import { <%= nxWelcomeSymbolName %> } from './<%= nxWelcomeFileName %>'; +import { Router, RouterModule } from '@angular/router'; + +describe('<%= appSymbolName %>', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterModule.forRoot([ + { path: '', component: <%= nxWelcomeSymbolName %> }, + ]),<% if (standalone) { %> + <%= appSymbolName %>, + <%= nxWelcomeSymbolName %>,<% } %> + ],<% if (!standalone) { %> + declarations: [<%= appSymbolName %>, <%= nxWelcomeSymbolName %>],<% } %> + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(<%= appSymbolName %>); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title '<%= appName %>'`, () => { + const fixture = TestBed.createComponent(<%= appSymbolName %>); + const app = fixture.componentInstance; + expect(app.title).toEqual('<%= appName %>'); + }); + + it('should render title', fakeAsync(() => { + const fixture = TestBed.createComponent(<%= appSymbolName %>); + const router = TestBed.inject(Router); + fixture.ngZone?.run(() => router.navigate([''])); + tick(); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain( + 'Welcome <%= appName %>' + ); + })); +}); diff --git a/packages/angular/src/generators/setup-mf/files/host-files/app.component.spec.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/host-files/app.component.spec.ts__tmpl__ deleted file mode 100644 index be04c96682..0000000000 --- a/packages/angular/src/generators/setup-mf/files/host-files/app.component.spec.ts__tmpl__ +++ /dev/null @@ -1,47 +0,0 @@ -import { fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { AppComponent } from './app.component'; -import { NxWelcomeComponent } from './nx-welcome.component';<% if(useRouterTestingModule) { %> -import { RouterTestingModule } from '@angular/router/testing';<% } %> -import { Router<% if(!useRouterTestingModule) { %>, RouterModule<% } %> } from '@angular/router'; - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [<% if(useRouterTestingModule) { %> - RouterTestingModule.withRoutes([ - { path: '', component: NxWelcomeComponent }, - ]),<% } %><% if(!useRouterTestingModule) { %> - RouterModule.forRoot([ - { path: '', component: NxWelcomeComponent }, - ]),<% } %><% if (standalone) { %> - AppComponent, - NxWelcomeComponent,<% } %> - ],<% if (!standalone) { %> - declarations: [AppComponent, NxWelcomeComponent],<% } %> - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have as title '<%= appName %>'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('<%= appName %>'); - }); - - it('should render title', fakeAsync(() => { - const fixture = TestBed.createComponent(AppComponent); - const router = TestBed.inject(Router); - fixture.ngZone?.run(() => router.navigate([''])); - tick(); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain( - 'Welcome <%= appName %>' - ); - })); -}); diff --git a/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry.routes.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry.routes.ts__tmpl__ index 76cdef4997..a997287e1a 100644 --- a/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry.routes.ts__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry.routes.ts__tmpl__ @@ -1,4 +1,4 @@ import { Route } from '@angular/router'; -import { RemoteEntryComponent } from './entry.component'; +import { RemoteEntry<%= componentType %> } from './entry<%= componentFileSuffix %>'; -export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }]; \ No newline at end of file +export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry<%= componentType %> }]; \ No newline at end of file diff --git a/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry.component.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry__componentFileSuffix__.ts__tmpl__ similarity index 66% rename from packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry.component.ts__tmpl__ rename to packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry__componentFileSuffix__.ts__tmpl__ index 41e0b27433..8af5e868a7 100644 --- a/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry.component.ts__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/standalone-entry-component-files/entry__componentFileSuffix__.ts__tmpl__ @@ -1,13 +1,13 @@ import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NxWelcomeComponent } from './nx-welcome.component'; +import { <%= nxWelcomeSymbolName %> } from './<%= nxWelcomeFileName %>'; @Component({<% if (setStandaloneTrue) { %> standalone: true,<% } %> - imports: [CommonModule, NxWelcomeComponent],<% if (prefix) { %> + imports: [CommonModule, <%= nxWelcomeSymbolName %>],<% if (prefix) { %> selector: '<%= prefix %>-<%= appName %>-entry', template: `<<%= prefix %>-nx-welcome>-nx-welcome>`<% } else { %> selector: '<%= appName %>-entry', template: ``<% } %> }) -export class RemoteEntryComponent {} +export class RemoteEntry<%= componentType %> {} diff --git a/packages/angular/src/generators/setup-mf/files/ts-webpack/module-federation.config.ts__tmpl__ b/packages/angular/src/generators/setup-mf/files/ts-webpack/module-federation.config.ts__tmpl__ index af68795490..9688abab6a 100644 --- a/packages/angular/src/generators/setup-mf/files/ts-webpack/module-federation.config.ts__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/ts-webpack/module-federation.config.ts__tmpl__ @@ -17,7 +17,7 @@ const config: ModuleFederationConfig = { remotes: [<% if (federationType === 'static') { remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); } %>]<% } %><% if(type === 'remote') { %> exposes: {<% if(standalone) { %> './Routes': '<%= projectRoot %>/src/app/remote-entry/entry.routes.ts',<% } else { %> - './Module': '<%= projectRoot %>/src/app/remote-entry/entry.module.ts',<% } %> + './Module': '<%= projectRoot %>/src/app/remote-entry/<%= entryModuleFileName %>.ts',<% } %> },<% } %> }; diff --git a/packages/angular/src/generators/setup-mf/files/ts-webpack/tsconfig.lint.json__tmpl__ b/packages/angular/src/generators/setup-mf/files/ts-webpack/tsconfig.lint.json__tmpl__ index 1df0c1a0f2..ff3efdacd4 100644 --- a/packages/angular/src/generators/setup-mf/files/ts-webpack/tsconfig.lint.json__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/ts-webpack/tsconfig.lint.json__tmpl__ @@ -5,7 +5,7 @@ }, "include": [ "src/main.ts", - <% if(type === "remote") { %> "src/remote-entry/<% if(standalone) { %>entry.routes.ts", <% } else { %> entry.module.ts", <% } } %> + <% if(type === "remote") { %> "src/remote-entry/<% if(standalone) { %>entry.routes.ts",<% } else { %><%= entryModuleFileName %>.ts",<% } } %> "webpack.config.ts", "webpack.prod.config.ts" ] diff --git a/packages/angular/src/generators/setup-mf/files/webpack/module-federation.config.js__tmpl__ b/packages/angular/src/generators/setup-mf/files/webpack/module-federation.config.js__tmpl__ index 0fc24d6c7c..d23dd483e1 100644 --- a/packages/angular/src/generators/setup-mf/files/webpack/module-federation.config.js__tmpl__ +++ b/packages/angular/src/generators/setup-mf/files/webpack/module-federation.config.js__tmpl__ @@ -18,6 +18,6 @@ module.exports = { remotes: [<% if (federationType === 'static') { remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); } %>]<% } %><% if(type === 'remote') { %> exposes: {<% if(standalone) { %> './Routes': '<%= projectRoot %>/src/app/remote-entry/entry.routes.ts',<% } else { %> - './Module': '<%= projectRoot %>/src/app/remote-entry/entry.module.ts',<% } %> + './Module': '<%= projectRoot %>/src/app/remote-entry/<%= entryModuleFileName %>.ts',<% } %> },<% } %> }; diff --git a/packages/angular/src/generators/setup-mf/lib/add-remote-entry.ts b/packages/angular/src/generators/setup-mf/lib/add-remote-entry.ts index 8790a67aca..07570d7a77 100644 --- a/packages/angular/src/generators/setup-mf/lib/add-remote-entry.ts +++ b/packages/angular/src/generators/setup-mf/lib/add-remote-entry.ts @@ -1,15 +1,25 @@ import type { Tree } from '@nx/devkit'; import { generateFiles, joinPathFragments } from '@nx/devkit'; import { addRoute } from '../../../utils/nx-devkit/route-utils'; -import type { Schema } from '../schema'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; +import type { NormalizedOptions } from '../schema'; export function addRemoteEntry( tree: Tree, - { appName, routing, prefix, standalone }: Schema, + options: NormalizedOptions, appRoot: string ) { const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + const { + appName, + routing, + prefix, + standalone, + componentType, + componentFileSuffix, + nxWelcomeComponentInfo, + entryModuleFileName, + } = options; generateFiles( tree, @@ -25,9 +35,14 @@ export function addRemoteEntry( appName, routing, prefix, - // Angular v19 or higher defaults to true, while v18 or lower defaults to false + // Angular v19 or higher defaults to true, while lower versions default to false setStandaloneFalse: angularMajorVersion >= 19, setStandaloneTrue: angularMajorVersion < 19, + componentType, + componentFileSuffix, + entryModuleFileName, + nxWelcomeFileName: nxWelcomeComponentInfo.extensionlessFileName, + nxWelcomeSymbolName: nxWelcomeComponentInfo.symbolName, } ); @@ -41,7 +56,7 @@ export function addRemoteEntry( addRoute( tree, joinPathFragments(appRoot, 'src/app/app.routes.ts'), - `{ path: '', loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule) }` + `{ path: '', loadChildren: () => import('./remote-entry/${entryModuleFileName}').then(m => m.RemoteEntryModule) }` ); } } diff --git a/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts b/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts index c8cb6e2fa7..7c8cd2417d 100644 --- a/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts +++ b/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts @@ -207,10 +207,20 @@ function addLazyLoadedRouteToHostAppModule( }` ); - const pathToAppComponentTemplate = joinPathFragments( + let pathToAppComponentTemplate = joinPathFragments( hostAppConfig.sourceRoot, 'app/app.component.html' ); + const candidatePaths = [ + pathToAppComponentTemplate, + joinPathFragments(hostAppConfig.sourceRoot, 'app/app.html'), + ]; + for (const path of candidatePaths) { + if (tree.exists(path)) { + pathToAppComponentTemplate = path; + break; + } + } const appComponent = tree.read(pathToAppComponentTemplate, 'utf-8'); if ( appComponent.includes(`
        `) && diff --git a/packages/angular/src/generators/setup-mf/lib/fix-bootstrap.ts b/packages/angular/src/generators/setup-mf/lib/fix-bootstrap.ts index 271e20fd9d..63c81aefb0 100644 --- a/packages/angular/src/generators/setup-mf/lib/fix-bootstrap.ts +++ b/packages/angular/src/generators/setup-mf/lib/fix-bootstrap.ts @@ -1,11 +1,21 @@ import { joinPathFragments, type Tree } from '@nx/devkit'; -import type { Schema } from '../schema'; +import type { NormalizedOptions } from '../schema'; -export function fixBootstrap(tree: Tree, appRoot: string, options: Schema) { +export function fixBootstrap( + tree: Tree, + appRoot: string, + options: NormalizedOptions +) { const mainFilePath = joinPathFragments(appRoot, 'src/main.ts'); const bootstrapCode = tree.read(mainFilePath, 'utf-8'); if (options.standalone && options.mfType === 'remote') { - tree.write(`${appRoot}/src/bootstrap.ts`, standaloneBootstrapCode()); + tree.write( + `${appRoot}/src/bootstrap.ts`, + standaloneBootstrapCode( + options.componentType, + options.componentFileSuffix + ) + ); } else { tree.write(joinPathFragments(appRoot, 'src/bootstrap.ts'), bootstrapCode); } @@ -35,12 +45,14 @@ fetch('${manifestPath}') } } -const standaloneBootstrapCode = - () => `import { bootstrapApplication } from '@angular/platform-browser'; +const standaloneBootstrapCode = ( + componentType: string, + componentFileSuffix: string +) => `import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { RemoteEntryComponent } from './app/remote-entry/entry.component'; +import { RemoteEntry${componentType} } from './app/remote-entry/entry${componentFileSuffix}'; -bootstrapApplication(RemoteEntryComponent, appConfig).catch((err) => +bootstrapApplication(RemoteEntry${componentType}, appConfig).catch((err) => console.error(err) ); `; diff --git a/packages/angular/src/generators/setup-mf/lib/generate-config.ts b/packages/angular/src/generators/setup-mf/lib/generate-config.ts index 4f9a6f518f..0c60040b82 100644 --- a/packages/angular/src/generators/setup-mf/lib/generate-config.ts +++ b/packages/angular/src/generators/setup-mf/lib/generate-config.ts @@ -1,10 +1,10 @@ import type { Tree } from '@nx/devkit'; import { generateFiles, joinPathFragments, logger } from '@nx/devkit'; -import type { Schema } from '../schema'; +import type { NormalizedOptions } from '../schema'; export function generateWebpackConfig( tree: Tree, - options: Schema, + options: NormalizedOptions, appRoot: string, remotesWithPorts: { remoteName: string; port: number }[] ) { @@ -38,6 +38,7 @@ export function generateWebpackConfig( remotes: remotesWithPorts ?? [], projectRoot: appRoot, standalone: options.standalone, + entryModuleFileName: options.entryModuleFileName, } ); diff --git a/packages/angular/src/generators/setup-mf/lib/normalize-options.ts b/packages/angular/src/generators/setup-mf/lib/normalize-options.ts index 25e7f6bbe1..8dd3ad4ec5 100644 --- a/packages/angular/src/generators/setup-mf/lib/normalize-options.ts +++ b/packages/angular/src/generators/setup-mf/lib/normalize-options.ts @@ -1,4 +1,12 @@ -import type { Tree } from '@nx/devkit'; +import { names, readProjectConfiguration, type Tree } from '@nx/devkit'; +import { + getAppComponentInfo, + getNxWelcomeComponentInfo, +} from '../../utils/app-components-info'; +import { + getComponentType, + getModuleTypeSeparator, +} from '../../utils/artifact-types'; import { getProjectPrefix } from '../../utils/project'; import type { NormalizedOptions, Schema } from '../schema'; @@ -6,11 +14,27 @@ export function normalizeOptions( tree: Tree, options: Schema ): NormalizedOptions { + const componentType = getComponentType(tree); + const componentFileSuffix = componentType ? `.${componentType}` : ''; + const moduleTypeSeparator = getModuleTypeSeparator(tree); + const entryModuleFileName = `entry${moduleTypeSeparator}module`; + + const project = readProjectConfiguration(tree, options.appName); + return { ...options, typescriptConfiguration: options.typescriptConfiguration ?? true, federationType: options.federationType ?? 'static', prefix: options.prefix ?? getProjectPrefix(tree, options.appName) ?? 'app', standalone: options.standalone ?? true, + componentType: componentType ? names(componentType).className : '', + componentFileSuffix, + entryModuleFileName, + appComponentInfo: getAppComponentInfo(tree, componentFileSuffix, project), + nxWelcomeComponentInfo: getNxWelcomeComponentInfo( + tree, + componentFileSuffix, + project + ), }; } diff --git a/packages/angular/src/generators/setup-mf/lib/remove-dead-code-from-remote.ts b/packages/angular/src/generators/setup-mf/lib/remove-dead-code-from-remote.ts index 5e7eef0c0b..8fad1b50ab 100644 --- a/packages/angular/src/generators/setup-mf/lib/remove-dead-code-from-remote.ts +++ b/packages/angular/src/generators/setup-mf/lib/remove-dead-code-from-remote.ts @@ -1,15 +1,21 @@ import type { Tree } from '@nx/devkit'; import { joinPathFragments, readProjectConfiguration } from '@nx/devkit'; -import { Schema } from '../schema'; +import type { NormalizedOptions } from '../schema'; -export function removeDeadCodeFromRemote(tree: Tree, options: Schema) { +export function removeDeadCodeFromRemote( + tree: Tree, + options: NormalizedOptions +) { const projectName = options.appName; const project = readProjectConfiguration(tree, projectName); + const { appComponentInfo, nxWelcomeComponentInfo, entryModuleFileName } = + options; + ['css', 'less', 'scss', 'sass'].forEach((style) => { const pathToComponentStyle = joinPathFragments( project.sourceRoot, - `app/app.component.${style}` + `app/${appComponentInfo.extensionlessFileName}.${style}` ); if (tree.exists(pathToComponentStyle)) { tree.delete(pathToComponentStyle); @@ -17,23 +23,26 @@ export function removeDeadCodeFromRemote(tree: Tree, options: Schema) { }); tree.rename( - joinPathFragments(project.sourceRoot, 'app/nx-welcome.component.ts'), + nxWelcomeComponentInfo.path, joinPathFragments( project.sourceRoot, - 'app/remote-entry/nx-welcome.component.ts' + `app/remote-entry/${nxWelcomeComponentInfo.fileName}` ) ); tree.delete( - joinPathFragments(project.sourceRoot, 'app/app.component.spec.ts') + joinPathFragments( + project.sourceRoot, + `app/${appComponentInfo.extensionlessFileName}.spec.ts` + ) ); - tree.delete(joinPathFragments(project.sourceRoot, 'app/app.component.html')); - - const pathToAppComponent = joinPathFragments( - project.sourceRoot, - 'app/app.component.ts' + tree.delete( + joinPathFragments( + project.sourceRoot, + `app/${appComponentInfo.extensionlessFileName}.html` + ) ); if (!options.standalone) { - const componentContents = tree.read(pathToAppComponent, 'utf-8'); + const componentContents = tree.read(appComponentInfo.path, 'utf-8'); const isInlineTemplate = !componentContents.includes('templateUrl'); const component = @@ -43,33 +52,37 @@ export function removeDeadCodeFromRemote(tree: Tree, options: Schema) { `template: '' }) -export class AppComponent {}`; +export class ${appComponentInfo.symbolName} {}`; - tree.write(pathToAppComponent, component); + tree.write(appComponentInfo.path, component); + let modulePath = joinPathFragments(project.sourceRoot, 'app/app.module.ts'); + if (!tree.exists(modulePath)) { + modulePath = joinPathFragments(project.sourceRoot, 'app/app-module.ts'); + } tree.write( - joinPathFragments(project.sourceRoot, 'app/app.module.ts'), + modulePath, `import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { ${appComponentInfo.symbolName} } from './${appComponentInfo.extensionlessFileName}'; @NgModule({ - declarations: [AppComponent], + declarations: [${appComponentInfo.symbolName}], imports: [ BrowserModule, RouterModule.forRoot([{ path: '', - loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule) + loadChildren: () => import('./remote-entry/${entryModuleFileName}').then(m => m.RemoteEntryModule) }], { initialNavigation: 'enabledBlocking' }), ], providers: [], - bootstrap: [AppComponent], + bootstrap: [${appComponentInfo.symbolName}], }) export class AppModule {}` ); } else { - tree.delete(pathToAppComponent); + tree.delete(appComponentInfo.path); const pathToIndexHtml = project.targets.build.options.index; const indexContents = tree.read(pathToIndexHtml, 'utf-8'); diff --git a/packages/angular/src/generators/setup-mf/lib/setup-host-if-dynamic.ts b/packages/angular/src/generators/setup-mf/lib/setup-host-if-dynamic.ts index d76ae48c3e..93439c55ac 100644 --- a/packages/angular/src/generators/setup-mf/lib/setup-host-if-dynamic.ts +++ b/packages/angular/src/generators/setup-mf/lib/setup-host-if-dynamic.ts @@ -5,25 +5,17 @@ import { updateProjectConfiguration, } from '@nx/devkit'; import type { Schema } from '../schema'; -import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; export function setupHostIfDynamic(tree: Tree, options: Schema) { if (options.federationType === 'static') { return; } - const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); const project = readProjectConfiguration(tree, options.appName); - const pathToMFManifest = - angularMajorVersion >= 18 - ? joinPathFragments( - project.root, - 'public/module-federation.manifest.json' - ) - : joinPathFragments( - project.sourceRoot, - 'assets/module-federation.manifest.json' - ); + const pathToMFManifest = joinPathFragments( + project.root, + 'public/module-federation.manifest.json' + ); if (!tree.exists(pathToMFManifest)) { tree.write(pathToMFManifest, '{}'); diff --git a/packages/angular/src/generators/setup-mf/lib/setup-tspath-for-remote.ts b/packages/angular/src/generators/setup-mf/lib/setup-tspath-for-remote.ts index 6ae84c83e3..1a3248e2e2 100644 --- a/packages/angular/src/generators/setup-mf/lib/setup-tspath-for-remote.ts +++ b/packages/angular/src/generators/setup-mf/lib/setup-tspath-for-remote.ts @@ -1,14 +1,14 @@ import type { Tree } from '@nx/devkit'; -import type { Schema } from '../schema'; +import type { NormalizedOptions } from '../schema'; import { joinPathFragments, readProjectConfiguration } from '@nx/devkit'; import { addTsConfigPath } from '@nx/js'; -export function setupTspathForRemote(tree: Tree, options: Schema) { +export function setupTspathForRemote(tree: Tree, options: NormalizedOptions) { const project = readProjectConfiguration(tree, options.appName); const exportPath = options.standalone ? `./src/app/remote-entry/entry.routes.ts` - : `./src/app/remote-entry/entry.module.ts`; + : `./src/app/remote-entry/${options.entryModuleFileName}.ts`; const exportName = options.standalone ? 'Routes' : 'Module'; diff --git a/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts b/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts index 05445b4344..33986c774d 100644 --- a/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts +++ b/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts @@ -5,14 +5,18 @@ import { type Tree, } from '@nx/devkit'; import { addRoute } from '../../../utils/nx-devkit/route-utils'; -import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; -import type { Schema } from '../schema'; +import type { NormalizedOptions } from '../schema'; -export function updateHostAppRoutes(tree: Tree, options: Schema) { +export function updateHostAppRoutes(tree: Tree, options: NormalizedOptions) { const { sourceRoot } = readProjectConfiguration(tree, options.appName); + const { appComponentInfo, nxWelcomeComponentInfo } = options; tree.write( - joinPathFragments(sourceRoot, 'app/app.component.html'), + joinPathFragments( + sourceRoot, + 'app', + `${appComponentInfo.extensionlessFileName}.html` + ), ` @@ -24,15 +28,17 @@ export function updateHostAppRoutes(tree: Tree, options: Schema) { sourceRoot, 'app/app.routes.ts' ); - - let hostRootRoutingFile = tree.read(pathToHostRootRoutingFile, 'utf-8'); - - if (!hostRootRoutingFile) { + if (!tree.exists(pathToHostRootRoutingFile)) { pathToHostRootRoutingFile = joinPathFragments( sourceRoot, 'app/app-routing.module.ts' ); - hostRootRoutingFile = tree.read(pathToHostRootRoutingFile, 'utf-8'); + } + if (!tree.exists(pathToHostRootRoutingFile)) { + pathToHostRootRoutingFile = joinPathFragments( + sourceRoot, + 'app/app-routing-module.ts' + ); } addRoute( @@ -40,17 +46,18 @@ export function updateHostAppRoutes(tree: Tree, options: Schema) { pathToHostRootRoutingFile, `{ path: '', - component: NxWelcomeComponent + component: ${nxWelcomeComponentInfo.symbolName} }` ); tree.write( pathToHostRootRoutingFile, - `import { NxWelcomeComponent } from './nx-welcome.component'; + `import { ${nxWelcomeComponentInfo.symbolName} } from './${ + nxWelcomeComponentInfo.extensionlessFileName + }'; ${tree.read(pathToHostRootRoutingFile, 'utf-8')}` ); - const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); generateFiles( tree, joinPathFragments(__dirname, '../files/host-files'), @@ -58,7 +65,10 @@ ${tree.read(pathToHostRootRoutingFile, 'utf-8')}` { appName: options.appName, standalone: options.standalone, - useRouterTestingModule: angularMajorVersion < 18, + appFileName: appComponentInfo.extensionlessFileName, + appSymbolName: appComponentInfo.symbolName, + nxWelcomeFileName: nxWelcomeComponentInfo.extensionlessFileName, + nxWelcomeSymbolName: nxWelcomeComponentInfo.symbolName, tmpl: '', } ); diff --git a/packages/angular/src/generators/setup-mf/lib/update-tsconfig.ts b/packages/angular/src/generators/setup-mf/lib/update-tsconfig.ts index 4591bf8087..69d612ea29 100644 --- a/packages/angular/src/generators/setup-mf/lib/update-tsconfig.ts +++ b/packages/angular/src/generators/setup-mf/lib/update-tsconfig.ts @@ -1,5 +1,5 @@ import type { Tree } from '@nx/devkit'; -import type { Schema } from '../schema'; +import type { NormalizedOptions } from '../schema'; import { updateJson, @@ -7,19 +7,19 @@ import { joinPathFragments, } from '@nx/devkit'; -export function updateTsConfig(tree: Tree, schema: Schema) { - const { root } = readProjectConfiguration(tree, schema.appName); +export function updateTsConfig(tree: Tree, options: NormalizedOptions) { + const { root } = readProjectConfiguration(tree, options.appName); updateJson(tree, joinPathFragments(root, `tsconfig.app.json`), (json) => { json.compilerOptions ??= {}; json.compilerOptions.target = 'ES2020'; - if (schema.mfType === 'remote') { + if (options.mfType === 'remote') { json.files ??= []; json.files.push( - schema.standalone + options.standalone ? 'src/app/remote-entry/entry.routes.ts' - : 'src/app/remote-entry/entry.module.ts' + : `src/app/remote-entry/${options.entryModuleFileName}.ts` ); } diff --git a/packages/angular/src/generators/setup-mf/schema.d.ts b/packages/angular/src/generators/setup-mf/schema.d.ts index 0c983aa83f..8144d5660d 100644 --- a/packages/angular/src/generators/setup-mf/schema.d.ts +++ b/packages/angular/src/generators/setup-mf/schema.d.ts @@ -1,3 +1,5 @@ +import type { ComponentMetadata } from '../utils/app-components-info'; + type FederationType = 'static' | 'dynamic'; export interface Schema { @@ -21,4 +23,9 @@ export interface Schema { export interface NormalizedOptions extends Schema { federationType: FederationType; prefix: string | undefined; + componentType: string; + componentFileSuffix: string; + entryModuleFileName: string; + appComponentInfo: ComponentMetadata; + nxWelcomeComponentInfo: ComponentMetadata; } diff --git a/packages/angular/src/generators/setup-mf/setup-mf.spec.ts b/packages/angular/src/generators/setup-mf/setup-mf.spec.ts index c99bb98a6e..18577858c7 100644 --- a/packages/angular/src/generators/setup-mf/setup-mf.spec.ts +++ b/packages/angular/src/generators/setup-mf/setup-mf.spec.ts @@ -2,8 +2,10 @@ import 'nx/src/internal-testing-utils/mock-project-graph'; import { readJson, + readNxJson, readProjectConfiguration, updateJson, + updateNxJson, type Tree, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -16,15 +18,17 @@ describe('Init MF', () => { let tree: Tree; beforeEach(async () => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', + bundler: 'webpack', routing: true, standalone: false, skipFormat: true, }); await generateTestApplication(tree, { directory: 'remote1', + bundler: 'webpack', routing: true, standalone: false, skipFormat: true, @@ -233,10 +237,10 @@ describe('Init MF', () => { // ASSERT expect( - tree.read('remote1/src/app/remote-entry/entry.component.ts', 'utf-8') + tree.read('remote1/src/app/remote-entry/entry.ts', 'utf-8') ).toMatchSnapshot(); expect( - tree.read('remote1/src/app/remote-entry/entry.module.ts', 'utf-8') + tree.read('remote1/src/app/remote-entry/entry-module.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -251,7 +255,7 @@ describe('Init MF', () => { // ASSERT expect( - tree.read('remote1/src/app/remote-entry/entry.component.ts', 'utf-8') + tree.read('remote1/src/app/remote-entry/entry.ts', 'utf-8') ).toMatchSnapshot(); }); @@ -717,38 +721,38 @@ describe('Init MF', () => { prefix: 'my-org', }); - expect(tree.read('app1/src/app/app.component.spec.ts', 'utf-8')) + expect(tree.read('app1/src/app/app.spec.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { fakeAsync, TestBed, tick } from '@angular/core/testing'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { App } from './app'; + import { NxWelcome } from './nx-welcome'; import { Router, RouterModule } from '@angular/router'; - describe('AppComponent', () => { + describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ - RouterModule.forRoot([{ path: '', component: NxWelcomeComponent }]), - AppComponent, - NxWelcomeComponent, + RouterModule.forRoot([{ path: '', component: NxWelcome }]), + App, + NxWelcome, ], }).compileComponents(); }); it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const app = fixture.componentInstance; expect(app).toBeTruthy(); }); it(\`should have as title 'app1'\`, () => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const app = fixture.componentInstance; expect(app.title).toEqual('app1'); }); it('should render title', fakeAsync(() => { - const fixture = TestBed.createComponent(AppComponent); + const fixture = TestBed.createComponent(App); const router = TestBed.inject(Router); fixture.ngZone?.run(() => router.navigate([''])); tick(); @@ -797,69 +801,199 @@ describe('Init MF', () => { expect(dependencies['@nx/angular']).toBe(nxVersion); }); - describe('angular compat support', () => { - beforeEach(() => { - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '~17.2.0', - }, - })); + it('should generate the entry component respecting the "type" option in component generator defaults', async () => { + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:component': { + ...nxJson.generators?.['@nx/angular:component'], + type: 'component', + }, + }; + updateNxJson(tree, nxJson); + + await setupMf(tree, { + appName: 'app1', + mfType: 'host', + routing: true, + standalone: false, + skipFormat: true, + }); + await setupMf(tree, { + appName: 'remote1', + mfType: 'remote', + host: 'app1', + port: 4201, + routing: true, + standalone: false, + skipFormat: true, }); - it('should generate the host app component test file using RouterTestingModule', async () => { - await setupMf(tree, { - appName: 'app1', - mfType: 'host', - prefix: 'my-org', - }); + expect( + tree.read('remote1/src/app/remote-entry/entry.component.ts', 'utf-8') + ).toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; - expect(tree.read('app1/src/app/app.component.spec.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "import { fakeAsync, TestBed, tick } from '@angular/core/testing'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; - import { RouterTestingModule } from '@angular/router/testing'; - import { Router } from '@angular/router'; + @Component({ + selector: 'app-remote1-entry', + standalone: false, + template: \`\` + }) + export class RemoteEntryComponent {} + " + `); + expect(tree.read('remote1/src/app/remote-entry/entry-module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { RouterModule } from '@angular/router'; - describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - RouterTestingModule.withRoutes([ - { path: '', component: NxWelcomeComponent }, - ]), - AppComponent, - NxWelcomeComponent, - ], - }).compileComponents(); - }); + import { RemoteEntryComponent } from './entry.component'; + import { NxWelcome } from './nx-welcome'; + import { remoteRoutes } from './entry.routes'; - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); + @NgModule({ + declarations: [RemoteEntryComponent, NxWelcome], + imports: [ + CommonModule, + RouterModule.forChild(remoteRoutes), + ], + providers: [], + }) + export class RemoteEntryModule {}" + `); + expect(tree.read('remote1/src/app/remote-entry/entry.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Route } from '@angular/router'; + import { RemoteEntryComponent } from './entry.component'; - it(\`should have as title 'app1'\`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('app1'); - }); + export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];" + `); + expect(tree.read('app1/src/app/app.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NxWelcome } from './nx-welcome'; + import { Route } from '@angular/router'; - it('should render title', fakeAsync(() => { - const fixture = TestBed.createComponent(AppComponent); - const router = TestBed.inject(Router); - fixture.ngZone?.run(() => router.navigate([''])); - tick(); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain('Welcome app1'); - })); - }); - " - `); + export const appRoutes: Route[] = [ + { + path: 'remote1', + loadChildren: () => import('remote1/Module').then(m => m!.RemoteEntryModule) + }, + { + path: '', + component: NxWelcome + },]; + " + `); + }); + + it('should handle app and nx welcome components with the "component" type', async () => { + tree = createTreeWithEmptyWorkspace(); + const nxJson = readNxJson(tree); + nxJson.generators = { + ...nxJson.generators, + '@nx/angular:component': { + ...nxJson.generators?.['@nx/angular:component'], + type: 'component', + }, + }; + updateNxJson(tree, nxJson); + await generateTestApplication(tree, { + directory: 'app1', + bundler: 'webpack', + routing: true, + standalone: false, + skipFormat: true, }); + await generateTestApplication(tree, { + directory: 'remote1', + bundler: 'webpack', + routing: true, + standalone: false, + skipFormat: true, + }); + + await setupMf(tree, { + appName: 'app1', + mfType: 'host', + routing: true, + standalone: false, + skipFormat: true, + }); + await setupMf(tree, { + appName: 'remote1', + mfType: 'remote', + host: 'app1', + port: 4201, + routing: true, + standalone: false, + skipFormat: true, + }); + + expect( + tree.read('remote1/src/app/remote-entry/entry.component.ts', 'utf-8') + ).toMatchInlineSnapshot(` + "import { Component } from '@angular/core'; + + @Component({ + selector: 'app-remote1-entry', + standalone: false, + template: \`\` + }) + export class RemoteEntryComponent {} + " + `); + expect(tree.read('remote1/src/app/remote-entry/entry-module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { RouterModule } from '@angular/router'; + + import { RemoteEntryComponent } from './entry.component'; + import { NxWelcomeComponent } from './nx-welcome.component'; + import { remoteRoutes } from './entry.routes'; + + @NgModule({ + declarations: [RemoteEntryComponent, NxWelcomeComponent], + imports: [ + CommonModule, + RouterModule.forChild(remoteRoutes), + ], + providers: [], + }) + export class RemoteEntryModule {}" + `); + expect(tree.read('remote1/src/app/remote-entry/entry.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { Route } from '@angular/router'; + import { RemoteEntryComponent } from './entry.component'; + + export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];" + `); + expect(tree.read('app1/src/app/app.routes.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NxWelcomeComponent } from './nx-welcome.component'; + import { Route } from '@angular/router'; + + export const appRoutes: Route[] = [ + { + path: 'remote1', + loadChildren: () => import('remote1/Module').then(m => m!.RemoteEntryModule) + }, + { + path: '', + component: NxWelcomeComponent + },]; + " + `); + expect(tree.read('app1/src/app/app.component.html', 'utf-8')) + .toMatchInlineSnapshot(` + " + + " + `); }); }); diff --git a/packages/angular/src/generators/setup-mf/setup-mf.ts b/packages/angular/src/generators/setup-mf/setup-mf.ts index 9463f342d6..780bc8cb4c 100644 --- a/packages/angular/src/generators/setup-mf/setup-mf.ts +++ b/packages/angular/src/generators/setup-mf/setup-mf.ts @@ -2,12 +2,19 @@ import { addDependenciesToPackageJson, formatFiles, readProjectConfiguration, + runTasksInSerial, + type GeneratorCallback, type Tree, } from '@nx/devkit'; import { moduleFederationEnhancedVersion, nxVersion, } from '../../utils/versions'; +import { + getInstalledAngularDevkitVersion, + getInstalledAngularVersionInfo, + versions, +} from '../utils/version-utils'; import { addCypressOnErrorWorkaround, addRemoteEntry, @@ -31,7 +38,7 @@ export async function setupMf(tree: Tree, rawOptions: Schema) { const options = normalizeOptions(tree, rawOptions); const projectConfig = readProjectConfiguration(tree, options.appName); - let installTask = () => {}; + const tasks: GeneratorCallback[] = []; if (options.mfType === 'remote') { addRemoteToHost(tree, { appName: options.appName, @@ -43,16 +50,18 @@ export async function setupMf(tree: Tree, rawOptions: Schema) { removeDeadCodeFromRemote(tree, options); setupTspathForRemote(tree, options); if (!options.skipPackageJson) { - installTask = addDependenciesToPackageJson( - tree, - { - '@module-federation/enhanced': moduleFederationEnhancedVersion, - }, - { - '@nx/web': nxVersion, - '@nx/webpack': nxVersion, - '@nx/module-federation': nxVersion, - } + tasks.push( + addDependenciesToPackageJson( + tree, + { + '@module-federation/enhanced': moduleFederationEnhancedVersion, + }, + { + '@nx/web': nxVersion, + '@nx/webpack': nxVersion, + '@nx/module-federation': nxVersion, + } + ) ); } } @@ -77,14 +86,16 @@ export async function setupMf(tree: Tree, rawOptions: Schema) { }); } if (!options.skipPackageJson) { - installTask = addDependenciesToPackageJson( - tree, - {}, - { - '@nx/webpack': nxVersion, - '@module-federation/enhanced': moduleFederationEnhancedVersion, - '@nx/module-federation': nxVersion, - } + tasks.push( + addDependenciesToPackageJson( + tree, + {}, + { + '@nx/webpack': nxVersion, + '@module-federation/enhanced': moduleFederationEnhancedVersion, + '@nx/module-federation': nxVersion, + } + ) ); } } @@ -104,12 +115,31 @@ export async function setupMf(tree: Tree, rawOptions: Schema) { addCypressOnErrorWorkaround(tree, options); } + if (!options.skipPackageJson) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion >= 20) { + const angularDevkitVersion = + getInstalledAngularDevkitVersion(tree) ?? + versions(tree).angularDevkitVersion; + // the executors used by MF require @angular-devkit/build-angular + tasks.push( + addDependenciesToPackageJson( + tree, + {}, + { '@angular-devkit/build-angular': angularDevkitVersion }, + undefined, + true + ) + ); + } + } + // format files if (!options.skipFormat) { await formatFiles(tree); } - return installTask; + return runTasksInSerial(...tasks); } export default setupMf; diff --git a/packages/angular/src/generators/setup-ssr/__snapshots__/setup-ssr.spec.ts.snap b/packages/angular/src/generators/setup-ssr/__snapshots__/setup-ssr.spec.ts.snap index bec2963d63..27768429d2 100644 --- a/packages/angular/src/generators/setup-ssr/__snapshots__/setup-ssr.spec.ts.snap +++ b/packages/angular/src/generators/setup-ssr/__snapshots__/setup-ssr.spec.ts.snap @@ -25,7 +25,7 @@ exports[`setupSSR with application builder should create the files correctly for }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:application", + "executor": "@angular/build:application", "options": { "assets": [ { @@ -34,13 +34,11 @@ exports[`setupSSR with application builder should create the files correctly for }, ], "browser": "app1/src/main.ts", - "index": "app1/src/index.html", + "outputMode": "server", "outputPath": "dist/app1", "polyfills": [ "zone.js", ], - "prerender": true, - "scripts": [], "server": "app1/src/main.server.ts", "ssr": { "entry": "app1/src/server.ts", @@ -57,19 +55,21 @@ exports[`setupSSR with application builder should create the files correctly for `; exports[`setupSSR with application builder should create the files correctly for ssr 2`] = ` -"import { APP_BASE_HREF } from '@angular/common'; -import { CommonEngine, isMainModule } from '@angular/ssr/node'; +"import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; import express from 'express'; -import { dirname, join, resolve } from 'node:path'; +import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; -import AppServerModule from './main.server'; const serverDistFolder = dirname(fileURLToPath(import.meta.url)); const browserDistFolder = resolve(serverDistFolder, '../browser'); -const indexHtml = join(serverDistFolder, 'index.server.html'); const app = express(); -const commonEngine = new CommonEngine(); +const angularApp = new AngularNodeAppEngine(); /** * Example Express Rest API endpoints can be defined here. @@ -86,30 +86,24 @@ const commonEngine = new CommonEngine(); /** * Serve static files from /browser */ -app.get( - '**', +app.use( express.static(browserDistFolder, { maxAge: '1y', - index: 'index.html', + index: false, + redirect: false, }) ); /** * Handle all other requests by rendering the Angular application. */ -app.get('**', (req, res, next) => { - const { protocol, originalUrl, baseUrl, headers } = req; - - commonEngine - .render({ - bootstrap: AppServerModule, - documentFilePath: indexHtml, - url: \`\${protocol}://\${headers.host}\${originalUrl}\`, - publicPath: browserDistFolder, - providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }], - }) - .then((html) => res.send(html)) - .catch((err) => next(err)); +app.use('/**', (req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next() + ) + .catch(next); }); /** @@ -123,7 +117,10 @@ if (isMainModule(import.meta.url)) { }); } -export default app; +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); " `; @@ -152,7 +149,7 @@ exports[`setupSSR with application builder should create the files correctly for }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:application", + "executor": "@angular/build:application", "options": { "assets": [ { @@ -161,13 +158,11 @@ exports[`setupSSR with application builder should create the files correctly for }, ], "browser": "app1/src/main.ts", - "index": "app1/src/index.html", + "outputMode": "server", "outputPath": "dist/app1", "polyfills": [ "zone.js", ], - "prerender": true, - "scripts": [], "server": "app1/src/main.server.ts", "ssr": { "entry": "app1/src/server.ts", @@ -184,19 +179,21 @@ exports[`setupSSR with application builder should create the files correctly for `; exports[`setupSSR with application builder should create the files correctly for ssr when app is standalone 2`] = ` -"import { APP_BASE_HREF } from '@angular/common'; -import { CommonEngine, isMainModule } from '@angular/ssr/node'; +"import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; import express from 'express'; -import { dirname, join, resolve } from 'node:path'; +import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; -import bootstrap from './main.server'; const serverDistFolder = dirname(fileURLToPath(import.meta.url)); const browserDistFolder = resolve(serverDistFolder, '../browser'); -const indexHtml = join(serverDistFolder, 'index.server.html'); const app = express(); -const commonEngine = new CommonEngine(); +const angularApp = new AngularNodeAppEngine(); /** * Example Express Rest API endpoints can be defined here. @@ -213,30 +210,24 @@ const commonEngine = new CommonEngine(); /** * Serve static files from /browser */ -app.get( - '**', +app.use( express.static(browserDistFolder, { maxAge: '1y', - index: 'index.html', + index: false, + redirect: false, }) ); /** * Handle all other requests by rendering the Angular application. */ -app.get('**', (req, res, next) => { - const { protocol, originalUrl, baseUrl, headers } = req; - - commonEngine - .render({ - bootstrap, - documentFilePath: indexHtml, - url: \`\${protocol}://\${headers.host}\${originalUrl}\`, - publicPath: browserDistFolder, - providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }], - }) - .then((html) => res.send(html)) - .catch((err) => next(err)); +app.use('/**', (req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next() + ) + .catch(next); }); /** @@ -250,7 +241,10 @@ if (isMainModule(import.meta.url)) { }); } -export default app; +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); " `; diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder-common-engine/server/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder-common-engine/server/__serverFileName__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder-common-engine/server/__serverFileName__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder-common-engine/server/__serverFileName__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder/ngmodule-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder/ngmodule-src/__main__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder/ngmodule-src/__main__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder/ngmodule-src/__main__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder/ngmodule-src/app/__rootModuleFileName__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder/ngmodule-src/app/__rootModuleFileName__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder/ngmodule-src/app/__rootModuleFileName__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder/ngmodule-src/app/__rootModuleFileName__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder/server/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder/server/__serverFileName__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder/server/__serverFileName__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder/server/__serverFileName__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder/standalone-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder/standalone-src/__main__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder/standalone-src/__main__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder/standalone-src/__main__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder/standalone-src/app/app.config.server.ts__tpl__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder/standalone-src/app/app.config.server.ts__tpl__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder/standalone-src/app/app.config.server.ts__tpl__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder/standalone-src/app/app.config.server.ts__tpl__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ b/packages/angular/src/generators/setup-ssr/files/v19/application-builder/standalone-src/app/app.routes.server.ts__tpl__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ rename to packages/angular/src/generators/setup-ssr/files/v19/application-builder/standalone-src/app/app.routes.server.ts__tpl__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/server-builder/ngmodule-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v19/server-builder/ngmodule-src/__main__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/server-builder/ngmodule-src/__main__ rename to packages/angular/src/generators/setup-ssr/files/v19/server-builder/ngmodule-src/__main__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/server-builder/ngmodule-src/app/__rootModuleFileName__ b/packages/angular/src/generators/setup-ssr/files/v19/server-builder/ngmodule-src/app/__rootModuleFileName__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/server-builder/ngmodule-src/app/__rootModuleFileName__ rename to packages/angular/src/generators/setup-ssr/files/v19/server-builder/ngmodule-src/app/__rootModuleFileName__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/server-builder/root/tsconfig.server.json.template b/packages/angular/src/generators/setup-ssr/files/v19/server-builder/root/tsconfig.server.json.template similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/server-builder/root/tsconfig.server.json.template rename to packages/angular/src/generators/setup-ssr/files/v19/server-builder/root/tsconfig.server.json.template diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/server-builder/server/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/v19/server-builder/server/__serverFileName__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/server-builder/server/__serverFileName__ rename to packages/angular/src/generators/setup-ssr/files/v19/server-builder/server/__serverFileName__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/server-builder/standalone-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v19/server-builder/standalone-src/__main__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/server-builder/standalone-src/__main__ rename to packages/angular/src/generators/setup-ssr/files/v19/server-builder/standalone-src/__main__ diff --git a/packages/angular/src/generators/setup-ssr/files/v19+/server-builder/standalone-src/app/app.config.server.ts.template b/packages/angular/src/generators/setup-ssr/files/v19/server-builder/standalone-src/app/app.config.server.ts.template similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/v19+/server-builder/standalone-src/app/app.config.server.ts.template rename to packages/angular/src/generators/setup-ssr/files/v19/server-builder/standalone-src/app/app.config.server.ts.template diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/__main__ new file mode 100644 index 0000000000..063a6f9eac --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/__main__ @@ -0,0 +1 @@ +export { <%= rootModuleClassName %> as default } from './app/<%= rootModuleFileName.slice(0, -3) %>'; diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/__rootModuleFileName__ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/__rootModuleFileName__ new file mode 100644 index 0000000000..e716ca1aab --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/__rootModuleFileName__ @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { provideServerRendering, withRoutes } from '@angular/ssr'; +import { <%= appSymbolName %> } from './<%= appFileName %>'; +import { AppModule } from './app<%= moduleTypeSeparator %>module'; +import { serverRoutes } from './app.routes.server'; + +@NgModule({ + imports: [AppModule], + providers: [provideServerRendering(withRoutes(serverRoutes))], + bootstrap: [<%= appSymbolName %>], +}) +export class <%= rootModuleClassName %> {} diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ new file mode 100644 index 0000000000..ffd37b1f23 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ @@ -0,0 +1,8 @@ +import { RenderMode, ServerRoute } from '@angular/ssr'; + +export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender + } +]; diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/server/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/server/__serverFileName__ new file mode 100644 index 0000000000..a278c7a60c --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/server/__serverFileName__ @@ -0,0 +1,66 @@ +import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; +import express from 'express'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const serverDistFolder = dirname(fileURLToPath(import.meta.url)); +const browserDistFolder = resolve(serverDistFolder, '../<%= browserDistDirectory %>'); + +const app = express(); +const angularApp = new AngularNodeAppEngine(); + +/** + * Example Express Rest API endpoints can be defined here. + * Uncomment and define endpoints as necessary. + * + * Example: + * ```ts + * app.get('/api/**', (req, res) => { + * // Handle API request + * }); + * ``` + */ + +/** + * Serve static files from /<%= browserDistDirectory %> + */ +app.use( + express.static(browserDistFolder, { + maxAge: '1y', + index: false, + redirect: false, + }) +); + +/** + * Handle all other requests by rendering the Angular application. + */ +app.use('/**', (req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next() + ) + .catch(next); +}); + +/** + * Start the server if this module is the main entry point. + * The server listens on the port defined by the `PORT` environment variable, or defaults to <%= serverPort %>. + */ +if (isMainModule(import.meta.url)) { + const port = process.env['PORT'] || <%= serverPort %>; + app.listen(port, () => { + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/__main__ new file mode 100644 index 0000000000..1db1a6dfc3 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/__main__ @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { <%= appSymbolName %> } from './app/<%= appFileName %>'; +import { config } from './app/app.config.server'; + +const bootstrap = () => bootstrapApplication(<%= appSymbolName %>, config); + +export default bootstrap; diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.config.server.ts__tpl__ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.config.server.ts__tpl__ new file mode 100644 index 0000000000..41031f1165 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.config.server.ts__tpl__ @@ -0,0 +1,12 @@ +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); diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ new file mode 100644 index 0000000000..ffd37b1f23 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ @@ -0,0 +1,8 @@ +import { RenderMode, ServerRoute } from '@angular/ssr'; + +export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender + } +]; diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/__main__ new file mode 100644 index 0000000000..063a6f9eac --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/__main__ @@ -0,0 +1 @@ +export { <%= rootModuleClassName %> as default } from './app/<%= rootModuleFileName.slice(0, -3) %>'; diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/app/__rootModuleFileName__ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/app/__rootModuleFileName__ new file mode 100644 index 0000000000..712ff67cd3 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/app/__rootModuleFileName__ @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; + +import { AppModule } from './app<%= moduleTypeSeparator %>module'; +import { <%= appSymbolName %> } from './<%= appFileName %>'; + +@NgModule({ + imports: [ + AppModule, + ServerModule, + ], + bootstrap: [<%= appSymbolName %>], +}) +export class <%= rootModuleClassName %> {} diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/root/tsconfig.server.json.template b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/root/tsconfig.server.json.template new file mode 100644 index 0000000000..173c61f54f --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/root/tsconfig.server.json.template @@ -0,0 +1,18 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "outDir": "<%= rootOffset %>out-tsc/server", + "module": "commonjs", + "moduleResolution": "node10", + "types": [ + "node"<% if (hasLocalizePackage) { %>, + "@angular/localize"<% } %> + ] + }, + "files": [ + "src/<%= main %>", + "src/server.ts" + ] +} diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/server/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/server/__serverFileName__ new file mode 100644 index 0000000000..abeb7c54c2 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/server/__serverFileName__ @@ -0,0 +1,69 @@ +import 'zone.js/node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr/node'; +import * as express from 'express'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import <% if (standalone) { %>bootstrap<% } else { %><%= rootModuleClassName %><% } %> from './<%= main.slice(0, -3) %>'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const distFolder = join(process.cwd(), '<%= browserDistDirectory %>'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); + + const commonEngine = new CommonEngine(); + + server.set('view engine', 'html'); + server.set('views', distFolder); + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + server.get('*.*', express.static(distFolder, { + maxAge: '1y' + })); + + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap<% if (!standalone) { %>: <%= rootModuleClassName %><% } %>, + documentFilePath: indexHtml, + url: `${protocol}://${headers.host}${originalUrl}`, + publicPath: distFolder, + providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }], + }) + .then((html) => res.send(html)) + .catch((err) => next(err)); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || <%= serverPort %>; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +// Webpack will replace 'require' with '__webpack_require__' +// '__non_webpack_require__' is a proxy to Node 'require' +// The below code is to ensure that the server is run only when not requiring the bundle. +declare const __non_webpack_require__: NodeRequire; +const mainModule = __non_webpack_require__.main; +const moduleFilename = mainModule && mainModule.filename || ''; +if (moduleFilename === __filename || moduleFilename.includes('iisnode')) { + run(); +} + +export default <% if (standalone) { %>bootstrap<% } else { %><%= rootModuleClassName %><% } %>; diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/__main__ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/__main__ new file mode 100644 index 0000000000..1db1a6dfc3 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/__main__ @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { <%= appSymbolName %> } from './app/<%= appFileName %>'; +import { config } from './app/app.config.server'; + +const bootstrap = () => bootstrapApplication(<%= appSymbolName %>, config); + +export default bootstrap; diff --git a/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/app/app.config.server.ts.template b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/app/app.config.server.ts.template new file mode 100644 index 0000000000..05c29319d5 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/app/app.config.server.ts.template @@ -0,0 +1,11 @@ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering } from '@angular/ssr'; +import { appConfig } from './app.config'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering() + ] +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/packages/angular/src/generators/setup-ssr/lib/add-dependencies.ts b/packages/angular/src/generators/setup-ssr/lib/add-dependencies.ts index ef626cbf13..a71eb0ba79 100644 --- a/packages/angular/src/generators/setup-ssr/lib/add-dependencies.ts +++ b/packages/angular/src/generators/setup-ssr/lib/add-dependencies.ts @@ -1,8 +1,8 @@ import { addDependenciesToPackageJson, type Tree } from '@nx/devkit'; -import { gte } from 'semver'; import { + getInstalledAngularDevkitVersion, getInstalledAngularVersionInfo, - getInstalledPackageVersionInfo, + getInstalledPackageVersion, versions, } from '../../utils/version-utils'; @@ -11,23 +11,28 @@ export function addDependencies( isUsingApplicationBuilder: boolean ): void { const pkgVersions = versions(tree); - const { version: angularVersion } = getInstalledAngularVersionInfo(tree); const dependencies: Record = { '@angular/platform-server': - getInstalledPackageVersionInfo(tree, '@angular/platform-server') - ?.version ?? pkgVersions.angularVersion, + getInstalledPackageVersion(tree, '@angular/platform-server') ?? + pkgVersions.angularVersion, express: pkgVersions.expressVersion, }; const devDependencies: Record = { '@types/express': pkgVersions.typesExpressVersion, }; - dependencies['@angular/ssr'] = - getInstalledPackageVersionInfo(tree, '@angular-devkit/build-angular') - ?.version ?? pkgVersions.angularDevkitVersion; - if (!isUsingApplicationBuilder && gte(angularVersion, '17.1.0')) { + const angularDevkitVersion = + getInstalledAngularDevkitVersion(tree) ?? pkgVersions.angularDevkitVersion; + dependencies['@angular/ssr'] = angularDevkitVersion; + + if (!isUsingApplicationBuilder) { devDependencies['browser-sync'] = pkgVersions.browserSyncVersion; + } else { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion >= 20) { + dependencies['@angular-devkit/build-angular'] = angularDevkitVersion; + } } addDependenciesToPackageJson(tree, dependencies, devDependencies); diff --git a/packages/angular/src/generators/setup-ssr/lib/add-hydration.spec.ts b/packages/angular/src/generators/setup-ssr/lib/add-hydration.spec.ts index 8d6fae01c2..8438e9c761 100644 --- a/packages/angular/src/generators/setup-ssr/lib/add-hydration.spec.ts +++ b/packages/angular/src/generators/setup-ssr/lib/add-hydration.spec.ts @@ -32,6 +32,7 @@ export const appConfig: ApplicationConfig = { project: 'app1', standalone: true, isUsingApplicationBuilder: true, + buildTargetTsConfigPath: 'apps/app1/tsconfig.app.json', }); expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) @@ -66,6 +67,7 @@ export const appConfig: ApplicationConfig = { project: 'app1', standalone: true, isUsingApplicationBuilder: true, + buildTargetTsConfigPath: 'apps/app1/tsconfig.app.json', }); expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) @@ -105,6 +107,7 @@ export class AppModule {} project: 'app1', standalone: false, isUsingApplicationBuilder: true, + buildTargetTsConfigPath: 'apps/app1/tsconfig.app.json', }); expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) @@ -151,6 +154,7 @@ export class AppModule {} project: 'app1', standalone: false, isUsingApplicationBuilder: true, + buildTargetTsConfigPath: 'apps/app1/tsconfig.app.json', }); expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) diff --git a/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts b/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts index f9b7db762e..2078577869 100644 --- a/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts +++ b/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts @@ -24,9 +24,24 @@ export function addHydration(tree: Tree, options: NormalizedGeneratorOptions) { tsquery = require('@phenomnomnominal/tsquery').tsquery; } - const pathToClientConfigFile = options.standalone - ? joinPathFragments(projectConfig.sourceRoot, 'app/app.config.ts') - : joinPathFragments(projectConfig.sourceRoot, 'app/app.module.ts'); + let pathToClientConfigFile: string; + if (options.standalone) { + pathToClientConfigFile = joinPathFragments( + projectConfig.sourceRoot, + 'app/app.config.ts' + ); + } else { + pathToClientConfigFile = joinPathFragments( + projectConfig.sourceRoot, + 'app/app.module.ts' + ); + if (!tree.exists(pathToClientConfigFile)) { + pathToClientConfigFile = joinPathFragments( + projectConfig.sourceRoot, + 'app/app-module.ts' + ); + } + } const sourceText = tree.read(pathToClientConfigFile, 'utf-8'); let sourceFile = tsModule.createSourceFile( diff --git a/packages/angular/src/generators/setup-ssr/lib/add-server-file.ts b/packages/angular/src/generators/setup-ssr/lib/add-server-file.ts index 09b10ae393..cca456ea9f 100644 --- a/packages/angular/src/generators/setup-ssr/lib/add-server-file.ts +++ b/packages/angular/src/generators/setup-ssr/lib/add-server-file.ts @@ -19,10 +19,19 @@ export function addServerFile(tree: Tree, options: NormalizedGeneratorOptions) { const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); const baseFilesPath = join(__dirname, '..', 'files'); let pathToFiles: string; - if (angularMajorVersion >= 19) { + if (angularMajorVersion >= 20) { pathToFiles = join( baseFilesPath, - 'v19+', + 'v20+', + options.isUsingApplicationBuilder + ? 'application-builder' + : 'server-builder', + 'server' + ); + } else if (angularMajorVersion === 19) { + pathToFiles = join( + baseFilesPath, + 'v19', options.isUsingApplicationBuilder ? 'application-builder' + (options.serverRouting ? '' : '-common-engine') diff --git a/packages/angular/src/generators/setup-ssr/lib/generate-files.ts b/packages/angular/src/generators/setup-ssr/lib/generate-files.ts index 4df0d75ae4..75e9fb6086 100644 --- a/packages/angular/src/generators/setup-ssr/lib/generate-files.ts +++ b/packages/angular/src/generators/setup-ssr/lib/generate-files.ts @@ -5,12 +5,17 @@ import { readProjectConfiguration, } from '@nx/devkit'; import { join } from 'path'; +import { clean, coerce, gte } from 'semver'; +import { getAppComponentInfo } from '../../utils/app-components-info'; +import { + getComponentType, + getModuleTypeSeparator, +} from '../../utils/artifact-types'; import { getInstalledAngularVersionInfo, getInstalledPackageVersion, } from '../../utils/version-utils'; import type { NormalizedGeneratorOptions } from '../schema'; -import { clean, coerce, gte } from 'semver'; export function generateSSRFiles( tree: Tree, @@ -30,10 +35,19 @@ export function generateSSRFiles( const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); const baseFilesPath = join(__dirname, '..', 'files'); let pathToFiles: string; - if (angularMajorVersion >= 19) { + if (angularMajorVersion >= 20) { pathToFiles = join( baseFilesPath, - 'v19+', + 'v20+', + options.isUsingApplicationBuilder + ? 'application-builder' + : 'server-builder', + options.standalone ? 'standalone-src' : 'ngmodule-src' + ); + } else if (angularMajorVersion === 19) { + pathToFiles = join( + baseFilesPath, + 'v19', options.isUsingApplicationBuilder ? 'application-builder' : 'server-builder', @@ -55,16 +69,27 @@ export function generateSSRFiles( ? clean(ssrVersion) ?? coerce(ssrVersion).version : null; + const componentType = getComponentType(tree); + const appComponentInfo = getAppComponentInfo( + tree, + componentType ? `.${componentType}` : '', + project + ); + const moduleTypeSeparator = getModuleTypeSeparator(tree); + generateFiles(tree, pathToFiles, sourceRoot, { ...options, provideServerRoutingFn: !cleanedSsrVersion || gte(cleanedSsrVersion, '19.2.0') ? 'provideServerRouting' : 'provideServerRoutesConfig', + appFileName: appComponentInfo.extensionlessFileName, + appSymbolName: appComponentInfo.symbolName, + moduleTypeSeparator, tpl: '', }); - if (angularMajorVersion >= 19 && !options.serverRouting) { + if (angularMajorVersion === 19 && !options.serverRouting) { tree.delete(joinPathFragments(sourceRoot, 'app/app.routes.server.ts')); } } diff --git a/packages/angular/src/generators/setup-ssr/lib/generate-server-ts-config.ts b/packages/angular/src/generators/setup-ssr/lib/generate-server-ts-config.ts index c240859837..cc377b9411 100644 --- a/packages/angular/src/generators/setup-ssr/lib/generate-server-ts-config.ts +++ b/packages/angular/src/generators/setup-ssr/lib/generate-server-ts-config.ts @@ -19,6 +19,16 @@ export function setServerTsConfigOptionsForApplicationBuilder( const tsConfigPath = targets.build.options.tsConfig; updateJson(tree, tsConfigPath, (json) => { + json.compilerOptions ??= {}; + const types = new Set(json.compilerOptions.types ?? []); + types.add('node'); + json.compilerOptions.types = Array.from(types); + + if (json.include?.includes('src/**/*.ts')) { + // server file is already included, no need to add it + return json; + } + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); const files = new Set(json.files ?? []); @@ -30,11 +40,6 @@ export function setServerTsConfigOptionsForApplicationBuilder( } json.files = Array.from(files); - json.compilerOptions ??= {}; - const types = new Set(json.compilerOptions.types ?? []); - types.add('node'); - json.compilerOptions.types = Array.from(types); - return json; }); } @@ -54,8 +59,10 @@ export function generateTsConfigServerJsonForBrowserBuilder( const baseFilesPath = join(__dirname, '..', 'files'); let pathToFiles: string; - if (angularMajorVersion >= 19) { - pathToFiles = join(baseFilesPath, 'v19+', 'server-builder', 'root'); + if (angularMajorVersion >= 20) { + pathToFiles = join(baseFilesPath, 'v20+', 'server-builder', 'root'); + } else if (angularMajorVersion === 19) { + pathToFiles = join(baseFilesPath, 'v19', 'server-builder', 'root'); } else { pathToFiles = join(baseFilesPath, 'pre-v19', 'root'); } @@ -66,4 +73,25 @@ export function generateTsConfigServerJsonForBrowserBuilder( hasLocalizePackage, tpl: '', }); + + updateJson(tree, joinPathFragments(project.root, 'tsconfig.json'), (json) => { + json.references ??= []; + json.references.push({ + path: joinPathFragments(project.root, 'tsconfig.server.json'), + }); + return json; + }); + + if (angularMajorVersion >= 20) { + updateJson(tree, options.buildTargetTsConfigPath, (json) => { + const exclude = new Set(json.exclude ?? []); + exclude.add(`src/${options.main}`); + exclude.add(`src/${options.serverFileName}`); + if (options.standalone) { + exclude.add('src/app/app.config.server.ts'); + } + json.exclude = Array.from(exclude); + return json; + }); + } } diff --git a/packages/angular/src/generators/setup-ssr/lib/normalize-options.ts b/packages/angular/src/generators/setup-ssr/lib/normalize-options.ts index 1bb7f7970d..a7e97d154d 100644 --- a/packages/angular/src/generators/setup-ssr/lib/normalize-options.ts +++ b/packages/angular/src/generators/setup-ssr/lib/normalize-options.ts @@ -1,4 +1,8 @@ -import { readProjectConfiguration, type Tree } from '@nx/devkit'; +import { + joinPathFragments, + readProjectConfiguration, + type Tree, +} from '@nx/devkit'; import { promptWhenInteractive } from '@nx/devkit/src/generators/prompt'; import { isNgStandaloneApp } from '../../../utils/nx-devkit/ast-utils'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; @@ -8,7 +12,7 @@ export async function normalizeOptions( tree: Tree, options: Schema ): Promise { - const { targets } = readProjectConfiguration(tree, options.project); + const { targets, root } = readProjectConfiguration(tree, options.project); const isUsingApplicationBuilder = targets.build.executor === '@angular-devkit/build-angular:application' || targets.build.executor === '@angular/build:application' || @@ -17,7 +21,7 @@ export async function normalizeOptions( if (options.serverRouting === undefined && isUsingApplicationBuilder) { const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); - if (angularMajorVersion >= 19) { + if (angularMajorVersion === 19) { options.serverRouting = await promptWhenInteractive<{ serverRouting: boolean; }>( @@ -31,7 +35,7 @@ export async function normalizeOptions( { serverRouting: false } ).then(({ serverRouting }) => serverRouting); } else { - options.serverRouting = false; + options.serverRouting = angularMajorVersion >= 20; } } else if ( options.serverRouting !== undefined && @@ -57,5 +61,8 @@ export async function normalizeOptions( hydration: options.hydration ?? true, serverRouting: options.serverRouting, isUsingApplicationBuilder, + buildTargetTsConfigPath: + targets.build.options?.tsConfig ?? + joinPathFragments(root, 'tsconfig.app.json'), }; } diff --git a/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.spec.ts b/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.spec.ts index 06eba3c64b..fd38a87425 100644 --- a/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.spec.ts +++ b/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.spec.ts @@ -28,6 +28,7 @@ export const appConfig: ApplicationConfig = { project: 'app1', standalone: true, isUsingApplicationBuilder: true, + buildTargetTsConfigPath: 'apps/app1/tsconfig.app.json', }); expect(tree.read('apps/app1/src/app.config.ts', 'utf-8')) @@ -66,6 +67,7 @@ export const appConfig: ApplicationConfig = { project: 'app1', standalone: true, isUsingApplicationBuilder: true, + buildTargetTsConfigPath: 'apps/app1/tsconfig.app.json', }); expect(tree.read('apps/app1/src/app.config.ts', 'utf-8')) @@ -113,6 +115,7 @@ export class AppModule {} project: 'app1', standalone: false, isUsingApplicationBuilder: true, + buildTargetTsConfigPath: 'apps/app1/tsconfig.app.json', }); expect(tree.read('apps/app1/src/app.module.ts', 'utf-8')) diff --git a/packages/angular/src/generators/setup-ssr/lib/update-project-config.ts b/packages/angular/src/generators/setup-ssr/lib/update-project-config.ts index e3d1953b35..8d0a420ee4 100644 --- a/packages/angular/src/generators/setup-ssr/lib/update-project-config.ts +++ b/packages/angular/src/generators/setup-ssr/lib/update-project-config.ts @@ -48,6 +48,13 @@ export function updateProjectConfigForApplicationBuilder( delete outputPath.browser; } else { outputPath = outputPath.base; + if (buildTarget.outputs && buildTarget.outputs.length > 0) { + buildTarget.outputs = buildTarget.outputs.map((output) => + output === '{options.outputPath.base}' + ? '{options.outputPath}' + : output + ); + } } } diff --git a/packages/angular/src/generators/setup-ssr/lib/validate-options.ts b/packages/angular/src/generators/setup-ssr/lib/validate-options.ts index a9eae4de0d..9c1f8c1bfa 100644 --- a/packages/angular/src/generators/setup-ssr/lib/validate-options.ts +++ b/packages/angular/src/generators/setup-ssr/lib/validate-options.ts @@ -10,9 +10,9 @@ export function validateOptions(tree: Tree, options: Schema): void { const { major: angularMajorVersion, version: angularVersion } = getInstalledAngularVersionInfo(tree); - if (angularMajorVersion < 19 && options.serverRouting) { + if (angularMajorVersion !== 19 && options.serverRouting !== undefined) { throw new Error( - `The "serverRouting" option is only supported in Angular versions >= 19.0.0. You are using Angular ${angularVersion}.` + `The "serverRouting" option is only supported in Angular versions 19.x.x. You are using Angular ${angularVersion}.` ); } } diff --git a/packages/angular/src/generators/setup-ssr/schema.d.ts b/packages/angular/src/generators/setup-ssr/schema.d.ts index 8c08243b57..aa8cf109ef 100644 --- a/packages/angular/src/generators/setup-ssr/schema.d.ts +++ b/packages/angular/src/generators/setup-ssr/schema.d.ts @@ -15,4 +15,5 @@ export interface Schema { export interface NormalizedGeneratorOptions extends Schema { isUsingApplicationBuilder: boolean; + buildTargetTsConfigPath: string; } diff --git a/packages/angular/src/generators/setup-ssr/schema.json b/packages/angular/src/generators/setup-ssr/schema.json index 04cfcd330d..46fbd6f480 100644 --- a/packages/angular/src/generators/setup-ssr/schema.json +++ b/packages/angular/src/generators/setup-ssr/schema.json @@ -53,7 +53,7 @@ "default": true }, "serverRouting": { - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.", + "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.", "type": "boolean" }, "skipFormat": { diff --git a/packages/angular/src/generators/setup-ssr/setup-ssr.spec.ts b/packages/angular/src/generators/setup-ssr/setup-ssr.spec.ts index ce0a56f9df..cc6a25ff5c 100644 --- a/packages/angular/src/generators/setup-ssr/setup-ssr.spec.ts +++ b/packages/angular/src/generators/setup-ssr/setup-ssr.spec.ts @@ -23,7 +23,7 @@ describe('setupSSR', () => { describe('with application builder', () => { it('should create the files correctly for ssr', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', standalone: false, @@ -44,10 +44,10 @@ describe('setupSSR', () => { " `); expect(tree.read('app1/src/main.ts', 'utf-8')).toMatchInlineSnapshot(` - "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - import { AppModule } from './app/app.module'; + "import { platformBrowser } from '@angular/platform-browser'; + import { AppModule } from './app/app-module'; - platformBrowserDynamic() + platformBrowser() .bootstrapModule(AppModule, { ngZoneEventCoalescing: true, }) @@ -55,43 +55,73 @@ describe('setupSSR', () => { " `); expect(tree.exists('app1/tsconfig.server.json')).toBe(false); - expect(readJson(tree, 'app1/tsconfig.app.json').files).toStrictEqual([ - 'src/main.ts', - 'src/main.server.ts', - 'src/server.ts', - ]); + expect(tree.read('app1/tsconfig.app.json', 'utf-8')) + .toMatchInlineSnapshot(` + "{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": [ + "jest.config.ts", + "src/test-setup.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] + } + " + `); expect(tree.read('app1/src/app/app.server.module.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { NgModule } from '@angular/core'; - import { ServerModule } from '@angular/platform-server'; - import { AppComponent } from './app.component'; - import { AppModule } from './app.module'; + import { provideServerRendering, withRoutes } from '@angular/ssr'; + import { App } from './app'; + import { AppModule } from './app-module'; + import { serverRoutes } from './app.routes.server'; @NgModule({ - imports: [AppModule, ServerModule], - bootstrap: [AppComponent], + imports: [AppModule], + providers: [provideServerRendering(withRoutes(serverRoutes))], + bootstrap: [App], }) export class AppServerModule {} " `); - expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) + expect(tree.read('app1/src/app/app.routes.server.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { NgModule } from '@angular/core'; + "import { RenderMode, ServerRoute } from '@angular/ssr'; + + export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender, + }, + ]; + " + `); + expect(tree.read('app1/src/app/app-module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule, provideClientHydration, withEventReplay, } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; import { appRoutes } from './app.routes'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [BrowserModule, RouterModule.forRoot(appRoutes)], - providers: [provideClientHydration(withEventReplay())], - bootstrap: [AppComponent], + providers: [ + provideBrowserGlobalErrorListeners(), + provideClientHydration(withEventReplay()), + ], + bootstrap: [App], }) export class AppModule {} " @@ -102,7 +132,7 @@ describe('setupSSR', () => { it('should create the files correctly for ssr when app is standalone', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', skipFormat: true, @@ -119,39 +149,65 @@ describe('setupSSR', () => { expect(tree.read('app1/src/main.server.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { bootstrapApplication } from '@angular/platform-browser'; - import { AppComponent } from './app/app.component'; + import { App } from './app/app'; import { config } from './app/app.config.server'; - const bootstrap = () => bootstrapApplication(AppComponent, config); + const bootstrap = () => bootstrapApplication(App, config); export default bootstrap; " `); expect(tree.exists('app1/tsconfig.server.json')).toBe(false); - expect(readJson(tree, 'app1/tsconfig.app.json').files).toStrictEqual([ - 'src/main.ts', - 'src/main.server.ts', - 'src/server.ts', - ]); + expect(tree.read('app1/tsconfig.app.json', 'utf-8')) + .toMatchInlineSnapshot(` + "{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": [ + "jest.config.ts", + "src/test-setup.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] + } + " + `); expect(tree.read('app1/src/app/app.config.server.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; - import { provideServerRendering } from '@angular/platform-server'; + import { provideServerRendering, withRoutes } from '@angular/ssr'; import { appConfig } from './app.config'; + import { serverRoutes } from './app.routes.server'; const serverConfig: ApplicationConfig = { - providers: [provideServerRendering()], + providers: [provideServerRendering(withRoutes(serverRoutes))], }; export const config = mergeApplicationConfig(appConfig, serverConfig); " `); + expect(tree.read('app1/src/app/app.routes.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { RenderMode, ServerRoute } from '@angular/ssr'; + + export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender, + }, + ]; + " + `); const nxJson = readJson(tree, 'nx.json'); expect(nxJson.targetDefaults.server).toBeUndefined(); }); it('should support object output option using a custom "outputPath.browser" and "outputPath.server" values', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', skipFormat: true, @@ -172,8 +228,48 @@ describe('setupSSR', () => { ); }); + it('should update "outputPath" to a string when "outputPath.browser" is an empty string and the only other property set is "outputPath.base"', async () => { + const tree = createTreeWithEmptyWorkspace(); + await generateTestApplication(tree, { + directory: 'app1', + skipFormat: true, + }); + const project = readProjectConfiguration(tree, 'app1'); + project.targets.build.options.outputPath = { + base: project.targets.build.options.outputPath, + browser: '', + }; + updateProjectConfiguration(tree, 'app1', project); + + await setupSsr(tree, { project: 'app1' }); + + const updatedProject = readProjectConfiguration(tree, 'app1'); + expect(updatedProject.targets.build.options.outputPath).toBe('dist/app1'); + }); + + it('should update "outputPath" to a string when "outputPath.browser" is an empty string and the other properties match their default values', async () => { + const tree = createTreeWithEmptyWorkspace(); + await generateTestApplication(tree, { + directory: 'app1', + skipFormat: true, + }); + const project = readProjectConfiguration(tree, 'app1'); + project.targets.build.options.outputPath = { + base: project.targets.build.options.outputPath, + browser: '', + server: 'server', + media: 'media', + }; + updateProjectConfiguration(tree, 'app1', project); + + await setupSsr(tree, { project: 'app1' }); + + const updatedProject = readProjectConfiguration(tree, 'app1'); + expect(updatedProject.targets.build.options.outputPath).toBe('dist/app1'); + }); + it('should remove "outputPath.browser" when it is an empty string', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', skipFormat: true, @@ -195,91 +291,38 @@ describe('setupSSR', () => { }); }); - it('should setup server routing for NgModule apps when "serverRouting" is true', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + it('should update "outputs" when set to "{options.outputPath.base}" and "outputPath" is converted to a string', async () => { + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', - standalone: false, skipFormat: true, }); + const project = readProjectConfiguration(tree, 'app1'); + project.targets.build.outputs = [ + '{options.outputPath.base}', + '{projectRoot}/some-other-output-dir', + ]; + project.targets.build.options.outputPath = { + base: project.targets.build.options.outputPath, + browser: '', + }; + updateProjectConfiguration(tree, 'app1', project); - await setupSsr(tree, { project: 'app1', serverRouting: true }); + await setupSsr(tree, { project: 'app1' }); - expect(tree.read('app1/src/app/app.server.module.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "import { NgModule } from '@angular/core'; - import { ServerModule } from '@angular/platform-server'; - import { provideServerRouting } from '@angular/ssr'; - import { AppComponent } from './app.component'; - import { AppModule } from './app.module'; - import { serverRoutes } from './app.routes.server'; - - @NgModule({ - imports: [AppModule, ServerModule], - providers: [provideServerRouting(serverRoutes)], - bootstrap: [AppComponent], - }) - export class AppServerModule {} - " - `); - expect(tree.read('app1/src/app/app.routes.server.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "import { RenderMode, ServerRoute } from '@angular/ssr'; - - export const serverRoutes: ServerRoute[] = [ - { - path: '**', - renderMode: RenderMode.Prerender, - }, - ]; - " - `); - }); - - it('should setup server routing for standalone apps when "serverRouting" is true', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - await generateTestApplication(tree, { - directory: 'app1', - standalone: true, - skipFormat: true, - }); - - await setupSsr(tree, { project: 'app1', serverRouting: true }); - - expect(tree.read('app1/src/app/app.config.server.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; - import { provideServerRendering } from '@angular/platform-server'; - import { provideServerRouting } from '@angular/ssr'; - import { appConfig } from './app.config'; - import { serverRoutes } from './app.routes.server'; - - const serverConfig: ApplicationConfig = { - providers: [provideServerRendering(), provideServerRouting(serverRoutes)], - }; - - export const config = mergeApplicationConfig(appConfig, serverConfig); - " - `); - expect(tree.read('app1/src/app/app.routes.server.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "import { RenderMode, ServerRoute } from '@angular/ssr'; - - export const serverRoutes: ServerRoute[] = [ - { - path: '**', - renderMode: RenderMode.Prerender, - }, - ]; - " - `); + const updatedProject = readProjectConfiguration(tree, 'app1'); + expect(updatedProject.targets.build.outputs).toStrictEqual([ + '{options.outputPath}', + '{projectRoot}/some-other-output-dir', + ]); + expect(updatedProject.targets.build.options.outputPath).toBe('dist/app1'); }); }); describe('with browser builder', () => { it('should create the files correctly for ssr', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', standalone: false, @@ -301,10 +344,10 @@ describe('setupSSR', () => { " `); expect(tree.read('app1/src/main.ts', 'utf-8')).toMatchInlineSnapshot(` - "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - import { AppModule } from './app/app.module'; + "import { platformBrowser } from '@angular/platform-browser'; + import { AppModule } from './app/app-module'; - platformBrowserDynamic() + platformBrowser() .bootstrapModule(AppModule, { ngZoneEventCoalescing: true }) @@ -319,6 +362,8 @@ describe('setupSSR', () => { "extends": "./tsconfig.app.json", "compilerOptions": { "outDir": "../out-tsc/server", + "module": "commonjs", + "moduleResolution": "node10", "types": [ "node" ] @@ -335,36 +380,36 @@ describe('setupSSR', () => { "import { NgModule } from '@angular/core'; import { ServerModule } from '@angular/platform-server'; - import { AppModule } from './app.module'; - import { AppComponent } from './app.component'; + import { AppModule } from './app-module'; + import { App } from './app'; @NgModule({ imports: [ AppModule, ServerModule, ], - bootstrap: [AppComponent], + bootstrap: [App], }) export class AppServerModule {} " `); - expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) + expect(tree.read('app1/src/app/app-module.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { NgModule } from '@angular/core'; + "import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule, provideClientHydration, withEventReplay } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; import { appRoutes } from './app.routes'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes), ], - providers: [provideClientHydration(withEventReplay())], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners(), provideClientHydration(withEventReplay())], + bootstrap: [App], }) export class AppModule {} " @@ -375,7 +420,7 @@ describe('setupSSR', () => { it('should create the files correctly for ssr when app is standalone', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', bundler: 'webpack', @@ -393,10 +438,10 @@ describe('setupSSR', () => { expect(tree.read('app1/src/main.server.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { bootstrapApplication } from '@angular/platform-browser'; - import { AppComponent } from './app/app.component'; + import { App } from './app/app'; import { config } from './app/app.config.server'; - const bootstrap = () => bootstrapApplication(AppComponent, config); + const bootstrap = () => bootstrapApplication(App, config); export default bootstrap; " @@ -409,6 +454,8 @@ describe('setupSSR', () => { "extends": "./tsconfig.app.json", "compilerOptions": { "outDir": "../out-tsc/server", + "module": "commonjs", + "moduleResolution": "node10", "types": [ "node" ] @@ -423,7 +470,7 @@ describe('setupSSR', () => { expect(tree.read('app1/src/app/app.config.server.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; - import { provideServerRendering } from '@angular/platform-server'; + import { provideServerRendering } from '@angular/ssr'; import { appConfig } from './app.config'; const serverConfig: ApplicationConfig = { @@ -440,7 +487,7 @@ describe('setupSSR', () => { }); it('should update build target output path', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', standalone: false, @@ -461,7 +508,7 @@ describe('setupSSR', () => { }); it('should install the correct dependencies', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', skipFormat: true, @@ -482,7 +529,7 @@ describe('setupSSR', () => { }); it('should not touch the package.json when run with `--skipPackageJson`', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', skipFormat: true, @@ -508,7 +555,7 @@ describe('setupSSR', () => { it('should add hydration correctly for NgModule apps', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', @@ -524,23 +571,23 @@ describe('setupSSR', () => { }); // ASSERT - expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) + expect(tree.read('app1/src/app/app-module.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { NgModule } from '@angular/core'; + "import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule, provideClientHydration, withEventReplay } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; import { appRoutes } from './app.routes'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes), ], - providers: [provideClientHydration(withEventReplay())], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners(), provideClientHydration(withEventReplay())], + bootstrap: [App], }) export class AppModule {} " @@ -549,7 +596,7 @@ describe('setupSSR', () => { it('should add hydration correctly to standalone', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', @@ -566,13 +613,17 @@ describe('setupSSR', () => { // ASSERT expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; + "import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; export const appConfig: ApplicationConfig = { - providers: [provideClientHydration(withEventReplay()),provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes) ] + providers: [provideClientHydration(withEventReplay()), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `); @@ -580,12 +631,13 @@ describe('setupSSR', () => { expect(tree.read('app1/src/app/app.config.server.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; - import { provideServerRendering } from '@angular/platform-server'; + import { provideServerRendering, withRoutes } from '@angular/ssr'; import { appConfig } from './app.config'; + import { serverRoutes } from './app.routes.server'; const serverConfig: ApplicationConfig = { providers: [ - provideServerRendering() + provideServerRendering(withRoutes(serverRoutes)) ] }; @@ -596,7 +648,7 @@ describe('setupSSR', () => { it('should set "initialNavigation: enabledBlocking" in "RouterModule.forRoot" options when hydration=false', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', standalone: false, @@ -609,23 +661,23 @@ describe('setupSSR', () => { skipFormat: true, }); - expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) + expect(tree.read('app1/src/app/app-module.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { NgModule } from '@angular/core'; + "import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; - import { AppComponent } from './app.component'; + import { App } from './app'; import { appRoutes } from './app.routes'; - import { NxWelcomeComponent } from './nx-welcome.component'; + import { NxWelcome } from './nx-welcome'; @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], + declarations: [App, NxWelcome], imports: [ BrowserModule, RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), ], - providers: [], - bootstrap: [AppComponent], + providers: [provideBrowserGlobalErrorListeners()], + bootstrap: [App], }) export class AppModule {} " @@ -633,7 +685,7 @@ describe('setupSSR', () => { }); it('should set "withEnabledBlockingInitialNavigation()" in "provideRouter" features when hydration=false', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); await generateTestApplication(tree, { directory: 'app1', skipFormat: true, @@ -647,12 +699,16 @@ describe('setupSSR', () => { expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; + "import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; import { provideRouter, withEnabledBlockingInitialNavigation } from '@angular/router'; import { appRoutes } from './app.routes'; export const appConfig: ApplicationConfig = { - providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes, withEnabledBlockingInitialNavigation()) ] + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes, withEnabledBlockingInitialNavigation()) + ] }; " `); @@ -661,11 +717,11 @@ describe('setupSSR', () => { describe('compat', () => { it('should install the correct versions when using older versions of Angular', async () => { // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); updateJson(tree, 'package.json', (json) => ({ ...json, dependencies: { - '@angular/core': '17.2.0', + '@angular/core': '18.2.0', }, })); await generateTestApplication(tree, { @@ -680,22 +736,22 @@ describe('setupSSR', () => { // ASSERT const pkgJson = readJson(tree, 'package.json'); expect(pkgJson.dependencies['@angular/ssr']).toBe( - backwardCompatibleVersions.angularV17.angularDevkitVersion + backwardCompatibleVersions.angularV18.angularDevkitVersion ); expect(pkgJson.dependencies['@angular/platform-server']).toEqual( - backwardCompatibleVersions.angularV17.angularVersion + backwardCompatibleVersions.angularV18.angularVersion ); expect(pkgJson.dependencies['@angular/ssr']).toEqual( - backwardCompatibleVersions.angularV17.angularDevkitVersion + backwardCompatibleVersions.angularV18.angularDevkitVersion ); expect(pkgJson.dependencies['express']).toEqual( - backwardCompatibleVersions.angularV17.expressVersion + backwardCompatibleVersions.angularV18.expressVersion ); expect( pkgJson.dependencies['@nguniversal/express-engine'] ).toBeUndefined(); expect(pkgJson.devDependencies['@types/express']).toBe( - backwardCompatibleVersions.angularV17.typesExpressVersion + backwardCompatibleVersions.angularV18.typesExpressVersion ); expect(pkgJson.devDependencies['@nguniversal/builders']).toBeUndefined(); }); @@ -704,7 +760,7 @@ describe('setupSSR', () => { const tree = createTreeWithEmptyWorkspace(); updateJson(tree, 'package.json', (json) => ({ ...json, - dependencies: { '@angular/core': '17.2.0' }, + dependencies: { '@angular/core': '18.2.0' }, })); await generateTestApplication(tree, { directory: 'app1', @@ -745,7 +801,7 @@ describe('setupSSR', () => { const tree = createTreeWithEmptyWorkspace(); updateJson(tree, 'package.json', (json) => ({ ...json, - dependencies: { '@angular/core': '17.2.0' }, + dependencies: { '@angular/core': '18.2.0' }, })); await generateTestApplication(tree, { directory: 'app1', @@ -760,13 +816,16 @@ describe('setupSSR', () => { expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { ApplicationConfig } from '@angular/core'; + "import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideClientHydration } from '@angular/platform-browser'; export const appConfig: ApplicationConfig = { - providers: [provideClientHydration(),provideRouter(appRoutes) ] + providers: [provideClientHydration(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes) + ] }; " `); @@ -789,7 +848,7 @@ describe('setupSSR', () => { }); it('should setup server routing using "provideServerRoutesConfig" for NgModule apps when "serverRouting" is true and @angular/ssr version is lower than 19.2.0', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); updateJson(tree, 'package.json', (json) => ({ ...json, dependencies: { '@angular/core': '19.1.0', '@angular/ssr': '19.1.0' }, @@ -834,8 +893,54 @@ describe('setupSSR', () => { `); }); + it('should setup server routing using "provideServerRouting" for NgModule apps when "serverRouting" is true and @angular/ssr version is 19.2.x', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { '@angular/core': '19.2.0', '@angular/ssr': '19.2.0' }, + devDependencies: { '@angular-devkit/build-angular': '19.2.0' }, + })); + await generateTestApplication(tree, { + directory: 'app1', + standalone: false, + skipFormat: true, + }); + + await setupSsr(tree, { project: 'app1', serverRouting: true }); + + expect(tree.read('app1/src/app/app.server.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { ServerModule } from '@angular/platform-server'; + import { provideServerRouting } from '@angular/ssr'; + import { AppComponent } from './app.component'; + import { AppModule } from './app.module'; + import { serverRoutes } from './app.routes.server'; + + @NgModule({ + imports: [AppModule, ServerModule], + providers: [provideServerRouting(serverRoutes)], + bootstrap: [AppComponent], + }) + export class AppServerModule {} + " + `); + expect(tree.read('app1/src/app/app.routes.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { RenderMode, ServerRoute } from '@angular/ssr'; + + export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender, + }, + ]; + " + `); + }); + it('should setup server routing using "provideServerRoutesConfig" for standalone apps when "serverRouting" is true and @angular/ssr version is lower than 19.2.0', async () => { - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const tree = createTreeWithEmptyWorkspace(); updateJson(tree, 'package.json', (json) => ({ ...json, dependencies: { '@angular/core': '19.1.0', '@angular/ssr': '19.1.0' }, @@ -880,5 +985,73 @@ describe('setupSSR', () => { " `); }); + + it('should setup server routing using "provideServerRouting" for standalone apps when "serverRouting" is true and @angular/ssr version is 19.2.x', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { '@angular/core': '19.2.0', '@angular/ssr': '19.2.0' }, + devDependencies: { '@angular-devkit/build-angular': '19.2.0' }, + })); + await generateTestApplication(tree, { + directory: 'app1', + standalone: true, + skipFormat: true, + }); + + await setupSsr(tree, { project: 'app1', serverRouting: true }); + + expect(tree.read('app1/src/app/app.config.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; + import { provideServerRendering } from '@angular/platform-server'; + import { provideServerRouting } from '@angular/ssr'; + import { appConfig } from './app.config'; + import { serverRoutes } from './app.routes.server'; + + const serverConfig: ApplicationConfig = { + providers: [provideServerRendering(), provideServerRouting(serverRoutes)], + }; + + export const config = mergeApplicationConfig(appConfig, serverConfig); + " + `); + expect(tree.read('app1/src/app/app.routes.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { RenderMode, ServerRoute } from '@angular/ssr'; + + export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender, + }, + ]; + " + `); + }); + + it('should add server files to the tsconfig.app.json files for versions lower than v20', async () => { + const tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); + await generateTestApplication(tree, { + directory: 'app1', + standalone: false, + skipFormat: true, + }); + + await setupSsr(tree, { project: 'app1' }); + + expect(readJson(tree, 'app1/tsconfig.app.json').files).toStrictEqual([ + 'src/main.ts', + 'src/main.server.ts', + 'src/server.ts', + ]); + }); }); }); diff --git a/packages/angular/src/generators/stories/__snapshots__/stories-app.spec.ts.snap b/packages/angular/src/generators/stories/__snapshots__/stories-app.spec.ts.snap index 5b5de71b2b..063d07d6c7 100644 --- a/packages/angular/src/generators/stories/__snapshots__/stories-app.spec.ts.snap +++ b/packages/angular/src/generators/stories/__snapshots__/stories-app.spec.ts.snap @@ -2,16 +2,16 @@ exports[`angularStories generator: applications should generate stories file for inline scam component 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { MyScamComponent } from './my-scam.component'; +import { MyScam } from './my-scam'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: MyScamComponent, - title: 'MyScamComponent', +const meta: Meta = { + component: MyScam, + title: 'MyScam', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: { @@ -31,16 +31,16 @@ export const Heading: Story = { exports[`angularStories generator: applications should generate stories file with interaction tests 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { AppComponent } from './app.component'; +import { App } from './app'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: AppComponent, - title: 'AppComponent', +const meta: Meta = { + component: App, + title: 'App', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: {}, @@ -58,16 +58,16 @@ export const Heading: Story = { exports[`angularStories generator: applications should ignore a path that has a nested component, but still generate nested component stories 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { ComponentBComponent } from './component-b.component'; +import { ComponentB } from './component-b'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: ComponentBComponent, - title: 'ComponentBComponent', +const meta: Meta = { + component: ComponentB, + title: 'ComponentB', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: { @@ -87,16 +87,16 @@ export const Heading: Story = { exports[`angularStories generator: applications should ignore a path when using a routing module 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { ComponentComponent } from './component.component'; +import { Component } from './component'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: ComponentComponent, - title: 'ComponentComponent', +const meta: Meta = { + component: Component, + title: 'Component', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: { diff --git a/packages/angular/src/generators/stories/__snapshots__/stories-lib.spec.ts.snap b/packages/angular/src/generators/stories/__snapshots__/stories-lib.spec.ts.snap index 72842c417c..fb75c1230a 100644 --- a/packages/angular/src/generators/stories/__snapshots__/stories-lib.spec.ts.snap +++ b/packages/angular/src/generators/stories/__snapshots__/stories-lib.spec.ts.snap @@ -2,16 +2,16 @@ exports[`angularStories generator: libraries Stories for non-empty Angular library should generate stories file for standalone components 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { StandaloneComponent } from './standalone.component'; +import { Standalone } from './standalone'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: StandaloneComponent, - title: 'StandaloneComponent', +const meta: Meta = { + component: Standalone, + title: 'Standalone', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: {}, @@ -29,16 +29,16 @@ export const Heading: Story = { exports[`angularStories generator: libraries Stories for non-empty Angular library should generate stories file for standalone components 2`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { SecondaryStandaloneComponent } from './secondary-standalone.component'; +import { SecondaryStandalone } from './secondary-standalone'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: SecondaryStandaloneComponent, - title: 'SecondaryStandaloneComponent', +const meta: Meta = { + component: SecondaryStandalone, + title: 'SecondaryStandalone', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: {}, @@ -56,16 +56,16 @@ export const Heading: Story = { exports[`angularStories generator: libraries Stories for non-empty Angular library should generate stories.ts files 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { TestButtonComponent } from './test-button.component'; +import { TestButton } from './test-button'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: TestButtonComponent, - title: 'TestButtonComponent', +const meta: Meta = { + component: TestButton, + title: 'TestButton', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: { @@ -93,16 +93,16 @@ export const Heading: Story = { exports[`angularStories generator: libraries Stories for non-empty Angular library should ignore paths 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { TestButtonComponent } from './test-button.component'; +import { TestButton } from './test-button'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: TestButtonComponent, - title: 'TestButtonComponent', +const meta: Meta = { + component: TestButton, + title: 'TestButton', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: { diff --git a/packages/angular/src/generators/stories/stories-app.spec.ts b/packages/angular/src/generators/stories/stories-app.spec.ts index 2c6dedb466..3456c92a06 100644 --- a/packages/angular/src/generators/stories/stories-app.spec.ts +++ b/packages/angular/src/generators/stories/stories-app.spec.ts @@ -24,7 +24,7 @@ describe('angularStories generator: applications', () => { await angularStoriesGenerator(tree, { name: appName }); expect( - tree.read(`${appName}/src/app/app.component.stories.ts`, 'utf-8') + tree.read(`${appName}/src/app/app.stories.ts`, 'utf-8') ).toMatchSnapshot(); }); @@ -38,7 +38,7 @@ describe('angularStories generator: applications', () => { await angularStoriesGenerator(tree, { name: appName }); expect( - tree.exists(`${appName}/src/app/my-scam/my-scam.component.stories.ts`) + tree.exists(`${appName}/src/app/my-scam/my-scam.stories.ts`) ).toBeTruthy(); }); @@ -92,20 +92,18 @@ describe('angularStories generator: applications', () => { await angularStoriesGenerator(tree, { name: appName, - ignorePaths: [`${appName}/src/app/component-a/component-a.component.ts`], + ignorePaths: [`${appName}/src/app/component-a/component-a.ts`], skipFormat: true, }); expect( tree.read( - `${appName}/src/app/component-a/component-b/component-b.component.stories.ts`, + `${appName}/src/app/component-a/component-b/component-b.stories.ts`, 'utf-8' ) ).toMatchSnapshot(); expect( - tree.exists( - `${appName}/src/app/component-a/component-a.component.stories.ts` - ) + tree.exists(`${appName}/src/app/component-a/component-a.component.ts`) ).toBeFalsy(); }); @@ -142,19 +140,14 @@ describe('angularStories generator: applications', () => { await angularStoriesGenerator(tree, { name: appName, - ignorePaths: [`${appName}/src/app/app.component.ts`], + ignorePaths: [`${appName}/src/app/app.ts`], skipFormat: true, }); expect( - tree.read( - `${appName}/src/app/component/component.component.stories.ts`, - 'utf-8' - ) + tree.read(`${appName}/src/app/component/component.stories.ts`, 'utf-8') ).toMatchSnapshot(); - expect( - tree.exists(`${appName}/src/app/app.component.stories.ts`) - ).toBeFalsy(); + expect(tree.exists(`${appName}/src/app/app.stories.ts`)).toBeFalsy(); }); it('should generate stories file for inline scam component', async () => { @@ -168,10 +161,7 @@ describe('angularStories generator: applications', () => { await angularStoriesGenerator(tree, { name: appName, skipFormat: true }); expect( - tree.read( - `${appName}/src/app/my-scam/my-scam.component.stories.ts`, - 'utf-8' - ) + tree.read(`${appName}/src/app/my-scam/my-scam.stories.ts`, 'utf-8') ).toMatchSnapshot(); }); }); diff --git a/packages/angular/src/generators/stories/stories-lib.spec.ts b/packages/angular/src/generators/stories/stories-lib.spec.ts index 4e736fb316..9f353ab649 100644 --- a/packages/angular/src/generators/stories/stories-lib.spec.ts +++ b/packages/angular/src/generators/stories/stories-lib.spec.ts @@ -59,35 +59,85 @@ describe('angularStories generator: libraries', () => { expect( tree.exists( - `${libName}/src/lib/barrel/barrel-button/barrel-button.component.stories.ts` + `${libName}/src/lib/barrel/barrel-button/barrel-button.stories.ts` ) ).toBeTruthy(); expect( tree.exists( - `${libName}/src/lib/nested/nested-button/nested-button.component.stories.ts` + `${libName}/src/lib/nested/nested-button/nested-button.stories.ts` ) ).toBeTruthy(); expect( - tree.exists( - `${libName}/src/lib/test-button/test-button.component.stories.ts` - ) + tree.exists(`${libName}/src/lib/test-button/test-button.stories.ts`) ).toBeTruthy(); expect( - tree.exists( - `${libName}/src/lib/test-other/test-other.component.stories.ts` - ) + tree.exists(`${libName}/src/lib/test-other/test-other.stories.ts`) ).toBeTruthy(); expect( tree.read( - `${libName}/src/lib/test-button/test-button.component.stories.ts`, + `${libName}/src/lib/test-button/test-button.stories.ts`, 'utf-8' ) ).toMatchSnapshot(); + expect( + tree.exists( + `${libName}/secondary-entry-point/src/lib/secondary-button/secondary-button.stories.ts` + ) + ).toBeTruthy(); + }); + + it('should generate stories.ts files for components generated with a type "component"', async () => { + writeJson(tree, `${libName}/package.json`, { name: libName }); + await librarySecondaryEntryPointGenerator(tree, { + library: libName, + name: 'secondary-entry-point', + skipFormat: true, + }); + await componentGenerator(tree, { + name: 'secondary-button', + path: `${libName}/secondary-entry-point/src/lib/secondary-button/secondary-button`, + type: 'component', + skipFormat: true, + }); + + await angularStoriesGenerator(tree, { name: libName }); + expect( tree.exists( `${libName}/secondary-entry-point/src/lib/secondary-button/secondary-button.component.stories.ts` ) ).toBeTruthy(); + expect( + tree.read( + `${libName}/secondary-entry-point/src/lib/secondary-button/secondary-button.component.stories.ts`, + 'utf-8' + ) + ).toMatchInlineSnapshot(` + "import type { Meta, StoryObj } from '@storybook/angular'; + import { SecondaryButtonComponent } from './secondary-button.component'; + import { within } from '@storybook/testing-library'; + import { expect } from '@storybook/jest'; + + const meta: Meta = { + component: SecondaryButtonComponent, + title: 'SecondaryButtonComponent', + }; + export default meta; + type Story = StoryObj; + + export const Primary: Story = { + args: {}, + }; + + export const Heading: Story = { + args: {}, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + expect(canvas.getByText(/secondary-button works!/gi)).toBeTruthy(); + }, + }; + " + `); }); it('should run twice without errors', async () => { @@ -113,17 +163,17 @@ describe('angularStories generator: libraries', () => { expect( tree.exists( - `${libName}/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.stories.ts` + `${libName}/src/lib/variable-declare/variable-declare-button/variable-declare-button.stories.ts` ) ).toBeTruthy(); expect( tree.exists( - `${libName}/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.stories.ts` + `${libName}/src/lib/variable-declare/variable-declare-view/variable-declare-view.stories.ts` ) ).toBeTruthy(); }); - it('should handle modules with where components are spread into the declarations array', async () => { + it('should handle modules where components are spread into the declarations array', async () => { await angularStoriesGenerator(tree, { name: libName, skipFormat: true, @@ -131,17 +181,17 @@ describe('angularStories generator: libraries', () => { expect( tree.exists( - `${libName}/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.stories.ts` + `${libName}/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.stories.ts` ) ).toBeTruthy(); expect( tree.exists( - `${libName}/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.stories.ts` + `${libName}/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.stories.ts` ) ).toBeTruthy(); expect( tree.exists( - `${libName}/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.stories.ts` + `${libName}/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.stories.ts` ) ).toBeTruthy(); }); @@ -154,12 +204,12 @@ describe('angularStories generator: libraries', () => { expect( tree.exists( - `${libName}/src/lib/static-member-declarations/cmp1/cmp1.component.stories.ts` + `${libName}/src/lib/static-member-declarations/cmp1/cmp1.stories.ts` ) ).toBeTruthy(); expect( tree.exists( - `${libName}/src/lib/static-member-declarations/cmp2/cmp2.component.stories.ts` + `${libName}/src/lib/static-member-declarations/cmp2/cmp2.stories.ts` ) ).toBeTruthy(); }); @@ -174,7 +224,7 @@ describe('angularStories generator: libraries', () => { await angularStoriesGenerator(tree, { name: libName, skipFormat: true }); expect( - tree.exists(`${libName}/src/lib/my-scam/my-scam.component.stories.ts`) + tree.exists(`${libName}/src/lib/my-scam/my-scam.stories.ts`) ).toBeTruthy(); }); @@ -189,7 +239,7 @@ describe('angularStories generator: libraries', () => { await angularStoriesGenerator(tree, { name: libName, skipFormat: true }); expect( - tree.exists(`${libName}/src/lib/my-scam/my-scam.component.stories.ts`) + tree.exists(`${libName}/src/lib/my-scam/my-scam.stories.ts`) ).toBeTruthy(); }); @@ -219,24 +269,22 @@ describe('angularStories generator: libraries', () => { await angularStoriesGenerator(tree, { name: libName }); expect( - tree.exists( - `${libName}/src/lib/standalone/standalone.component.stories.ts` - ) + tree.exists(`${libName}/src/lib/standalone/standalone.stories.ts`) ).toBeTruthy(); expect( tree.read( - `${libName}/src/lib/standalone/standalone.component.stories.ts`, + `${libName}/src/lib/standalone/standalone.stories.ts`, 'utf-8' ) ).toMatchSnapshot(); expect( tree.exists( - `${libName}/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.stories.ts` + `${libName}/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.stories.ts` ) ).toBeTruthy(); expect( tree.read( - `${libName}/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.stories.ts`, + `${libName}/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.stories.ts`, 'utf-8' ) ).toMatchSnapshot(); @@ -253,7 +301,7 @@ describe('angularStories generator: libraries', () => { // add a standalone component to the secondary entrypoint await componentGenerator(tree, { name: 'secondary-button', - path: `${libName}/secondary-entry-point/src/lib/secondary-button/seconday-button`, + path: `${libName}/secondary-entry-point/src/lib/secondary-button/secondary-button`, skipFormat: true, }); @@ -268,33 +316,29 @@ describe('angularStories generator: libraries', () => { expect( tree.exists( - `${libName}/src/lib/barrel/barrel-button/barrel-button.component.stories.ts` + `${libName}/src/lib/barrel/barrel-button/barrel-button.stories.ts` ) ).toBeFalsy(); expect( tree.exists( - `${libName}/src/lib/nested/nested-button/nested-button.component.stories.ts` + `${libName}/src/lib/nested/nested-button/nested-button.stories.ts` ) ).toBeTruthy(); expect( - tree.exists( - `${libName}/src/lib/test-button/test-button.component.stories.ts` - ) + tree.exists(`${libName}/src/lib/test-button/test-button.stories.ts`) ).toBeTruthy(); expect( - tree.exists( - `${libName}/src/lib/test-other/test-other.component.stories.ts` - ) + tree.exists(`${libName}/src/lib/test-other/test-other.stories.ts`) ).toBeTruthy(); expect( tree.read( - `${libName}/src/lib/test-button/test-button.component.stories.ts`, + `${libName}/src/lib/test-button/test-button.stories.ts`, 'utf-8' ) ).toMatchSnapshot(); expect( tree.exists( - `${libName}/secondary-entry-point/src/lib/secondary-button/secondary-button.component.stories.ts` + `${libName}/secondary-entry-point/src/lib/secondary-button/secondary-button.stories.ts` ) ).toBeFalsy(); }); diff --git a/packages/angular/src/generators/storybook-configuration/__snapshots__/storybook-configuration.spec.ts.snap b/packages/angular/src/generators/storybook-configuration/__snapshots__/storybook-configuration.spec.ts.snap index 0c718a36b0..ce1514614c 100644 --- a/packages/angular/src/generators/storybook-configuration/__snapshots__/storybook-configuration.spec.ts.snap +++ b/packages/angular/src/generators/storybook-configuration/__snapshots__/storybook-configuration.spec.ts.snap @@ -32,16 +32,16 @@ export default config; exports[`StorybookConfiguration generator should configure storybook with interaction tests and install dependencies 1`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { TestButtonComponent } from './test-button.component'; +import { TestButton } from './test-button'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: TestButtonComponent, - title: 'TestButtonComponent', +const meta: Meta = { + component: TestButton, + title: 'TestButton', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: { @@ -69,16 +69,16 @@ export const Heading: Story = { exports[`StorybookConfiguration generator should configure storybook with interaction tests and install dependencies 2`] = ` "import type { Meta, StoryObj } from '@storybook/angular'; -import { TestOtherComponent } from './test-other.component'; +import { TestOther } from './test-other'; import { within } from '@storybook/testing-library'; import { expect } from '@storybook/jest'; -const meta: Meta = { - component: TestOtherComponent, - title: 'TestOtherComponent', +const meta: Meta = { + component: TestOther, + title: 'TestOther', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Primary: Story = { args: {}, @@ -118,85 +118,85 @@ exports[`StorybookConfiguration generator should generate in the correct folder "test-ui-lib/secondary-entry-point/ng-package.json", "test-ui-lib/secondary-entry-point/README.md", "test-ui-lib/secondary-entry-point/src/index.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.css", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.html", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.spec.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.stories.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-entry-point.module.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.css", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.html", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.spec.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.stories.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.css", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.html", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.spec.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.stories.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-entry-point-module.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.css", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.html", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.spec.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.stories.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.ts", "test-ui-lib/src/index.ts", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.css", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.html", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.spec.ts", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.stories.ts", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.ts", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.css", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.html", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.spec.ts", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.stories.ts", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.ts", "test-ui-lib/src/lib/barrel/barrel-button/index.ts", - "test-ui-lib/src/lib/barrel/barrel.module.ts", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.css", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.html", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.spec.ts", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.stories.ts", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.ts", - "test-ui-lib/src/lib/nested/nested.module.ts", - "test-ui-lib/src/lib/standalone/standalone.component.css", - "test-ui-lib/src/lib/standalone/standalone.component.html", - "test-ui-lib/src/lib/standalone/standalone.component.spec.ts", - "test-ui-lib/src/lib/standalone/standalone.component.stories.ts", - "test-ui-lib/src/lib/standalone/standalone.component.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.css", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.html", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.spec.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.stories.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.css", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.html", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.spec.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.stories.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.ts", - "test-ui-lib/src/lib/static-member-declarations/static-member-declarations.module.ts", - "test-ui-lib/src/lib/test-button/test-button.component.css", - "test-ui-lib/src/lib/test-button/test-button.component.html", - "test-ui-lib/src/lib/test-button/test-button.component.spec.ts", - "test-ui-lib/src/lib/test-button/test-button.component.stories.ts", - "test-ui-lib/src/lib/test-button/test-button.component.ts", - "test-ui-lib/src/lib/test-other/test-other.component.css", - "test-ui-lib/src/lib/test-other/test-other.component.html", - "test-ui-lib/src/lib/test-other/test-other.component.spec.ts", - "test-ui-lib/src/lib/test-other/test-other.component.stories.ts", - "test-ui-lib/src/lib/test-other/test-other.component.ts", - "test-ui-lib/src/lib/test-ui-lib.module.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.css", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.html", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.spec.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.stories.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.css", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.html", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.spec.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.stories.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare.module.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.css", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.html", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.spec.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.stories.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.css", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.html", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.spec.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.stories.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.css", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.html", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.spec.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.stories.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare.module.ts", + "test-ui-lib/src/lib/barrel/barrel-module.ts", + "test-ui-lib/src/lib/nested/nested-button/nested-button.css", + "test-ui-lib/src/lib/nested/nested-button/nested-button.html", + "test-ui-lib/src/lib/nested/nested-button/nested-button.spec.ts", + "test-ui-lib/src/lib/nested/nested-button/nested-button.stories.ts", + "test-ui-lib/src/lib/nested/nested-button/nested-button.ts", + "test-ui-lib/src/lib/nested/nested-module.ts", + "test-ui-lib/src/lib/standalone/standalone.css", + "test-ui-lib/src/lib/standalone/standalone.html", + "test-ui-lib/src/lib/standalone/standalone.spec.ts", + "test-ui-lib/src/lib/standalone/standalone.stories.ts", + "test-ui-lib/src/lib/standalone/standalone.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.css", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.html", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.spec.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.stories.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.css", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.html", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.spec.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.stories.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.ts", + "test-ui-lib/src/lib/static-member-declarations/static-member-declarations-module.ts", + "test-ui-lib/src/lib/test-button/test-button.css", + "test-ui-lib/src/lib/test-button/test-button.html", + "test-ui-lib/src/lib/test-button/test-button.spec.ts", + "test-ui-lib/src/lib/test-button/test-button.stories.ts", + "test-ui-lib/src/lib/test-button/test-button.ts", + "test-ui-lib/src/lib/test-other/test-other.css", + "test-ui-lib/src/lib/test-other/test-other.html", + "test-ui-lib/src/lib/test-other/test-other.spec.ts", + "test-ui-lib/src/lib/test-other/test-other.stories.ts", + "test-ui-lib/src/lib/test-other/test-other.ts", + "test-ui-lib/src/lib/test-ui-lib-module.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.css", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.html", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.spec.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.stories.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-module.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.css", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.html", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.spec.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.stories.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.css", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.html", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.spec.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.stories.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.css", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.html", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.spec.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.stories.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-module.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.css", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.html", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.spec.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.stories.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.ts", "test-ui-lib/src/test-setup.ts", "test-ui-lib/tsconfig.json", "test-ui-lib/tsconfig.lib.json", @@ -229,85 +229,85 @@ exports[`StorybookConfiguration generator should generate the right files 1`] = "test-ui-lib/secondary-entry-point/ng-package.json", "test-ui-lib/secondary-entry-point/README.md", "test-ui-lib/secondary-entry-point/src/index.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.css", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.html", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.spec.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.stories.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.component.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-entry-point.module.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.css", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.html", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.spec.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.stories.ts", - "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.component.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.css", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.html", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.spec.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.stories.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-button/secondary-button.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-entry-point-module.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.css", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.html", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.spec.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.stories.ts", + "test-ui-lib/secondary-entry-point/src/lib/secondary-standalone/secondary-standalone.ts", "test-ui-lib/src/index.ts", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.css", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.html", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.spec.ts", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.stories.ts", - "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.component.ts", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.css", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.html", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.spec.ts", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.stories.ts", + "test-ui-lib/src/lib/barrel/barrel-button/barrel-button.ts", "test-ui-lib/src/lib/barrel/barrel-button/index.ts", - "test-ui-lib/src/lib/barrel/barrel.module.ts", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.css", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.html", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.spec.ts", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.stories.ts", - "test-ui-lib/src/lib/nested/nested-button/nested-button.component.ts", - "test-ui-lib/src/lib/nested/nested.module.ts", - "test-ui-lib/src/lib/standalone/standalone.component.css", - "test-ui-lib/src/lib/standalone/standalone.component.html", - "test-ui-lib/src/lib/standalone/standalone.component.spec.ts", - "test-ui-lib/src/lib/standalone/standalone.component.stories.ts", - "test-ui-lib/src/lib/standalone/standalone.component.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.css", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.html", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.spec.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.stories.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.component.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.css", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.html", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.spec.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.stories.ts", - "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.component.ts", - "test-ui-lib/src/lib/static-member-declarations/static-member-declarations.module.ts", - "test-ui-lib/src/lib/test-button/test-button.component.css", - "test-ui-lib/src/lib/test-button/test-button.component.html", - "test-ui-lib/src/lib/test-button/test-button.component.spec.ts", - "test-ui-lib/src/lib/test-button/test-button.component.stories.ts", - "test-ui-lib/src/lib/test-button/test-button.component.ts", - "test-ui-lib/src/lib/test-other/test-other.component.css", - "test-ui-lib/src/lib/test-other/test-other.component.html", - "test-ui-lib/src/lib/test-other/test-other.component.spec.ts", - "test-ui-lib/src/lib/test-other/test-other.component.stories.ts", - "test-ui-lib/src/lib/test-other/test-other.component.ts", - "test-ui-lib/src/lib/test-ui-lib.module.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.css", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.html", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.spec.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.stories.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.component.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.css", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.html", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.spec.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.stories.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.component.ts", - "test-ui-lib/src/lib/variable-declare/variable-declare.module.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.css", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.html", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.spec.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.stories.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.component.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.css", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.html", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.spec.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.stories.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.component.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.css", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.html", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.spec.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.stories.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.component.ts", - "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare.module.ts", + "test-ui-lib/src/lib/barrel/barrel-module.ts", + "test-ui-lib/src/lib/nested/nested-button/nested-button.css", + "test-ui-lib/src/lib/nested/nested-button/nested-button.html", + "test-ui-lib/src/lib/nested/nested-button/nested-button.spec.ts", + "test-ui-lib/src/lib/nested/nested-button/nested-button.stories.ts", + "test-ui-lib/src/lib/nested/nested-button/nested-button.ts", + "test-ui-lib/src/lib/nested/nested-module.ts", + "test-ui-lib/src/lib/standalone/standalone.css", + "test-ui-lib/src/lib/standalone/standalone.html", + "test-ui-lib/src/lib/standalone/standalone.spec.ts", + "test-ui-lib/src/lib/standalone/standalone.stories.ts", + "test-ui-lib/src/lib/standalone/standalone.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.css", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.html", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.spec.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.stories.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp1/cmp1.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.css", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.html", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.spec.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.stories.ts", + "test-ui-lib/src/lib/static-member-declarations/cmp2/cmp2.ts", + "test-ui-lib/src/lib/static-member-declarations/static-member-declarations-module.ts", + "test-ui-lib/src/lib/test-button/test-button.css", + "test-ui-lib/src/lib/test-button/test-button.html", + "test-ui-lib/src/lib/test-button/test-button.spec.ts", + "test-ui-lib/src/lib/test-button/test-button.stories.ts", + "test-ui-lib/src/lib/test-button/test-button.ts", + "test-ui-lib/src/lib/test-other/test-other.css", + "test-ui-lib/src/lib/test-other/test-other.html", + "test-ui-lib/src/lib/test-other/test-other.spec.ts", + "test-ui-lib/src/lib/test-other/test-other.stories.ts", + "test-ui-lib/src/lib/test-other/test-other.ts", + "test-ui-lib/src/lib/test-ui-lib-module.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.css", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.html", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.spec.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.stories.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-button/variable-declare-button.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-module.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.css", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.html", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.spec.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.stories.ts", + "test-ui-lib/src/lib/variable-declare/variable-declare-view/variable-declare-view.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.css", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.html", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.spec.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.stories.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-anotherview/variable-spread-declare-anotherview.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.css", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.html", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.spec.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.stories.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-button/variable-spread-declare-button.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-module.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.css", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.html", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.spec.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.stories.ts", + "test-ui-lib/src/lib/variable-spread-declare/variable-spread-declare-view/variable-spread-declare-view.ts", "test-ui-lib/src/test-setup.ts", "test-ui-lib/tsconfig.json", "test-ui-lib/tsconfig.lib.json", diff --git a/packages/angular/src/generators/storybook-configuration/storybook-configuration.spec.ts b/packages/angular/src/generators/storybook-configuration/storybook-configuration.spec.ts index a2f4458ed4..dbca0e7adf 100644 --- a/packages/angular/src/generators/storybook-configuration/storybook-configuration.spec.ts +++ b/packages/angular/src/generators/storybook-configuration/storybook-configuration.spec.ts @@ -1,5 +1,5 @@ import type { Tree } from '@nx/devkit'; -import { readJson, writeJson } from '@nx/devkit'; +import { readJson, updateJson, writeJson } from '@nx/devkit'; import { componentGenerator } from '../component/component'; import { librarySecondaryEntryPointGenerator } from '../library-secondary-entry-point/library-secondary-entry-point'; import { @@ -48,14 +48,10 @@ describe('StorybookConfiguration generator', () => { expect(tree.exists('test-ui-lib/.storybook/main.ts')).toBeTruthy(); expect(tree.exists('test-ui-lib/.storybook/tsconfig.json')).toBeTruthy(); expect( - tree.exists( - 'test-ui-lib/src/lib/test-button/test-button.component.stories.ts' - ) + tree.exists('test-ui-lib/src/lib/test-button/test-button.stories.ts') ).toBeFalsy(); expect( - tree.exists( - 'test-ui-lib/src/lib/test-other/test-other.component.stories.ts' - ) + tree.exists('test-ui-lib/src/lib/test-other/test-other.stories.ts') ).toBeFalsy(); }); @@ -82,15 +78,12 @@ describe('StorybookConfiguration generator', () => { expect(tree.exists('test-ui-lib/.storybook/tsconfig.json')).toBeTruthy(); expect( tree.read( - 'test-ui-lib/src/lib/test-button/test-button.component.stories.ts', + 'test-ui-lib/src/lib/test-button/test-button.stories.ts', 'utf-8' ) ).toMatchSnapshot(); expect( - tree.read( - 'test-ui-lib/src/lib/test-other/test-other.component.stories.ts', - 'utf-8' - ) + tree.read('test-ui-lib/src/lib/test-other/test-other.stories.ts', 'utf-8') ).toMatchSnapshot(); const packageJson = JSON.parse(tree.read('package.json', 'utf-8')); @@ -185,6 +178,14 @@ describe('StorybookConfiguration generator', () => { }); it('should exclude Storybook-related files from tsconfig.editor.json for applications', async () => { + // the tsconfig.editor.json is only generated for versions lower than v20 + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + ...json.dependencies, + '@angular/core': '~19.2.0', + }; + return json; + }); await generateTestApplication(tree, { directory: 'test-app' }); await storybookConfigurationGenerator(tree, { diff --git a/packages/angular/src/generators/utils/add-jest.ts b/packages/angular/src/generators/utils/add-jest.ts index 308b89e2cf..2dee496bf7 100644 --- a/packages/angular/src/generators/utils/add-jest.ts +++ b/packages/angular/src/generators/utils/add-jest.ts @@ -4,7 +4,8 @@ import { joinPathFragments, type Tree, } from '@nx/devkit'; -import { jestPresetAngularVersion, nxVersion } from '../../utils/versions'; +import { nxVersion } from '../../utils/versions'; +import { versions } from './version-utils'; export type AddJestOptions = { name: string; @@ -21,10 +22,14 @@ export async function addJest( if (!options.skipPackageJson) { process.env.npm_config_legacy_peer_deps ??= 'true'; + const pkgVersions = versions(tree); addDependenciesToPackageJson( tree, - {}, - { 'jest-preset-angular': jestPresetAngularVersion }, + { + // TODO(leo): jest-preset-angular still needs this until https://github.com/thymikee/jest-preset-angular/pull/3079 is merged + '@angular/platform-browser-dynamic': pkgVersions.angularVersion, + }, + { 'jest-preset-angular': pkgVersions.jestPresetAngularVersion }, undefined, true ); diff --git a/packages/angular/src/generators/utils/app-components-info.ts b/packages/angular/src/generators/utils/app-components-info.ts new file mode 100644 index 0000000000..e55791aae6 --- /dev/null +++ b/packages/angular/src/generators/utils/app-components-info.ts @@ -0,0 +1,80 @@ +import { + joinPathFragments, + names, + type ProjectConfiguration, + type Tree, +} from '@nx/devkit'; +import { basename } from 'node:path'; +import { getInstalledAngularVersionInfo } from './version-utils'; + +export type ComponentMetadata = { + fileName: string; + extensionlessFileName: string; + path: string; + symbolName: string; +}; + +export function getAppComponentInfo( + tree: Tree, + componentFileSuffix: string, + project: ProjectConfiguration +): ComponentMetadata { + return getComponentInfo(tree, 'app', componentFileSuffix, project); +} + +export function getNxWelcomeComponentInfo( + tree: Tree, + componentFileSuffix: string, + project: ProjectConfiguration +): ComponentMetadata { + return getComponentInfo(tree, 'nx-welcome', componentFileSuffix, project); +} + +// TODO(leo): follow this up and improve it by using static analysis +function getComponentInfo( + tree: Tree, + component: 'app' | 'nx-welcome', + componentFileSuffix: string, + project: ProjectConfiguration +): ComponentMetadata { + let componentPath = joinPathFragments( + project.sourceRoot, + `app/${component}.component.ts` + ); + + if (!tree.exists(componentPath)) { + componentPath = joinPathFragments( + project.sourceRoot, + `app/${component}.ts` + ); + } + + if (!tree.exists(componentPath)) { + if (componentFileSuffix) { + componentPath = joinPathFragments( + project.sourceRoot, + `app/${component}${componentFileSuffix}.ts` + ); + } + } + + if (!tree.exists(componentPath)) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + componentPath = joinPathFragments( + project.sourceRoot, + angularMajorVersion >= 20 + ? `app/${component}.ts` + : `app/${component}.component.ts` + ); + } + + const fileName = basename(componentPath); + const extensionlessFileName = fileName.slice(0, -3); + + return { + fileName, + extensionlessFileName, + path: componentPath, + symbolName: names(extensionlessFileName).className, + }; +} diff --git a/packages/angular/src/generators/utils/artifact-types.ts b/packages/angular/src/generators/utils/artifact-types.ts new file mode 100644 index 0000000000..3801c020e4 --- /dev/null +++ b/packages/angular/src/generators/utils/artifact-types.ts @@ -0,0 +1,37 @@ +import { readNxJson, type Tree } from '@nx/devkit'; +import { getInstalledAngularVersionInfo } from './version-utils'; + +export function getComponentType(tree: Tree): string | undefined { + const nxJson = readNxJson(tree); + let componentType = + nxJson.generators?.['@nx/angular:component']?.type ?? + nxJson.generators?.['@nx/angular']?.component?.type; + + if (!componentType) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 20) { + componentType = 'component'; + } + } + + return componentType; +} + +export function getModuleTypeSeparator(tree: Tree): '-' | '.' { + const nxJson = readNxJson(tree); + // We don't have a "module" generator but the @nx/angular collection extends + // from the @schematics/angular collection so the "module" generator is + // available there. We check for a generator default for each collection. + let typeSeparator: '-' | '.' = + nxJson.generators?.['@nx/angular:module']?.typeSeparator ?? + nxJson.generators?.['@nx/angular']?.module?.typeSeparator ?? + nxJson.generators?.['@schematics/angular:module']?.typeSeparator ?? + nxJson.generators?.['@schematics/angular']?.module?.typeSeparator; + + if (!typeSeparator) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + typeSeparator = angularMajorVersion >= 20 ? '-' : '.'; + } + + return typeSeparator; +} diff --git a/packages/angular/src/generators/utils/ensure-angular-dependencies.spec.ts b/packages/angular/src/generators/utils/ensure-angular-dependencies.spec.ts index 1300684be6..39f0d323be 100644 --- a/packages/angular/src/generators/utils/ensure-angular-dependencies.spec.ts +++ b/packages/angular/src/generators/utils/ensure-angular-dependencies.spec.ts @@ -2,6 +2,7 @@ import { readJson, updateJson, type Tree } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { angularDevkitVersion, angularVersion } from '../../utils/versions'; import { ensureAngularDependencies } from './ensure-angular-dependencies'; +import { backwardCompatibleVersions } from '../../utils/backward-compatible-versions'; describe('ensureAngularDependencies', () => { let tree: Tree; @@ -21,9 +22,6 @@ describe('ensureAngularDependencies', () => { expect(dependencies['@angular/compiler']).toBe(angularVersion); expect(dependencies['@angular/core']).toBe(angularVersion); expect(dependencies['@angular/platform-browser']).toBe(angularVersion); - expect(dependencies['@angular/platform-browser-dynamic']).toBe( - angularVersion - ); expect(dependencies['@angular/router']).toBe(angularVersion); expect(dependencies['rxjs']).toBeDefined(); expect(dependencies['tslib']).toBeDefined(); @@ -31,15 +29,30 @@ describe('ensureAngularDependencies', () => { expect(devDependencies['@angular/cli']).toBe(angularDevkitVersion); expect(devDependencies['@angular/compiler-cli']).toBe(angularVersion); expect(devDependencies['@angular/language-service']).toBe(angularVersion); - expect(devDependencies['@angular-devkit/build-angular']).toBe( - angularDevkitVersion - ); expect(devDependencies['@angular-devkit/schematics']).toBe( angularDevkitVersion ); expect(devDependencies['@schematics/angular']).toBe(angularDevkitVersion); }); + it('should add both packages for builders when angular version is less than 20', () => { + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { ...json.dependencies, '@angular/core': '~18.0.0' }, + })); + + ensureAngularDependencies(tree); + + const { devDependencies } = readJson(tree, 'package.json'); + + expect(devDependencies['@angular/build']).toBe( + backwardCompatibleVersions.angularV18.angularDevkitVersion + ); + expect(devDependencies['@angular-devkit/build-angular']).toBe( + backwardCompatibleVersions.angularV18.angularDevkitVersion + ); + }); + it('should add peer dependencies respecting the @angular/devkit installed version', () => { // ARRANGE updateJson(tree, 'package.json', (json) => ({ diff --git a/packages/angular/src/generators/utils/ensure-angular-dependencies.ts b/packages/angular/src/generators/utils/ensure-angular-dependencies.ts index 5cb03b20d0..3d93aabe97 100644 --- a/packages/angular/src/generators/utils/ensure-angular-dependencies.ts +++ b/packages/angular/src/generators/utils/ensure-angular-dependencies.ts @@ -3,7 +3,12 @@ import { type GeneratorCallback, type Tree, } from '@nx/devkit'; -import { getInstalledPackageVersion, versions } from './version-utils'; +import { + getInstalledAngularDevkitVersion, + getInstalledAngularVersionInfo, + getInstalledPackageVersion, + versions, +} from './version-utils'; export function ensureAngularDependencies(tree: Tree): GeneratorCallback { const dependencies: Record = {}; @@ -34,17 +39,13 @@ export function ensureAngularDependencies(tree: Tree): GeneratorCallback { dependencies['@angular/core'] = angularVersion; dependencies['@angular/forms'] = angularVersion; dependencies['@angular/platform-browser'] = angularVersion; - dependencies['@angular/platform-browser-dynamic'] = angularVersion; dependencies['@angular/router'] = angularVersion; dependencies.rxjs = rxjsVersion; dependencies.tslib = tsLibVersion; dependencies['zone.js'] = zoneJsVersion; } - const installedAngularDevkitVersion = getInstalledPackageVersion( - tree, - '@angular-devkit/build-angular' - ); + const installedAngularDevkitVersion = getInstalledAngularDevkitVersion(tree); if (!installedAngularDevkitVersion) { /** * If `@angular-devkit/build-angular` is already installed, we assume the workspace @@ -59,10 +60,15 @@ export function ensureAngularDependencies(tree: Tree): GeneratorCallback { // Ensure the `@nx/angular` peer dependencies are always installed. const angularDevkitVersion = installedAngularDevkitVersion ?? pkgVersions.angularDevkitVersion; - devDependencies['@angular-devkit/build-angular'] = angularDevkitVersion; devDependencies['@angular-devkit/schematics'] = angularDevkitVersion; devDependencies['@schematics/angular'] = angularDevkitVersion; + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 20) { + devDependencies['@angular/build'] = angularDevkitVersion; + devDependencies['@angular-devkit/build-angular'] = angularDevkitVersion; + } + return addDependenciesToPackageJson( tree, dependencies, diff --git a/packages/angular/src/generators/utils/export-scam.spec.ts b/packages/angular/src/generators/utils/export-scam.spec.ts index 1f0d2c9f6a..8c8e2e2ef3 100644 --- a/packages/angular/src/generators/utils/export-scam.spec.ts +++ b/packages/angular/src/generators/utils/export-scam.spec.ts @@ -16,9 +16,10 @@ describe('exportScam', () => { expect(() => exportScam(tree, { directory: 'apps/app1/src/app/example', - filePath: 'apps/app1/src/example/example.component.ts', + filePath: 'apps/app1/src/example/example-component.ts', name: 'example', projectName: 'app1', + modulePath: 'apps/app1/src/example/example-module.ts', inlineScam: true, export: true, }) @@ -38,9 +39,10 @@ describe('exportScam', () => { // ACT exportScam(tree, { directory: 'libs/lib1/src/lib/example', - filePath: 'libs/lib1/src/lib/example/example.component.ts', + filePath: 'libs/lib1/src/lib/example/example-component.ts', name: 'example', projectName: 'lib1', + modulePath: 'libs/lib1/src/lib/example/example-module.ts', inlineScam: true, export: true, }); @@ -48,7 +50,7 @@ describe('exportScam', () => { // ASSERT const entryPointSource = tree.read(`libs/lib1/src/index.ts`, 'utf-8'); expect(entryPointSource).toMatchInlineSnapshot( - `"export * from './lib/example/example.component';"` + `"export * from './lib/example/example-component';"` ); }); @@ -65,9 +67,10 @@ describe('exportScam', () => { // ACT exportScam(tree, { directory: 'libs/lib1/src/lib/example', - filePath: 'libs/lib1/src/lib/example/example.component.ts', + filePath: 'libs/lib1/src/lib/example/example-component.ts', name: 'example', projectName: 'lib1', + modulePath: 'libs/lib1/src/lib/example/example-module.ts', inlineScam: false, export: true, }); @@ -75,8 +78,8 @@ describe('exportScam', () => { // ASSERT const entryPointSource = tree.read(`libs/lib1/src/index.ts`, 'utf-8'); expect(entryPointSource).toMatchInlineSnapshot(` - "export * from './lib/example/example.component'; - export * from './lib/example/example.module';" + "export * from './lib/example/example-component'; + export * from './lib/example/example-module';" `); }); @@ -97,9 +100,10 @@ describe('exportScam', () => { // ACT exportScam(tree, { directory: 'libs/lib1/feature/src/lib/example', - filePath: 'libs/lib1/feature/src/lib/example/example.component.ts', + filePath: 'libs/lib1/feature/src/lib/example/example-component.ts', name: 'example', projectName: 'lib1', + modulePath: 'libs/lib1/feature/src/lib/example/example-module.ts', inlineScam: true, export: true, }); @@ -110,7 +114,7 @@ describe('exportScam', () => { 'utf-8' ); expect(entryPointSource).toMatchInlineSnapshot( - `"export * from './lib/example/example.component';"` + `"export * from './lib/example/example-component';"` ); }); }); diff --git a/packages/angular/src/generators/utils/export-scam.ts b/packages/angular/src/generators/utils/export-scam.ts index 1b911bfa65..90458ab84a 100644 --- a/packages/angular/src/generators/utils/export-scam.ts +++ b/packages/angular/src/generators/utils/export-scam.ts @@ -14,6 +14,7 @@ export type GenerationOptions = { filePath: string; name: string; projectName: string; + modulePath: string; export?: boolean; inlineScam?: boolean; }; @@ -63,13 +64,9 @@ export function exportScam(tree: Tree, options: GenerationOptions): void { export * from '${relativePathFromEntryPoint}';`; if (!options.inlineScam) { - const moduleFilePath = joinPathFragments( - options.directory, - `${names(options.name).fileName}.module.ts` - ); const relativePathFromModule = getRelativeImportToFile( entryPointPath, - moduleFilePath + options.modulePath ); updatedEntryPointContent = stripIndents`${updatedEntryPointContent} export * from '${relativePathFromModule}';`; diff --git a/packages/angular/src/generators/utils/find-module.ts b/packages/angular/src/generators/utils/find-module.ts index aae9d9c69a..642f03621b 100644 --- a/packages/angular/src/generators/utils/find-module.ts +++ b/packages/angular/src/generators/utils/find-module.ts @@ -11,43 +11,55 @@ import { let tsModule: typeof import('typescript'); export function findModule(tree: Tree, path: string, module?: string) { - let modulePath = ''; + const candidatePaths: string[] = []; let pathToSearch = path; while (pathToSearch !== '.' && pathToSearch !== '/') { if (module) { const pathToModule = joinPathFragments(pathToSearch, module); if (tree.exists(pathToModule)) { - modulePath = pathToModule; + candidatePaths.push(pathToModule); break; } } else { const potentialOptions = tree .children(pathToSearch) - .filter((f) => f.endsWith('.module.ts')); - if (potentialOptions.length > 1) { - throw new Error( - `More than one NgModule was found. Please provide the NgModule you wish to use.` + .filter((f) => f.endsWith('.module.ts') || f.endsWith('-module.ts')); + if (potentialOptions.length > 0) { + candidatePaths.push( + ...potentialOptions.map((p) => joinPathFragments(pathToSearch, p)) ); - } else if (potentialOptions.length === 1) { - modulePath = joinPathFragments(pathToSearch, potentialOptions[0]); break; } } pathToSearch = dirname(pathToSearch); } - if (modulePath === '') { + if (candidatePaths.length === 0) { throw new Error('Could not find a declaring module file.'); } - const moduleContents = tree.read(modulePath, 'utf-8'); - if (!moduleContents.includes('@NgModule')) { + const modules = candidatePaths.filter((p) => { + const moduleContents = tree.read(p, 'utf-8'); + return moduleContents.includes('@NgModule'); + }); + + if (modules.length === 0) { throw new Error( - `Declaring module file (${modulePath}) does not contain an @NgModule Declaration.` + candidatePaths.length === 1 + ? `Declaring module file (${candidatePaths[0]}) does not contain an @NgModule Declaration.` + : `Declaring module files (${candidatePaths.join( + ', ' + )}) do not contain an @NgModule Declaration.` ); } - return modulePath; + if (modules.length > 1) { + throw new Error( + `More than one NgModule was found. Please provide the NgModule you wish to use.` + ); + } + + return modules[0]; } export function addToNgModule( diff --git a/packages/angular/src/generators/utils/storybook-ast/component-info.ts b/packages/angular/src/generators/utils/storybook-ast/component-info.ts index c115e3eb5a..9fa4efe94c 100644 --- a/packages/angular/src/generators/utils/storybook-ast/component-info.ts +++ b/packages/angular/src/generators/utils/storybook-ast/component-info.ts @@ -11,7 +11,7 @@ import type { Identifier, SourceFile, Statement } from 'typescript'; import { getTsSourceFile } from '../../../utils/nx-devkit/ast-utils'; import { getInstalledAngularVersionInfo } from '../version-utils'; import type { EntryPoint } from './entry-point'; -import { getModuleDeclaredComponents } from './module-info'; +import { getModuleDeclarations } from './module-info'; let tsModule: typeof import('typescript'); let tsquery: typeof import('@phenomnomnominal/tsquery').tsquery; @@ -33,12 +33,12 @@ export function getComponentsInfo( return moduleFilePaths .flatMap((moduleFilePath) => { const file = getTsSourceFile(tree, moduleFilePath); - const declaredComponents = getModuleDeclaredComponents( + const moduleDeclarations = getModuleDeclarations( file, moduleFilePath, projectName ); - if (declaredComponents.length === 0) { + if (moduleDeclarations.length === 0) { return undefined; } @@ -49,14 +49,14 @@ export function getComponentsInfo( (statement) => statement.kind === tsModule.SyntaxKind.ImportDeclaration ); - const componentsInfo = declaredComponents.map((componentName) => - getComponentInfo( + const componentsInfo = moduleDeclarations.map((maybeComponentName) => + tryGetComponentInfo( tree, entryPoint, file, imports, moduleFilePath, - componentName + maybeComponentName ) ); @@ -178,14 +178,14 @@ function getComponentImportPath( return importPath; } -function getComponentInfo( +function tryGetComponentInfo( tree: Tree, entryPoint: EntryPoint, sourceFile: SourceFile, imports: Statement[], moduleFilePath: string, - componentName: string -): ComponentInfo { + symbolName: string +): ComponentInfo | undefined { try { if (!tsquery) { ensureTypescript(); @@ -197,7 +197,7 @@ function getComponentInfo( // try to get the component from the same file (inline scam) const node = tsquery( sourceFile, - `ClassDeclaration:has(Decorator > CallExpression > Identifier[name=Component]):has(Identifier[name=${componentName}])`, + `ClassDeclaration:has(Decorator > CallExpression > Identifier[name=Component]):has(Identifier[name=${symbolName}])`, { visitAllChildren: true } )[0]; @@ -205,57 +205,77 @@ function getComponentInfo( return { componentFileName: basename(moduleFilePath, '.ts'), moduleFolderPath, - name: componentName, + name: symbolName, path: '.', entryPointName: entryPoint.name, }; } // try to get the component from the imports - const componentFilePathRelativeToModule = getComponentImportPath( - componentName, + const symbolFilePathRelativeToModule = getComponentImportPath( + symbolName, imports ); - const componentImportPath = getFullComponentFilePath( + let symbolImportPath = getFullComponentFilePath( moduleFolderPath, - componentFilePathRelativeToModule + symbolFilePathRelativeToModule ); - if (tree.exists(componentImportPath) && !tree.isFile(componentImportPath)) { - return getComponentInfoFromDir( + if (tree.exists(symbolImportPath) && !tree.isFile(symbolImportPath)) { + return tryGetComponentInfoFromDir( tree, entryPoint, - componentImportPath, - componentName, + symbolImportPath, + symbolName, moduleFolderPath ); } - const path = dirname(componentFilePathRelativeToModule); - const componentFileName = basename(componentFilePathRelativeToModule); + const candidatePaths = [ + symbolImportPath, + `${symbolImportPath}.ts`, + `${symbolImportPath}.js`, + ]; - return { - componentFileName, - moduleFolderPath, - name: componentName, - path, - entryPointName: entryPoint.name, - }; + for (const candidatePath of candidatePaths) { + if (!tree.exists(candidatePath)) { + continue; + } + + const content = tree.read(candidatePath, 'utf-8'); + const classAndComponentRegex = new RegExp( + `@Component[\\s\\S\n]*?\\bclass ${symbolName}\\b`, + 'g' + ); + + if (content.match(classAndComponentRegex)) { + const path = dirname(symbolFilePathRelativeToModule); + const componentFileName = basename(symbolFilePathRelativeToModule); + + return { + componentFileName, + moduleFolderPath, + name: symbolName, + path, + entryPointName: entryPoint.name, + }; + } + } + + return undefined; } catch (ex) { - logger.warn( - `Could not generate a story for ${componentName}. Error: ${ex}` - ); + logger.warn(`Could not generate a story for ${symbolName}. Error: ${ex}`); return undefined; } } -function getComponentInfoFromDir( +function tryGetComponentInfoFromDir( tree: Tree, entryPoint: EntryPoint, dir: string, - componentName: string, + symbolName: string, moduleFolderPath: string -): ComponentInfo { +): ComponentInfo | undefined { let path = null; let componentFileName = null; @@ -268,7 +288,7 @@ function getComponentInfoFromDir( if (candidateFile.endsWith('.ts')) { const content = tree.read(candidateFile, 'utf-8'); const classAndComponentRegex = new RegExp( - `@Component[\\s\\S\n]*?\\bclass ${componentName}\\b`, + `@Component[\\s\\S\n]*?\\bclass ${symbolName}\\b`, 'g' ); if (content.match(classAndComponentRegex)) { @@ -285,15 +305,16 @@ function getComponentInfoFromDir( } if (path === null) { - throw new Error( - `Path to component ${componentName} couldn't be found. Please open an issue on https://github.com/nrwl/nx/issues.` + console.warn( + `Couldn't resolve "${symbolName}" imported from ${dir} relative to ${moduleFolderPath}.` ); + return undefined; } return { componentFileName, moduleFolderPath, - name: componentName, + name: symbolName, path, entryPointName: entryPoint.name, }; diff --git a/packages/angular/src/generators/utils/storybook-ast/module-info.ts b/packages/angular/src/generators/utils/storybook-ast/module-info.ts index 650fd3f384..977fe072e7 100644 --- a/packages/angular/src/generators/utils/storybook-ast/module-info.ts +++ b/packages/angular/src/generators/utils/storybook-ast/module-info.ts @@ -19,7 +19,7 @@ import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript' let tsModule: typeof import('typescript'); -export function getModuleDeclaredComponents( +export function getModuleDeclarations( file: SourceFile, moduleFilePath: string, projectName: string @@ -47,7 +47,9 @@ export function getModuleDeclaredComponents( return []; } - return getDeclaredComponentsInDeclarations(declarationsArray); + return getDeclaredComponentNodes(declarationsArray).map((node) => + node.getText() + ); } export function getModuleFilePaths( @@ -93,14 +95,6 @@ function hasNgModule(tree: Tree, filePath: string): boolean { return ngModule.length > 0; } -function getDeclaredComponentsInDeclarations( - declarationsArray: Node -): string[] { - return getDeclaredComponentNodes(declarationsArray) - .map((node) => node.getText()) - .filter((name) => name.endsWith('Component')); -} - function getDeclaredComponentNodes(declarationsArray: Node): Node[] { if (!tsModule) { tsModule = ensureTypescript(); diff --git a/packages/angular/src/generators/utils/testing.ts b/packages/angular/src/generators/utils/testing.ts index 42d1512501..cd588dcc33 100644 --- a/packages/angular/src/generators/utils/testing.ts +++ b/packages/angular/src/generators/utils/testing.ts @@ -73,17 +73,17 @@ export async function createStorybookTestWorkspaceForLib( }); tree.write( - `${libName}/src/lib/test-button/test-button.component.ts`, + `${libName}/src/lib/test-button/test-button.ts`, `import { Component, Input } from '@angular/core'; export type ButtonStyle = 'default' | 'primary' | 'accent'; @Component({ selector: 'proj-test-button', - templateUrl: './test-button.component.html', - styleUrls: ['./test-button.component.css'] + templateUrl: './test-button.html', + styleUrls: ['./test-button.css'] }) -export class TestButtonComponent { +export class TestButton { @Input('buttonType') type = 'button'; @Input() style: ButtonStyle = 'default'; @Input() age?: number; @@ -92,14 +92,14 @@ export class TestButtonComponent { ); tree.write( - `${libName}/src/lib/test-button/test-button.component.html`, + `${libName}/src/lib/test-button/test-button.html`, `` ); - const modulePath = `${libName}/src/lib/${libName}.module.ts`; + const modulePath = `${libName}/src/lib/${libName}-module.ts`; tree.write( modulePath, - `import * as ButtonExports from './test-button/test-button.component'; + `import * as ButtonExports from './test-button/test-button'; ${tree.read(modulePath)}` ); @@ -119,18 +119,18 @@ export class TestButtonComponent { tree.write( `${libName}/src/lib/barrel/barrel-button/index.ts`, - `export * from './barrel-button.component';` + `export * from './barrel-button';` ); tree.write( - `${libName}/src/lib/barrel/barrel.module.ts`, + `${libName}/src/lib/barrel/barrel-module.ts`, `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { BarrelButtonComponent } from './barrel-button'; +import { BarrelButton } from './barrel-button'; @NgModule({ imports: [CommonModule], - declarations: [BarrelButtonComponent], + declarations: [BarrelButton], }) export class BarrelModule {}` ); @@ -158,15 +158,15 @@ export class BarrelModule {}` }); tree.write( - `${libName}/src/lib/variable-declare/variable-declare.module.ts`, + `${libName}/src/lib/variable-declare/variable-declare-module.ts`, `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { VariableDeclareButtonComponent } from './variable-declare-button/variable-declare-button.component'; -import { VariableDeclareViewComponent } from './variable-declare-view/variable-declare-view.component'; +import { VariableDeclareButton } from './variable-declare-button/variable-declare-button'; +import { VariableDeclareView } from './variable-declare-view/variable-declare-view'; const COMPONENTS = [ - VariableDeclareButtonComponent, - VariableDeclareViewComponent + VariableDeclareButton, + VariableDeclareView ] @NgModule({ @@ -208,21 +208,21 @@ export class VariableDeclareModule {}` }); tree.write( - `${libName}/src/lib/variable-spread-declare/variable-spread-declare.module.ts`, + `${libName}/src/lib/variable-spread-declare/variable-spread-declare-module.ts`, `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { VariableSpreadDeclareButtonComponent } from './variable-spread-declare-button/variable-spread-declare-button.component'; -import { VariableSpreadDeclareViewComponent } from './variable-spread-declare-view/variable-spread-declare-view.component'; -import { VariableSpreadDeclareAnotherviewComponent } from './variable-spread-declare-anotherview/variable-spread-declare-anotherview.component'; +import { VariableSpreadDeclareButton } from './variable-spread-declare-button/variable-spread-declare-button'; +import { VariableSpreadDeclareView } from './variable-spread-declare-view/variable-spread-declare-view'; +import { VariableSpreadDeclareAnotherview } from './variable-spread-declare-anotherview/variable-spread-declare-anotherview'; const COMPONENTS = [ - VariableSpreadDeclareButtonComponent, - VariableSpreadDeclareViewComponent + VariableSpreadDeclareButton, + VariableSpreadDeclareView ] @NgModule({ imports: [CommonModule], - declarations: [...COMPONENTS, VariableSpreadDeclareAnotherviewComponent], + declarations: [...COMPONENTS, VariableSpreadDeclareAnotherview], }) export class VariableSpreadDeclareModule {}` ); @@ -250,11 +250,11 @@ export class VariableSpreadDeclareModule {}` }); tree.write( - `${libName}/src/lib/static-member-declarations/static-member-declarations.module.ts`, + `${libName}/src/lib/static-member-declarations/static-member-declarations-module.ts`, `import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { Cmp1Component } from './cmp1/cmp1.component'; -import { Cmp2Component } from './cmp2/cmp2.component'; +import { Cmp1 } from './cmp1/cmp1'; +import { Cmp2 } from './cmp2/cmp2'; @NgModule({ imports: [CommonModule], @@ -262,7 +262,7 @@ import { Cmp2Component } from './cmp2/cmp2.component'; exports: StaticMemberDeclarationsModule.COMPONENTS }) export class StaticMemberDeclarationsModule { - static readonly COMPONENTS = [Cmp1Component, Cmp2Component]; + static readonly COMPONENTS = [Cmp1, Cmp2]; }` ); @@ -305,7 +305,7 @@ function generateModule( } const moduleNames = names(options.name); - const moduleFilePath = `${options.path}/${moduleNames.fileName}/${moduleNames.fileName}.module.ts`; + const moduleFilePath = `${options.path}/${moduleNames.fileName}/${moduleNames.fileName}-module.ts`; tree.write( moduleFilePath, diff --git a/packages/angular/src/generators/utils/version-utils.ts b/packages/angular/src/generators/utils/version-utils.ts index 3e12e0803d..4669328615 100644 --- a/packages/angular/src/generators/utils/version-utils.ts +++ b/packages/angular/src/generators/utils/version-utils.ts @@ -67,10 +67,10 @@ export function versions( ): PackageLatestVersions | PackageCompatVersions { const majorAngularVersion = getInstalledAngularMajorVersion(tree); switch (majorAngularVersion) { - case 17: - return backwardCompatibleVersions.angularV17; case 18: return backwardCompatibleVersions.angularV18; + case 19: + return backwardCompatibleVersions.angularV19; default: return latestVersions; } diff --git a/packages/angular/src/generators/web-worker/lib/add-snippet.ts b/packages/angular/src/generators/web-worker/lib/add-snippet.ts index dd0cfe617e..cfa2fd91a8 100644 --- a/packages/angular/src/generators/web-worker/lib/add-snippet.ts +++ b/packages/angular/src/generators/web-worker/lib/add-snippet.ts @@ -4,9 +4,11 @@ import { joinPathFragments, stripIndents } from '@nx/devkit'; export function addSnippet(tree: Tree, name: string, path: string) { const fileRegExp = new RegExp(`^${name}.*\\.ts`); - const children = tree.children(path); - const siblingModules = children - .filter((f) => fileRegExp.test(f) && !/(module|spec)\.ts$/.test(f)) + const siblingModules = tree + .children(path) + .filter( + (f) => fileRegExp.test(f) && !/(module|spec|config|routes)\.ts$/.test(f) + ) .sort(); if (siblingModules.length === 0) { diff --git a/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.md b/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.md new file mode 100644 index 0000000000..1af37e473c --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.md @@ -0,0 +1,68 @@ +#### Migrate Imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr` + +Migrate the imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`. This migration will also add the `@angular/ssr` package to your dependencies if needed. + +#### Examples + +Change the import of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`: + +{% tabs %} +{% tab label="Before" %} + +```ts {% fileName="app/app.config.server.ts" highlightLines=[2] %} +import { ApplicationConfig } from '@angular/core'; +import { provideServerRendering } from '@angular/platform-server'; + +const serverConfig: ApplicationConfig = { + providers: [provideServerRendering()], +}; +``` + +{% /tab %} + +{% tab label="After" %} + +```ts {% fileName="app/app.config.server.ts" highlightLines=[2] %} +import { ApplicationConfig } from '@angular/core'; +import { provideServerRendering } from '@angular/ssr'; + +const serverConfig: ApplicationConfig = { + providers: [provideServerRendering()], +}; +``` + +{% /tab %} +{% /tabs %} + +If you already have imports from `@angular/ssr`, the migration will add `provideServerRendering` to the existing import: + +{% tabs %} +{% tab label="Before" %} + +```ts {% fileName="app/app.config.server.ts" highlightLines=[2,3] %} +import { ApplicationConfig } from '@angular/core'; +import { provideServerRendering } from '@angular/platform-server'; +import { provideServerRouting } from '@angular/ssr'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [provideServerRendering(), provideServerRouting(serverRoutes)], +}; +``` + +{% /tab %} + +{% tab label="After" %} + +```ts {% fileName="app/app.config.server.ts" highlightLines=[2] %} +import { ApplicationConfig } from '@angular/core'; +import { provideServerRouting, provideServerRendering } from '@angular/ssr'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [provideServerRendering(), provideServerRouting(serverRoutes)], +}; +``` + +{% /tab %} +{% /tabs %} diff --git a/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.spec.ts b/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.spec.ts new file mode 100644 index 0000000000..4093e19793 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.spec.ts @@ -0,0 +1,105 @@ +import { + addProjectConfiguration, + readJson, + type ProjectGraph, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './migrate-provide-server-rendering-import'; + +let projectGraph: ProjectGraph; +jest.mock('@nx/devkit', () => ({ + ...jest.requireActual('@nx/devkit'), + createProjectGraphAsync: jest + .fn() + .mockImplementation(() => Promise.resolve(projectGraph)), +})); + +describe('migrate-provide-server-rendering-import migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'app1', { root: 'apps/app1' }); + projectGraph = { + dependencies: { + app1: [ + { + source: 'app1', + target: 'npm:@angular/platform-server', + type: 'static', + }, + ], + }, + nodes: { + app1: { + data: { root: 'apps/app1' }, + name: 'app1', + type: 'app', + }, + }, + }; + }); + + it('should replace provideServerRouting with provideServerRendering', async () => { + tree.write( + 'apps/app1/src/app/app.config.server.ts', + `import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering } from '@angular/platform-server'; +import { provideServerRouting } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(), + provideServerRouting(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 { provideServerRouting, provideServerRendering } from '@angular/ssr'; + import { appConfig } from './app.config'; + import { serverRoutes } from './app.routes.server'; + + const serverConfig: ApplicationConfig = { + providers: [provideServerRendering(), provideServerRouting(serverRoutes)], + }; + + export const config = mergeApplicationConfig(appConfig, serverConfig); + " + `); + }); + + it('should add "@angular/ssr" when the import is changed', async () => { + tree.write( + 'apps/app1/src/app/app.config.server.ts', + `import { provideServerRendering } from '@angular/platform-server';` + ); + + await migration(tree); + + const { dependencies } = readJson(tree, 'package.json'); + expect(dependencies['@angular/ssr']).toBeDefined(); + }); + + it('should not add "@angular/ssr" dependency when no imports have been updated', async () => { + tree.write( + 'apps/app1/src/app/app.config.server.ts', + `import { provideClientHydration } from '@angular/platform-browser';` + ); + + await migration(tree); + + const { dependencies } = readJson(tree, 'package.json'); + expect(dependencies['@angular/ssr']).toBeUndefined(); + }); +}); diff --git a/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.ts b/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.ts new file mode 100644 index 0000000000..cba6e817ce --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.ts @@ -0,0 +1,175 @@ +import { + addDependenciesToPackageJson, + formatFiles, + visitNotIgnoredFiles, + type Tree, +} from '@nx/devkit'; +import * as ts from 'typescript'; +import { FileChangeRecorder } from '../../utils/file-change-recorder'; +import { angularDevkitVersion } from '../../utils/versions'; +import { getProjectsFilteredByDependencies } from '../utils/projects'; + +export default async function (tree: Tree) { + const projects = await getProjectsFilteredByDependencies(tree, [ + 'npm:@angular/platform-server', + ]); + + if (!projects.length) { + return; + } + + let isSsrInstalled = false; + for (const { project } of projects) { + visitNotIgnoredFiles(tree, project.root, (file) => { + if (!file.endsWith('.ts') || file.endsWith('.d.ts')) { + return; + } + + const shouldInstallSsr = processFile(tree, file); + + if (shouldInstallSsr && !isSsrInstalled) { + isSsrInstalled = true; + addDependenciesToPackageJson( + tree, + { '@angular/ssr': angularDevkitVersion }, + {}, + undefined, + true + ); + } + }); + } + + await formatFiles(tree); +} + +function processFile(tree: Tree, filePath: string): boolean { + const content = tree.read(filePath, 'utf-8'); + + if ( + !content.includes('provideServerRendering') || + !content.includes('@angular/platform-server') + ) { + return false; + } + + const sourceFile = ts.createSourceFile( + filePath, + content, + ts.ScriptTarget.Latest, + true + ); + + let platformServerHasProvideServerRendering = false; + let platformServerImportNode: ts.ImportDeclaration | undefined; + let ssrImportNode: ts.ImportDeclaration | undefined; + const platformServerImports = new Set(); + + sourceFile.forEachChild((node) => { + if (!ts.isImportDeclaration(node)) { + return; + } + + const moduleSpecifier = node.moduleSpecifier.getText(sourceFile); + if (moduleSpecifier.includes('@angular/platform-server')) { + platformServerImportNode = node; + const importClause = node.importClause; + if ( + importClause && + importClause.namedBindings && + ts.isNamedImports(importClause.namedBindings) + ) { + const namedImports = importClause.namedBindings.elements.map((e) => + e.getText(sourceFile) + ); + namedImports.forEach((importName) => { + if (importName === 'provideServerRendering') { + platformServerHasProvideServerRendering = true; + } else { + platformServerImports.add(importName); + } + }); + } + } else if (moduleSpecifier.includes('@angular/ssr')) { + ssrImportNode = node; + } + }); + + if (!platformServerHasProvideServerRendering) { + return; + } + + const recorder = new FileChangeRecorder(tree, filePath); + const printer = ts.createPrinter({ + newLine: ts.NewLineKind.LineFeed, + }); + if ( + ssrImportNode?.importClause?.namedBindings && + ts.isNamedImports(ssrImportNode.importClause.namedBindings) + ) { + const namedBindingsNode = ssrImportNode.importClause! + .namedBindings as ts.NamedImports; + const updatedNamedBindingsNode = ts.factory.updateNamedImports( + namedBindingsNode, + [ + ...namedBindingsNode.elements, + ts.factory.createImportSpecifier( + false, + undefined, + ts.factory.createIdentifier('provideServerRendering') + ), + ] + ); + recorder.replace( + namedBindingsNode, + printer.printNode( + ts.EmitHint.Unspecified, + updatedNamedBindingsNode, + sourceFile + ) + ); + } else { + /** + * Add a new import statement with the needed named import in case it + * doesn't exist yet or it doesn't have named imports. + * + * It would be quite uncommon to have an import from @angular/ssr without + * named imports, but if that's the case, we'll just add an extra import + * statement with the needed named import. + */ + recorder.insertLeft( + 0, + `import { provideServerRendering } from '@angular/ssr';\n` + ); + } + + if (platformServerImports.size > 0) { + // we only collected platform server imports because there were named + // imports, so we can safely use the type + const namedBindingsNode = platformServerImportNode.importClause! + .namedBindings as ts.NamedImports; + const updatedNamedBindingsNode = ts.factory.updateNamedImports( + namedBindingsNode, + namedBindingsNode.elements.filter((e) => + platformServerImports.has(e.getText(sourceFile)) + ) + ); + recorder.replace( + namedBindingsNode, + printer.printNode( + ts.EmitHint.Unspecified, + updatedNamedBindingsNode, + sourceFile + ) + ); + } else { + recorder.remove( + platformServerImportNode.getFullStart(), + platformServerImportNode.getEnd() + ); + } + + recorder.applyChanges(); + + return true; +} diff --git a/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.md b/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.md new file mode 100644 index 0000000000..f863985a6e --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.md @@ -0,0 +1,81 @@ +#### Replace `provideServerRouting` with `provideServerRendering` + +Replace `provideServerRouting` calls with `provideServerRendering` using `withRoutes`. + +#### Examples + +Remove `provideServerRouting` from your providers array and update the `provideServerRendering` call to use `withRoutes`: + +{% tabs %} +{% tab label="Before" %} + +```ts {% fileName="app/app.config.server.ts" highlightLines=[2,6] %} +import { ApplicationConfig } from '@angular/core'; +import { provideServerRendering, provideServerRouting } from '@angular/ssr'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [provideServerRendering(), provideServerRouting(serverRoutes)], +}; +``` + +{% /tab %} + +{% tab label="After" %} + +```ts {% fileName="app/app.config.server.ts" highlightLines=[2,6] %} +import { ApplicationConfig } from '@angular/core'; +import { provideServerRendering, withRoutes } from '@angular/ssr'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [provideServerRendering(withRoutes(serverRoutes))], +}; +``` + +{% /tab %} +{% /tabs %} + +If you have `provideServerRouting` with additional arguments, the migration will preserve them: + +{% tabs %} +{% tab label="Before" %} + +```ts {% fileName="app/app.config.server.ts" highlightLines=[4,11,12] %} +import { ApplicationConfig } from '@angular/core'; +import { + provideServerRendering, + provideServerRouting, + withAppShell, +} from '@angular/ssr'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(), + provideServerRouting(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 %} diff --git a/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.spec.ts b/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.spec.ts new file mode 100644 index 0000000000..4bab5cfa31 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.spec.ts @@ -0,0 +1,118 @@ +import { + addProjectConfiguration, + type ProjectGraph, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './replace-provide-server-routing'; + +let projectGraph: ProjectGraph; +jest.mock('@nx/devkit', () => ({ + ...jest.requireActual('@nx/devkit'), + createProjectGraphAsync: jest + .fn() + .mockImplementation(() => Promise.resolve(projectGraph)), +})); + +describe('replace-provide-server-routing migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'app1', { root: 'apps/app1' }); + projectGraph = { + dependencies: { + app1: [ + { + source: 'app1', + target: 'npm:@angular/ssr', + type: 'static', + }, + ], + }, + nodes: { + app1: { + data: { root: 'apps/app1' }, + name: 'app1', + type: 'app', + }, + }, + }; + }); + + it('should remove "provideServerRouting", 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, provideServerRouting } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [provideServerRendering(), provideServerRouting(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 "provideServerRouting"', async () => { + tree.write( + 'apps/app1/src/app/app.config.server.ts', + `import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering, provideServerRouting, withAppShell } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(), + provideServerRouting(serverRoutes, withAppShell(AppShellComponent)), + ], +}; + +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); + " + `); + }); +}); diff --git a/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.ts b/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.ts new file mode 100644 index 0000000000..a824a5ab34 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/replace-provide-server-routing.ts @@ -0,0 +1,181 @@ +import { formatFiles, visitNotIgnoredFiles, type Tree } from '@nx/devkit'; +import { tsquery } from '@phenomnomnominal/tsquery'; +import * as ts from 'typescript'; +import { FileChangeRecorder } from '../../utils/file-change-recorder'; +import { getProjectsFilteredByDependencies } from '../utils/projects'; + +export default async function (tree: Tree) { + const projects = await getProjectsFilteredByDependencies(tree, [ + 'npm:@angular/ssr', + ]); + + if (!projects.length) { + return; + } + + for (const { project } of projects) { + visitNotIgnoredFiles(tree, project.root, (file) => { + if (!file.endsWith('.ts') || file.endsWith('.d.ts')) { + return; + } + + processFile(tree, file); + }); + } + + await formatFiles(tree); +} + +function processFile(tree: Tree, filePath: string): void { + const content = tree.read(filePath, 'utf-8'); + + if ( + !content.includes('provideServerRouting') || + !content.includes('@angular/ssr') + ) { + return; + } + + const sourceFile = tsquery.ast(content); + + const providersArray = tsquery.query( + sourceFile, + 'PropertyAssignment:has(Identifier[name=providers]) > ArrayLiteralExpression:has(CallExpression > Identifier[name=provideServerRouting])', + { visitAllChildren: true } + )[0]; + if (!providersArray) { + return; + } + + const recorder = new FileChangeRecorder(tree, filePath); + const printer = ts.createPrinter({ + newLine: ts.NewLineKind.LineFeed, + }); + + let provideServerRenderingCall: ts.CallExpression | undefined; + let provideServerRoutingCall: ts.CallExpression; + + const providerCallNodes = providersArray.elements.filter((el) => + ts.isCallExpression(el) + ); + for (const node of providerCallNodes) { + if (node.expression.getText() === 'provideServerRendering') { + provideServerRenderingCall = node; + } else if (node.expression.getText() === 'provideServerRouting') { + provideServerRoutingCall = node; + } + } + + const withRoutesCall = ts.factory.createCallExpression( + ts.factory.createIdentifier('withRoutes'), + undefined, + [provideServerRoutingCall.arguments.at(0)] + ); + + let updatedProvidersArray: ts.ArrayLiteralExpression; + if (provideServerRenderingCall) { + // remove the "provideServerRouting" call and update the existing "provideServerRendering" call + updatedProvidersArray = ts.factory.updateArrayLiteralExpression( + providersArray, + providersArray.elements + .filter( + (el) => + !( + ts.isCallExpression(el) && + ts.isIdentifier(el.expression) && + el.expression.text === 'provideServerRouting' + ) + ) + .map((el) => { + if ( + ts.isCallExpression(el) && + ts.isIdentifier(el.expression) && + el.expression.text === 'provideServerRendering' + ) { + return ts.factory.updateCallExpression( + el, + el.expression, + el.typeArguments, + [withRoutesCall, ...provideServerRoutingCall.arguments.slice(1)] + ); + } + + return el; + }) + ); + } else { + // replace the "provideServerRouting" call 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' + ) { + return ts.factory.createCallExpression( + ts.factory.createIdentifier('provideServerRendering'), + undefined, + [withRoutesCall, ...provideServerRoutingCall.arguments.slice(1)] + ); + } + + return el; + }) + ); + } + + recorder.replace( + providersArray, + printer.printNode( + ts.EmitHint.Unspecified, + updatedProvidersArray, + sourceFile + ) + ); + + const importDecl = sourceFile.statements.find( + (stmt) => + ts.isImportDeclaration(stmt) && + ts.isStringLiteral(stmt.moduleSpecifier) && + stmt.moduleSpecifier.text === '@angular/ssr' + ) as ts.ImportDeclaration | undefined; + + if (importDecl?.importClause?.namedBindings) { + const namedBindings = importDecl?.importClause.namedBindings; + + if (ts.isNamedImports(namedBindings)) { + // remove the "provideServerRouting" import and ensure we have the "withRoutes" import + const updatedElementNames = new Set([ + ...namedBindings.elements + .map((el) => el.getText()) + .filter((x) => x !== 'provideServerRouting'), + 'withRoutes', + ]); + const updatedNamedBindings = ts.factory.updateNamedImports( + namedBindings, + Array.from(updatedElementNames).map((name) => + ts.factory.createImportSpecifier( + false, + undefined, + ts.factory.createIdentifier(name) + ) + ) + ); + + const printer = ts.createPrinter({ + newLine: ts.NewLineKind.LineFeed, + }); + recorder.replace( + namedBindings, + printer.printNode( + ts.EmitHint.Unspecified, + updatedNamedBindings, + sourceFile + ) + ); + } + } + + recorder.applyChanges(); +} diff --git a/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.md b/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.md new file mode 100644 index 0000000000..6dfde0d121 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.md @@ -0,0 +1,176 @@ +#### Set Generator Defaults for Previous Style Guide + +Updates the generator defaults in the `nx.json` file to maintain the previous Angular Style Guide behavior. This ensures that newly generated code in existing workspaces follows the same conventions as the existing codebase. + +#### Examples + +The migration will add default configurations for the relevant Angular generators in the workspace's `nx.json` file: + +{% tabs %} +{% tab label="Before" %} + +```json {% fileName="nx.json" %} +{ + "generators": {} +} +``` + +{% /tab %} + +{% tab label="After" %} + +```json {% fileName="nx.json" %} +{ + "generators": { + "@nx/angular:component": { + "type": "component" + }, + "@nx/angular:directive": { + "type": "directive" + }, + "@nx/angular:service": { + "type": "service" + }, + "@nx/angular:scam": { + "type": "component" + }, + "@nx/angular:scam-directive": { + "type": "directive" + }, + "@nx/angular:guard": { + "typeSeparator": "." + }, + "@nx/angular:interceptor": { + "typeSeparator": "." + }, + "@nx/angular:module": { + "typeSeparator": "." + }, + "@nx/angular:pipe": { + "typeSeparator": "." + }, + "@nx/angular:resolver": { + "typeSeparator": "." + }, + "@schematics/angular:component": { + "type": "component" + }, + "@schematics/angular:directive": { + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:interceptor": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." + } + } +} +``` + +{% /tab %} +{% /tabs %} + +If some of the generator defaults are already set, the migration will not override them: + +{% tabs %} +{% tab label="Before" %} + +```json {% fileName="nx.json" highlightLines=["3-14"] %} +{ + "generators": { + "@nx/angular:component": { + "type": "cmp" + }, + "@schematics/angular:component": { + "type": "cmp" + }, + "@nx/angular:interceptor": { + "typeSeparator": "-" + }, + "@schematics/angular:interceptor": { + "typeSeparator": "-" + } + } +} +``` + +{% /tab %} + +{% tab label="After" %} + +```json {% fileName="nx.json" highlightLines=["3-14"] %} +{ + "generators": { + "@nx/angular:component": { + "type": "cmp" + }, + "@schematics/angular:component": { + "type": "cmp" + }, + "@nx/angular:interceptor": { + "typeSeparator": "-" + }, + "@schematics/angular:interceptor": { + "typeSeparator": "-" + }, + "@nx/angular:directive": { + "type": "directive" + }, + "@nx/angular:service": { + "type": "service" + }, + "@nx/angular:scam": { + "type": "component" + }, + "@nx/angular:scam-directive": { + "type": "directive" + }, + "@nx/angular:guard": { + "typeSeparator": "." + }, + "@nx/angular:module": { + "typeSeparator": "." + }, + "@nx/angular:pipe": { + "typeSeparator": "." + }, + "@nx/angular:resolver": { + "typeSeparator": "." + }, + "@schematics/angular:directive": { + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." + } + } +} +``` + +{% /tab %} +{% /tabs %} diff --git a/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.spec.ts b/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.spec.ts new file mode 100644 index 0000000000..778e0e1af9 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.spec.ts @@ -0,0 +1,301 @@ +import { readNxJson, updateNxJson, type Tree } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './set-generator-defaults-for-previous-style-guide'; + +describe('set-generator-defaults-for-previous-style-guide', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should add the generator defaults when there is no generators property in the nx.json file', async () => { + const nxJson = readNxJson(tree); + delete nxJson.generators; + updateNxJson(tree, nxJson); + + await migration(tree); + + const updatedNxJson = readNxJson(tree); + expect(updatedNxJson.generators).toMatchInlineSnapshot(` + { + "@nx/angular:component": { + "type": "component", + }, + "@nx/angular:directive": { + "type": "directive", + }, + "@nx/angular:guard": { + "typeSeparator": ".", + }, + "@nx/angular:interceptor": { + "typeSeparator": ".", + }, + "@nx/angular:module": { + "typeSeparator": ".", + }, + "@nx/angular:pipe": { + "typeSeparator": ".", + }, + "@nx/angular:resolver": { + "typeSeparator": ".", + }, + "@nx/angular:scam": { + "type": "component", + }, + "@nx/angular:scam-directive": { + "type": "directive", + }, + "@nx/angular:service": { + "type": "service", + }, + "@schematics/angular:component": { + "type": "component", + }, + "@schematics/angular:directive": { + "type": "directive", + }, + "@schematics/angular:guard": { + "typeSeparator": ".", + }, + "@schematics/angular:interceptor": { + "typeSeparator": ".", + }, + "@schematics/angular:module": { + "typeSeparator": ".", + }, + "@schematics/angular:pipe": { + "typeSeparator": ".", + }, + "@schematics/angular:resolver": { + "typeSeparator": ".", + }, + "@schematics/angular:service": { + "type": "service", + }, + } + `); + }); + + it('should add the generator defaults when there is an empty generators property in the nx.json file', async () => { + const nxJson = readNxJson(tree); + nxJson.generators = {}; + updateNxJson(tree, nxJson); + + await migration(tree); + + const updatedNxJson = readNxJson(tree); + expect(updatedNxJson.generators).toMatchInlineSnapshot(` + { + "@nx/angular:component": { + "type": "component", + }, + "@nx/angular:directive": { + "type": "directive", + }, + "@nx/angular:guard": { + "typeSeparator": ".", + }, + "@nx/angular:interceptor": { + "typeSeparator": ".", + }, + "@nx/angular:module": { + "typeSeparator": ".", + }, + "@nx/angular:pipe": { + "typeSeparator": ".", + }, + "@nx/angular:resolver": { + "typeSeparator": ".", + }, + "@nx/angular:scam": { + "type": "component", + }, + "@nx/angular:scam-directive": { + "type": "directive", + }, + "@nx/angular:service": { + "type": "service", + }, + "@schematics/angular:component": { + "type": "component", + }, + "@schematics/angular:directive": { + "type": "directive", + }, + "@schematics/angular:guard": { + "typeSeparator": ".", + }, + "@schematics/angular:interceptor": { + "typeSeparator": ".", + }, + "@schematics/angular:module": { + "typeSeparator": ".", + }, + "@schematics/angular:pipe": { + "typeSeparator": ".", + }, + "@schematics/angular:resolver": { + "typeSeparator": ".", + }, + "@schematics/angular:service": { + "type": "service", + }, + } + `); + }); + + it('should not override existing generator defaults for the full generator specifier (:) ', async () => { + const nxJson = readNxJson(tree); + nxJson.generators = { + '@nx/angular:component': { type: 'cmp' }, + '@schematics/angular:component': { type: 'cmp' }, + '@nx/angular:interceptor': { typeSeparator: '-' }, + '@schematics/angular:interceptor': { typeSeparator: '-' }, + }; + updateNxJson(tree, nxJson); + + await migration(tree); + + const updatedNxJson = readNxJson(tree); + expect(updatedNxJson.generators).toMatchInlineSnapshot(` + { + "@nx/angular:component": { + "type": "cmp", + }, + "@nx/angular:directive": { + "type": "directive", + }, + "@nx/angular:guard": { + "typeSeparator": ".", + }, + "@nx/angular:interceptor": { + "typeSeparator": "-", + }, + "@nx/angular:module": { + "typeSeparator": ".", + }, + "@nx/angular:pipe": { + "typeSeparator": ".", + }, + "@nx/angular:resolver": { + "typeSeparator": ".", + }, + "@nx/angular:scam": { + "type": "component", + }, + "@nx/angular:scam-directive": { + "type": "directive", + }, + "@nx/angular:service": { + "type": "service", + }, + "@schematics/angular:component": { + "type": "cmp", + }, + "@schematics/angular:directive": { + "type": "directive", + }, + "@schematics/angular:guard": { + "typeSeparator": ".", + }, + "@schematics/angular:interceptor": { + "typeSeparator": "-", + }, + "@schematics/angular:module": { + "typeSeparator": ".", + }, + "@schematics/angular:pipe": { + "typeSeparator": ".", + }, + "@schematics/angular:resolver": { + "typeSeparator": ".", + }, + "@schematics/angular:service": { + "type": "service", + }, + } + `); + }); + + it('should not override existing generator defaults for nested generator specifiers (.)', async () => { + const nxJson = readNxJson(tree); + nxJson.generators = { + '@nx/angular': { + component: { type: 'cmp' }, + interceptor: { typeSeparator: '-' }, + }, + '@schematics/angular': { + component: { type: 'cmp' }, + interceptor: { typeSeparator: '-' }, + }, + }; + updateNxJson(tree, nxJson); + + await migration(tree); + + const updatedNxJson = readNxJson(tree); + expect(updatedNxJson.generators).toMatchInlineSnapshot(` + { + "@nx/angular": { + "component": { + "type": "cmp", + }, + "directive": { + "type": "directive", + }, + "guard": { + "typeSeparator": ".", + }, + "interceptor": { + "typeSeparator": "-", + }, + "module": { + "typeSeparator": ".", + }, + "pipe": { + "typeSeparator": ".", + }, + "resolver": { + "typeSeparator": ".", + }, + "scam": { + "type": "component", + }, + "scam-directive": { + "type": "directive", + }, + "service": { + "type": "service", + }, + }, + "@schematics/angular": { + "component": { + "type": "cmp", + }, + "directive": { + "type": "directive", + }, + "guard": { + "typeSeparator": ".", + }, + "interceptor": { + "typeSeparator": "-", + }, + "module": { + "typeSeparator": ".", + }, + "pipe": { + "typeSeparator": ".", + }, + "resolver": { + "typeSeparator": ".", + }, + "service": { + "type": "service", + }, + }, + } + `); + }); +}); diff --git a/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.ts b/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.ts new file mode 100644 index 0000000000..67f3c78dd1 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.ts @@ -0,0 +1,82 @@ +import { formatFiles, readNxJson, updateNxJson, type Tree } from '@nx/devkit'; + +const TYPE_GENERATORS = ['component', 'directive', 'service'] as const; +const TYPE_SEPARATOR_GENERATORS = [ + 'guard', + 'interceptor', + 'module', + 'pipe', + 'resolver', +] as const; + +export default async function (tree: Tree) { + const nxJson = readNxJson(tree); + nxJson.generators ??= {}; + + for (const generator of TYPE_GENERATORS) { + setDefault(nxJson.generators, '@nx/angular', generator, 'type', generator); + setDefault( + nxJson.generators, + '@schematics/angular', + generator, + 'type', + generator + ); + } + + setDefault(nxJson.generators, '@nx/angular', 'scam', 'type', 'component'); + setDefault( + nxJson.generators, + '@nx/angular', + 'scam-directive', + 'type', + 'directive' + ); + + for (const generator of TYPE_SEPARATOR_GENERATORS) { + setDefault( + nxJson.generators, + '@nx/angular', + generator, + 'typeSeparator', + '.' + ); + setDefault( + nxJson.generators, + '@schematics/angular', + generator, + 'typeSeparator', + '.' + ); + } + + updateNxJson(tree, nxJson); + + await formatFiles(tree); +} + +function setDefault( + generators: Record, + collection: string, + generator: string, + option: 'type' | 'typeSeparator', + value: string +) { + const generatorKey = `${collection}:${generator}`; + if ( + generators[generatorKey]?.[option] || + generators[collection]?.[generator]?.[option] + ) { + return; + } + + if (generators[generatorKey]) { + generators[generatorKey][option] = value; + } else if (generators[collection]?.[generator]) { + generators[collection][generator][option] = value; + } else if (generators[collection]) { + generators[collection][generator] = { [option]: value }; + } else { + generators[generatorKey] = { [option]: value }; + } +} diff --git a/packages/angular/src/migrations/update-21-2-0/update-angular-cli.md b/packages/angular/src/migrations/update-21-2-0/update-angular-cli.md new file mode 100644 index 0000000000..63938f7510 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/update-angular-cli.md @@ -0,0 +1,29 @@ +#### Sample Code Changes + +Update the `@angular/cli` package version in the `package.json` file at the workspace root to **~20.0.0**. + +{% tabs %} +{% tab label="Before" %} + +```json {% fileName="package.json" %} +{ + "devDependencies": { + "@angular/cli": "~19.2.0" + } +} +``` + +{% /tab %} +{% tab label="After" %} + +```json {% highlightLines=[3] fileName="package.json" %} +{ + "devDependencies": { + "@angular/cli": "~20.0.0" + } +} +``` + +{% /tab %} + +{% /tabs %} diff --git a/packages/angular/src/migrations/update-21-2-0/update-angular-cli.spec.ts b/packages/angular/src/migrations/update-21-2-0/update-angular-cli.spec.ts new file mode 100644 index 0000000000..d62b620f6e --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/update-angular-cli.spec.ts @@ -0,0 +1,42 @@ +import { readJson, Tree, writeJson } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import updateAngularCli, { angularCliVersion } from './update-angular-cli'; + +describe('update-angular-cli migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + }); + + it('should update @angular/cli version when defined as a dev dependency', async () => { + writeJson(tree, 'package.json', { + devDependencies: { '@angular/cli': '~13.3.0' }, + }); + + await updateAngularCli(tree); + + const { devDependencies } = readJson(tree, 'package.json'); + expect(devDependencies['@angular/cli']).toBe(angularCliVersion); + }); + + it('should update @angular/cli version when defined as a dependency', async () => { + writeJson(tree, 'package.json', { + dependencies: { '@angular/cli': '~13.3.0' }, + }); + + await updateAngularCli(tree); + + const { dependencies } = readJson(tree, 'package.json'); + expect(dependencies['@angular/cli']).toBe(angularCliVersion); + }); + + it('should not add @angular/cli to package.json when it is not set', async () => { + const initialPackageJson = readJson(tree, 'package.json'); + + await updateAngularCli(tree); + + const packageJson = readJson(tree, 'package.json'); + expect(packageJson).toStrictEqual(initialPackageJson); + }); +}); diff --git a/packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts b/packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts new file mode 100644 index 0000000000..35c70d72e2 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/update-angular-cli.ts @@ -0,0 +1,23 @@ +import { formatFiles, Tree, updateJson } from '@nx/devkit'; + +export const angularCliVersion = '20.0.0-rc.3'; + +export default async function (tree: Tree) { + let shouldFormat = false; + + updateJson(tree, 'package.json', (json) => { + if (json.devDependencies?.['@angular/cli']) { + json.devDependencies['@angular/cli'] = angularCliVersion; + shouldFormat = true; + } else if (json.dependencies?.['@angular/cli']) { + json.dependencies['@angular/cli'] = angularCliVersion; + shouldFormat = true; + } + + return json; + }); + + if (shouldFormat) { + await formatFiles(tree); + } +} diff --git a/packages/angular/src/migrations/update-21-2-0/update-module-resolution.md b/packages/angular/src/migrations/update-21-2-0/update-module-resolution.md new file mode 100644 index 0000000000..1ea89dac3a --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/update-module-resolution.md @@ -0,0 +1,65 @@ +#### Update `moduleResolution` to `bundler` in TypeScript configurations + +Updates the TypeScript `moduleResolution` option to `'bundler'` for improved compatibility with modern package resolution algorithms used by bundlers like Webpack, Vite, and esbuild. + +#### Examples + +The migration will update TypeScript configuration files in your workspace to use the `'bundler'` module resolution strategy: + +{% tabs %} +{% tab label="Before" %} + +```json {% fileName="apps/app1/tsconfig.app.json" highlightLines=["4"] %} +{ + "compilerOptions": { + "module": "es2020", + "moduleResolution": "node" + } +} +``` + +{% /tab %} + +{% tab label="After" %} + +```json {% fileName="apps/app1/tsconfig.app.json" highlightLines=["4"] %} +{ + "compilerOptions": { + "module": "es2020", + "moduleResolution": "bundler" + } +} +``` + +{% /tab %} +{% /tabs %} + +If the `moduleResolution` is already set to `'bundler'` or the `module` is set to `'preserve'`, the migration will not modify the configuration: + +{% tabs %} +{% tab label="Before" %} + +```json {% fileName="apps/app1/tsconfig.app.json" highlightLines=[3,4] %} +{ + "compilerOptions": { + "module": "preserve", + "moduleResolution": "node" + } +} +``` + +{% /tab %} + +{% tab label="After" %} + +```json {% fileName="apps/app1/tsconfig.app.json" highlightLines=[3,4] %} +{ + "compilerOptions": { + "module": "preserve", + "moduleResolution": "node" + } +} +``` + +{% /tab %} +{% /tabs %} diff --git a/packages/angular/src/migrations/update-21-2-0/update-module-resolution.spec.ts b/packages/angular/src/migrations/update-21-2-0/update-module-resolution.spec.ts new file mode 100644 index 0000000000..46c3987914 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/update-module-resolution.spec.ts @@ -0,0 +1,140 @@ +import { + addProjectConfiguration, + readJson, + writeJson, + type ProjectConfiguration, + type ProjectGraph, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './update-module-resolution'; + +let projectGraph: ProjectGraph; +jest.mock('@nx/devkit', () => ({ + ...jest.requireActual('@nx/devkit'), + createProjectGraphAsync: jest + .fn() + .mockImplementation(() => Promise.resolve(projectGraph)), +})); + +describe('update-module-resolution migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should update moduleResolution in project-specific tsconfig files', async () => { + addProject('app1', { + root: 'apps/app1', + sourceRoot: 'apps/app1/src', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + tsConfig: 'apps/app1/tsconfig.app.json', + }, + }, + test: { + executor: '@angular-devkit/build-angular:karma', + options: { + tsConfig: 'apps/app1/tsconfig.spec.json', + }, + }, + }, + }); + writeJson(tree, 'apps/app1/tsconfig.app.json', { + extends: '../tsconfig.json', + compilerOptions: { + module: 'es2020', + moduleResolution: 'node', + }, + }); + writeJson(tree, 'apps/app1/tsconfig.spec.json', { + extends: '../tsconfig.json', + compilerOptions: { + module: 'es2020', + moduleResolution: 'node', + }, + }); + + await migration(tree); + + const appConfig = readJson(tree, 'apps/app1/tsconfig.app.json'); + const specConfig = readJson(tree, 'apps/app1/tsconfig.spec.json'); + expect(appConfig.compilerOptions.moduleResolution).toBe('bundler'); + expect(specConfig.compilerOptions.moduleResolution).toBe('bundler'); + }); + + it('should not update moduleResolution when module is "preserve"', async () => { + addProject('app1', { + root: 'apps/app1', + sourceRoot: 'apps/app1/src', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + tsConfig: 'apps/app1/tsconfig.app.json', + }, + }, + }, + }); + writeJson(tree, 'apps/app1/tsconfig.app.json', { + compilerOptions: { + module: 'preserve', + moduleResolution: 'node', + }, + }); + + await migration(tree); + + const config = readJson(tree, 'apps/app1/tsconfig.app.json'); + expect(config.compilerOptions.moduleResolution).toBe('node'); + }); + + it('should not update moduleResolution when it is already "bundler"', async () => { + addProject('app1', { + root: 'apps/app1', + sourceRoot: 'apps/app1/src', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + tsConfig: 'apps/app1/tsconfig.app.json', + }, + }, + }, + }); + writeJson(tree, 'apps/app1/tsconfig.app.json', { + compilerOptions: { + module: 'es2020', + moduleResolution: 'bundler', + }, + }); + + await migration(tree); + + const config = readJson(tree, 'apps/app1/tsconfig.app.json'); + expect(config.compilerOptions.moduleResolution).toBe('bundler'); + }); + + function addProject( + projectName: string, + config: ProjectConfiguration, + dependencies: string[] = ['npm:@angular/core'] + ): void { + projectGraph = { + dependencies: { + [projectName]: dependencies.map((d) => ({ + source: projectName, + target: d, + type: 'static', + })), + }, + nodes: { + [projectName]: { data: config, name: projectName, type: 'app' }, + }, + }; + addProjectConfiguration(tree, projectName, config); + } +}); diff --git a/packages/angular/src/migrations/update-21-2-0/update-module-resolution.ts b/packages/angular/src/migrations/update-21-2-0/update-module-resolution.ts new file mode 100644 index 0000000000..f9534b40c9 --- /dev/null +++ b/packages/angular/src/migrations/update-21-2-0/update-module-resolution.ts @@ -0,0 +1,63 @@ +import { formatFiles, readJson, type Tree, updateJson } from '@nx/devkit'; +import { allProjectTargets, allTargetOptions } from '../../utils/targets'; +import { getProjectsFilteredByDependencies } from '../utils/projects'; + +type TsConfig = { + compilerOptions?: { + module?: string; + moduleResolution?: string; + }; +}; + +export default async function (tree: Tree) { + const uniqueTsConfigs = new Set(); + + const projects = await getProjectsFilteredByDependencies(tree, [ + 'npm:@angular/core', + ]); + + for (const { project } of projects) { + for (const [, target] of allProjectTargets(project)) { + for (const [, options] of allTargetOptions<{ tsConfig?: string }>( + target + )) { + if (typeof options?.tsConfig === 'string') { + uniqueTsConfigs.add(options.tsConfig); + } + } + } + } + + for (const tsConfig of uniqueTsConfigs) { + if (tree.exists(tsConfig)) { + updateModuleResolution(tree, tsConfig); + } + } + + await formatFiles(tree); +} + +function updateModuleResolution(tree: Tree, tsConfigPath: string): void { + const tsConfig = readJson(tree, tsConfigPath); + + if (!tsConfig.compilerOptions) { + return; + } + + const { compilerOptions } = tsConfig; + + // Only update if module is not 'preserve' and moduleResolution is not already 'bundler' + if ( + compilerOptions.module === 'preserve' || + compilerOptions.moduleResolution === 'bundler' + ) { + return; + } + + // Update moduleResolution to 'bundler' + updateJson(tree, tsConfigPath, (json) => { + json.compilerOptions ??= {}; + json.compilerOptions.moduleResolution = 'bundler'; + return json; + }); +} diff --git a/packages/angular/src/plugins/plugin.ts b/packages/angular/src/plugins/plugin.ts index 6025bf0f93..bd89a1e7ff 100644 --- a/packages/angular/src/plugins/plugin.ts +++ b/packages/angular/src/plugins/plugin.ts @@ -54,8 +54,14 @@ const knownExecutors = { '@angular-devkit/build-angular:ng-packagr', '@angular/build:ng-packagr', ]), - devServer: new Set(['@angular-devkit/build-angular:dev-server']), - extractI18n: new Set(['@angular-devkit/build-angular:extract-i18n']), + devServer: new Set([ + '@angular-devkit/build-angular:dev-server', + '@angular/build:dev-server', + ]), + extractI18n: new Set([ + '@angular-devkit/build-angular:extract-i18n', + '@angular/build:extract-i18n', + ]), prerender: new Set([ '@angular-devkit/build-angular:prerender', '@nguniversal/builders:prerender', @@ -65,7 +71,10 @@ const knownExecutors = { '@angular-devkit/build-angular:ssr-dev-server', '@nguniversal/builders:ssr-dev-server', ]), - test: new Set(['@angular-devkit/build-angular:karma']), + test: new Set([ + '@angular-devkit/build-angular:karma', + '@angular/build:karma', + ]), }; const pmc = getPackageManagerCommand(); @@ -199,6 +208,7 @@ async function buildAngularProjects( appShellTargets.push({ target: nxTargetName, project: projectName }); } else if (knownExecutors.build.has(angularTarget.builder)) { await updateBuildTarget( + projectName, nxTargetName, targets[nxTargetName], angularTarget, @@ -349,6 +359,7 @@ function updateAppShellTarget( } async function updateBuildTarget( + projectName: string, targetName: string, target: TargetConfiguration, angularTarget: AngularTargetConfiguration, @@ -359,21 +370,7 @@ async function updateBuildTarget( ): Promise { target.dependsOn = [`^${targetName}`]; - if (angularTarget.options?.outputPath) { - const fullOutputPath = join( - context.workspaceRoot, - angularWorkspaceRoot, - angularTarget.options.outputPath - ); - target.outputs = [ - getOutput( - fullOutputPath, - context.workspaceRoot, - angularWorkspaceRoot, - projectRoot - ), - ]; - } else if ( + if ( angularTarget.builder === '@angular-devkit/build-angular:ng-packagr' || angularTarget.builder === '@angular/build:ng-packagr' ) { @@ -386,6 +383,20 @@ async function updateBuildTarget( if (outputs.length) { target.outputs = outputs; } + } else { + const fullOutputPath = join( + context.workspaceRoot, + angularWorkspaceRoot, + angularTarget.options?.outputPath ?? posix.join('dist', projectName) + ); + target.outputs = [ + getOutput( + fullOutputPath, + context.workspaceRoot, + angularWorkspaceRoot, + projectRoot + ), + ]; } if (target.outputs?.length) { @@ -510,7 +521,7 @@ async function getNgPackagrOutputs( let ngPackageJsonPath = join( context.workspaceRoot, angularWorkspaceRoot, - target.options.project + target.options?.project ?? join(projectRoot, 'ng-package.json') ); const readConfig = async (configPath: string) => { diff --git a/packages/angular/src/utils/backward-compatible-versions.ts b/packages/angular/src/utils/backward-compatible-versions.ts index eb288146a2..517f59498c 100644 --- a/packages/angular/src/utils/backward-compatible-versions.ts +++ b/packages/angular/src/utils/backward-compatible-versions.ts @@ -1,6 +1,6 @@ import * as latestVersions from './versions'; -type SupportedVersions = 'angularV17' | 'angularV18'; +type SupportedVersions = 'angularV18' | 'angularV19'; type LatestPackageVersionNames = Exclude< keyof typeof latestVersions, @@ -13,46 +13,14 @@ export type PackageVersionNames = | CompatPackageVersionNames; export type VersionMap = { - angularV17: Record< - Exclude, - string - >; angularV18: Record; + angularV19: Record; }; export type PackageLatestVersions = Record; export type PackageCompatVersions = VersionMap[SupportedVersions]; export const backwardCompatibleVersions: VersionMap = { - angularV17: { - angularVersion: '~17.3.0', - angularDevkitVersion: '~17.3.0', - ngPackagrVersion: '~17.3.0', - angularRspackVersion: '~20.6.1', - ngrxVersion: '~17.0.0', - rxjsVersion: '~7.8.0', - zoneJsVersion: '~0.14.3', - angularJsVersion: '1.7.9', - tsLibVersion: '^2.3.0', - corsVersion: '~2.8.5', - typesCorsVersion: '~2.8.5', - expressVersion: '^4.21.2', - typesExpressVersion: '^4.17.21', - browserSyncVersion: '^3.0.0', - moduleFederationNodeVersion: '~2.3.0', - moduleFederationEnhancedVersion: '~0.2.3', - angularEslintVersion: '~17.3.0', - tailwindVersion: '^3.0.2', - postcssVersion: '^8.4.5', - postcssUrlVersion: '~10.1.3', - autoprefixerVersion: '^10.4.0', - tsNodeVersion: '10.9.1', - jestPresetAngularVersion: '~14.0.3', - typesNodeVersion: '18.16.9', - jasmineMarblesVersion: '^0.9.2', - jsoncEslintParserVersion: '^2.1.0', - webpackMergeVersion: '^5.8.0', - }, angularV18: { angularVersion: '~18.2.0', angularDevkitVersion: '~18.2.0', @@ -83,4 +51,34 @@ export const backwardCompatibleVersions: VersionMap = { jsoncEslintParserVersion: '^2.1.0', webpackMergeVersion: '^5.8.0', }, + angularV19: { + angularVersion: '~19.2.0', + angularDevkitVersion: '~19.2.0', + ngPackagrVersion: '~19.2.0', + angularRspackVersion: '~20.6.1', + ngrxVersion: '~19.1.0', + rxjsVersion: '~7.8.0', + zoneJsVersion: '~0.15.0', + angularJsVersion: '1.7.9', + tsLibVersion: '^2.3.0', + corsVersion: '~2.8.5', + typesCorsVersion: '~2.8.5', + expressVersion: '^4.21.2', + typesExpressVersion: '^4.17.21', + browserSyncVersion: '^3.0.0', + moduleFederationNodeVersion: '^2.6.26', + moduleFederationEnhancedVersion: '^0.9.0', + angularEslintVersion: '^19.2.0', + typescriptEslintVersion: '^7.16.0', + tailwindVersion: '^3.0.2', + postcssVersion: '^8.4.5', + postcssUrlVersion: '~10.1.3', + autoprefixerVersion: '^10.4.0', + tsNodeVersion: '10.9.1', + jestPresetAngularVersion: '~14.4.0', + typesNodeVersion: '18.16.9', + jasmineMarblesVersion: '^0.9.2', + jsoncEslintParserVersion: '^2.1.0', + webpackMergeVersion: '^5.8.0', + }, }; diff --git a/packages/angular/src/utils/nx-devkit/ast-utils.ts b/packages/angular/src/utils/nx-devkit/ast-utils.ts index caf2cc2ccd..a334ac18e3 100644 --- a/packages/angular/src/utils/nx-devkit/ast-utils.ts +++ b/packages/angular/src/utils/nx-devkit/ast-utils.ts @@ -1,4 +1,9 @@ -import { names, readProjectConfiguration, Tree } from '@nx/devkit'; +import { + joinPathFragments, + names, + readProjectConfiguration, + Tree, +} from '@nx/devkit'; import { findNodes, getImport, @@ -702,11 +707,20 @@ function getListOfRoutes( export function isNgStandaloneApp(tree: Tree, projectName: string) { const project = readProjectConfiguration(tree, projectName); - const mainFile = + let mainFile = project.targets?.build?.options?.main ?? project.targets?.build?.options?.browser; + let hasMainFile = false; + if (mainFile) { + hasMainFile = true; + } else { + const sourceRoot = + project.sourceRoot ?? joinPathFragments(project.root, 'src'); + mainFile = joinPathFragments(sourceRoot, 'main.ts'); + hasMainFile = tree.exists(mainFile); + } - if (project.projectType !== 'application' || !mainFile) { + if (project.projectType !== 'application' || !hasMainFile) { return false; } @@ -920,10 +934,16 @@ export function readBootstrapInfo( } const config = readProjectConfiguration(host, app); - let mainPath; + let mainPath: string; try { mainPath = - config.targets.build.options.main ?? config.targets.build.options.browser; + config.targets.build.options?.main ?? + config.targets.build.options?.browser; + if (!mainPath) { + const sourceRoot = + config.sourceRoot ?? joinPathFragments(config.root, 'src'); + mainPath = joinPathFragments(sourceRoot, 'main.ts'); + } } catch (e) { throw new Error('Main file cannot be located'); } diff --git a/packages/angular/src/utils/nx-devkit/testing.ts b/packages/angular/src/utils/nx-devkit/testing.ts index 52264d4977..f2455b7f9a 100644 --- a/packages/angular/src/utils/nx-devkit/testing.ts +++ b/packages/angular/src/utils/nx-devkit/testing.ts @@ -32,7 +32,7 @@ export function createApp( // save for getAppDir() lookup by external *.spec.ts tests appConfig = { appName, - appModule: `${appName}/src/app/app.module.ts`, + appModule: `${appName}/src/app/app-module.ts`, }; tree.write( @@ -40,22 +40,22 @@ export function createApp( `import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; ${routing ? "import { RouterModule } from '@angular/router'" : ''}; -import { AppComponent } from './app.component'; +import { App } from './app'; @NgModule({ imports: [BrowserModule, ${routing ? 'RouterModule.forRoot([])' : ''}], - declarations: [AppComponent], - bootstrap: [AppComponent] + declarations: [App], + bootstrap: [App] }) export class AppModule {} ` ); tree.write( `${appName}/src/main.ts`, - `import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + `import { platformBrowser } from '@angular/platform-browser'; -import { AppModule } from './app/app.module'; +import { AppModule } from './app/app-module'; -platformBrowserDynamic() +platformBrowser() .bootstrapModule(AppModule) .catch(err => console.log(err)); ` @@ -94,7 +94,7 @@ export function createLib(tree: Tree, libName: string) { libConfig = { name, - module: `${propertyName}/src/lib/${fileName}.module.ts`, + module: `${propertyName}/src/lib/${fileName}-module.ts`, barrel: `${propertyName}/src/index.ts`, }; @@ -113,7 +113,7 @@ export class ${className}Module { } ); tree.write( libConfig.barrel, - `export * from './lib/${fileName}.module'; + `export * from './lib/${fileName}-module'; ` ); } diff --git a/packages/angular/src/utils/targets.ts b/packages/angular/src/utils/targets.ts index b46122730d..5beb60936b 100644 --- a/packages/angular/src/utils/targets.ts +++ b/packages/angular/src/utils/targets.ts @@ -1,4 +1,12 @@ -import { TargetConfiguration } from '@nx/devkit'; +import type { ProjectConfiguration, TargetConfiguration } from '@nx/devkit'; + +export function* allProjectTargets( + project: ProjectConfiguration +): Iterable<[name: string, target: TargetConfiguration]> { + for (const [name, target] of Object.entries(project.targets ?? {})) { + yield [name, target]; + } +} export function* allTargetOptions( target: TargetConfiguration diff --git a/packages/angular/src/utils/versions.spec.ts b/packages/angular/src/utils/versions.spec.ts index cddac5c051..c3cc579605 100644 --- a/packages/angular/src/utils/versions.spec.ts +++ b/packages/angular/src/utils/versions.spec.ts @@ -1,7 +1,7 @@ import { angularDevkitVersion } from './versions'; describe('Angular Versions', () => { - it('angular CLI package should use ~ package matching', () => { - expect(angularDevkitVersion[0]).toEqual('~'); + it('angular CLI package should not use ^ package matching', () => { + expect(angularDevkitVersion[0]).not.toEqual('^'); }); }); diff --git a/packages/angular/src/utils/versions.ts b/packages/angular/src/utils/versions.ts index 5c89240d8e..fccf387ac7 100644 --- a/packages/angular/src/utils/versions.ts +++ b/packages/angular/src/utils/versions.ts @@ -1,8 +1,8 @@ export const nxVersion = require('../../package.json').version; -export const angularVersion = '~19.2.0'; -export const angularDevkitVersion = '~19.2.0'; -export const ngPackagrVersion = '~19.2.0'; +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 ngrxVersion = '^19.0.0'; export const rxjsVersion = '~7.8.0'; diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index d7f330dab1..a5c4af6860 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -71,7 +71,6 @@ interface AngularArguments extends BaseArguments { e2eTestRunner: 'none' | 'cypress' | 'playwright'; bundler: 'webpack' | 'rspack' | 'esbuild'; ssr: boolean; - serverRouting: boolean; prefix: string; } @@ -871,7 +870,6 @@ async function determineAngularOptions( let e2eTestRunner: undefined | 'none' | 'cypress' | 'playwright' = undefined; let bundler: undefined | 'webpack' | 'rspack' | 'esbuild' = undefined; let ssr: undefined | boolean = undefined; - let serverRouting: undefined | boolean = undefined; const standaloneApi = parsedArgs.standaloneApi; const routing = parsedArgs.routing; @@ -993,25 +991,6 @@ async function determineAngularOptions( ssr = reply.ssr === 'Yes'; } - if (parsedArgs.serverRouting !== undefined) { - serverRouting = parsedArgs.serverRouting; - } else if (ssr && bundler === 'esbuild') { - const reply = await enquirer.prompt<{ serverRouting: 'Yes' | 'No' }>([ - { - name: 'serverRouting', - message: - 'Would you like to use the Server Routing and App Engine APIs (Developer Preview) for this server application?', - type: 'autocomplete', - choices: [{ name: 'Yes' }, { name: 'No' }], - initial: 1, - skip: !parsedArgs.interactive || isCI(), - }, - ]); - serverRouting = reply.serverRouting === 'Yes'; - } else { - serverRouting = false; - } - unitTestRunner = await determineUnitTestRunner(parsedArgs); e2eTestRunner = await determineE2eTestRunner(parsedArgs); @@ -1025,7 +1004,6 @@ async function determineAngularOptions( e2eTestRunner, bundler, ssr, - serverRouting, prefix, }; } diff --git a/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts b/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts index 44da0ac08a..6fce610c77 100644 --- a/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts +++ b/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts @@ -135,6 +135,29 @@ describe('determineArtifactNameAndDirectoryOptions', () => { }); }); + it('should support receiving a suffix separator', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'apps/app1', + projectType: 'application', + }); + + const result = await determineArtifactNameAndDirectoryOptions(tree, { + suffix: 'component', + suffixSeparator: '-', + path: 'apps/app1/myComponent', + }); + + expect(result).toStrictEqual({ + artifactName: 'myComponent', + directory: 'apps/app1', + fileName: 'myComponent-component', + filePath: 'apps/app1/myComponent-component.ts', + fileExtension: 'ts', + fileExtensionType: 'ts', + project: 'app1', + }); + }); + it('should support receiving the full file path including the file extension', async () => { addProjectConfiguration(tree, 'app1', { root: 'apps/app1', diff --git a/packages/devkit/src/generators/artifact-name-and-directory-utils.ts b/packages/devkit/src/generators/artifact-name-and-directory-utils.ts index e0f2b308bc..2cc9369990 100644 --- a/packages/devkit/src/generators/artifact-name-and-directory-utils.ts +++ b/packages/devkit/src/generators/artifact-name-and-directory-utils.ts @@ -25,8 +25,8 @@ export type ArtifactGenerationOptions = { name?: string; fileExtension?: string; suffix?: string; + suffixSeparator?: string; allowedFileExtensions?: string[]; - /** * @deprecated Provide the full file path including the file extension in the `path` option. This option will be removed in Nx v21. */ @@ -116,7 +116,7 @@ function getNameAndDirectoryOptions( fileName = fileName.replace(fileExtensionRegex, ''); extractedName = fileName; } else if (options.suffix) { - fileName = `${fileName}.${options.suffix}`; + fileName = `${fileName}${options.suffixSeparator ?? '.'}${options.suffix}`; } const filePath = joinPathFragments(directory, `${fileName}.${fileExtension}`); diff --git a/packages/devkit/src/utils/versions.ts b/packages/devkit/src/utils/versions.ts index acf09028d9..7f793aa876 100644 --- a/packages/devkit/src/utils/versions.ts +++ b/packages/devkit/src/utils/versions.ts @@ -1 +1 @@ -export const typescriptVersion = '~5.7.2'; +export const typescriptVersion = '~5.8.2'; diff --git a/packages/eslint/migrations.json b/packages/eslint/migrations.json index 7f0c0fafbd..f9552ddce8 100644 --- a/packages/eslint/migrations.json +++ b/packages/eslint/migrations.json @@ -109,6 +109,70 @@ "version": "^10.0.0" } } + }, + "21.2.0-typescript-eslint": { + "version": "21.2.0-beta.0", + "requires": { + "typescript-eslint": ">8.0.0 <8.29.0" + }, + "packages": { + "typescript-eslint": { + "version": "^8.29.0" + }, + "@typescript-eslint/eslint-plugin": { + "version": "^8.29.0" + }, + "@typescript-eslint/parser": { + "version": "^8.29.0" + }, + "@typescript-eslint/utils": { + "version": "^8.29.0" + }, + "@typescript-eslint/rule-tester": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/scope-manager": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/typescript-estree": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + } + } + }, + "21.2.0-@typescript-eslint": { + "version": "21.2.0-beta.0", + "requires": { + "@typescript-eslint/eslint-plugin": ">8.0.0 <8.29.0" + }, + "packages": { + "typescript-eslint": { + "version": "^8.29.0" + }, + "@typescript-eslint/eslint-plugin": { + "version": "^8.29.0" + }, + "@typescript-eslint/parser": { + "version": "^8.29.0" + }, + "@typescript-eslint/utils": { + "version": "^8.29.0" + }, + "@typescript-eslint/rule-tester": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/scope-manager": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + }, + "@typescript-eslint/typescript-estree": { + "version": "^8.29.0", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/eslint/package.json b/packages/eslint/package.json index c260b9cfdc..e7cba07a42 100644 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -39,7 +39,7 @@ "@nx/js": "file:../js", "semver": "^7.5.3", "tslib": "^2.3.0", - "typescript": "~5.7.2" + "typescript": "~5.8.2" }, "peerDependenciesMeta": { "@zkochan/js-yaml": { diff --git a/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts b/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts index 12b767acc1..095da9d65b 100644 --- a/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts +++ b/packages/eslint/src/generators/convert-to-flat-config/generator.spec.ts @@ -69,7 +69,7 @@ describe('convert-to-flat-config generator', () => { "@nx/eslint-plugin": "0.0.1", "eslint": "^9.8.0", "eslint-config-prettier": "^10.0.0", - "typescript-eslint": "^8.19.0" + "typescript-eslint": "^8.29.0" } } " @@ -682,7 +682,7 @@ describe('convert-to-flat-config generator', () => { "@nx/eslint-plugin": "0.0.1", "eslint": "^9.8.0", "eslint-config-prettier": "^10.0.0", - "typescript-eslint": "^8.19.0" + "typescript-eslint": "^8.29.0" } } " diff --git a/packages/eslint/src/utils/versions.ts b/packages/eslint/src/utils/versions.ts index f40fad520c..9f8fdbb1ff 100644 --- a/packages/eslint/src/utils/versions.ts +++ b/packages/eslint/src/utils/versions.ts @@ -7,6 +7,6 @@ export const typescriptESLintVersion = '^7.16.0'; export const jsoncEslintParserVersion = '^2.1.0'; // Updated linting stack for ESLint v9, typescript-eslint v8 -export const eslint9__typescriptESLintVersion = '^8.19.0'; +export const eslint9__typescriptESLintVersion = '^8.29.0'; export const eslint9__eslintVersion = '^9.8.0'; export const eslintCompat = '^1.1.1'; diff --git a/packages/js/migrations.json b/packages/js/migrations.json index c82a4dd64c..af81a8d342 100644 --- a/packages/js/migrations.json +++ b/packages/js/migrations.json @@ -83,6 +83,19 @@ "alwaysAddToPackageJson": false } } + }, + "21.2.0": { + "version": "21.2.0-beta.0", + "x-prompt": "Do you want to update to TypeScript v5.8?", + "requires": { + "typescript": ">=5.7.0 <5.8.0" + }, + "packages": { + "typescript": { + "version": "~5.8.2", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/js/src/utils/versions.ts b/packages/js/src/utils/versions.ts index 6b9aad6645..502f5fe656 100644 --- a/packages/js/src/utils/versions.ts +++ b/packages/js/src/utils/versions.ts @@ -11,7 +11,7 @@ export const typesNodeVersion = '18.16.9'; export const verdaccioVersion = '^6.0.5'; // Typescript -export const typescriptVersion = '~5.7.2'; +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. diff --git a/packages/module-federation/src/utils/share.spec.ts b/packages/module-federation/src/utils/share.spec.ts index 1320713827..d81d919608 100644 --- a/packages/module-federation/src/utils/share.spec.ts +++ b/packages/module-federation/src/utils/share.spec.ts @@ -208,6 +208,11 @@ describe('MF Share Utils', () => { singleton: true, strictVersion: true, }, + '@angular/core/primitives/di': { + requiredVersion: '~13.2.0', + singleton: true, + strictVersion: true, + }, '@angular/core/primitives/event-dispatch': { requiredVersion: '~13.2.0', singleton: true, @@ -317,6 +322,11 @@ describe('MF Share Utils', () => { singleton: true, strictVersion: true, }, + '@angular/core/primitives/di': { + requiredVersion: '~13.2.0', + singleton: true, + strictVersion: true, + }, '@angular/core/primitives/event-dispatch': { requiredVersion: '~13.2.0', singleton: true, @@ -465,6 +475,11 @@ describe('MF Share Utils', () => { singleton: true, strictVersion: true, }, + '@angular/core/primitives/di': { + requiredVersion: '~13.2.0', + singleton: true, + strictVersion: true, + }, '@angular/core/primitives/event-dispatch': { requiredVersion: '~13.2.0', singleton: true, @@ -566,6 +581,11 @@ describe('MF Share Utils', () => { singleton: true, strictVersion: true, }, + '@angular/core/primitives/di': { + requiredVersion: '~13.2.0', + singleton: true, + strictVersion: true, + }, '@angular/core/primitives/event-dispatch': { requiredVersion: '~13.2.0', singleton: true, diff --git a/packages/nx/.eslintrc.json b/packages/nx/.eslintrc.json index 642712f288..e0354c7d54 100644 --- a/packages/nx/.eslintrc.json +++ b/packages/nx/.eslintrc.json @@ -105,6 +105,7 @@ "typescript", "@nrwl/angular", "@angular-devkit/build-angular", + "@angular/build", "@angular-devkit/core", "@angular-devkit/architect", "@swc/core", //Optional, used in JS analysis if available diff --git a/packages/nx/src/adapter/compat.ts b/packages/nx/src/adapter/compat.ts index b6e16e46b7..39ab87411a 100644 --- a/packages/nx/src/adapter/compat.ts +++ b/packages/nx/src/adapter/compat.ts @@ -112,6 +112,10 @@ if (!patched) { () => {}; } catch (e) {} + try { + require('@angular/build/private').assertCompatibleAngularVersion = () => {}; + } catch (e) {} + patched = true; } diff --git a/packages/nx/src/command-line/init/implementation/angular/index.ts b/packages/nx/src/command-line/init/implementation/angular/index.ts index bda42feae3..96a5bded59 100644 --- a/packages/nx/src/command-line/init/implementation/angular/index.ts +++ b/packages/nx/src/command-line/init/implementation/angular/index.ts @@ -128,7 +128,9 @@ function addPluginDependencies(): void { packageJson.devDependencies['@angular/cli'] ?? packageJson.dependencies?.['@angular/cli'] ?? packageJson.devDependencies['@angular-devkit/build-angular'] ?? - packageJson.dependencies?.['@angular-devkit/build-angular']; + packageJson.dependencies?.['@angular-devkit/build-angular'] ?? + packageJson.devDependencies['@angular/build'] ?? + packageJson.dependencies?.['@angular/build']; for (const dep of peerDepsToInstall) { if (!packageJson.devDependencies[dep] && !packageJson.dependencies?.[dep]) { diff --git a/packages/nx/src/command-line/init/implementation/angular/standalone-workspace.ts b/packages/nx/src/command-line/init/implementation/angular/standalone-workspace.ts index 533273ca9f..ae01a4763c 100644 --- a/packages/nx/src/command-line/init/implementation/angular/standalone-workspace.ts +++ b/packages/nx/src/command-line/init/implementation/angular/standalone-workspace.ts @@ -1,5 +1,5 @@ import { unlinkSync } from 'fs'; -import { dirname, join, relative, resolve } from 'path'; +import { dirname, join, posix, relative, resolve } from 'node:path'; import { toNewFormat } from '../../../../adapter/angular-json'; import type { NxJsonConfiguration } from '../../../../config/nx-json'; import type { ProjectConfiguration } from '../../../../config/workspace-json-project-json'; @@ -48,7 +48,7 @@ export async function setupStandaloneWorkspace( // update its targets outputs and delete angular.json const projects = toNewFormat(angularJson).projects; for (const [projectName, project] of Object.entries(projects ?? {})) { - updateProjectOutputs(repoRoot, project); + updateProjectOutputs(repoRoot, projectName, project, cacheableOperations); writeJsonFile(join(project.root, 'project.json'), { $schema: normalizePath( relative( @@ -143,11 +143,30 @@ function createNxJson( function updateProjectOutputs( repoRoot: string, - project: ProjectConfiguration + projectName: string, + project: ProjectConfiguration, + cacheableOperations: string[] ): void { - Object.values(project.targets ?? {}).forEach((target) => { + Object.entries(project.targets ?? {}).forEach(([targetName, target]) => { if ( + target.executor === '@angular/build:application' || + target.executor === '@angular-devkit/build-angular:application' + ) { + if (target.options.outputPath) { + if (typeof target.options.outputPath === 'string') { + target.outputs = ['{options.outputPath}']; + } else if (target.options.outputPath.base) { + target.outputs = ['{options.outputPath.base}']; + } else if (cacheableOperations.includes(targetName)) { + target.cache = false; + } + } else { + target.options.outputPath = posix.join('dist', projectName); + target.outputs = ['{options.outputPath}']; + } + } else if ( [ + '@angular-devkit/build-angular:browser-esbuild', '@angular-devkit/build-angular:browser', '@angular-builders/custom-webpack:browser', 'ngx-build-plus:browser', @@ -156,7 +175,11 @@ function updateProjectOutputs( 'ngx-build-plus:server', ].includes(target.executor) ) { - target.outputs = ['{options.outputPath}']; + if (target.options.outputPath) { + target.outputs = ['{options.outputPath}']; + } else if (cacheableOperations.includes(targetName)) { + target.cache = false; + } } else if (target.executor === '@angular-eslint/builder:lint') { target.outputs = ['{options.outputFile}']; } else if ( @@ -164,7 +187,9 @@ function updateProjectOutputs( target.executor === '@angular/build:ng-packagr' ) { try { - const ngPackageJsonPath = join(repoRoot, target.options.project); + const ngPackagrProject = + target.options.project ?? posix.join(project.root, 'ng-package.json'); + const ngPackageJsonPath = join(repoRoot, ngPackagrProject); const ngPackageJson = readJsonFile(ngPackageJsonPath); const outputPath = relative( repoRoot, @@ -218,7 +243,9 @@ function projectUsesKarmaBuilder( project: AngularJsonProjectConfiguration ): boolean { return Object.values(project.architect ?? {}).some( - (target) => target.builder === '@angular-devkit/build-angular:karma' + (target) => + target.builder === '@angular/build:karma' || + target.builder === '@angular-devkit/build-angular:karma' ); } diff --git a/packages/nx/src/plugins/js/versions.ts b/packages/nx/src/plugins/js/versions.ts index acf09028d9..7f793aa876 100644 --- a/packages/nx/src/plugins/js/versions.ts +++ b/packages/nx/src/plugins/js/versions.ts @@ -1 +1 @@ -export const typescriptVersion = '~5.7.2'; +export const typescriptVersion = '~5.8.2'; diff --git a/packages/remix/src/utils/versions.ts b/packages/remix/src/utils/versions.ts index c44a8ce53d..b84ce2d9c6 100644 --- a/packages/remix/src/utils/versions.ts +++ b/packages/remix/src/utils/versions.ts @@ -9,7 +9,7 @@ export const reactDomVersion = '^18.2.0'; export const typesReactVersion = '^18.2.0'; export const typesReactDomVersion = '^18.2.0'; export const eslintVersion = '^8.56.0'; -export const typescriptVersion = '~5.7.2'; +export const typescriptVersion = '~5.8.2'; export const tailwindVersion = '^3.3.0'; export const postcssVersion = '^8.4.38'; export const autoprefixerVersion = '^10.4.19'; diff --git a/packages/rspack/src/utils/read-rspack-options.ts b/packages/rspack/src/utils/read-rspack-options.ts index ce0ae013ba..cb8afa5967 100644 --- a/packages/rspack/src/utils/read-rspack-options.ts +++ b/packages/rspack/src/utils/read-rspack-options.ts @@ -58,7 +58,7 @@ export async function readRspackOptions( ); // If the resolved configuration is an array, resolve each configuration return Array.isArray(resolved) - ? await Promise.all(resolved.map(resolveConfig)) + ? (await Promise.all(resolved.map(resolveConfig))).flat() : resolved; } else if (Array.isArray(config)) { // If the config passed is an array, resolve each configuration diff --git a/packages/vite/src/generators/vitest/__snapshots__/vitest.spec.ts.snap b/packages/vite/src/generators/vitest/__snapshots__/vitest.spec.ts.snap index fcf46ad7a3..396141d2a4 100644 --- a/packages/vite/src/generators/vitest/__snapshots__/vitest.spec.ts.snap +++ b/packages/vite/src/generators/vitest/__snapshots__/vitest.spec.ts.snap @@ -1,17 +1,18 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`vitest generator angular should generate src/test-setup.ts 1`] = ` -"import '@analogjs/vitest-angular/setup-zone'; +"import '@angular/compiler'; +import '@analogjs/vitest-angular/setup-zone'; import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting, -} from '@angular/platform-browser-dynamic/testing'; + BrowserTestingModule, + platformBrowserTesting, +} from '@angular/platform-browser/testing'; import { getTestBed } from '@angular/core/testing'; getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + BrowserTestingModule, + platformBrowserTesting() ); " `; diff --git a/packages/vite/src/generators/vitest/vitest-generator.ts b/packages/vite/src/generators/vitest/vitest-generator.ts index 3187667d94..a8138a8b3f 100644 --- a/packages/vite/src/generators/vitest/vitest-generator.ts +++ b/packages/vite/src/generators/vitest/vitest-generator.ts @@ -31,7 +31,7 @@ import initGenerator from '../init/init'; import { VitestGeneratorSchema } from './schema'; import { detectUiFramework } from '../../utils/detect-ui-framework'; import { getVitestDependenciesVersionsToInstall } from '../../utils/version-utils'; -import { coerce, major } from 'semver'; +import { clean, coerce, major } from 'semver'; /** * @param hasPlugin some frameworks (e.g. Nuxt) provide their own plugin. Their generators handle the plugin detection. @@ -90,9 +90,28 @@ export async function vitestGeneratorInternal( const setupFile = joinPathFragments(root, relativeTestSetupPath); if (!tree.exists(setupFile)) { - tree.write( - setupFile, - `import '@analogjs/vitest-angular/setup-zone'; + if (isAngularV20(tree)) { + tree.write( + setupFile, + `import '@angular/compiler'; +import '@analogjs/vitest-angular/setup-zone'; + +import { + BrowserTestingModule, + platformBrowserTesting, +} from '@angular/platform-browser/testing'; +import { getTestBed } from '@angular/core/testing'; + +getTestBed().initTestEnvironment( + BrowserTestingModule, + platformBrowserTesting() +); +` + ); + } else { + tree.write( + setupFile, + `import '@analogjs/vitest-angular/setup-zone'; import { BrowserDynamicTestingModule, @@ -105,7 +124,8 @@ getTestBed().initTestEnvironment( platformBrowserDynamicTesting() ); ` - ); + ); + } } createOrEditViteConfig( @@ -381,4 +401,20 @@ function tryFindSetupFile(tree: Tree, projectRoot: string) { } } +function isAngularV20(tree: Tree) { + const { dependencies, devDependencies } = readJson(tree, 'package.json'); + const angularVersion = + dependencies?.['@angular/core'] ?? devDependencies?.['@angular/core']; + + if (!angularVersion) { + // assume the latest version will be installed, which will be 20 or later + return true; + } + + const cleanedAngularVersion = + clean(angularVersion) ?? coerce(angularVersion).version; + + return major(cleanedAngularVersion) >= 20; +} + export default vitestGenerator; diff --git a/packages/vite/src/generators/vitest/vitest.spec.ts b/packages/vite/src/generators/vitest/vitest.spec.ts index 9d7001e234..7215150618 100644 --- a/packages/vite/src/generators/vitest/vitest.spec.ts +++ b/packages/vite/src/generators/vitest/vitest.spec.ts @@ -222,6 +222,34 @@ describe('vitest generator', () => { ).toMatchSnapshot(); }); + it('should generate src/test-setup.ts using @angular/platform-browser-dynamic/testing when Angular version is lower than 20', async () => { + const { tree, runGenerator } = setUpAngularWorkspace(); + tree; + updateJson(tree, 'package.json', (json) => { + json.dependencies['@angular/core'] = '~19.2.0'; + return json; + }); + + await runGenerator(); + + expect(tree.read('apps/my-test-angular-app/src/test-setup.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import '@analogjs/vitest-angular/setup-zone'; + + import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, + } from '@angular/platform-browser-dynamic/testing'; + import { getTestBed } from '@angular/core/testing'; + + getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() + ); + " + `); + }); + it('should exclude src/test-setup.ts in tsconfig.app.json', async () => { const tsConfig = readJson( appTree, diff --git a/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap b/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap index cf2fb85d2b..61e66f4c26 100644 --- a/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap +++ b/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap @@ -186,7 +186,7 @@ exports[`library should add vue, vite and vitest to package.json 1`] = ` "jiti": "2.4.2", "jsdom": "~22.1.0", "prettier": "^2.6.2", - "typescript": "~5.7.2", + "typescript": "~5.8.2", "vite": "^6.0.0", "vitest": "^3.0.0", "vue-tsc": "^2.2.8", diff --git a/packages/webpack/package.json b/packages/webpack/package.json index f34320dfe0..960f922dcc 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -62,7 +62,7 @@ "ts-loader": "^9.3.1", "tsconfig-paths-webpack-plugin": "4.0.0", "tslib": "^2.3.0", - "webpack": "5.98.0", + "webpack": "~5.99.0", "webpack-dev-server": "^5.2.1", "webpack-node-externals": "^3.0.0", "webpack-subresource-integrity": "^5.1.0", diff --git a/packages/webpack/src/utils/webpack/read-webpack-options.ts b/packages/webpack/src/utils/webpack/read-webpack-options.ts index e0c6ead095..2a6cd1a256 100644 --- a/packages/webpack/src/utils/webpack/read-webpack-options.ts +++ b/packages/webpack/src/utils/webpack/read-webpack-options.ts @@ -54,7 +54,7 @@ export async function readWebpackOptions( // If the resolved configuration is an array, resolve each configuration return Array.isArray(resolved) - ? await Promise.all(resolved.map(resolveConfig)) + ? (await Promise.all(resolved.map(resolveConfig))).flat() : resolved; } else if (Array.isArray(config)) { // If the config passed is an array, resolve each configuration diff --git a/packages/workspace/migrations.json b/packages/workspace/migrations.json index f05a62cc7c..e07e2f65c2 100644 --- a/packages/workspace/migrations.json +++ b/packages/workspace/migrations.json @@ -39,6 +39,19 @@ "alwaysAddToPackageJson": false } } + }, + "21.2.0": { + "version": "21.2.0-beta.0", + "x-prompt": "Do you want to update to TypeScript v5.8?", + "requires": { + "typescript": ">=5.7.0 <5.8.0" + }, + "packages": { + "typescript": { + "version": "~5.8.2", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/workspace/src/generators/new/generate-preset.ts b/packages/workspace/src/generators/new/generate-preset.ts index 38bebb77b6..01505fd9bb 100644 --- a/packages/workspace/src/generators/new/generate-preset.ts +++ b/packages/workspace/src/generators/new/generate-preset.ts @@ -99,7 +99,6 @@ export function generatePreset(host: Tree, opts: NormalizedSchema) { ? `--e2eTestRunner=${opts.e2eTestRunner}` : null, opts.ssr ? `--ssr` : null, - opts.serverRouting ? `--server-routing` : null, opts.prefix !== undefined ? `--prefix=${opts.prefix}` : null, opts.nxCloudToken ? `--nxCloudToken=${opts.nxCloudToken}` : null, opts.formatter ? `--formatter=${opts.formatter}` : null, diff --git a/packages/workspace/src/generators/new/new.ts b/packages/workspace/src/generators/new/new.ts index 55fca9c800..ad54126044 100644 --- a/packages/workspace/src/generators/new/new.ts +++ b/packages/workspace/src/generators/new/new.ts @@ -36,7 +36,6 @@ interface Schema { unitTestRunner?: 'jest' | 'vitest' | 'none'; e2eTestRunner?: 'cypress' | 'playwright' | 'detox' | 'jest' | 'none'; ssr?: boolean; - serverRouting?: boolean; prefix?: string; useGitHub?: boolean; nxCloud?: 'yes' | 'skip' | 'circleci' | 'github'; diff --git a/packages/workspace/src/generators/new/schema.json b/packages/workspace/src/generators/new/schema.json index 271f01294a..cd11f473e6 100644 --- a/packages/workspace/src/generators/new/schema.json +++ b/packages/workspace/src/generators/new/schema.json @@ -93,10 +93,6 @@ "type": "boolean", "default": false }, - "serverRouting": { - "description": "Use the Angular Server Routing and App Engine APIs (Developer Preview).", - "type": "boolean" - }, "prefix": { "description": "The prefix to use for Angular component and directive selectors.", "type": "string" diff --git a/packages/workspace/src/generators/preset/preset.spec.ts b/packages/workspace/src/generators/preset/preset.spec.ts index a3f37ad58c..d2766c1bd6 100644 --- a/packages/workspace/src/generators/preset/preset.spec.ts +++ b/packages/workspace/src/generators/preset/preset.spec.ts @@ -20,36 +20,35 @@ describe('preset', () => { style: 'css', linter: 'eslint', }); - expect(tree.children(`apps/${name}`)).toMatchInlineSnapshot(` + expect(tree.children(`apps/${name}`).sort()).toMatchInlineSnapshot(` [ - "project.json", - "src", - "tsconfig.app.json", - "tsconfig.editor.json", - "tsconfig.json", - "public", ".eslintrc.json", "jest.config.ts", + "project.json", + "public", + "src", + "tsconfig.app.json", + "tsconfig.json", "tsconfig.spec.json", ] `); - expect(tree.children(`apps/${name}/src/`)).toMatchInlineSnapshot(` + expect(tree.children(`apps/${name}/src/`).sort()).toMatchInlineSnapshot(` [ - "index.html", - "styles.css", "app", + "index.html", "main.ts", + "styles.css", "test-setup.ts", ] `); - expect(tree.children(`apps/${name}/src/app`)).toMatchInlineSnapshot(` + expect(tree.children(`apps/${name}/src/app`).sort()).toMatchInlineSnapshot(` [ - "app.component.css", - "app.component.html", - "app.component.spec.ts", - "app.component.ts", - "app.module.ts", - "nx-welcome.component.ts", + "app-module.ts", + "app.css", + "app.html", + "app.spec.ts", + "app.ts", + "nx-welcome.ts", ] `); }, 60_000); diff --git a/packages/workspace/src/generators/preset/preset.ts b/packages/workspace/src/generators/preset/preset.ts index 292b574051..7d2712a25f 100644 --- a/packages/workspace/src/generators/preset/preset.ts +++ b/packages/workspace/src/generators/preset/preset.ts @@ -37,7 +37,6 @@ async function createPreset(tree: Tree, options: Schema) { unitTestRunner: options.unitTestRunner, bundler: options.bundler, ssr: options.ssr, - serverRouting: options.serverRouting, prefix: options.prefix, nxCloudToken: options.nxCloudToken, }); @@ -58,7 +57,6 @@ async function createPreset(tree: Tree, options: Schema) { unitTestRunner: options.unitTestRunner, bundler: options.bundler, ssr: options.ssr, - serverRouting: options.serverRouting, prefix: options.prefix, nxCloudToken: options.nxCloudToken, }); diff --git a/packages/workspace/src/generators/preset/schema.json b/packages/workspace/src/generators/preset/schema.json index 711c5504a6..9f61614db3 100644 --- a/packages/workspace/src/generators/preset/schema.json +++ b/packages/workspace/src/generators/preset/schema.json @@ -110,10 +110,6 @@ "type": "boolean", "default": false }, - "serverRouting": { - "description": "Use the Angular Server Routing and App Engine APIs (Developer Preview).", - "type": "boolean" - }, "prefix": { "description": "The prefix to use for Angular component and directive selectors.", "type": "string" diff --git a/packages/workspace/src/utils/versions.ts b/packages/workspace/src/utils/versions.ts index b3b15a1b07..8e6032c9bf 100644 --- a/packages/workspace/src/utils/versions.ts +++ b/packages/workspace/src/utils/versions.ts @@ -1,8 +1,8 @@ export const nxVersion = require('../../package.json').version; -export const typescriptVersion = '~5.7.2'; +export const typescriptVersion = '~5.8.2'; // TODO: remove when preset generation is reworked and // deps are not installed from workspace -export const angularCliVersion = '~19.2.0'; +export const angularCliVersion = '20.0.0-rc.3'; export const angularRspackVersion = '^21.0.1'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11803c6460..6b3e390207 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: version: 0.1.55 '@nx/graph': specifier: 0.4.2 - version: 0.4.2(@nx/devkit@21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.4.2(@nx/devkit@21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@react-spring/three': specifier: ^9.7.3 version: 9.7.4(@react-three/fiber@8.17.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.166.1))(react@18.3.1)(three@0.166.1) @@ -55,13 +55,13 @@ importers: version: 8.17.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.166.1) '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))) + version: 0.4.2(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))) '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))) + version: 0.5.9(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))) '@tailwindcss/typography': specifier: 0.5.13 - version: 0.5.13(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))) + version: 0.5.13(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))) '@types/license-checker': specifier: ^25.0.3 version: 25.0.6 @@ -160,7 +160,7 @@ importers: version: 2.5.2 tailwindcss: specifier: 3.4.4 - version: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + version: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) three: specifier: ^0.166.1 version: 0.166.1 @@ -172,56 +172,62 @@ importers: version: 2.7.0 webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + version: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) devDependencies: '@actions/core': specifier: ^1.10.0 version: 1.10.1 '@angular-devkit/architect': - specifier: 0.1902.0 - version: 0.1902.0(chokidar@3.6.0) + specifier: 0.2000.0-rc.3 + version: 0.2000.0-rc.3(chokidar@3.6.0) '@angular-devkit/build-angular': - specifier: 19.2.0 - version: 19.2.0(cyjoxstszy672tff4k3podiddq) + specifier: 20.0.0-rc.3 + version: 20.0.0-rc.3(e3mdzg6cefq7ohkt2yqalrfi6a) '@angular-devkit/core': - specifier: 19.2.0 - version: 19.2.0(chokidar@3.6.0) + specifier: 20.0.0-rc.3 + version: 20.0.0-rc.3(chokidar@3.6.0) '@angular-devkit/schematics': - specifier: 19.2.0 - version: 19.2.0(chokidar@3.6.0) + specifier: 20.0.0-rc.3 + version: 20.0.0-rc.3(chokidar@3.6.0) '@angular-eslint/eslint-plugin': specifier: 19.2.0 - version: 19.2.0(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) + version: 19.2.0(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) '@angular-eslint/eslint-plugin-template': specifier: 19.2.0 - version: 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) + version: 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) '@angular-eslint/template-parser': specifier: 19.2.0 - version: 19.2.0(eslint@8.57.0)(typescript@5.7.3) + version: 19.2.0(eslint@8.57.0)(typescript@5.8.3) + '@angular/build': + specifier: 20.0.0-rc.3 + version: 20.0.0-rc.3(r2bqcb5jsbmtv6om74f3o7kxjq) '@angular/cli': - specifier: ~19.2.0 - version: 19.2.0(@types/node@20.16.10)(chokidar@3.6.0) + specifier: 20.0.0-rc.3 + version: 20.0.0-rc.3(@types/node@20.16.10)(chokidar@3.6.0) '@angular/common': - specifier: 19.2.0 - version: 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + specifier: 20.0.0-rc.2 + version: 20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) '@angular/compiler': - specifier: 19.2.0 - version: 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)) + specifier: 20.0.0-rc.2 + version: 20.0.0-rc.2 '@angular/compiler-cli': - specifier: 19.2.0 - version: 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3) + specifier: 20.0.0-rc.2 + version: 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3) '@angular/core': - specifier: 19.2.0 - version: 19.2.0(rxjs@7.8.1)(zone.js@0.14.10) + specifier: 20.0.0-rc.2 + version: 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': + specifier: 20.0.0-rc.2 + version: 20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)) '@angular/router': - specifier: 19.2.0 - version: 19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1) + specifier: 20.0.0-rc.2 + version: 20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)))(rxjs@7.8.2) '@astrojs/check': specifier: ^0.7.0 - version: 0.7.0(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.7.3) + version: 0.7.0(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.8.3) '@astrojs/react': specifier: ^3.6.2 - version: 3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.1)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + version: 3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.1)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) '@babel/core': specifier: ^7.23.2 version: 7.25.2 @@ -275,13 +281,13 @@ importers: version: 1.38.0 '@module-federation/enhanced': specifier: ^0.9.0 - version: 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@module-federation/sdk': specifier: ^0.9.0 version: 0.9.0 '@monodon/rust': specifier: 2.3.0 - version: 2.3.0(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + version: 2.3.0(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@napi-rs/cli': specifier: 3.0.0-alpha.56 version: 3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)) @@ -290,25 +296,25 @@ importers: version: 0.2.4 '@nestjs/cli': specifier: ^10.0.2 - version: 10.4.5(@swc/cli@0.6.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(chokidar@3.6.0))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + version: 10.4.5(@swc/cli@0.6.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(chokidar@3.6.0))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) '@nestjs/common': specifier: ^9.0.0 - version: 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': specifier: ^9.0.0 - version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': specifier: ^9.0.0 - version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3) + version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3) '@nestjs/schematics': specifier: ^9.1.0 - version: 9.2.0(chokidar@3.6.0)(typescript@5.7.3) + version: 9.2.0(chokidar@3.6.0)(typescript@5.8.3) '@nestjs/swagger': specifier: ^6.0.0 - version: 6.3.0(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2) + version: 6.3.0(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2) '@nestjs/testing': specifier: ^9.0.0 - version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3)) + version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3)) '@notionhq/client': specifier: ^2.2.15 version: 2.2.15(encoding@0.1.13) @@ -320,76 +326,76 @@ importers: version: 3.13.2(rollup@4.22.0)(webpack-sources@3.2.3) '@nx/angular': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(qbwr3m6hc3poqhlzwn26ht3bjm) + version: 21.1.0-beta.2(fyq5cnj7dng3hmfeopn2druo44) '@nx/conformance': specifier: 2.0.1 - version: 2.0.1(@nx/js@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + version: 2.0.1(@nx/js@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/cypress': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/devkit': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + version: 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/enterprise-cloud': specifier: 2.0.1 - version: 2.0.1(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + version: 2.0.1(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/esbuild': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/eslint': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/eslint-plugin': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-config-prettier@10.1.2(eslint@8.57.0))(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint-config-prettier@10.1.2(eslint@8.57.0))(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/jest': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/js': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/key': specifier: 2.0.1 version: 2.0.1 '@nx/next': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(dgrrpoiol2k2rjjaivrabkbbcu) + version: 21.1.0-beta.2(kedstl3f36vr6wsjei4qwqsd4i) '@nx/playwright': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@playwright/test@1.47.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@playwright/test@1.47.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/powerpack-license': specifier: 2.0.1 version: 2.0.1 '@nx/react': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@zkochan/js-yaml@0.0.7)(bufferutil@4.0.7)(esbuild@0.25.0)(eslint@8.57.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@zkochan/js-yaml@0.0.7)(bufferutil@4.0.7)(esbuild@0.25.0)(eslint@8.57.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@nx/rsbuild': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/rspack': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(hubv5tdg3ovp6w66rxdwysfxjy) + version: 21.1.0-beta.2(2ohclxkdl5ckzsxkckwm4z2bou) '@nx/storybook': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/vite': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@nx/web': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/webpack': specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@babel/traverse@7.26.9)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + version: 21.1.0-beta.2(@babel/traverse@7.27.1)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) '@phenomnomnominal/tsquery': specifier: ~5.0.1 - version: 5.0.1(typescript@5.7.3) + version: 5.0.1(typescript@5.8.3) '@playwright/test': specifier: ^1.36.1 version: 1.47.1 '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.5.7 - version: 0.5.15(react-refresh@0.10.0)(type-fest@3.13.1)(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack-hot-middleware@2.26.1)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 0.5.15(react-refresh@0.10.0)(type-fest@3.13.1)(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8))(webpack-hot-middleware@2.26.1)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@pnpm/lockfile-types': specifier: ^6.0.0 version: 6.0.0 @@ -398,10 +404,10 @@ importers: version: 1.9.0(react-redux@8.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@remix-run/dev': specifier: ^2.14.0 - version: 2.14.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(bufferutil@4.0.7)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + version: 2.14.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(bufferutil@4.0.7)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@remix-run/node': specifier: ^2.14.0 - version: 2.14.0(typescript@5.7.3) + version: 2.14.0(typescript@5.8.3) '@rollup/plugin-babel': specifier: ^6.0.4 version: 6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.22.0) @@ -428,7 +434,7 @@ importers: version: 1.3.9(@swc/helpers@0.5.11) '@rspack/dev-server': specifier: 1.1.1 - version: 1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@types/express@4.17.21)(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@types/express@4.17.21)(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@rspack/plugin-minify': specifier: ^0.7.5 version: 0.7.5 @@ -436,8 +442,8 @@ importers: specifier: ^1.0.0 version: 1.0.0(react-refresh@0.10.0) '@schematics/angular': - specifier: ~19.2.0 - version: 19.2.0(chokidar@3.6.0) + specifier: 20.0.0-rc.3 + version: 20.0.0-rc.3(chokidar@3.6.0) '@storybook/addon-essentials': specifier: 8.4.6 version: 8.4.6(@types/react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(webpack-sources@3.2.3) @@ -449,13 +455,13 @@ importers: version: 8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)) '@storybook/react': specifier: 8.4.6 - version: 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3) + version: 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3) '@storybook/react-vite': specifier: 8.4.6 - version: 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.22.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3) + version: 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.22.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3) '@storybook/react-webpack5': specifier: 8.4.6 - version: 8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + version: 8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) '@storybook/test': specifier: ^8.5.1 version: 8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)) @@ -467,13 +473,13 @@ importers: version: 2.45.4(bufferutil@4.0.7) '@svgr/rollup': specifier: ^8.1.0 - version: 8.1.0(rollup@4.22.0)(typescript@5.7.3) + version: 8.1.0(rollup@4.22.0)(typescript@5.8.3) '@svgr/webpack': specifier: ^8.0.1 - version: 8.1.0(typescript@5.7.3) + version: 8.1.0(typescript@5.8.3) '@swc-node/register': specifier: 1.9.1 - version: 1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3) + version: 1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3) '@swc/cli': specifier: 0.6.0 version: 0.6.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(chokidar@3.6.0) @@ -491,13 +497,13 @@ importers: version: 15.0.6(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tutorialkit/astro': specifier: 1.5.0 - version: 1.5.0(@types/node@20.16.10)(@types/react-dom@18.3.0)(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3))(less@4.1.3)(postcss@8.4.38)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + version: 1.5.0(@types/node@20.16.10)(@types/react-dom@18.3.0)(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3))(less@4.1.3)(postcss@8.4.38)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@tutorialkit/react': specifier: 1.5.0 - version: 1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.1)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + version: 1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.1)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@tutorialkit/theme': specifier: 1.5.0 - version: 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + version: 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@tutorialkit/types': specifier: 1.5.0 version: 1.5.0 @@ -574,20 +580,20 @@ importers: specifier: ^1.1.5 version: 1.1.9 '@typescript-eslint/eslint-plugin': - specifier: ^8.19.0 - version: 8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) + specifier: ^8.29.0 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/rule-tester': - specifier: ^8.19.0 - version: 8.20.0(eslint@8.57.0)(typescript@5.7.3) + specifier: ^8.29.0 + version: 8.32.1(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/type-utils': - specifier: ^8.19.0 - version: 8.20.0(eslint@8.57.0)(typescript@5.7.3) + specifier: ^8.29.0 + version: 8.32.1(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/utils': - specifier: ^8.19.0 - version: 8.20.0(eslint@8.57.0)(typescript@5.7.3) + specifier: ^8.29.0 + version: 8.32.1(eslint@8.57.0)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.2.0 - version: 4.3.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + version: 4.3.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@webcontainer/api': specifier: 1.5.1 version: 1.5.1 @@ -605,16 +611,16 @@ importers: version: 0.0.7 ai: specifier: ^2.2.10 - version: 2.2.37(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.5.6(typescript@5.7.3)) + version: 2.2.37(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.5.6(typescript@5.8.3)) ajv: specifier: ^8.12.0 version: 8.17.1 angular-eslint: specifier: 19.2.0 - version: 19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript-eslint@8.20.0(eslint@8.57.0)(typescript@5.7.3))(typescript@5.7.3) + version: 19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript-eslint@8.32.1(eslint@8.57.0)(typescript@5.8.3))(typescript@5.8.3) astro: specifier: 4.15.0 - version: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3) + version: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3) autoprefixer: specifier: 10.4.13 version: 10.4.13(postcss@8.4.38) @@ -623,7 +629,7 @@ importers: version: 29.7.0(@babel/core@7.25.2) babel-loader: specifier: ^9.1.2 - version: 9.2.1(@babel/core@7.25.2)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 9.2.1(@babel/core@7.25.2)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) browserslist: specifier: ^4.21.4 version: 4.23.3 @@ -650,10 +656,10 @@ importers: version: 2.0.0 copy-webpack-plugin: specifier: ^10.2.4 - version: 10.2.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 10.2.4(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) css-minimizer-webpack-plugin: specifier: ^5.0.0 - version: 5.0.1(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 5.0.1(esbuild@0.25.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) cypress: specifier: 14.3.0 version: 14.3.0 @@ -698,7 +704,7 @@ importers: version: 8.57.0 eslint-config-next: specifier: 15.3.0 - version: 15.3.0(eslint@8.57.0)(typescript@5.7.3) + version: 15.3.0(eslint@8.57.0)(typescript@5.8.3) eslint-config-prettier: specifier: 10.1.2 version: 10.1.2(eslint@8.57.0) @@ -707,7 +713,7 @@ importers: version: 2.14.0(eslint@8.57.0) eslint-plugin-import: specifier: 2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + version: 2.31.0(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0) eslint-plugin-jsx-a11y: specifier: 6.10.1 version: 6.10.1(eslint@8.57.0) @@ -722,7 +728,7 @@ importers: version: 5.0.0(eslint@8.57.0) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.0)(typescript@5.7.3) + version: 0.8.0(eslint@8.57.0)(typescript@5.8.3) express: specifier: ^4.21.2 version: 4.21.2 @@ -743,7 +749,7 @@ importers: version: 5.0.2 fork-ts-checker-webpack-plugin: specifier: 7.2.13 - version: 7.2.13(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 7.2.13(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) fs-extra: specifier: ^11.1.0 version: 11.2.0 @@ -761,7 +767,7 @@ importers: version: 4.7.7 html-webpack-plugin: specifier: 5.5.0 - version: 5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) http-proxy-middleware: specifier: ^3.0.3 version: 3.0.3 @@ -800,10 +806,10 @@ importers: version: 4.2.1 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + version: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-config: specifier: 29.7.0 - version: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + version: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-diff: specifier: 29.7.0 version: 29.7.0 @@ -842,10 +848,10 @@ importers: version: 4.1.3 less-loader: specifier: 11.1.0 - version: 11.1.0(less@4.1.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 11.1.0(less@4.1.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) license-webpack-plugin: specifier: ^4.0.2 - version: 4.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 4.0.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) lines-and-columns: specifier: 2.0.3 version: 2.0.3 @@ -878,7 +884,7 @@ importers: version: 0.80.12 mini-css-extract-plugin: specifier: ~2.4.7 - version: 2.4.7(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 2.4.7(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) minimatch: specifier: 9.0.3 version: 9.0.3 @@ -886,17 +892,17 @@ importers: specifier: ^3.1.10 version: 3.1.55(@next/env@14.2.28)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0)) ng-packagr: - specifier: 19.2.0 - version: 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))(tslib@2.7.0)(typescript@5.7.3) + specifier: 20.0.0-rc.1 + version: 20.0.0-rc.1(@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))(tslib@2.7.0)(typescript@5.8.3) npm-package-arg: specifier: 11.0.1 version: 11.0.1 nuxt: specifier: ^3.10.0 - version: 3.13.2(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(@parcel/watcher@2.4.1)(@types/node@20.16.10)(bufferutil@4.0.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3) + version: 3.13.2(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(@parcel/watcher@2.4.1)(@types/node@20.16.10)(bufferutil@4.0.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3) nx: specifier: 21.1.0-beta.2 - version: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + version: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) octokit: specifier: ^2.0.14 version: 2.1.0(encoding@0.1.13) @@ -918,9 +924,6 @@ importers: picocolors: specifier: ^1.1.0 version: 1.1.0 - piscina: - specifier: ^4.4.0 - version: 4.7.0 postcss: specifier: 8.4.38 version: 8.4.38 @@ -971,13 +974,13 @@ importers: version: 3.5.0 rollup-plugin-postcss: specifier: ^4.0.2 - version: 4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + version: 4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.22.0)(typescript@5.7.3) + version: 0.36.0(rollup@4.22.0)(typescript@5.8.3) rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 sass: specifier: 1.55.0 version: 1.55.0 @@ -986,13 +989,13 @@ importers: version: 1.85.1 sass-loader: specifier: 16.0.5 - version: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.55.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.55.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) semver: specifier: ^7.6.3 version: 7.6.3 source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 5.0.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) source-map-support: specifier: 0.5.19 version: 0.5.19 @@ -1004,7 +1007,7 @@ importers: version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)) style-loader: specifier: ^3.3.0 - version: 3.3.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 3.3.4(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) tar-stream: specifier: ~2.2.0 version: 2.2.0 @@ -1013,7 +1016,7 @@ importers: version: 1.0.2 terser-webpack-plugin: specifier: ^5.3.3 - version: 5.3.10(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 5.3.10(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) tmp: specifier: ~0.2.1 version: 0.2.3 @@ -1022,13 +1025,13 @@ importers: version: 1.2.2 ts-jest: specifier: 29.1.0 - version: 29.1.0(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.25.0)(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.1.0(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.25.0)(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))(typescript@5.8.3) ts-loader: specifier: ^9.3.1 - version: 9.5.1(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 9.5.1(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) ts-node: specifier: 10.9.1 - version: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3) + version: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3) tsconfig-paths: specifier: ^4.1.2 version: 4.2.0 @@ -1037,16 +1040,16 @@ importers: version: 4.0.0 typedoc: specifier: 0.25.12 - version: 0.25.12(typescript@5.7.3) + version: 0.25.12(typescript@5.8.3) typedoc-plugin-markdown: specifier: 3.17.1 - version: 3.17.1(typedoc@0.25.12(typescript@5.7.3)) + version: 3.17.1(typedoc@0.25.12(typescript@5.8.3)) typescript: - specifier: ~5.7.2 - version: 5.7.3 + specifier: ~5.8.2 + version: 5.8.3 typescript-eslint: - specifier: ^8.19.0 - version: 8.20.0(eslint@8.57.0)(typescript@5.7.3) + specifier: ^8.29.0 + version: 8.32.1(eslint@8.57.0)(typescript@5.8.3) unist-builder: specifier: ^4.0.0 version: 4.0.0 @@ -1058,16 +1061,16 @@ importers: version: 6.0.5(encoding@0.1.13)(typanion@3.14.0) vite: specifier: 6.2.0 - version: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + version: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) webpack: - specifier: 5.98.0 - version: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + specifier: 5.99.8 + version: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) webpack-dev-server: specifier: 5.2.1 - version: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8) webpack-merge: specifier: ^5.8.0 version: 5.10.0 @@ -1076,7 +1079,7 @@ importers: version: 3.0.0 webpack-subresource-integrity: specifier: ^5.1.0 - version: 5.1.0(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + version: 5.1.0(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) xstate: specifier: 4.34.0 version: 4.34.0 @@ -1201,27 +1204,37 @@ packages: resolution: {integrity: sha512-F/3O38QOYCwNqECNQauKb56GYdST9SrRSiqTNc5xpnUL//A09kaucmKSZ2VJAVY7K/rktSQn5viiQ3rTJLiZgA==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular-devkit/build-angular@19.2.0': - resolution: {integrity: sha512-chPiwTKQPYQn34MZ+5spTCSVSY5vha9C5UKPHsEFNiNT0Iw1mQRJkFvDyq9WZnoc4B0w5KRIiR08EjOTNHj/1w==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/architect@0.2000.0-rc.3': + resolution: {integrity: sha512-BMzSdX9AHB4NUDDK26PXiY1+/+4DNxMprrvAsJwYfRj16P2yCxoN8+UjniIdc0V7woYmv9GVxjpiuuFOK/X3PA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/build-angular@20.0.0-rc.3': + resolution: {integrity: sha512-DMqwX0ZfWPzWLPPdGB4pFxFccyEznPkS5TFZcb/Leu6XIYMcXPOEGWpvDII69rwplEECWOGVb8LIzj5cZgil9Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0 - '@angular/localize': ^19.0.0 || ^19.2.0-next.0 - '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0 - '@angular/service-worker': ^19.0.0 || ^19.2.0-next.0 - '@angular/ssr': ^19.2.0 + '@angular/compiler-cli': ^20.0.0 || ^20.0.0-next.0 + '@angular/core': ^20.0.0 || ^20.0.0-next.0 + '@angular/localize': ^20.0.0 || ^20.0.0-next.0 + '@angular/platform-browser': ^20.0.0 || ^20.0.0-next.0 + '@angular/platform-server': ^20.0.0 || ^20.0.0-next.0 + '@angular/service-worker': ^20.0.0 || ^20.0.0-next.0 + '@angular/ssr': ^20.0.0-rc.3 '@web/test-runner': ^0.20.0 browser-sync: ^3.0.2 jest: ^29.5.0 jest-environment-jsdom: ^29.5.0 karma: ^6.3.0 - ng-packagr: ^19.0.0 || ^19.2.0-next.0 + ng-packagr: ^20.0.0 || ^20.0.0-next.0 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: '>=5.5 <5.9' + typescript: '>=5.8 <5.9' peerDependenciesMeta: + '@angular/core': + optional: true '@angular/localize': optional: true + '@angular/platform-browser': + optional: true '@angular/platform-server': optional: true '@angular/service-worker': @@ -1245,9 +1258,9 @@ packages: tailwindcss: optional: true - '@angular-devkit/build-webpack@0.1902.0': - resolution: {integrity: sha512-SZsesHqrFRRUHXo4NZ1yZ+RsH/hGMVFoWb65pk+POSJYR4W6nm4pO0B2Uww2FWzv1MFfqYBOig/rBqhMB+yJ7Q==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/build-webpack@0.2000.0-rc.3': + resolution: {integrity: sha512-baXO/LGt5BCctPHG9z6THcLkxcmVtRApYlmKU6xXCoBEXWKXlABpHHRIIZNFel3JXKC+RiZ2JX9aug5DjcaNaA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^5.0.2 @@ -1279,6 +1292,15 @@ packages: chokidar: optional: true + '@angular-devkit/core@20.0.0-rc.3': + resolution: {integrity: sha512-Ji4A+UE3V6sBTDBVWGx7Yd8JwUq+h1f68rRjFXwaRb6FB1siU3zTbitHFVmb/asOzR8gl7/q6j5RJFT1wmtXcQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true + '@angular-devkit/schematics-cli@17.3.8': resolution: {integrity: sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -1296,6 +1318,10 @@ packages: resolution: {integrity: sha512-cGGqUGqBXIGJkeL65l70y0BflDAu/0Zi/ohbYat3hvadFfumRJnVElVfJ59JtWO7FfKQjxcwCVTyuQ/tevX/9A==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@20.0.0-rc.3': + resolution: {integrity: sha512-dSMbzKmaAe61f+tKV2SVvWK0NyLl76dcoUWZtRAwrgtiQrBMKFO3LzM1gcD4h2FQK5Th8c418XYKyYP6eMAurw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-eslint/builder@19.2.0': resolution: {integrity: sha512-8Lx24MrMJT8RlgDtwqfiLiJo4DzSaktjco6RmELUdWO2chJgRe9y+2iIgOeB2pmyD9UCsubwsfjBXlrnV/MPhQ==} peerDependencies: @@ -1336,25 +1362,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '*' - '@angular/build@19.2.0': - resolution: {integrity: sha512-IdTA9SvYReNcANm0tMgEtsx8qdIqKZYoF2xPZw2YDh6TeBWZK8VwoWtpXzkOBWedf9vgcrT7y0Y8gB11pgEP6g==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular/build@20.0.0-rc.3': + resolution: {integrity: sha512-O5OIcL5jT3MOHuPjKD3po71OcmVmSsr/JLru+eSNsN1bcfEPALqhtwbwoIVgnoT/awZxzMZVvxxMflB/uIradQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler': ^19.0.0 || ^19.2.0-next.0 - '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0 - '@angular/localize': ^19.0.0 || ^19.2.0-next.0 - '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0 - '@angular/service-worker': ^19.0.0 || ^19.2.0-next.0 - '@angular/ssr': ^19.2.0 + '@angular/compiler': ^20.0.0 || ^20.0.0-next.0 + '@angular/compiler-cli': ^20.0.0 || ^20.0.0-next.0 + '@angular/core': ^20.0.0 || ^20.0.0-next.0 + '@angular/localize': ^20.0.0 || ^20.0.0-next.0 + '@angular/platform-browser': ^20.0.0 || ^20.0.0-next.0 + '@angular/platform-server': ^20.0.0 || ^20.0.0-next.0 + '@angular/service-worker': ^20.0.0 || ^20.0.0-next.0 + '@angular/ssr': ^20.0.0-rc.3 karma: ^6.4.0 less: ^4.2.0 - ng-packagr: ^19.0.0 || ^19.2.0-next.0 + ng-packagr: ^20.0.0 || ^20.0.0-next.0 postcss: ^8.4.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: '>=5.5 <5.9' + tslib: ^2.3.0 + typescript: '>=5.8 <5.9' + vitest: ^3.1.1 peerDependenciesMeta: + '@angular/core': + optional: true '@angular/localize': optional: true + '@angular/platform-browser': + optional: true '@angular/platform-server': optional: true '@angular/service-worker': @@ -1371,74 +1405,64 @@ packages: optional: true tailwindcss: optional: true - - '@angular/cli@19.2.0': - resolution: {integrity: sha512-LUxuku6obwigdDJozAvmXyhMcm3rSXFoZK4+Al7r/JE80pjQEE+bGpu7jCb6JsH813DTNauN+BB66qk8bXSgRw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - hasBin: true - - '@angular/common@19.2.0': - resolution: {integrity: sha512-dm8PR94QY3DucXxltdV5p2Yxyr5bfPlmjOElwLhiTvxWbwCZJTVhPc8dw0TCKzCEu+tKafT48u4BLIB34a0A/g==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/core': 19.2.0 - rxjs: ^6.5.3 || ^7.4.0 - - '@angular/compiler-cli@19.2.0': - resolution: {integrity: sha512-IFl3LNfFanspS4gHjn207TPuoJGGieuC9r+j3nDitUcFH49fbShYLGCB6xczvK+j68ZWCqv4voxAOmLyfA/Opw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - hasBin: true - peerDependencies: - '@angular/compiler': 19.2.0 - typescript: '>=5.5 <5.9' - - '@angular/compiler@19.2.0': - resolution: {integrity: sha512-xGBD0C9ikH4jVDuQU3XzGqbh9Wovl8UR0wNzNd9rm4fltfC9ipz9NbfetsLPKWpPbfnUqmqMe4/pYjGEgWMonw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/core': 19.2.0 - peerDependenciesMeta: - '@angular/core': + vitest: optional: true - '@angular/core@19.2.0': - resolution: {integrity: sha512-WKTRltOt3MMWWuhRX7Y9RonKxIYjZeBDE6XRwceHMgaEDS2d8I2D3AIuqizRsgHpJqDPnQnH+vxcek4FivcSGA==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} + '@angular/cli@20.0.0-rc.3': + resolution: {integrity: sha512-VUD5TYxWGWN+e5iTFHxHi2je98mHdUruUKbjzt+gFstb7TlXjNGjw2z0/FfcR7x88hJJy23M5W6e82g9OFWE9Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular/common@20.0.0-rc.2': + resolution: {integrity: sha512-uI6cz18nN/SqUpGB4m6rKUVPJGEyDaWwBK46sS5XVrpTLwTah1ELQGbJfjX1HNZMTdjF+v8SxBLLpikf9XFMeA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: + '@angular/core': 20.0.0-rc.2 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/compiler-cli@20.0.0-rc.2': + resolution: {integrity: sha512-poPedZI8qNBvdjPikAFWNpiNzIDEgkwVhhCxPyznUjsnvg4fDDLvxgMX1EWYk/sr/jdbDLYydaBqYQznpzl9Zw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@angular/compiler': 20.0.0-rc.2 + typescript: '>=5.8 <5.9' + + '@angular/compiler@20.0.0-rc.2': + resolution: {integrity: sha512-dlBxczXg4QvEetXdS4IxS2wujotrqBi2IeG9kXBwyT8rYCuoQ/XkiARYtWze9gSx8vhDj2HYjY2TgdGcWvezwQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@angular/core@20.0.0-rc.2': + resolution: {integrity: sha512-yblIk2fE5PUVfzeono+fEd/gQsIH45kmOrxmmmAjXBx1B5qXkoBGgFMtqtJ4VjQRVk1CsLFikCejBoygz6waeA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/compiler': 20.0.0-rc.2 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 + peerDependenciesMeta: + '@angular/compiler': + optional: true - '@angular/platform-browser@18.2.5': - resolution: {integrity: sha512-PoX9idwnOpTJBlujzZ2nFGOsmCnZzOH7uNSWIR7trdoq0b1AFXfrxlCQ36qWamk7bbhJI4H28L8YTmKew/nXDA==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} + '@angular/platform-browser@20.0.0-rc.2': + resolution: {integrity: sha512-mqaR2ZkbpMYRtDbF9JMI+w2sDkXJyaQFVgPpGE5KwDQS53n+1uCP+OPi6b0M0PMJSSirpPdP4+iqQG+DyTZfvA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/animations': 18.2.5 - '@angular/common': 18.2.5 - '@angular/core': 18.2.5 + '@angular/animations': 20.0.0-rc.2 + '@angular/common': 20.0.0-rc.2 + '@angular/core': 20.0.0-rc.2 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@19.2.0': - resolution: {integrity: sha512-Md/zleBpWMi5H6KPMREM0M2EUAkoqe01zkXla0Z0hHoTn7Ty0fv0Te9bGDioVOG7JgHh6wYCrPJ/uJsjKObyvw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} + '@angular/router@20.0.0-rc.2': + resolution: {integrity: sha512-Cc0VFkkOS9q5+C0dXf8XnfrbkEIcgm15hYukiDafTjrB4SKoBTVA0NiHb7LyN/9Vzk1CErWz86Qk6Bc9pZ7G5w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 19.2.0 - '@angular/core': 19.2.0 - '@angular/platform-browser': 19.2.0 + '@angular/common': 20.0.0-rc.2 + '@angular/core': 20.0.0-rc.2 + '@angular/platform-browser': 20.0.0-rc.2 rxjs: ^6.5.3 || ^7.4.0 - '@angular/ssr@19.2.0': - resolution: {integrity: sha512-2Tnunv0FDMxf5KHpxnxHhxQ5Xd+4qZ+fGBBbvH2njO5tDdFab6QxTRpKH9xWNiLjAqVIarytmTsuYtpchRmnaw==} - peerDependencies: - '@angular/common': ^19.0.0 || ^19.2.0-next.0 - '@angular/core': ^19.0.0 || ^19.2.0-next.0 - '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0 - '@angular/router': ^19.0.0 || ^19.2.0-next.0 - peerDependenciesMeta: - '@angular/platform-server': - optional: true - '@antfu/install-pkg@1.0.0': resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} @@ -1579,6 +1603,10 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.4': resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} @@ -1587,8 +1615,8 @@ packages: resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.27.2': + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} engines: {node: '>=6.9.0'} '@babel/core@7.25.2': @@ -1603,6 +1631,10 @@ packages: resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} engines: {node: '>=6.9.0'} + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.25.6': resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} @@ -1611,14 +1643,14 @@ packages: resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.26.9': resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} @@ -1627,6 +1659,10 @@ packages: resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.1': + resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} + engines: {node: '>=6.9.0'} + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} engines: {node: '>=6.9.0'} @@ -1639,8 +1675,8 @@ packages: resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.25.9': @@ -1649,14 +1685,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.25.2': resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.25.9': - resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1671,8 +1713,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.24.7': @@ -1683,6 +1725,10 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.25.2': resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} @@ -1695,8 +1741,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.24.8': @@ -1711,14 +1763,18 @@ packages: resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.9': - resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1731,22 +1787,30 @@ packages: resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} @@ -1755,20 +1819,20 @@ packages: resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} '@babel/helpers@7.25.6': resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.0': - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.26.9': - resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': @@ -1785,13 +1849,13 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.26.9': - resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} engines: {node: '>=6.0.0'} hasBin: true @@ -1801,8 +1865,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1813,8 +1877,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1825,8 +1889,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1837,8 +1901,8 @@ packages: peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 @@ -1849,8 +1913,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1910,8 +1974,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1922,8 +1986,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2004,8 +2068,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2016,8 +2080,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + '@babel/plugin-transform-async-generator-functions@7.27.1': + resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2028,8 +2092,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2040,8 +2104,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2052,8 +2116,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.25.9': - resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + '@babel/plugin-transform-block-scoping@7.27.1': + resolution: {integrity: sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2070,14 +2134,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-static-block@7.24.7': resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 @@ -2088,8 +2158,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.27.1': + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2100,8 +2170,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2112,8 +2182,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.27.1': + resolution: {integrity: sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2124,8 +2194,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2136,8 +2206,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2148,8 +2218,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -2160,8 +2230,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2172,8 +2242,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2184,8 +2254,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2196,8 +2266,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2208,8 +2278,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2220,8 +2290,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2232,8 +2302,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2244,8 +2314,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2256,8 +2326,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2268,8 +2338,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2280,8 +2350,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2292,8 +2362,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2304,8 +2374,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2316,8 +2386,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -2328,8 +2398,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2340,8 +2410,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2352,8 +2422,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2364,8 +2434,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + '@babel/plugin-transform-object-rest-spread@7.27.2': + resolution: {integrity: sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2376,8 +2446,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2388,8 +2458,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2400,8 +2470,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2412,8 +2482,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.1': + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2424,8 +2494,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2436,8 +2506,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2448,8 +2518,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2502,14 +2572,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.25.9': - resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + '@babel/plugin-transform-regenerator@7.27.1': + resolution: {integrity: sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -2520,8 +2590,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2538,14 +2608,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-runtime@7.27.1': + resolution: {integrity: sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.24.7': resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2556,8 +2632,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2568,8 +2644,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2580,8 +2656,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2592,8 +2668,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.26.7': - resolution: {integrity: sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2610,8 +2686,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2622,8 +2698,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2634,8 +2710,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2646,8 +2722,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -2664,6 +2740,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.27.2': + resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: @@ -2688,14 +2770,14 @@ packages: resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.9': resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + engines: {node: '>=6.9.0'} + '@babel/standalone@7.25.6': resolution: {integrity: sha512-Kf2ZcZVqsKbtYhlA7sP0z5A3q5hmCVYMKMWRWNK/5OVwHIve3JY1djVRmIVAx8FMueLIfZGKQDIILK2w8zO4mg==} engines: {node: '>=6.9.0'} @@ -2704,14 +2786,14 @@ packages: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} - engines: {node: '>=6.9.0'} - '@babel/template@7.26.9': resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.6': resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} @@ -2724,6 +2806,10 @@ packages: resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} @@ -2740,6 +2826,10 @@ packages: resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2978,6 +3068,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.16.3': resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==} engines: {node: '>=12'} @@ -3026,6 +3122,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.16.3': resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==} engines: {node: '>=12'} @@ -3074,6 +3176,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.16.3': resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==} engines: {node: '>=12'} @@ -3122,6 +3230,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.16.3': resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==} engines: {node: '>=12'} @@ -3170,6 +3284,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.16.3': resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==} engines: {node: '>=12'} @@ -3218,6 +3338,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.16.3': resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==} engines: {node: '>=12'} @@ -3266,6 +3392,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.16.3': resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==} engines: {node: '>=12'} @@ -3314,6 +3446,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.16.3': resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==} engines: {node: '>=12'} @@ -3362,6 +3500,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.16.3': resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==} engines: {node: '>=12'} @@ -3410,6 +3554,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.16.3': resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==} engines: {node: '>=12'} @@ -3458,6 +3608,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.16.3': resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==} engines: {node: '>=12'} @@ -3506,6 +3662,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.16.3': resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==} engines: {node: '>=12'} @@ -3554,6 +3716,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.16.3': resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==} engines: {node: '>=12'} @@ -3602,6 +3770,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.16.3': resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==} engines: {node: '>=12'} @@ -3650,6 +3824,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.16.3': resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==} engines: {node: '>=12'} @@ -3698,6 +3878,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.16.3': resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} engines: {node: '>=12'} @@ -3746,6 +3932,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.24.2': resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} @@ -3758,6 +3950,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.16.3': resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==} engines: {node: '>=12'} @@ -3806,6 +4004,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} @@ -3824,6 +4028,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.16.3': resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==} engines: {node: '>=12'} @@ -3872,6 +4082,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.16.3': resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==} engines: {node: '>=12'} @@ -3920,6 +4136,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.16.3': resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==} engines: {node: '>=12'} @@ -3968,6 +4190,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.16.3': resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==} engines: {node: '>=12'} @@ -4016,6 +4244,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.16.3': resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==} engines: {node: '>=12'} @@ -4064,12 +4298,24 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.11.1': resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -4295,8 +4541,8 @@ packages: cpu: [x64] os: [win32] - '@inquirer/checkbox@4.1.2': - resolution: {integrity: sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==} + '@inquirer/checkbox@4.1.6': + resolution: {integrity: sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4304,8 +4550,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.6': - resolution: {integrity: sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==} + '@inquirer/confirm@5.1.10': + resolution: {integrity: sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4313,8 +4559,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.7': - resolution: {integrity: sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==} + '@inquirer/core@10.1.11': + resolution: {integrity: sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4322,8 +4568,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.7': - resolution: {integrity: sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==} + '@inquirer/editor@4.2.11': + resolution: {integrity: sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4331,8 +4577,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.9': - resolution: {integrity: sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==} + '@inquirer/expand@4.0.13': + resolution: {integrity: sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4340,12 +4586,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.10': - resolution: {integrity: sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==} + '@inquirer/figures@1.0.11': + resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} engines: {node: '>=18'} - '@inquirer/input@4.1.6': - resolution: {integrity: sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==} + '@inquirer/input@4.1.10': + resolution: {integrity: sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4353,8 +4599,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.9': - resolution: {integrity: sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==} + '@inquirer/number@3.0.13': + resolution: {integrity: sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4362,8 +4608,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.9': - resolution: {integrity: sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==} + '@inquirer/password@4.0.13': + resolution: {integrity: sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4371,8 +4617,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.3.2': - resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==} + '@inquirer/prompts@7.5.1': + resolution: {integrity: sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4380,8 +4626,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.0.9': - resolution: {integrity: sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==} + '@inquirer/rawlist@4.1.1': + resolution: {integrity: sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4389,8 +4635,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.9': - resolution: {integrity: sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==} + '@inquirer/search@3.0.13': + resolution: {integrity: sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4398,8 +4644,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.0.9': - resolution: {integrity: sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==} + '@inquirer/select@4.2.1': + resolution: {integrity: sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4411,8 +4657,8 @@ packages: resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} engines: {node: '>=18'} - '@inquirer/type@3.0.4': - resolution: {integrity: sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==} + '@inquirer/type@3.0.6': + resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4602,8 +4848,8 @@ packages: '@lezer/sass@1.0.7': resolution: {integrity: sha512-8HLlOkuX/SMHOggI2DAsXUw38TuURe+3eQ5hiuk9QmYOUyC55B1dYEIMkav5A4IELVaW4e1T4P9WRiI5ka4mdw==} - '@listr2/prompt-adapter-inquirer@2.0.18': - resolution: {integrity: sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==} + '@listr2/prompt-adapter-inquirer@2.0.22': + resolution: {integrity: sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==} engines: {node: '>=18.0.0'} peerDependencies: '@inquirer/prompts': '>= 3 < 8' @@ -4612,33 +4858,38 @@ packages: resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} - '@lmdb/lmdb-darwin-arm64@3.2.6': - resolution: {integrity: sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==} + '@lmdb/lmdb-darwin-arm64@3.3.0': + resolution: {integrity: sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==} cpu: [arm64] os: [darwin] - '@lmdb/lmdb-darwin-x64@3.2.6': - resolution: {integrity: sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==} + '@lmdb/lmdb-darwin-x64@3.3.0': + resolution: {integrity: sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==} cpu: [x64] os: [darwin] - '@lmdb/lmdb-linux-arm64@3.2.6': - resolution: {integrity: sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==} + '@lmdb/lmdb-linux-arm64@3.3.0': + resolution: {integrity: sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==} cpu: [arm64] os: [linux] - '@lmdb/lmdb-linux-arm@3.2.6': - resolution: {integrity: sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==} + '@lmdb/lmdb-linux-arm@3.3.0': + resolution: {integrity: sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==} cpu: [arm] os: [linux] - '@lmdb/lmdb-linux-x64@3.2.6': - resolution: {integrity: sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==} + '@lmdb/lmdb-linux-x64@3.3.0': + resolution: {integrity: sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==} cpu: [x64] os: [linux] - '@lmdb/lmdb-win32-x64@3.2.6': - resolution: {integrity: sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==} + '@lmdb/lmdb-win32-arm64@3.3.0': + resolution: {integrity: sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==} + cpu: [arm64] + os: [win32] + + '@lmdb/lmdb-win32-x64@3.3.0': + resolution: {integrity: sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==} cpu: [x64] os: [win32] @@ -5540,12 +5791,12 @@ packages: cpu: [x64] os: [win32] - '@ngtools/webpack@19.2.0': - resolution: {integrity: sha512-63/8ys3bNK2h7Py/dKHZ4ZClxQz6xuz3skUgLZIMs9O076KPsHTKDKEDG2oicmwe/nOXjVt6n9Z4wprFaRLbvw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@ngtools/webpack@20.0.0-rc.3': + resolution: {integrity: sha512-WIDAxFU671xqBy1IYDGNXpzca4fHtbrHeuSy64gSbjWcw6wCMUrwfdgCI2h5T6BjobBpxl+zQ9xa1AfdjkotSg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0 - typescript: '>=5.5 <5.9' + '@angular/compiler-cli': ^20.0.0 || ^20.0.0-next.0 + typescript: '>=5.8 <5.9' webpack: ^5.54.0 '@nodelib/fs.scandir@2.1.5': @@ -6980,13 +7231,13 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.30.1': - resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.34.8': - resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + '@rollup/rollup-android-arm-eabi@4.40.2': + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} cpu: [arm] os: [android] @@ -6995,13 +7246,13 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.30.1': - resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.34.8': - resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + '@rollup/rollup-android-arm64@4.40.2': + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} cpu: [arm64] os: [android] @@ -7010,13 +7261,13 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.30.1': - resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.34.8': - resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} + '@rollup/rollup-darwin-arm64@4.40.2': + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} cpu: [arm64] os: [darwin] @@ -7025,29 +7276,24 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.30.1': - resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.34.8': resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.30.1': - resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} - cpu: [arm64] - os: [freebsd] + '@rollup/rollup-darwin-x64@4.40.2': + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + cpu: [x64] + os: [darwin] '@rollup/rollup-freebsd-arm64@4.34.8': resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.30.1': - resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} - cpu: [x64] + '@rollup/rollup-freebsd-arm64@4.40.2': + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.34.8': @@ -7055,18 +7301,23 @@ packages: cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.40.2': + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.22.0': resolution: {integrity: sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': - resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} cpu: [arm] os: [linux] @@ -7075,13 +7326,13 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.30.1': - resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} cpu: [arm] os: [linux] @@ -7090,13 +7341,13 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.30.1': - resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.8': - resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} + '@rollup/rollup-linux-arm64-gnu@4.40.2': + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} cpu: [arm64] os: [linux] @@ -7105,19 +7356,14 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.30.1': - resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.8': resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': - resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} - cpu: [loong64] + '@rollup/rollup-linux-arm64-musl@4.40.2': + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + cpu: [arm64] os: [linux] '@rollup/rollup-linux-loongarch64-gnu@4.34.8': @@ -7125,18 +7371,23 @@ packages: cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.22.0': resolution: {integrity: sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': - resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} cpu: [ppc64] os: [linux] @@ -7145,13 +7396,18 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.30.1': - resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.2': + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} cpu: [riscv64] os: [linux] @@ -7160,13 +7416,13 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.30.1': - resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.8': - resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + '@rollup/rollup-linux-s390x-gnu@4.40.2': + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} cpu: [s390x] os: [linux] @@ -7175,13 +7431,13 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.30.1': - resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.8': - resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} + '@rollup/rollup-linux-x64-gnu@4.40.2': + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} cpu: [x64] os: [linux] @@ -7190,13 +7446,13 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.30.1': - resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.8': - resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} + '@rollup/rollup-linux-x64-musl@4.40.2': + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} cpu: [x64] os: [linux] @@ -7205,13 +7461,13 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.30.1': - resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.34.8': - resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} + '@rollup/rollup-win32-arm64-msvc@4.40.2': + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} cpu: [arm64] os: [win32] @@ -7220,13 +7476,13 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.30.1': - resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.8': - resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} + '@rollup/rollup-win32-ia32-msvc@4.40.2': + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} cpu: [ia32] os: [win32] @@ -7235,13 +7491,13 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.30.1': - resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.8': - resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} + '@rollup/rollup-win32-x64-msvc@4.40.2': + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} cpu: [x64] os: [win32] @@ -7396,9 +7652,9 @@ packages: '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - '@schematics/angular@19.2.0': - resolution: {integrity: sha512-/gdrYTr1DSUNmrUmpmne6uBnIBpJ/obHtccvz5sZckKni/KMPAr3CgGZ8JrHer3I732ucb1We9nbdtXvz+2glg==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@schematics/angular@20.0.0-rc.3': + resolution: {integrity: sha512-se/dewD5g2sjY8jAseQV++jYr6HwIr8SBrQ5jEZeI1SflNbjKxf2I/yAeDInUHBMvj0H9z3sODWPzde+yv+82Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -8127,6 +8383,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/express-serve-static-core@4.19.5': resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} @@ -8397,13 +8656,13 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.20.0': - resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==} + '@typescript-eslint/eslint-plugin@8.32.1': + resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/parser@8.20.0': resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==} @@ -8412,8 +8671,15 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/rule-tester@8.20.0': - resolution: {integrity: sha512-4Lg9dZY6ghXkecSmEfKvBySyx35krbtJtJZ53IT0fDh8WWZislP8QI38rWKSz8eB530YlBH+Tn0uhlLfhD+5vA==} + '@typescript-eslint/parser@8.32.1': + resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/rule-tester@8.32.1': + resolution: {integrity: sha512-XUCGJUbBBn6HNFnihX2bm50F4J1LndwdzTlw7kfSnqukXoRkW/SEwMIhDLSiTcSPXZPVbO8R/Aw35J9zm4kD4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8426,12 +8692,16 @@ packages: resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.20.0': - resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==} + '@typescript-eslint/scope-manager@8.32.1': + resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.32.1': + resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} @@ -8441,6 +8711,10 @@ packages: resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.32.1': + resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8456,18 +8730,24 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/typescript-estree@8.32.1': + resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@8.20.0': - resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==} + '@typescript-eslint/utils@8.32.1': + resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} @@ -8477,6 +8757,10 @@ packages: resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.32.1': + resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -8694,11 +8978,11 @@ packages: resolution: {integrity: sha512-4eqPCnPAJsL6gdVs0/oqZNgs2PnQW3HHBMgBHyEbb5A/ESI10TvRp+B7MRl9glUmy/aR5B6YSI68rgXvAFjdxA==} engines: {node: '>=12'} - '@vitejs/plugin-basic-ssl@1.2.0': - resolution: {integrity: sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==} - engines: {node: '>=14.21.3'} + '@vitejs/plugin-basic-ssl@2.0.0': + resolution: {integrity: sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^6.0.0 '@vitejs/plugin-react@4.3.4': resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} @@ -8864,93 +9148,48 @@ packages: '@web3-storage/multipart-parser@1.0.0': resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} - '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - '@webassemblyjs/floating-point-hex-parser@1.13.2': resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - '@webassemblyjs/helper-api-error@1.13.2': resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - '@webassemblyjs/helper-buffer@1.14.1': resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - '@webassemblyjs/helper-numbers@1.13.2': resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - '@webassemblyjs/helper-wasm-bytecode@1.13.2': resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} - '@webassemblyjs/helper-wasm-section@1.14.1': resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - '@webassemblyjs/ieee754@1.13.2': resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - '@webassemblyjs/leb128@1.13.2': resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - '@webassemblyjs/utf8@1.13.2': resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - '@webassemblyjs/wasm-edit@1.14.1': resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - '@webassemblyjs/wasm-gen@1.14.1': resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - '@webassemblyjs/wasm-opt@1.14.1': resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - '@webassemblyjs/wasm-parser@1.14.1': resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} @@ -9494,8 +9733,8 @@ packages: peerDependencies: postcss: ^8.1.0 - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -9536,6 +9775,13 @@ packages: peerDependencies: '@babel/core': ^7.8.0 + babel-loader@10.0.0: + resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} + engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5.61.0' + babel-loader@9.2.1: resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} engines: {node: '>= 14.15.0'} @@ -9634,8 +9880,8 @@ packages: bcryptjs@2.4.3: resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} - beasties@0.2.0: - resolution: {integrity: sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==} + beasties@0.3.3: + resolution: {integrity: sha512-Mba3V4hTPrM7P2CSidueg71JZ0G+DyK7maBqp4/uax/PQznwdFti9cOW6Z3lTxBRH84kRICN0TyQ0MSSmufaAw==} engines: {node: '>=14.0.0'} before-after-hook@2.2.3: @@ -9727,11 +9973,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.24.4: resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -10198,9 +10439,9 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - commander@13.0.0: - resolution: {integrity: sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==} - engines: {node: '>=18'} + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + engines: {node: '>=20'} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -10422,8 +10663,8 @@ packages: peerDependencies: webpack: ^5.1.0 - copy-webpack-plugin@12.0.2: - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + copy-webpack-plugin@13.0.0: + resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.1.0 @@ -11136,8 +11377,8 @@ packages: domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -11198,9 +11439,6 @@ packages: electron-to-chromium@1.5.25: resolution: {integrity: sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==} - electron-to-chromium@1.5.65: - resolution: {integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==} - emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -11268,6 +11506,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -11392,8 +11634,8 @@ packages: peerDependencies: esbuild: '>=0.12 <1' - esbuild-wasm@0.25.0: - resolution: {integrity: sha512-60iuWr6jdTVylmGXjpnqk3pCktUi5Rmjiv6EMza3h4X20BLtfL2BjUGs1+UCt2G9UK7jVGrJdUr5i1k0sL3wBg==} + esbuild-wasm@0.25.4: + resolution: {integrity: sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==} engines: {node: '>=18'} hasBin: true @@ -11437,6 +11679,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -11868,16 +12115,16 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -12624,12 +12871,12 @@ packages: peerDependencies: webpack: ^5.20.0 + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - htmlparser2@9.1.0: - resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} - http-assert@1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} @@ -12676,6 +12923,10 @@ packages: resolution: {integrity: sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + http-proxy-middleware@3.0.5: + resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -13782,8 +14033,8 @@ packages: less: ^3.5.0 || ^4.0.0 webpack: ^5.0.0 - less-loader@12.2.0: - resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==} + less-loader@12.3.0: + resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -13800,9 +14051,9 @@ packages: engines: {node: '>=6'} hasBin: true - less@4.2.2: - resolution: {integrity: sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==} - engines: {node: '>=6'} + less@4.3.0: + resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==} + engines: {node: '>=14'} hasBin: true leven@3.1.0: @@ -13856,12 +14107,12 @@ packages: enquirer: optional: true - listr2@8.2.5: - resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} - lmdb@3.2.6: - resolution: {integrity: sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==} + lmdb@3.3.0: + resolution: {integrity: sha512-MgJocUI6QEiSXQBFWLeyo1R7eQj8Rke5dlPxX0KFwli8/bsCxpM/KbXO5y0qmV/5llQ3wpneDWcTYxa+4vn8iQ==} hasBin: true load-json-file@4.0.0: @@ -14087,9 +14338,6 @@ packages: magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} - magic-string@0.30.15: - resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==} - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -14270,10 +14518,6 @@ packages: resolution: {integrity: sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ==} engines: {node: '>= 4.0.0'} - memfs@4.12.0: - resolution: {integrity: sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==} - engines: {node: '>= 4.0.0'} - memfs@4.17.0: resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} engines: {node: '>= 4.0.0'} @@ -14910,15 +15154,15 @@ packages: sass: optional: true - ng-packagr@19.2.0: - resolution: {integrity: sha512-bDyB9tmXMCL/4IhKcX84zGQlQrZhPhdCaomdJocz6EN57cZWdTP7SGhrswzpdGJY+y89855detet27oJLgR3IQ==} - engines: {node: ^18.19.1 || >=20.11.1} + ng-packagr@20.0.0-rc.1: + resolution: {integrity: sha512-vWECe1BZr+484VRbTf2OTvAdXFLhdBthJo6A2MY5xgDDg2hi4rH12d2RBeKQhJkD6V5QMWFF4kMCeBc0JE2CPg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler-cli': ^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0 + '@angular/compiler-cli': ^20.0.0 || ^20.0.0-next.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 - typescript: '>=5.5 <5.9' + typescript: '>=5.8 <5.9' peerDependenciesMeta: tailwindcss: optional: true @@ -15089,9 +15333,9 @@ packages: resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==} engines: {node: ^18.17.0 || >=20.5.0} - npm-packlist@9.0.0: - resolution: {integrity: sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==} - engines: {node: ^18.17.0 || >=20.5.0} + npm-packlist@10.0.0: + resolution: {integrity: sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==} + engines: {node: ^20.17.0 || >=22.9.0} npm-pick-manifest@10.0.0: resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==} @@ -15273,6 +15517,10 @@ packages: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} + open@10.1.2: + resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + engines: {node: '>=18'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -15418,9 +15666,9 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - pacote@20.0.0: - resolution: {integrity: sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==} - engines: {node: ^18.17.0 || >=20.5.0} + pacote@21.0.0: + resolution: {integrity: sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true pako@0.2.9: @@ -15476,8 +15724,8 @@ packages: parse-url@8.1.0: resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - parse5-html-rewriting-stream@7.0.0: - resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} + parse5-html-rewriting-stream@7.1.0: + resolution: {integrity: sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==} parse5-sax-parser@7.0.0: resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} @@ -15649,12 +15897,13 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - piscina@4.7.0: - resolution: {integrity: sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==} - piscina@4.8.0: resolution: {integrity: sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==} + piscina@5.0.0: + resolution: {integrity: sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==} + engines: {node: '>=18.x'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -16486,10 +16735,6 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.2: - resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -17253,6 +17498,13 @@ packages: resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} engines: {node: '>=8.3'} + rollup-plugin-dts@6.2.1: + resolution: {integrity: sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + rollup-plugin-postcss@4.0.2: resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} engines: {node: '>=10'} @@ -17283,13 +17535,13 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.30.1: - resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.34.8: - resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -17311,6 +17563,9 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + s.color@0.0.15: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} @@ -17513,6 +17768,11 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + sass@1.88.0: + resolution: {integrity: sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==} + engines: {node: '>=14.0.0'} + hasBin: true + sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} @@ -17538,6 +17798,10 @@ packages: resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} engines: {node: '>= 10.13.0'} + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} + scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} @@ -17593,6 +17857,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -18379,6 +18648,11 @@ packages: engines: {node: '>=10'} hasBin: true + terser@5.39.1: + resolution: {integrity: sha512-Mm6+uad0ZuDtcV8/4uOZQDQ8RuiC5Pu+iZRedJtF7yA/27sPL7d++In/AJKpWZlU3SYMPPkVfwetn6sgZ66pUA==} + engines: {node: '>=10'} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -18457,6 +18731,10 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.6: resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} engines: {node: '>=12.0.0'} @@ -18583,6 +18861,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-checker-rspack-plugin@1.1.1: resolution: {integrity: sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==} engines: {node: '>=16.0.0'} @@ -18814,12 +19098,12 @@ packages: typescript-auto-import-cache@0.3.5: resolution: {integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==} - typescript-eslint@8.20.0: - resolution: {integrity: sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==} + typescript-eslint@8.32.1: + resolution: {integrity: sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} @@ -18831,6 +19115,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + ua-parser-js@1.0.40: resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} hasBin: true @@ -19410,8 +19699,8 @@ packages: terser: optional: true - vite@6.1.0: - resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + vite@6.2.0: + resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -19450,8 +19739,8 @@ packages: yaml: optional: true - vite@6.2.0: - resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -19836,6 +20125,16 @@ packages: webpack-cli: optional: true + webpack@5.99.8: + resolution: {integrity: sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} @@ -20294,72 +20593,80 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@19.2.0(cyjoxstszy672tff4k3podiddq)': + '@angular-devkit/architect@0.2000.0-rc.3(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 20.0.0-rc.3(chokidar@3.6.0) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/build-angular@20.0.0-rc.3(e3mdzg6cefq7ohkt2yqalrfi6a)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.1902.0(chokidar@3.6.0) - '@angular-devkit/build-webpack': 0.1902.0(chokidar@3.6.0)(webpack-dev-server@5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@angular-devkit/core': 19.2.0(chokidar@3.6.0) - '@angular/build': 19.2.0(cxjrqumqlcnastohrhciqzxvse) - '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3) - '@babel/core': 7.26.9 - '@babel/generator': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 + '@angular-devkit/architect': 0.2000.0-rc.3(chokidar@3.6.0) + '@angular-devkit/build-webpack': 0.2000.0-rc.3(chokidar@3.6.0)(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + '@angular-devkit/core': 20.0.0-rc.3(chokidar@3.6.0) + '@angular/build': 20.0.0-rc.3(h7zdqshcmvpgwykrwwl3jpfrde) + '@angular/compiler-cli': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3) + '@babel/core': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.9) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-runtime': 7.26.9(@babel/core@7.26.9) - '@babel/preset-env': 7.26.9(@babel/core@7.26.9) - '@babel/runtime': 7.26.9 + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-runtime': 7.27.1(@babel/core@7.27.1) + '@babel/preset-env': 7.27.2(@babel/core@7.27.1) + '@babel/runtime': 7.27.1 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3))(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@ngtools/webpack': 20.0.0-rc.3(@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3))(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + '@vitejs/plugin-basic-ssl': 2.0.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) ansi-colors: 4.1.3 - autoprefixer: 10.4.20(postcss@8.5.2) - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + autoprefixer: 10.4.21(postcss@8.5.3) + babel-loader: 10.0.0(@babel/core@7.27.1)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) browserslist: 4.24.4 - copy-webpack-plugin: 12.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - css-loader: 7.1.2(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - esbuild-wasm: 0.25.0 + copy-webpack-plugin: 13.0.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + css-loader: 7.1.2(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + esbuild-wasm: 0.25.4 fast-glob: 3.3.3 - http-proxy-middleware: 3.0.3 + http-proxy-middleware: 3.0.5 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 - less: 4.2.2 - less-loader: 12.2.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(less@4.2.2)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - license-webpack-plugin: 4.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + less: 4.3.0 + less-loader: 12.3.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(less@4.3.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + license-webpack-plugin: 4.0.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) loader-utils: 3.3.1 - mini-css-extract-plugin: 2.9.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - open: 10.1.0 + mini-css-extract-plugin: 2.9.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + open: 10.1.2 ora: 5.4.1 picomatch: 4.0.2 - piscina: 4.8.0 - postcss: 8.5.2 - postcss-loader: 8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.5.2)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + piscina: 5.0.0 + postcss: 8.5.3 + postcss-loader: 8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) resolve-url-loader: 5.0.0 - rxjs: 7.8.1 - sass: 1.85.0 - sass-loader: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - semver: 7.7.1 - source-map-loader: 5.0.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + rxjs: 7.8.2 + sass: 1.88.0 + sass-loader: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.88.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + semver: 7.7.2 + source-map-loader: 5.0.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) source-map-support: 0.5.21 - terser: 5.39.0 + terser: 5.39.1 tree-kill: 1.2.2 tslib: 2.8.1 - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-dev-middleware: 7.4.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - webpack-dev-server: 5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + typescript: 5.8.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + webpack-dev-middleware: 7.4.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) optionalDependencies: - '@angular/ssr': 19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/router@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1)) - esbuild: 0.25.0 - jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + '@angular/core': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': 20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)) + esbuild: 0.25.4 + jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-environment-jsdom: 29.7.0(bufferutil@4.0.7) - ng-packagr: 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))(tslib@2.7.0)(typescript@5.7.3) - tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + ng-packagr: 20.0.0-rc.1(@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))(tslib@2.7.0)(typescript@5.8.3) + tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) transitivePeerDependencies: - '@angular/compiler' - '@rspack/core' @@ -20380,15 +20687,16 @@ snapshots: - uglify-js - utf-8-validate - vite + - vitest - webpack-cli - yaml - '@angular-devkit/build-webpack@0.1902.0(chokidar@3.6.0)(webpack-dev-server@5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@angular-devkit/build-webpack@0.2000.0-rc.3(chokidar@3.6.0)(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)))': dependencies: - '@angular-devkit/architect': 0.1902.0(chokidar@3.6.0) - rxjs: 7.8.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-dev-server: 5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@angular-devkit/architect': 0.2000.0-rc.3(chokidar@3.6.0) + rxjs: 7.8.2 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) transitivePeerDependencies: - chokidar @@ -20424,6 +20732,17 @@ snapshots: optionalDependencies: chokidar: 3.6.0 + '@angular-devkit/core@20.0.0-rc.3(chokidar@3.6.0)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.2 + source-map: 0.7.4 + optionalDependencies: + chokidar: 3.6.0 + '@angular-devkit/schematics-cli@17.3.8(chokidar@3.6.0)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) @@ -20465,42 +20784,52 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.7.3)': + '@angular-devkit/schematics@20.0.0-rc.3(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 20.0.0-rc.3(chokidar@3.6.0) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-eslint/builder@19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@angular-devkit/architect': 0.1902.0(chokidar@3.6.0) '@angular-devkit/core': 19.2.0(chokidar@3.6.0) eslint: 8.57.0 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - chokidar '@angular-eslint/bundled-angular-compiler@19.2.0': {} - '@angular-eslint/eslint-plugin-template@19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3)': + '@angular-eslint/eslint-plugin-template@19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 19.2.0 - '@angular-eslint/utils': 19.2.0(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) + '@angular-eslint/utils': 19.2.0(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) aria-query: 5.3.2 axobject-query: 4.1.0 eslint: 8.57.0 - typescript: 5.7.3 + typescript: 5.8.3 - '@angular-eslint/eslint-plugin@19.2.0(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3)': + '@angular-eslint/eslint-plugin@19.2.0(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 19.2.0 - '@angular-eslint/utils': 19.2.0(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@angular-eslint/utils': 19.2.0(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 - typescript: 5.7.3 + typescript: 5.8.3 - '@angular-eslint/schematics@19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.7.3)': + '@angular-eslint/schematics@19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@angular-devkit/core': 19.2.0(chokidar@3.6.0) '@angular-devkit/schematics': 19.2.0(chokidar@3.6.0) - '@angular-eslint/eslint-plugin': 19.2.0(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) - '@angular-eslint/eslint-plugin-template': 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) + '@angular-eslint/eslint-plugin': 19.2.0(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) + '@angular-eslint/eslint-plugin-template': 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) ignore: 7.0.3 semver: 7.7.1 strip-json-comments: 3.1.1 @@ -20511,58 +20840,61 @@ snapshots: - eslint - typescript - '@angular-eslint/template-parser@19.2.0(eslint@8.57.0)(typescript@5.7.3)': + '@angular-eslint/template-parser@19.2.0(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 19.2.0 eslint: 8.57.0 eslint-scope: 8.0.2 - typescript: 5.7.3 + typescript: 5.8.3 - '@angular-eslint/utils@19.2.0(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3)': + '@angular-eslint/utils@19.2.0(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 19.2.0 - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 - typescript: 5.7.3 + typescript: 5.8.3 - '@angular/build@19.2.0(cxjrqumqlcnastohrhciqzxvse)': + '@angular/build@20.0.0-rc.3(h7zdqshcmvpgwykrwwl3jpfrde)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.1902.0(chokidar@3.6.0) - '@angular/compiler': 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)) - '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3) - '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 + '@angular-devkit/architect': 0.2000.0-rc.3(chokidar@3.6.0) + '@angular/compiler': 20.0.0-rc.2 + '@angular/compiler-cli': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3) + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) - '@inquirer/confirm': 5.1.6(@types/node@20.16.10) - '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.1.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.2.2)(sass-embedded@1.85.1)(sass@1.85.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) - beasties: 0.2.0 + '@inquirer/confirm': 5.1.10(@types/node@20.16.10) + '@vitejs/plugin-basic-ssl': 2.0.0(vite@6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.3.0)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) + beasties: 0.3.3 browserslist: 4.24.4 - esbuild: 0.25.0 - fast-glob: 3.3.3 + esbuild: 0.25.4 https-proxy-agent: 7.0.6 istanbul-lib-instrument: 6.0.3 - listr2: 8.2.5 + jsonc-parser: 3.3.1 + listr2: 8.3.3 magic-string: 0.30.17 mrmime: 2.0.1 - parse5-html-rewriting-stream: 7.0.0 + parse5-html-rewriting-stream: 7.1.0 picomatch: 4.0.2 - piscina: 4.8.0 - rollup: 4.34.8 - sass: 1.85.0 - semver: 7.7.1 + piscina: 5.0.0 + rollup: 4.40.2 + sass: 1.88.0 + semver: 7.7.2 source-map-support: 0.5.21 - typescript: 5.7.3 - vite: 6.1.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.2.2)(sass-embedded@1.85.1)(sass@1.85.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + tinyglobby: 0.2.13 + tslib: 2.8.1 + typescript: 5.8.3 + vite: 6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.3.0)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) watchpack: 2.4.2 optionalDependencies: - '@angular/ssr': 19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/router@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1)) - less: 4.2.2 - lmdb: 3.2.6 - ng-packagr: 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))(tslib@2.7.0)(typescript@5.7.3) - postcss: 8.5.2 - tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + '@angular/core': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': 20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)) + less: 4.3.0 + lmdb: 3.3.0 + ng-packagr: 20.0.0-rc.1(@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))(tslib@2.7.0)(typescript@5.8.3) + postcss: 8.5.3 + tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) + vitest: 3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - '@types/node' - chokidar @@ -20576,24 +20908,77 @@ snapshots: - tsx - yaml - '@angular/cli@19.2.0(@types/node@20.16.10)(chokidar@3.6.0)': + '@angular/build@20.0.0-rc.3(r2bqcb5jsbmtv6om74f3o7kxjq)': dependencies: - '@angular-devkit/architect': 0.1902.0(chokidar@3.6.0) - '@angular-devkit/core': 19.2.0(chokidar@3.6.0) - '@angular-devkit/schematics': 19.2.0(chokidar@3.6.0) - '@inquirer/prompts': 7.3.2(@types/node@20.16.10) - '@listr2/prompt-adapter-inquirer': 2.0.18(@inquirer/prompts@7.3.2(@types/node@20.16.10)) - '@schematics/angular': 19.2.0(chokidar@3.6.0) + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2000.0-rc.3(chokidar@3.6.0) + '@angular/compiler': 20.0.0-rc.2 + '@angular/compiler-cli': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3) + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 5.1.10(@types/node@20.16.10) + '@vitejs/plugin-basic-ssl': 2.0.0(vite@6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) + beasties: 0.3.3 + browserslist: 4.24.4 + esbuild: 0.25.4 + https-proxy-agent: 7.0.6 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + listr2: 8.3.3 + magic-string: 0.30.17 + mrmime: 2.0.1 + parse5-html-rewriting-stream: 7.1.0 + picomatch: 4.0.2 + piscina: 5.0.0 + rollup: 4.40.2 + sass: 1.88.0 + semver: 7.7.2 + source-map-support: 0.5.21 + tinyglobby: 0.2.13 + tslib: 2.7.0 + typescript: 5.8.3 + vite: 6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) + watchpack: 2.4.2 + optionalDependencies: + '@angular/core': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': 20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)) + less: 4.1.3 + lmdb: 3.3.0 + ng-packagr: 20.0.0-rc.1(@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))(tslib@2.7.0)(typescript@5.8.3) + postcss: 8.4.38 + tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) + vitest: 3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) + transitivePeerDependencies: + - '@types/node' + - chokidar + - jiti + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@angular/cli@20.0.0-rc.3(@types/node@20.16.10)(chokidar@3.6.0)': + dependencies: + '@angular-devkit/architect': 0.2000.0-rc.3(chokidar@3.6.0) + '@angular-devkit/core': 20.0.0-rc.3(chokidar@3.6.0) + '@angular-devkit/schematics': 20.0.0-rc.3(chokidar@3.6.0) + '@inquirer/prompts': 7.5.1(@types/node@20.16.10) + '@listr2/prompt-adapter-inquirer': 2.0.22(@inquirer/prompts@7.5.1(@types/node@20.16.10)) + '@schematics/angular': 20.0.0-rc.3(chokidar@3.6.0) '@yarnpkg/lockfile': 1.1.0 ini: 5.0.0 jsonc-parser: 3.3.1 - listr2: 8.2.5 + listr2: 8.3.3 npm-package-arg: 12.0.2 npm-pick-manifest: 10.0.0 - pacote: 20.0.0 + pacote: 21.0.0 resolve: 1.22.10 - semver: 7.7.1 - symbol-observable: 4.0.0 + semver: 7.7.2 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -20601,61 +20986,53 @@ snapshots: - chokidar - supports-color - '@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1)': + '@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2)': dependencies: - '@angular/core': 19.2.0(rxjs@7.8.1)(zone.js@0.14.10) - rxjs: 7.8.1 + '@angular/core': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10) + rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3)': + '@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3)': dependencies: - '@angular/compiler': 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)) - '@babel/core': 7.26.9 + '@angular/compiler': 20.0.0-rc.2 + '@babel/core': 7.27.1 '@jridgewell/sourcemap-codec': 1.5.0 chokidar: 4.0.1 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 - semver: 7.7.1 + semver: 7.7.2 tslib: 2.8.1 - typescript: 5.7.3 + typescript: 5.8.3 yargs: 17.6.2 transitivePeerDependencies: - supports-color - '@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))': + '@angular/compiler@20.0.0-rc.2': dependencies: tslib: 2.8.1 - optionalDependencies: - '@angular/core': 19.2.0(rxjs@7.8.1)(zone.js@0.14.10) - '@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)': + '@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)': dependencies: - rxjs: 7.8.1 + rxjs: 7.8.2 tslib: 2.8.1 zone.js: 0.14.10 + optionalDependencies: + '@angular/compiler': 20.0.0-rc.2 - '@angular/platform-browser@18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))': + '@angular/platform-browser@20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))': dependencies: - '@angular/common': 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) - '@angular/core': 19.2.0(rxjs@7.8.1)(zone.js@0.14.10) + '@angular/common': 20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) + '@angular/core': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10) tslib: 2.8.1 - '@angular/router@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1)': + '@angular/router@20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(@angular/platform-browser@20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)))(rxjs@7.8.2)': dependencies: - '@angular/common': 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) - '@angular/core': 19.2.0(rxjs@7.8.1)(zone.js@0.14.10) - '@angular/platform-browser': 18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)) - rxjs: 7.8.1 + '@angular/common': 20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2) + '@angular/core': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10) + '@angular/platform-browser': 20.0.0-rc.2(@angular/common@20.0.0-rc.2(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10))(rxjs@7.8.2))(@angular/core@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(rxjs@7.8.2)(zone.js@0.14.10)) + rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ssr@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/router@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1))': - dependencies: - '@angular/common': 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) - '@angular/core': 19.2.0(rxjs@7.8.1)(zone.js@0.14.10) - '@angular/router': 19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.5(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1) - tslib: 2.8.1 - optional: true - '@antfu/install-pkg@1.0.0': dependencies: package-manager-detector: 0.2.11 @@ -20672,13 +21049,13 @@ snapshots: call-me-maybe: 1.0.2 js-yaml: 4.1.0 - '@astrojs/check@0.7.0(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.7.3)': + '@astrojs/check@0.7.0(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.8.3)': dependencies: - '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.7.3) + '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.8.3) chokidar: 3.6.0 fast-glob: 3.3.3 kleur: 4.1.5 - typescript: 5.7.3 + typescript: 5.8.3 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -20688,12 +21065,12 @@ snapshots: '@astrojs/internal-helpers@0.4.1': {} - '@astrojs/language-server@2.15.4(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.7.3)': + '@astrojs/language-server@2.15.4(prettier-plugin-astro@0.14.1)(prettier@2.8.8)(typescript@5.8.3)': dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.12(typescript@5.7.3) + '@volar/kit': 2.4.12(typescript@5.8.3) '@volar/language-core': 2.4.12 '@volar/language-server': 2.4.12 '@volar/language-service': 2.4.12 @@ -20760,12 +21137,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@3.1.9(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3))': + '@astrojs/mdx@3.1.9(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3))': dependencies: '@astrojs/markdown-remark': 5.3.0 '@mdx-js/mdx': 3.1.0(acorn@8.14.0) acorn: 8.14.0 - astro: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3) + astro: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3) es-module-lexer: 1.6.0 estree-util-visit: 2.0.0 gray-matter: 4.0.3 @@ -20784,15 +21161,15 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/react@3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.1)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)': + '@astrojs/react@3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.1)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)': dependencies: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 - '@vitejs/plugin-react': 4.3.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)) + '@vitejs/plugin-react': 4.3.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.5.3 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) transitivePeerDependencies: - '@types/node' - less @@ -20804,15 +21181,15 @@ snapshots: - supports-color - terser - '@astrojs/react@3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.20)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)': + '@astrojs/react@3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.20)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)': dependencies: '@types/react': 18.3.20 '@types/react-dom': 18.3.0 - '@vitejs/plugin-react': 4.3.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)) + '@vitejs/plugin-react': 4.3.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.5.3 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) transitivePeerDependencies: - '@types/node' - less @@ -20988,11 +21365,17 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.25.4': {} '@babel/compat-data@7.26.2': {} - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.2': {} '@babel/core@7.25.2': dependencies: @@ -21017,17 +21400,17 @@ snapshots: '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.3 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.0) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -21037,15 +21420,35 @@ snapshots: '@babel/core@7.26.9': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.4.0(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.27.1': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 convert-source-map: 2.0.0 debug: 4.4.0(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -21056,23 +21459,15 @@ snapshots: '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/generator@7.26.2': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 - - '@babel/generator@7.26.3': - dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 @@ -21085,6 +21480,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + '@babel/generator@7.27.1': + dependencies: + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + '@babel/helper-annotate-as-pure@7.24.7': dependencies: '@babel/types': 7.25.6 @@ -21093,18 +21496,22 @@ snapshots: dependencies: '@babel/types': 7.26.9 + '@babel/helper-annotate-as-pure@7.27.1': + dependencies: + '@babel/types': 7.27.1 + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.3 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.26.2 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -21116,10 +21523,10 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-compilation-targets@7.26.5': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -21127,12 +21534,12 @@ snapshots: '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -21140,12 +21547,12 @@ snapshots: '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -21153,12 +21560,64 @@ snapshots: '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.9) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -21170,17 +21629,24 @@ snapshots: regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.25.2)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.9)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 regexpu-core: 6.2.0 semver: 6.3.1 @@ -21206,10 +21672,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.9)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.26.5 debug: 4.4.0(supports-color@8.1.1) lodash.debounce: 4.0.8 @@ -21217,10 +21683,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.9)': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.0(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.0(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -21233,18 +21721,25 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-simple-access': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color @@ -21253,7 +21748,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -21262,7 +21757,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -21271,13 +21766,58 @@ snapshots: '@babel/core': 7.26.9 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.27.1)': dependencies: - '@babel/types': 7.26.9 + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.27.1 '@babel/helper-plugin-utils@7.24.8': {} @@ -21285,200 +21825,261 @@ snapshots: '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.25.2)': + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.9)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.9(@babel/core@7.25.2)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.9)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color '@babel/helper-simple-access@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.26.9 - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helper-wrap-function@7.25.9': - dependencies: - '@babel/template': 7.26.9 '@babel/traverse': 7.26.9 '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.27.1 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/helpers@7.25.6': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 - '@babel/helpers@7.26.0': + '@babel/helpers@7.27.1': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 - - '@babel/helpers@7.26.9': - dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 '@babel/parser@7.25.6': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.1 '@babel/parser@7.26.2': dependencies: - '@babel/types': 7.26.3 - - '@babel/parser@7.26.3': - dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.1 '@babel/parser@7.26.9': dependencies: '@babel/types': 7.26.9 + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -21486,12 +22087,21 @@ snapshots: '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.26.9) transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -21500,150 +22110,169 @@ snapshots: dependencies: '@babel/core': 7.26.9 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.9)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.9)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.9)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-assertions@7.25.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.9)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.26.9)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.9)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.9)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: @@ -21660,273 +22289,358 @@ snapshots: '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.9)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.9)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.9)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.9)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.9)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.9)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.9)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.9)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.25.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/traverse': 7.26.9 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.9)': + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.9) + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.2) + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.9)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-block-scoping@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.9)': + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) - '@babel/traverse': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.25.2) + '@babel/traverse': 7.27.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.9) - '@babel/traverse': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/traverse': 7.27.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/traverse': 7.27.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -21934,183 +22648,271 @@ snapshots: '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-destructuring@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-destructuring@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.9)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.9)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -22141,220 +22943,333 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.9)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-object-rest-spread@7.27.2(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.26.9) + + '@babel/plugin-transform-object-rest-spread@7.27.2(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.25.2)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.25.2)': + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-constant-elements@7.25.1(@babel/core@7.25.2)': dependencies: @@ -22376,12 +23291,12 @@ snapshots: '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': dependencies: @@ -22414,30 +23329,45 @@ snapshots: '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 regenerator-transform: 0.15.2 - '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-regenerator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.9)': + '@babel/plugin-transform-regenerator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-runtime@7.25.4(@babel/core@7.25.2)': dependencies: @@ -22454,8 +23384,8 @@ snapshots: '@babel/plugin-transform-runtime@7.26.9(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.9) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.9) babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.9) @@ -22463,61 +23393,101 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-runtime@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.27.1) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.27.1) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.9)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.26.7(@babel/core@7.26.9)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': dependencies: @@ -22552,51 +23522,85 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/preset-env@7.25.4(@babel/core@7.25.2)': dependencies: @@ -22689,70 +23693,70 @@ snapshots: '@babel/preset-env@7.26.9(@babel/core@7.26.9)': dependencies: - '@babel/compat-data': 7.26.8 + '@babel/compat-data': 7.27.2 '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.9) + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.26.9) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.9) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.9) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.9) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.9) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.9) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.9) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.9) - '@babel/plugin-transform-typeof-symbol': 7.26.7(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoping': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-object-rest-spread': 7.27.2(@babel/core@7.26.9) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-regenerator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.26.9) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.9) babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.9) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.9) @@ -22762,18 +23766,100 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-env@7.27.2(@babel/core@7.27.1)': + dependencies: + '@babel/compat-data': 7.27.2 + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-object-rest-spread': 7.27.2(@babel/core@7.27.1) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-regenerator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.1) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.1) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.27.1) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.27.1) + core-js-compat: 3.40.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.26.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.1 esutils: 2.0.3 '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.26.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.1 + esutils: 2.0.3 + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.1 esutils: 2.0.3 '@babel/preset-react@7.24.7(@babel/core@7.25.2)': @@ -22821,33 +23907,36 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@7.24.7(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.27.1) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.27.1) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + '@babel/regjsgen@0.8.0': {} '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.1': {} + '@babel/standalone@7.25.6': {} '@babel/template@7.25.0': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 - - '@babel/template@7.25.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@babel/template@7.26.9': dependencies: @@ -22855,26 +23944,32 @@ snapshots: '@babel/parser': 7.26.9 '@babel/types': 7.26.9 + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@babel/traverse@7.25.6': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 - debug: 4.3.7 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.0(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/traverse@7.25.9': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 - debug: 4.3.7 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.0(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -22891,16 +23986,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.27.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.0(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.6': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 to-fast-properties: 2.0.0 '@babel/types@7.26.0': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@babel/types@7.26.3': dependencies: @@ -22909,8 +24016,13 @@ snapshots: '@babel/types@7.26.9': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.27.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} @@ -23224,6 +24336,9 @@ snapshots: '@esbuild/aix-ppc64@0.25.0': optional: true + '@esbuild/aix-ppc64@0.25.4': + optional: true + '@esbuild/android-arm64@0.16.3': optional: true @@ -23248,6 +24363,9 @@ snapshots: '@esbuild/android-arm64@0.25.0': optional: true + '@esbuild/android-arm64@0.25.4': + optional: true + '@esbuild/android-arm@0.16.3': optional: true @@ -23272,6 +24390,9 @@ snapshots: '@esbuild/android-arm@0.25.0': optional: true + '@esbuild/android-arm@0.25.4': + optional: true + '@esbuild/android-x64@0.16.3': optional: true @@ -23296,6 +24417,9 @@ snapshots: '@esbuild/android-x64@0.25.0': optional: true + '@esbuild/android-x64@0.25.4': + optional: true + '@esbuild/darwin-arm64@0.16.3': optional: true @@ -23320,6 +24444,9 @@ snapshots: '@esbuild/darwin-arm64@0.25.0': optional: true + '@esbuild/darwin-arm64@0.25.4': + optional: true + '@esbuild/darwin-x64@0.16.3': optional: true @@ -23344,6 +24471,9 @@ snapshots: '@esbuild/darwin-x64@0.25.0': optional: true + '@esbuild/darwin-x64@0.25.4': + optional: true + '@esbuild/freebsd-arm64@0.16.3': optional: true @@ -23368,6 +24498,9 @@ snapshots: '@esbuild/freebsd-arm64@0.25.0': optional: true + '@esbuild/freebsd-arm64@0.25.4': + optional: true + '@esbuild/freebsd-x64@0.16.3': optional: true @@ -23392,6 +24525,9 @@ snapshots: '@esbuild/freebsd-x64@0.25.0': optional: true + '@esbuild/freebsd-x64@0.25.4': + optional: true + '@esbuild/linux-arm64@0.16.3': optional: true @@ -23416,6 +24552,9 @@ snapshots: '@esbuild/linux-arm64@0.25.0': optional: true + '@esbuild/linux-arm64@0.25.4': + optional: true + '@esbuild/linux-arm@0.16.3': optional: true @@ -23440,6 +24579,9 @@ snapshots: '@esbuild/linux-arm@0.25.0': optional: true + '@esbuild/linux-arm@0.25.4': + optional: true + '@esbuild/linux-ia32@0.16.3': optional: true @@ -23464,6 +24606,9 @@ snapshots: '@esbuild/linux-ia32@0.25.0': optional: true + '@esbuild/linux-ia32@0.25.4': + optional: true + '@esbuild/linux-loong64@0.16.3': optional: true @@ -23488,6 +24633,9 @@ snapshots: '@esbuild/linux-loong64@0.25.0': optional: true + '@esbuild/linux-loong64@0.25.4': + optional: true + '@esbuild/linux-mips64el@0.16.3': optional: true @@ -23512,6 +24660,9 @@ snapshots: '@esbuild/linux-mips64el@0.25.0': optional: true + '@esbuild/linux-mips64el@0.25.4': + optional: true + '@esbuild/linux-ppc64@0.16.3': optional: true @@ -23536,6 +24687,9 @@ snapshots: '@esbuild/linux-ppc64@0.25.0': optional: true + '@esbuild/linux-ppc64@0.25.4': + optional: true + '@esbuild/linux-riscv64@0.16.3': optional: true @@ -23560,6 +24714,9 @@ snapshots: '@esbuild/linux-riscv64@0.25.0': optional: true + '@esbuild/linux-riscv64@0.25.4': + optional: true + '@esbuild/linux-s390x@0.16.3': optional: true @@ -23584,6 +24741,9 @@ snapshots: '@esbuild/linux-s390x@0.25.0': optional: true + '@esbuild/linux-s390x@0.25.4': + optional: true + '@esbuild/linux-x64@0.16.3': optional: true @@ -23608,12 +24768,18 @@ snapshots: '@esbuild/linux-x64@0.25.0': optional: true + '@esbuild/linux-x64@0.25.4': + optional: true + '@esbuild/netbsd-arm64@0.24.2': optional: true '@esbuild/netbsd-arm64@0.25.0': optional: true + '@esbuild/netbsd-arm64@0.25.4': + optional: true + '@esbuild/netbsd-x64@0.16.3': optional: true @@ -23638,6 +24804,9 @@ snapshots: '@esbuild/netbsd-x64@0.25.0': optional: true + '@esbuild/netbsd-x64@0.25.4': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true @@ -23647,6 +24816,9 @@ snapshots: '@esbuild/openbsd-arm64@0.25.0': optional: true + '@esbuild/openbsd-arm64@0.25.4': + optional: true + '@esbuild/openbsd-x64@0.16.3': optional: true @@ -23671,6 +24843,9 @@ snapshots: '@esbuild/openbsd-x64@0.25.0': optional: true + '@esbuild/openbsd-x64@0.25.4': + optional: true + '@esbuild/sunos-x64@0.16.3': optional: true @@ -23695,6 +24870,9 @@ snapshots: '@esbuild/sunos-x64@0.25.0': optional: true + '@esbuild/sunos-x64@0.25.4': + optional: true + '@esbuild/win32-arm64@0.16.3': optional: true @@ -23719,6 +24897,9 @@ snapshots: '@esbuild/win32-arm64@0.25.0': optional: true + '@esbuild/win32-arm64@0.25.4': + optional: true + '@esbuild/win32-ia32@0.16.3': optional: true @@ -23743,6 +24924,9 @@ snapshots: '@esbuild/win32-ia32@0.25.0': optional: true + '@esbuild/win32-ia32@0.25.4': + optional: true + '@esbuild/win32-x64@0.16.3': optional: true @@ -23767,11 +24951,19 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true + '@esbuild/win32-x64@0.25.4': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.11.1': {} '@eslint/compat@1.1.1': {} @@ -23906,7 +25098,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -24015,27 +25207,27 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@inquirer/checkbox@4.1.2(@types/node@20.16.10)': + '@inquirer/checkbox@4.1.6(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/figures': 1.0.10 - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.16.10) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 20.16.10 - '@inquirer/confirm@5.1.6(@types/node@20.16.10)': + '@inquirer/confirm@5.1.10(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/type': 3.0.6(@types/node@20.16.10) optionalDependencies: '@types/node': 20.16.10 - '@inquirer/core@10.1.7(@types/node@20.16.10)': + '@inquirer/core@10.1.11(@types/node@20.16.10)': dependencies: - '@inquirer/figures': 1.0.10 - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.16.10) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -24045,83 +25237,83 @@ snapshots: optionalDependencies: '@types/node': 20.16.10 - '@inquirer/editor@4.2.7(@types/node@20.16.10)': + '@inquirer/editor@4.2.11(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/type': 3.0.6(@types/node@20.16.10) external-editor: 3.1.0 optionalDependencies: '@types/node': 20.16.10 - '@inquirer/expand@4.0.9(@types/node@20.16.10)': + '@inquirer/expand@4.0.13(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/type': 3.0.6(@types/node@20.16.10) yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 20.16.10 - '@inquirer/figures@1.0.10': {} + '@inquirer/figures@1.0.11': {} - '@inquirer/input@4.1.6(@types/node@20.16.10)': + '@inquirer/input@4.1.10(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/type': 3.0.6(@types/node@20.16.10) optionalDependencies: '@types/node': 20.16.10 - '@inquirer/number@3.0.9(@types/node@20.16.10)': + '@inquirer/number@3.0.13(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/type': 3.0.6(@types/node@20.16.10) optionalDependencies: '@types/node': 20.16.10 - '@inquirer/password@4.0.9(@types/node@20.16.10)': + '@inquirer/password@4.0.13(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/type': 3.0.6(@types/node@20.16.10) ansi-escapes: 4.3.2 optionalDependencies: '@types/node': 20.16.10 - '@inquirer/prompts@7.3.2(@types/node@20.16.10)': + '@inquirer/prompts@7.5.1(@types/node@20.16.10)': dependencies: - '@inquirer/checkbox': 4.1.2(@types/node@20.16.10) - '@inquirer/confirm': 5.1.6(@types/node@20.16.10) - '@inquirer/editor': 4.2.7(@types/node@20.16.10) - '@inquirer/expand': 4.0.9(@types/node@20.16.10) - '@inquirer/input': 4.1.6(@types/node@20.16.10) - '@inquirer/number': 3.0.9(@types/node@20.16.10) - '@inquirer/password': 4.0.9(@types/node@20.16.10) - '@inquirer/rawlist': 4.0.9(@types/node@20.16.10) - '@inquirer/search': 3.0.9(@types/node@20.16.10) - '@inquirer/select': 4.0.9(@types/node@20.16.10) + '@inquirer/checkbox': 4.1.6(@types/node@20.16.10) + '@inquirer/confirm': 5.1.10(@types/node@20.16.10) + '@inquirer/editor': 4.2.11(@types/node@20.16.10) + '@inquirer/expand': 4.0.13(@types/node@20.16.10) + '@inquirer/input': 4.1.10(@types/node@20.16.10) + '@inquirer/number': 3.0.13(@types/node@20.16.10) + '@inquirer/password': 4.0.13(@types/node@20.16.10) + '@inquirer/rawlist': 4.1.1(@types/node@20.16.10) + '@inquirer/search': 3.0.13(@types/node@20.16.10) + '@inquirer/select': 4.2.1(@types/node@20.16.10) optionalDependencies: '@types/node': 20.16.10 - '@inquirer/rawlist@4.0.9(@types/node@20.16.10)': + '@inquirer/rawlist@4.1.1(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/type': 3.0.6(@types/node@20.16.10) yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 20.16.10 - '@inquirer/search@3.0.9(@types/node@20.16.10)': + '@inquirer/search@3.0.13(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/figures': 1.0.10 - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.16.10) yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 20.16.10 - '@inquirer/select@4.0.9(@types/node@20.16.10)': + '@inquirer/select@4.2.1(@types/node@20.16.10)': dependencies: - '@inquirer/core': 10.1.7(@types/node@20.16.10) - '@inquirer/figures': 1.0.10 - '@inquirer/type': 3.0.4(@types/node@20.16.10) + '@inquirer/core': 10.1.11(@types/node@20.16.10) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.16.10) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: @@ -24131,7 +25323,7 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.4(@types/node@20.16.10)': + '@inquirer/type@3.0.6(@types/node@20.16.10)': optionalDependencies: '@types/node': 20.16.10 @@ -24169,7 +25361,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -24183,7 +25375,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -24299,7 +25491,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.1 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -24326,13 +25518,13 @@ snapshots: '@types/yargs': 17.0.10 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.7.3) - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + react-docgen-typescript: 2.2.2(typescript@5.8.3) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -24436,31 +25628,34 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@listr2/prompt-adapter-inquirer@2.0.18(@inquirer/prompts@7.3.2(@types/node@20.16.10))': + '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@7.5.1(@types/node@20.16.10))': dependencies: - '@inquirer/prompts': 7.3.2(@types/node@20.16.10) + '@inquirer/prompts': 7.5.1(@types/node@20.16.10) '@inquirer/type': 1.5.5 '@ljharb/through@2.3.13': dependencies: call-bind: 1.0.7 - '@lmdb/lmdb-darwin-arm64@3.2.6': + '@lmdb/lmdb-darwin-arm64@3.3.0': optional: true - '@lmdb/lmdb-darwin-x64@3.2.6': + '@lmdb/lmdb-darwin-x64@3.3.0': optional: true - '@lmdb/lmdb-linux-arm64@3.2.6': + '@lmdb/lmdb-linux-arm64@3.3.0': optional: true - '@lmdb/lmdb-linux-arm@3.2.6': + '@lmdb/lmdb-linux-arm@3.3.0': optional: true - '@lmdb/lmdb-linux-x64@3.2.6': + '@lmdb/lmdb-linux-x64@3.3.0': optional: true - '@lmdb/lmdb-win32-x64@3.2.6': + '@lmdb/lmdb-win32-arm64@3.3.0': + optional: true + + '@lmdb/lmdb-win32-x64@3.3.0': optional: true '@ltd/j-toml@1.38.0': {} @@ -24476,7 +25671,7 @@ snapshots: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.7.1 + semver: 7.7.2 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -24514,7 +25709,7 @@ snapshots: '@mdx-js/mdx@3.1.0(acorn@8.14.0)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -24564,7 +25759,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@module-federation/dts-plugin@0.9.1(bufferutil@4.0.7)(typescript@5.7.3)': + '@module-federation/dts-plugin@0.9.1(bufferutil@4.0.7)(typescript@5.8.3)': dependencies: '@module-federation/error-codes': 0.9.1 '@module-federation/managers': 0.9.1 @@ -24581,7 +25776,7 @@ snapshots: log4js: 6.9.1 node-schedule: 2.1.1 rambda: 9.3.0 - typescript: 5.7.3 + typescript: 5.8.3 ws: 8.18.0(bufferutil@4.0.7) transitivePeerDependencies: - bufferutil @@ -24589,23 +25784,23 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@module-federation/enhanced@0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.9.1 '@module-federation/data-prefetch': 0.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@module-federation/dts-plugin': 0.9.1(bufferutil@4.0.7)(typescript@5.7.3) + '@module-federation/dts-plugin': 0.9.1(bufferutil@4.0.7)(typescript@5.8.3) '@module-federation/error-codes': 0.9.1 '@module-federation/inject-external-runtime-core-plugin': 0.9.1(@module-federation/runtime-tools@0.9.1) '@module-federation/managers': 0.9.1 - '@module-federation/manifest': 0.9.1(bufferutil@4.0.7)(typescript@5.7.3) - '@module-federation/rspack': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(typescript@5.7.3) + '@module-federation/manifest': 0.9.1(bufferutil@4.0.7)(typescript@5.8.3) + '@module-federation/rspack': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(typescript@5.8.3) '@module-federation/runtime-tools': 0.9.1 '@module-federation/sdk': 0.9.1 btoa: 1.2.1 upath: 2.0.1 optionalDependencies: - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + typescript: 5.8.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -24629,9 +25824,9 @@ snapshots: find-pkg: 2.0.0 fs-extra: 9.1.0 - '@module-federation/manifest@0.9.1(bufferutil@4.0.7)(typescript@5.7.3)': + '@module-federation/manifest@0.9.1(bufferutil@4.0.7)(typescript@5.8.3)': dependencies: - '@module-federation/dts-plugin': 0.9.1(bufferutil@4.0.7)(typescript@5.7.3) + '@module-federation/dts-plugin': 0.9.1(bufferutil@4.0.7)(typescript@5.8.3) '@module-federation/managers': 0.9.1 '@module-federation/sdk': 0.9.1 chalk: 3.0.0 @@ -24644,16 +25839,16 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/node@2.6.27(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@module-federation/node@2.6.27(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: - '@module-federation/enhanced': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@module-federation/enhanced': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@module-federation/runtime': 0.9.1 '@module-federation/sdk': 0.9.1 - '@module-federation/utilities': 3.1.45(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@module-federation/utilities': 3.1.45(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) btoa: 1.2.1 encoding: 0.1.13 node-fetch: 2.7.0(encoding@0.1.13) - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) optionalDependencies: next: 14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0) react: 18.3.1 @@ -24667,18 +25862,18 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/rspack@0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(typescript@5.7.3)': + '@module-federation/rspack@0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.9.1 - '@module-federation/dts-plugin': 0.9.1(bufferutil@4.0.7)(typescript@5.7.3) + '@module-federation/dts-plugin': 0.9.1(bufferutil@4.0.7)(typescript@5.8.3) '@module-federation/inject-external-runtime-core-plugin': 0.9.1(@module-federation/runtime-tools@0.9.1) '@module-federation/managers': 0.9.1 - '@module-federation/manifest': 0.9.1(bufferutil@4.0.7)(typescript@5.7.3) + '@module-federation/manifest': 0.9.1(bufferutil@4.0.7)(typescript@5.8.3) '@module-federation/runtime-tools': 0.9.1 '@module-federation/sdk': 0.9.1 '@rspack/core': 1.3.9(@swc/helpers@0.5.11) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - bufferutil - debug @@ -24742,10 +25937,10 @@ snapshots: fs-extra: 9.1.0 resolve: 1.22.8 - '@module-federation/utilities@3.1.45(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@module-federation/utilities@3.1.45(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: '@module-federation/sdk': 0.9.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) optionalDependencies: next: 14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0) react: 18.3.1 @@ -24778,11 +25973,11 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@monodon/rust@2.3.0(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@monodon/rust@2.3.0(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: '@ltd/j-toml': 1.38.0 '@napi-rs/cli': 3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)) - '@nx/devkit': 20.2.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/devkit': 20.2.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) chalk: 4.1.2 npm-run-path: 4.0.1 semver: 7.5.4 @@ -24888,7 +26083,7 @@ snapshots: dependencies: '@napi-rs/lzma': 1.4.0 '@napi-rs/tar': 0.1.4 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -25165,7 +26360,7 @@ snapshots: '@napi-rs/wasm-tools-win32-ia32-msvc': 0.0.2 '@napi-rs/wasm-tools-win32-x64-msvc': 0.0.2 - '@nestjs/cli@10.4.5(@swc/cli@0.6.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(chokidar@3.6.0))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))': + '@nestjs/cli@10.4.5(@swc/cli@0.6.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(chokidar@3.6.0))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -25175,7 +26370,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -25184,7 +26379,7 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/cli': 0.6.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(chokidar@3.6.0) @@ -25194,39 +26389,39 @@ snapshots: - uglify-js - webpack-cli - '@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1)': + '@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: iterare: 1.2.1 reflect-metadata: 0.2.2 - rxjs: 7.8.1 + rxjs: 7.8.2 tslib: 2.5.3 uid: 2.0.2 - '@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1)': + '@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nuxtjs/opencollective': 0.3.2(encoding@0.1.13) fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 reflect-metadata: 0.2.2 - rxjs: 7.8.1 + rxjs: 7.8.2 tslib: 2.5.3 uid: 2.0.2 optionalDependencies: - '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3) + '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3) transitivePeerDependencies: - encoding - '@nestjs/mapped-types@1.2.2(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)': + '@nestjs/mapped-types@1.2.2(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2) reflect-metadata: 0.2.2 - '@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3)': + '@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3)': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) body-parser: 1.20.2 cors: 2.8.5 express: 4.18.2 @@ -25246,34 +26441,34 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/schematics@9.2.0(chokidar@3.6.0)(typescript@5.7.3)': + '@nestjs/schematics@9.2.0(chokidar@3.6.0)(typescript@5.8.3)': dependencies: '@angular-devkit/core': 16.0.1(chokidar@3.6.0) '@angular-devkit/schematics': 16.0.1(chokidar@3.6.0) jsonc-parser: 3.2.0 pluralize: 8.0.0 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - chokidar - '@nestjs/swagger@6.3.0(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)': + '@nestjs/swagger@6.3.0(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/mapped-types': 1.2.2(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2) + '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/mapped-types': 1.2.2(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2) js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 3.2.0 reflect-metadata: 0.2.2 swagger-ui-dist: 4.18.2 - '@nestjs/testing@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3))': + '@nestjs/testing@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3))': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/common': 9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.5.3 optionalDependencies: - '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@9.4.3) + '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@9.4.3) '@netlify/functions@2.8.1': dependencies: @@ -25319,11 +26514,11 @@ snapshots: '@next/swc-win32-x64-msvc@14.2.28': optional: true - '@ngtools/webpack@19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3))(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@ngtools/webpack@20.0.0-rc.3(@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3))(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)))': dependencies: - '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3) - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + '@angular/compiler-cli': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3) + typescript: 5.8.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) '@nodelib/fs.scandir@2.1.5': dependencies: @@ -25368,11 +26563,11 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: - semver: 7.7.1 + semver: 7.7.2 '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.1 + semver: 7.7.2 '@npmcli/git@4.1.0': dependencies: @@ -25382,7 +26577,7 @@ snapshots: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.1 + semver: 7.7.2 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -25396,7 +26591,7 @@ snapshots: proc-log: 5.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.1 + semver: 7.7.2 which: 5.0.0 transitivePeerDependencies: - bluebird @@ -25416,7 +26611,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 proc-log: 3.0.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - bluebird @@ -25428,7 +26623,7 @@ snapshots: json-parse-even-better-errors: 4.0.0 normalize-package-data: 7.0.0 proc-log: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - bluebird @@ -25456,12 +26651,12 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@1.4.2(magicast@0.3.5)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3)': + '@nuxt/devtools-kit@1.4.2(magicast@0.3.5)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.2(rollup@4.22.0)(webpack-sources@3.2.3) execa: 7.2.0 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - magicast - rollup @@ -25479,15 +26674,15 @@ snapshots: pkg-types: 1.2.0 prompts: 2.4.2 rc9: 2.1.2 - semver: 7.7.1 + semver: 7.7.2 - '@nuxt/devtools@1.4.2(bufferutil@4.0.7)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(vue@3.5.6(typescript@5.7.3))(webpack-sources@3.2.3)': + '@nuxt/devtools@1.4.2(bufferutil@4.0.7)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(vue@3.5.6(typescript@5.8.3))(webpack-sources@3.2.3)': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.4.2(magicast@0.3.5)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3) + '@nuxt/devtools-kit': 1.4.2(magicast@0.3.5)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3) '@nuxt/devtools-wizard': 1.4.2 '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3) - '@vue/devtools-core': 7.4.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(vue@3.5.6(typescript@5.7.3)) + '@vue/devtools-core': 7.4.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(vue@3.5.6(typescript@5.8.3)) '@vue/devtools-kit': 7.4.4 birpc: 0.2.17 consola: 3.2.3 @@ -25511,14 +26706,14 @@ snapshots: pkg-types: 1.2.0 rc9: 2.1.2 scule: 1.3.0 - semver: 7.7.1 + semver: 7.7.2 simple-git: 3.27.0 sirv: 2.0.4 - tinyglobby: 0.2.12 + tinyglobby: 0.2.13 unimport: 3.12.0(rollup@4.22.0)(webpack-sources@3.2.3) - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) - vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) - vite-plugin-vue-inspector: 5.2.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) + vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) + vite-plugin-vue-inspector: 5.2.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) which: 3.0.1 ws: 8.18.0(bufferutil@4.0.7) transitivePeerDependencies: @@ -25602,13 +26797,13 @@ snapshots: - supports-color - webpack-sources - '@nuxt/vite-builder@3.13.2(@types/node@20.16.10)(eslint@8.57.0)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3)(vue@3.5.6(typescript@5.7.3))(webpack-sources@3.2.3)': + '@nuxt/vite-builder@3.13.2(@types/node@20.16.10)(eslint@8.57.0)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3)(vue@3.5.6(typescript@5.8.3))(webpack-sources@3.2.3)': dependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3) '@rollup/plugin-replace': 5.0.7(rollup@4.22.0) - '@vitejs/plugin-vue': 5.1.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0))(vue@3.5.6(typescript@5.7.3)) - '@vitejs/plugin-vue-jsx': 4.0.1(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0))(vue@3.5.6(typescript@5.7.3)) - autoprefixer: 10.4.20(postcss@8.5.3) + '@vitejs/plugin-vue': 5.1.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1))(vue@3.5.6(typescript@5.8.3)) + '@vitejs/plugin-vue-jsx': 4.0.1(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1))(vue@3.5.6(typescript@5.8.3)) + autoprefixer: 10.4.21(postcss@8.5.3) clear: 0.1.0 consola: 3.2.3 cssnano: 7.0.6(postcss@8.5.3) @@ -25633,10 +26828,10 @@ snapshots: ufo: 1.5.4 unenv: 1.10.0 unplugin: 1.14.1(webpack-sources@3.2.3) - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) - vite-node: 2.1.1(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) - vite-plugin-checker: 0.8.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.7.3)(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)) - vue: 3.5.6(typescript@5.7.3) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + vite-node: 2.1.1(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + vite-plugin-checker: 0.8.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.8.3)(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)) + vue: 3.5.6(typescript@5.8.3) vue-bundle-renderer: 2.1.0 transitivePeerDependencies: - '@biomejs/biome' @@ -25670,28 +26865,28 @@ snapshots: transitivePeerDependencies: - encoding - '@nx/angular@21.1.0-beta.2(qbwr3m6hc3poqhlzwn26ht3bjm)': + '@nx/angular@21.1.0-beta.2(fyq5cnj7dng3hmfeopn2druo44)': dependencies: - '@angular-devkit/build-angular': 19.2.0(cyjoxstszy672tff4k3podiddq) - '@angular-devkit/core': 19.2.0(chokidar@3.6.0) - '@angular-devkit/schematics': 19.2.0(chokidar@3.6.0) - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/module-federation': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - '@nx/rspack': 21.1.0-beta.2(hubv5tdg3ovp6w66rxdwysfxjy) - '@nx/web': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/webpack': 21.1.0-beta.2(@babel/traverse@7.26.9)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - '@nx/workspace': 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) - '@schematics/angular': 19.2.0(chokidar@3.6.0) - '@typescript-eslint/type-utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@angular-devkit/build-angular': 20.0.0-rc.3(e3mdzg6cefq7ohkt2yqalrfi6a) + '@angular-devkit/core': 20.0.0-rc.3(chokidar@3.6.0) + '@angular-devkit/schematics': 20.0.0-rc.3(chokidar@3.6.0) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/module-federation': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + '@nx/rspack': 21.1.0-beta.2(2ohclxkdl5ckzsxkckwm4z2bou) + '@nx/web': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/webpack': 21.1.0-beta.2(@babel/traverse@7.27.1)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + '@nx/workspace': 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) + '@schematics/angular': 20.0.0-rc.3(chokidar@3.6.0) + '@typescript-eslint/type-utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) enquirer: 2.3.6 magic-string: 0.30.17 picocolors: 1.1.1 picomatch: 4.0.2 piscina: 4.8.0 - rxjs: 7.8.1 + rxjs: 7.8.2 semver: 7.7.1 tslib: 2.8.1 webpack-merge: 5.10.0 @@ -25731,26 +26926,26 @@ snapshots: - vue-tsc - webpack-cli - '@nx/conformance@2.0.1(@nx/js@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/conformance@2.0.1(@nx/js@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: - '@nx/devkit': 21.0.0(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 21.0.0(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@nx/key': 2.0.1 ajv: 8.17.1 esbuild: 0.21.5 - nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) picocolors: 1.1.1 semver: 7.5.4 yargs: 17.7.2 transitivePeerDependencies: - debug - '@nx/cypress@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/cypress@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) detect-port: 1.6.1 semver: 7.7.1 tree-kill: 1.2.2 @@ -25769,55 +26964,55 @@ snapshots: - typescript - verdaccio - '@nx/devkit@20.2.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/devkit@20.2.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) semver: 7.7.1 tmp: 0.2.3 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/devkit@21.0.0(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/devkit@21.0.0(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) semver: 7.7.1 tmp: 0.2.3 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/devkit@21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/devkit@21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) semver: 7.7.1 tmp: 0.2.3 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/enterprise-cloud@2.0.1(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/enterprise-cloud@2.0.1(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: - '@nx/devkit': 21.0.0(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/devkit': 21.0.0(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/key': 2.0.1 - nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) semver: 7.5.4 transitivePeerDependencies: - debug - '@nx/esbuild@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/esbuild@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) picocolors: 1.1.1 tinyglobby: 0.2.12 tsconfig-paths: 4.2.0 @@ -25833,13 +27028,13 @@ snapshots: - supports-color - verdaccio - '@nx/eslint-plugin@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-config-prettier@10.1.2(eslint@8.57.0))(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/eslint-plugin@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint-config-prettier@10.1.2(eslint@8.57.0))(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/type-utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@typescript-eslint/parser': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) chalk: 4.1.2 confusing-browser-globals: 1.0.11 globals: 15.15.0 @@ -25859,10 +27054,10 @@ snapshots: - typescript - verdaccio - '@nx/eslint@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/eslint@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) eslint: 8.57.0 semver: 7.7.1 tslib: 2.8.1 @@ -25878,23 +27073,23 @@ snapshots: - supports-color - verdaccio - '@nx/graph@0.4.2(@nx/devkit@21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@nx/graph@0.4.2(@nx/devkit@21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router-dom: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nx/jest@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/jest@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) identity-obj-proxy: 3.0.0 - jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-resolve: 29.7.0 jest-util: 29.7.0 minimatch: 9.0.3 @@ -25917,7 +27112,7 @@ snapshots: - typescript - verdaccio - '@nx/js@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/js@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@babel/core': 7.26.9 '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.9) @@ -25926,12 +27121,12 @@ snapshots: '@babel/preset-env': 7.26.9(@babel/core@7.26.9) '@babel/preset-typescript': 7.24.7(@babel/core@7.26.9) '@babel/runtime': 7.26.9 - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/workspace': 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/workspace': 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.26.9) babel-plugin-macros: 3.1.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.9)(@babel/traverse@7.26.9) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.9)(@babel/traverse@7.27.1) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -26006,20 +27201,20 @@ snapshots: transitivePeerDependencies: - debug - '@nx/module-federation@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))': + '@nx/module-federation@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))': dependencies: - '@module-federation/enhanced': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@module-federation/node': 2.6.27(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@module-federation/enhanced': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + '@module-federation/node': 2.6.27(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@module-federation/sdk': 0.9.1 - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/web': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/web': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) '@rspack/core': 1.3.9(@swc/helpers@0.5.11) express: 4.21.2 http-proxy-middleware: 3.0.3 picocolors: 1.1.1 tslib: 2.8.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -26040,19 +27235,19 @@ snapshots: - vue-tsc - webpack-cli - '@nx/next@21.1.0-beta.2(dgrrpoiol2k2rjjaivrabkbbcu)': + '@nx/next@21.1.0-beta.2(kedstl3f36vr6wsjei4qwqsd4i)': dependencies: '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/react': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@zkochan/js-yaml@0.0.7)(bufferutil@4.0.7)(esbuild@0.25.0)(eslint@8.57.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@nx/web': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/webpack': 21.1.0-beta.2(@babel/traverse@7.26.9)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) - '@svgr/webpack': 8.1.0(typescript@5.7.3) - copy-webpack-plugin: 10.2.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - file-loader: 6.2.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/react': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@zkochan/js-yaml@0.0.7)(bufferutil@4.0.7)(esbuild@0.25.0)(eslint@8.57.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + '@nx/web': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/webpack': 21.1.0-beta.2(@babel/traverse@7.27.1)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) + '@svgr/webpack': 8.1.0(typescript@5.8.3) + copy-webpack-plugin: 10.2.4(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + file-loader: 6.2.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) ignore: 5.3.2 next: 14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0) semver: 7.7.1 @@ -26120,12 +27315,12 @@ snapshots: '@nx/nx-win32-x64-msvc@21.1.0-beta.2': optional: true - '@nx/playwright@21.1.0-beta.2(@babel/traverse@7.26.9)(@playwright/test@1.47.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/playwright@21.1.0-beta.2(@babel/traverse@7.27.1)(@playwright/test@1.47.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) minimatch: 9.0.3 tslib: 2.8.1 optionalDependencies: @@ -26148,17 +27343,17 @@ snapshots: transitivePeerDependencies: - debug - '@nx/react@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@zkochan/js-yaml@0.0.7)(bufferutil@4.0.7)(esbuild@0.25.0)(eslint@8.57.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@nx/react@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@zkochan/js-yaml@0.0.7)(bufferutil@4.0.7)(esbuild@0.25.0)(eslint@8.57.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/module-federation': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - '@nx/web': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) - '@svgr/webpack': 8.1.0(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/module-federation': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + '@nx/web': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) + '@svgr/webpack': 8.1.0(typescript@5.8.3) express: 4.21.2 - file-loader: 6.2.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + file-loader: 6.2.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) http-proxy-middleware: 3.0.3 minimatch: 9.0.3 picocolors: 1.1.1 @@ -26187,11 +27382,11 @@ snapshots: - webpack - webpack-cli - '@nx/rsbuild@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/rsbuild@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) '@rsbuild/core': 1.1.8 minimatch: 9.0.3 tslib: 2.8.1 @@ -26205,40 +27400,40 @@ snapshots: - typescript - verdaccio - '@nx/rspack@21.1.0-beta.2(hubv5tdg3ovp6w66rxdwysfxjy)': + '@nx/rspack@21.1.0-beta.2(2ohclxkdl5ckzsxkckwm4z2bou)': dependencies: - '@module-federation/enhanced': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@module-federation/node': 2.6.27(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/module-federation': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - '@nx/web': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@module-federation/enhanced': 0.9.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + '@module-federation/node': 2.6.27(@rspack/core@1.3.9(@swc/helpers@0.5.11))(bufferutil@4.0.7)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/module-federation': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(bufferutil@4.0.7)(esbuild@0.25.0)(next@14.2.28(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.47.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + '@nx/web': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) '@rspack/core': 1.3.9(@swc/helpers@0.5.11) - '@rspack/dev-server': 1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@types/express@4.17.21)(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@rspack/dev-server': 1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@types/express@4.17.21)(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.10.0) autoprefixer: 10.4.13(postcss@8.4.38) browserslist: 4.24.4 - css-loader: 6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + css-loader: 6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) enquirer: 2.3.6 express: 4.21.2 http-proxy-middleware: 3.0.3 - less-loader: 11.1.0(less@4.1.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - license-webpack-plugin: 4.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + less-loader: 11.1.0(less@4.1.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + license-webpack-plugin: 4.0.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) loader-utils: 2.0.3 parse5: 4.0.0 picocolors: 1.1.1 postcss: 8.4.38 postcss-import: 14.1.0(postcss@8.4.38) - postcss-loader: 8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + postcss-loader: 8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) sass: 1.85.0 sass-embedded: 1.85.1 - sass-loader: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - source-map-loader: 5.0.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - style-loader: 3.3.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - ts-checker-rspack-plugin: 1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(typescript@5.7.3) + sass-loader: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + source-map-loader: 5.0.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + style-loader: 3.3.4(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + ts-checker-rspack-plugin: 1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(typescript@5.8.3) tslib: 2.8.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) webpack-node-externals: 3.0.0 transitivePeerDependencies: - '@babel/traverse' @@ -26264,13 +27459,13 @@ snapshots: - vue-tsc - webpack-cli - '@nx/storybook@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/storybook@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/cypress': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@nx/cypress': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(cypress@14.3.0)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) semver: 7.7.1 tslib: 2.8.1 transitivePeerDependencies: @@ -26286,19 +27481,19 @@ snapshots: - typescript - verdaccio - '@nx/vite@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@nx/vite@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) '@swc/helpers': 0.5.11 ajv: 8.17.1 enquirer: 2.3.6 picomatch: 4.0.2 semver: 7.7.1 tsconfig-paths: 4.2.0 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) + vitest: 3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -26309,10 +27504,10 @@ snapshots: - typescript - verdaccio - '@nx/web@21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': + '@nx/web@21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) detect-port: 1.6.1 http-server: 14.1.0 picocolors: 1.1.1 @@ -26326,46 +27521,46 @@ snapshots: - supports-color - verdaccio - '@nx/webpack@21.1.0-beta.2(@babel/traverse@7.26.9)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.7.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))': + '@nx/webpack@21.1.0-beta.2(@babel/traverse@7.27.1)(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(bufferutil@4.0.7)(esbuild@0.25.0)(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.8.3)(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))': dependencies: '@babel/core': 7.26.9 - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 21.1.0-beta.2(@babel/traverse@7.26.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.7.3) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 21.1.0-beta.2(@babel/traverse@7.27.1)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@6.0.5(encoding@0.1.13)(typanion@3.14.0)) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) ajv: 8.17.1 autoprefixer: 10.4.13(postcss@8.4.38) - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) browserslist: 4.24.4 - copy-webpack-plugin: 10.2.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - css-loader: 6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - css-minimizer-webpack-plugin: 5.0.1(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + copy-webpack-plugin: 10.2.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + css-loader: 6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + css-minimizer-webpack-plugin: 5.0.1(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.8.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) less: 4.1.3 - less-loader: 11.1.0(less@4.1.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - license-webpack-plugin: 4.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + less-loader: 11.1.0(less@4.1.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + license-webpack-plugin: 4.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) loader-utils: 2.0.3 - mini-css-extract-plugin: 2.4.7(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + mini-css-extract-plugin: 2.4.7(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) parse5: 4.0.0 picocolors: 1.1.1 postcss: 8.4.38 postcss-import: 14.1.0(postcss@8.4.38) - postcss-loader: 6.2.1(postcss@8.4.38)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - rxjs: 7.8.1 + postcss-loader: 6.2.1(postcss@8.4.38)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + rxjs: 7.8.2 sass: 1.85.0 sass-embedded: 1.85.1 - sass-loader: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - source-map-loader: 5.0.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - style-loader: 3.3.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + sass-loader: 16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + source-map-loader: 5.0.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + style-loader: 3.3.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) stylus: 0.64.0 - stylus-loader: 7.1.3(stylus@0.64.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - ts-loader: 9.5.1(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + stylus-loader: 7.1.3(stylus@0.64.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + ts-loader: 9.5.1(typescript@5.8.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) tsconfig-paths-webpack-plugin: 4.0.0 tslib: 2.8.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) webpack-node-externals: 3.0.0 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) transitivePeerDependencies: - '@babel/traverse' - '@parcel/css' @@ -26390,13 +27585,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@nx/workspace@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))': + '@nx/workspace@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))': dependencies: - '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/devkit': 21.1.0-beta.2(nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) picomatch: 4.0.2 tslib: 2.8.1 yargs-parser: 21.1.1 @@ -26705,7 +27900,7 @@ snapshots: '@types/shimmer': 1.2.0 import-in-the-middle: 1.13.0 require-in-the-middle: 7.5.1 - semver: 7.7.1 + semver: 7.7.2 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -26827,10 +28022,10 @@ snapshots: '@parcel/watcher-win32-ia32': 2.4.1 '@parcel/watcher-win32-x64': 2.4.1 - '@phenomnomnominal/tsquery@5.0.1(typescript@5.7.3)': + '@phenomnomnominal/tsquery@5.0.1(typescript@5.8.3)': dependencies: esquery: 1.6.0 - typescript: 5.7.3 + typescript: 5.8.3 '@pkgjs/parseargs@0.11.0': optional: true @@ -26839,7 +28034,7 @@ snapshots: dependencies: playwright: 1.47.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.10.0)(type-fest@3.13.1)(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack-hot-middleware@2.26.1)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.10.0)(type-fest@3.13.1)(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8))(webpack-hot-middleware@2.26.1)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.38.1 @@ -26849,10 +28044,10 @@ snapshots: react-refresh: 0.10.0 schema-utils: 4.2.0 source-map: 0.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) optionalDependencies: type-fest: 3.13.1 - webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8) webpack-hot-middleware: 2.26.1 '@pnpm/lockfile-types@6.0.0': @@ -27627,7 +28822,7 @@ snapshots: react: 18.3.1 react-redux: 8.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) - '@remix-run/dev@2.14.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(bufferutil@4.0.7)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3))(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@remix-run/dev@2.14.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(bufferutil@4.0.7)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3))(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@babel/core': 7.26.0 '@babel/generator': 7.26.2 @@ -27639,12 +28834,12 @@ snapshots: '@babel/types': 7.26.0 '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.14.0(typescript@5.7.3) - '@remix-run/react': 2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3) + '@remix-run/node': 2.14.0(typescript@5.8.3) + '@remix-run/react': 2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) '@remix-run/router': 1.21.0 - '@remix-run/server-runtime': 2.14.0(typescript@5.7.3) + '@remix-run/server-runtime': 2.14.0(typescript@5.8.3) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + '@vanilla-extract/integration': 6.5.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -27671,7 +28866,7 @@ snapshots: pidtree: 0.6.0 postcss: 8.4.38 postcss-discard-duplicates: 5.1.0(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) postcss-modules: 6.0.0(postcss@8.4.38) prettier: 2.8.8 pretty-ms: 7.0.1 @@ -27682,12 +28877,12 @@ snapshots: set-cookie-parser: 2.7.0 tar-fs: 2.1.1 tsconfig-paths: 4.2.0 - valibot: 0.41.0(typescript@5.7.3) - vite-node: 1.6.0(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + valibot: 0.41.0(typescript@5.8.3) + vite-node: 1.6.0(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) ws: 7.5.10(bufferutil@4.0.7) optionalDependencies: - typescript: 5.7.3 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + typescript: 5.8.3 + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -27704,9 +28899,9 @@ snapshots: - ts-node - utf-8-validate - '@remix-run/node@2.14.0(typescript@5.7.3)': + '@remix-run/node@2.14.0(typescript@5.8.3)': dependencies: - '@remix-run/server-runtime': 2.14.0(typescript@5.7.3) + '@remix-run/server-runtime': 2.14.0(typescript@5.8.3) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 cookie-signature: 1.2.1 @@ -27714,25 +28909,25 @@ snapshots: stream-slice: 0.1.2 undici: 6.19.8 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 - '@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)': + '@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': dependencies: '@remix-run/router': 1.19.2 - '@remix-run/server-runtime': 2.12.0(typescript@5.7.3) + '@remix-run/server-runtime': 2.12.0(typescript@5.8.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.26.2(react@18.3.1) react-router-dom: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) turbo-stream: 2.4.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 '@remix-run/router@1.19.2': {} '@remix-run/router@1.21.0': {} - '@remix-run/server-runtime@2.12.0(typescript@5.7.3)': + '@remix-run/server-runtime@2.12.0(typescript@5.8.3)': dependencies: '@remix-run/router': 1.19.2 '@types/cookie': 0.6.0 @@ -27742,9 +28937,9 @@ snapshots: source-map: 0.7.4 turbo-stream: 2.4.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 - '@remix-run/server-runtime@2.14.0(typescript@5.7.3)': + '@remix-run/server-runtime@2.14.0(typescript@5.8.3)': dependencies: '@remix-run/router': 1.21.0 '@types/cookie': 0.6.0 @@ -27754,7 +28949,7 @@ snapshots: source-map: 0.7.4 turbo-stream: 2.4.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 '@remix-run/web-blob@3.1.0': dependencies: @@ -27798,11 +28993,11 @@ snapshots: '@lezer/javascript': 1.4.21 '@lezer/lr': 1.4.2 - '@rollup/plugin-alias@5.1.0(rollup@4.30.1)': + '@rollup/plugin-alias@5.1.0(rollup@4.40.2)': dependencies: slash: 4.0.0 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.2 '@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.22.0)': dependencies: @@ -27826,16 +29021,16 @@ snapshots: optionalDependencies: rollup: 4.22.0 - '@rollup/plugin-commonjs@25.0.8(rollup@4.30.1)': + '@rollup/plugin-commonjs@25.0.8(rollup@4.40.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.30.1) + '@rollup/pluginutils': 5.1.0(rollup@4.40.2) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.11 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.2 '@rollup/plugin-image@3.0.3(rollup@4.22.0)': dependencies: @@ -27844,13 +29039,13 @@ snapshots: optionalDependencies: rollup: 4.22.0 - '@rollup/plugin-inject@5.0.5(rollup@4.30.1)': + '@rollup/plugin-inject@5.0.5(rollup@4.40.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.30.1) + '@rollup/pluginutils': 5.1.0(rollup@4.40.2) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.2 '@rollup/plugin-json@6.1.0(rollup@4.22.0)': dependencies: @@ -27858,17 +29053,11 @@ snapshots: optionalDependencies: rollup: 4.22.0 - '@rollup/plugin-json@6.1.0(rollup@4.30.1)': + '@rollup/plugin-json@6.1.0(rollup@4.40.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.30.1) + '@rollup/pluginutils': 5.1.0(rollup@4.40.2) optionalDependencies: - rollup: 4.30.1 - - '@rollup/plugin-json@6.1.0(rollup@4.34.8)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.34.8) - optionalDependencies: - rollup: 4.34.8 + rollup: 4.40.2 '@rollup/plugin-node-resolve@15.2.3(rollup@4.22.0)': dependencies: @@ -27881,16 +29070,16 @@ snapshots: optionalDependencies: rollup: 4.22.0 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.30.1)': + '@rollup/plugin-node-resolve@15.2.3(rollup@4.40.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.30.1) + '@rollup/pluginutils': 5.1.0(rollup@4.40.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.2 '@rollup/plugin-replace@5.0.7(rollup@4.22.0)': dependencies: @@ -27899,20 +29088,20 @@ snapshots: optionalDependencies: rollup: 4.22.0 - '@rollup/plugin-replace@5.0.7(rollup@4.30.1)': + '@rollup/plugin-replace@5.0.7(rollup@4.40.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.30.1) + '@rollup/pluginutils': 5.1.0(rollup@4.40.2) magic-string: 0.30.17 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.2 - '@rollup/plugin-terser@0.4.4(rollup@4.30.1)': + '@rollup/plugin-terser@0.4.4(rollup@4.40.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.39.0 + terser: 5.39.1 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.2 '@rollup/plugin-url@8.0.2(rollup@4.22.0)': dependencies: @@ -27935,182 +29124,177 @@ snapshots: optionalDependencies: rollup: 4.22.0 - '@rollup/pluginutils@5.1.0(rollup@4.30.1)': + '@rollup/pluginutils@5.1.0(rollup@4.40.2)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.30.1 - - '@rollup/pluginutils@5.1.0(rollup@4.34.8)': - dependencies: - '@types/estree': 1.0.6 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.34.8 + rollup: 4.40.2 '@rollup/rollup-android-arm-eabi@4.22.0': optional: true - '@rollup/rollup-android-arm-eabi@4.30.1': - optional: true - '@rollup/rollup-android-arm-eabi@4.34.8': optional: true - '@rollup/rollup-android-arm64@4.22.0': + '@rollup/rollup-android-arm-eabi@4.40.2': optional: true - '@rollup/rollup-android-arm64@4.30.1': + '@rollup/rollup-android-arm64@4.22.0': optional: true '@rollup/rollup-android-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-arm64@4.22.0': + '@rollup/rollup-android-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-arm64@4.30.1': + '@rollup/rollup-darwin-arm64@4.22.0': optional: true '@rollup/rollup-darwin-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-x64@4.22.0': + '@rollup/rollup-darwin-arm64@4.40.2': optional: true - '@rollup/rollup-darwin-x64@4.30.1': + '@rollup/rollup-darwin-x64@4.22.0': optional: true '@rollup/rollup-darwin-x64@4.34.8': optional: true - '@rollup/rollup-freebsd-arm64@4.30.1': + '@rollup/rollup-darwin-x64@4.40.2': optional: true '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - '@rollup/rollup-freebsd-x64@4.30.1': + '@rollup/rollup-freebsd-arm64@4.40.2': optional: true '@rollup/rollup-freebsd-x64@4.34.8': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.22.0': + '@rollup/rollup-freebsd-x64@4.40.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + '@rollup/rollup-linux-arm-gnueabihf@4.22.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.22.0': + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.30.1': + '@rollup/rollup-linux-arm-musleabihf@4.22.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm64-gnu@4.22.0': + '@rollup/rollup-linux-arm-musleabihf@4.40.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.30.1': + '@rollup/rollup-linux-arm64-gnu@4.22.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-arm64-musl@4.22.0': + '@rollup/rollup-linux-arm64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.30.1': + '@rollup/rollup-linux-arm64-musl@4.22.0': optional: true '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + '@rollup/rollup-linux-arm64-musl@4.40.2': optional: true '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.22.0': + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.22.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.22.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-gnu@4.22.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-s390x-gnu@4.22.0': + '@rollup/rollup-linux-riscv64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-musl@4.40.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.22.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-gnu@4.22.0': + '@rollup/rollup-linux-s390x-gnu@4.40.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.30.1': + '@rollup/rollup-linux-x64-gnu@4.22.0': optional: true '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-musl@4.22.0': + '@rollup/rollup-linux-x64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-x64-musl@4.30.1': + '@rollup/rollup-linux-x64-musl@4.22.0': optional: true '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - '@rollup/rollup-win32-arm64-msvc@4.22.0': + '@rollup/rollup-linux-x64-musl@4.40.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.30.1': + '@rollup/rollup-win32-arm64-msvc@4.22.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - '@rollup/rollup-win32-ia32-msvc@4.22.0': + '@rollup/rollup-win32-arm64-msvc@4.40.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.30.1': + '@rollup/rollup-win32-ia32-msvc@4.22.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true + '@rollup/rollup-win32-ia32-msvc@4.40.2': + optional: true + '@rollup/rollup-win32-x64-msvc@4.22.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.30.1': + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.8': + '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true '@rollup/wasm-node@4.27.4': @@ -28222,7 +29406,7 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.11 - '@rspack/dev-server@1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@types/express@4.17.21)(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@rspack/dev-server@1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@types/express@4.17.21)(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) chokidar: 3.6.0 @@ -28230,8 +29414,8 @@ snapshots: http-proxy-middleware: 2.0.7(@types/express@4.17.21) mime-types: 2.1.35 p-retry: 6.2.0 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - webpack-dev-server: 5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-dev-middleware: 7.4.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + webpack-dev-server: 5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) ws: 8.18.0(bufferutil@4.0.7) transitivePeerDependencies: - '@types/express' @@ -28261,10 +29445,10 @@ snapshots: '@rushstack/eslint-patch@1.10.4': {} - '@schematics/angular@19.2.0(chokidar@3.6.0)': + '@schematics/angular@20.0.0-rc.3(chokidar@3.6.0)': dependencies: - '@angular-devkit/core': 19.2.0(chokidar@3.6.0) - '@angular-devkit/schematics': 19.2.0(chokidar@3.6.0) + '@angular-devkit/core': 20.0.0-rc.3(chokidar@3.6.0) + '@angular-devkit/schematics': 20.0.0-rc.3(chokidar@3.6.0) jsonc-parser: 3.3.1 transitivePeerDependencies: - chokidar @@ -28453,17 +29637,17 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3)': + '@storybook/builder-vite@8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3)': dependencies: '@storybook/csf-plugin': 8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(webpack-sources@3.2.3) browser-assert: 1.2.1 storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) ts-dedent: 2.2.0 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - webpack-sources - '@storybook/builder-webpack5@8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))': + '@storybook/builder-webpack5@8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))': dependencies: '@storybook/core-webpack': 8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)) '@types/node': 22.5.5 @@ -28472,27 +29656,27 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.1 constants-browserify: 1.0.0 - css-loader: 6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + css-loader: 6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) es-module-lexer: 1.6.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - html-webpack-plugin: 5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + html-webpack-plugin: 5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.1 storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) - style-loader: 3.3.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + style-loader: 3.3.4(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-dev-middleware: 6.1.3(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - '@rspack/core' - '@swc/core' @@ -28588,11 +29772,11 @@ snapshots: dependencies: storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) - '@storybook/preset-react-webpack@8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))': + '@storybook/preset-react-webpack@8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))': dependencies: '@storybook/core-webpack': 8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)) - '@storybook/react': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@storybook/react': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) '@types/node': 22.5.5 '@types/semver': 7.5.8 find-up: 5.0.0 @@ -28604,9 +29788,9 @@ snapshots: semver: 7.7.1 storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) tsconfig-paths: 4.2.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - '@storybook/test' - '@swc/core' @@ -28619,17 +29803,17 @@ snapshots: dependencies: storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: debug: 4.4.0(supports-color@8.1.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 micromatch: 4.0.8 - react-docgen-typescript: 2.2.2(typescript@5.7.3) + react-docgen-typescript: 2.2.2(typescript@5.8.3) tslib: 2.8.1 - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + typescript: 5.8.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -28639,12 +29823,12 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) - '@storybook/react-vite@8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.22.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3)': + '@storybook/react-vite@8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.22.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3)': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@rollup/pluginutils': 5.1.0(rollup@4.22.0) - '@storybook/builder-vite': 8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3) - '@storybook/react': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3) + '@storybook/builder-vite': 8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3) + '@storybook/react': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3) find-up: 5.0.0 magic-string: 0.30.12 react: 18.3.1 @@ -28653,7 +29837,7 @@ snapshots: resolve: 1.22.8 storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) tsconfig-paths: 4.2.0 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - '@storybook/test' - rollup @@ -28661,17 +29845,17 @@ snapshots: - typescript - webpack-sources - '@storybook/react-webpack5@8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))': + '@storybook/react-webpack5@8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))': dependencies: - '@storybook/builder-webpack5': 8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - '@storybook/preset-react-webpack': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - '@storybook/react': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3) + '@storybook/builder-webpack5': 8.4.6(@rspack/core@1.3.9(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + '@storybook/preset-react-webpack': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + '@storybook/react': 8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3) '@types/node': 22.5.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - '@rspack/core' - '@storybook/test' @@ -28681,7 +29865,7 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.7.3)': + '@storybook/react@8.4.6(@storybook/test@8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))(typescript@5.8.3)': dependencies: '@storybook/components': 8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)) '@storybook/global': 5.0.0 @@ -28694,7 +29878,7 @@ snapshots: storybook: 8.4.6(bufferutil@4.0.7)(prettier@2.8.8) optionalDependencies: '@storybook/test': 8.5.1(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8)) - typescript: 5.7.3 + typescript: 5.8.3 '@storybook/test@8.4.6(storybook@8.4.6(bufferutil@4.0.7)(prettier@2.8.8))': dependencies: @@ -28818,12 +30002,12 @@ snapshots: '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.25.2) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.25.2) - '@svgr/core@8.1.0(typescript@5.7.3)': + '@svgr/core@8.1.0(typescript@5.8.3)': dependencies: '@babel/core': 7.25.2 '@svgr/babel-preset': 8.1.0(@babel/core@7.25.2) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.7.3) + cosmiconfig: 8.3.6(typescript@5.8.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -28834,26 +30018,26 @@ snapshots: '@babel/types': 7.26.0 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.7.3))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': dependencies: '@babel/core': 7.25.2 '@svgr/babel-preset': 8.1.0(@babel/core@7.25.2) - '@svgr/core': 8.1.0(typescript@5.7.3) + '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.7.3))(typescript@5.7.3)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@svgr/core': 8.1.0(typescript@5.7.3) - cosmiconfig: 8.3.6(typescript@5.7.3) + '@svgr/core': 8.1.0(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.8.3) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/rollup@8.1.0(rollup@4.22.0)(typescript@5.7.3)': + '@svgr/rollup@8.1.0(rollup@4.22.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-constant-elements': 7.25.1(@babel/core@7.25.2) @@ -28861,24 +30045,24 @@ snapshots: '@babel/preset-react': 7.24.7(@babel/core@7.25.2) '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) '@rollup/pluginutils': 5.1.0(rollup@4.22.0) - '@svgr/core': 8.1.0(typescript@5.7.3) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3))(typescript@5.7.3) + '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - rollup - supports-color - typescript - '@svgr/webpack@8.1.0(typescript@5.7.3)': + '@svgr/webpack@8.1.0(typescript@5.8.3)': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-constant-elements': 7.25.1(@babel/core@7.25.2) '@babel/preset-env': 7.25.4(@babel/core@7.25.2) '@babel/preset-react': 7.24.7(@babel/core@7.25.2) '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@svgr/core': 8.1.0(typescript@5.7.3) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3))(typescript@5.7.3) + '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - supports-color - typescript @@ -28888,7 +30072,7 @@ snapshots: '@swc/core': 1.5.7(@swc/helpers@0.5.11) '@swc/types': 0.1.21 - '@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3)': + '@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3)': dependencies: '@swc-node/core': 1.13.3(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21) '@swc-node/sourcemap-support': 0.5.1 @@ -28897,7 +30081,7 @@ snapshots: debug: 4.3.7 pirates: 4.0.6 tslib: 2.7.0 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - '@swc/types' - supports-color @@ -29003,22 +30187,22 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))': + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))': dependencies: - tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))': + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) - '@tailwindcss/typography@0.5.13(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))': + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -29031,7 +30215,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -29084,23 +30268,23 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 - '@tutorialkit/astro@1.5.0(@types/node@20.16.10)(@types/react-dom@18.3.0)(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3))(less@4.1.3)(postcss@8.4.38)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@tutorialkit/astro@1.5.0(@types/node@20.16.10)(@types/react-dom@18.3.0)(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3))(less@4.1.3)(postcss@8.4.38)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: - '@astrojs/mdx': 3.1.9(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3)) - '@astrojs/react': 3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.20)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + '@astrojs/mdx': 3.1.9(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3)) + '@astrojs/react': 3.6.3(@types/node@20.16.10)(@types/react-dom@18.3.0)(@types/react@18.3.20)(less@4.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) '@expressive-code/plugin-collapsible-sections': 0.35.6 '@expressive-code/plugin-line-numbers': 0.35.6 '@nanostores/react': 0.7.2(nanostores@0.10.3)(react@18.3.1) '@stackblitz/sdk': 1.11.0 - '@tutorialkit/react': 1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.20)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@tutorialkit/react': 1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.20)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@tutorialkit/runtime': 1.5.0 - '@tutorialkit/theme': 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@tutorialkit/theme': 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@tutorialkit/types': 1.5.0 '@types/react': 18.3.20 '@unocss/reset': 0.62.4 '@webcontainer/api': 1.5.1 - astro: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3) - astro-expressive-code: 0.35.6(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3)) + astro: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3) + astro-expressive-code: 0.35.6(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3)) chokidar: 3.6.0 fast-glob: 3.3.3 front-matter: 4.0.2 @@ -29114,7 +30298,7 @@ snapshots: remark-directive: 3.0.1 unified: 11.0.5 unist-util-visit: 5.0.0 - unocss: 0.59.4(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + unocss: 0.59.4(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) zod: 3.23.8 transitivePeerDependencies: - '@emotion/is-prop-valid' @@ -29133,7 +30317,7 @@ snapshots: - terser - vite - '@tutorialkit/react@1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.1)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@tutorialkit/react@1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.1)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@codemirror/autocomplete': 6.18.6 '@codemirror/commands': 6.8.1 @@ -29158,7 +30342,7 @@ snapshots: '@radix-ui/react-dialog': 1.1.7(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@replit/codemirror-lang-svelte': 6.0.0(@codemirror/autocomplete@6.18.6)(@codemirror/lang-css@6.3.1)(@codemirror/lang-html@6.4.9)(@codemirror/lang-javascript@6.2.3)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.5)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/javascript@1.4.21)(@lezer/lr@1.4.2) '@tutorialkit/runtime': 1.5.0 - '@tutorialkit/theme': 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@tutorialkit/theme': 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@webcontainer/api': 1.5.1 '@xterm/addon-fit': 0.10.0(@xterm/xterm@5.5.0) '@xterm/addon-web-links': 0.11.0(@xterm/xterm@5.5.0) @@ -29180,7 +30364,7 @@ snapshots: - supports-color - vite - '@tutorialkit/react@1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.20)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@tutorialkit/react@1.5.0(patch_hash=kkebbkg5j2fp5xasb2zxj4epiu)(@types/react-dom@18.3.0)(@types/react@18.3.20)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@codemirror/autocomplete': 6.18.6 '@codemirror/commands': 6.8.1 @@ -29205,7 +30389,7 @@ snapshots: '@radix-ui/react-dialog': 1.1.7(@types/react-dom@18.3.0)(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@replit/codemirror-lang-svelte': 6.0.0(@codemirror/autocomplete@6.18.6)(@codemirror/lang-css@6.3.1)(@codemirror/lang-html@6.4.9)(@codemirror/lang-javascript@6.2.3)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.5)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/javascript@1.4.21)(@lezer/lr@1.4.2) '@tutorialkit/runtime': 1.5.0 - '@tutorialkit/theme': 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@tutorialkit/theme': 1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@webcontainer/api': 1.5.1 '@xterm/addon-fit': 0.10.0(@xterm/xterm@5.5.0) '@xterm/addon-web-links': 0.11.0(@xterm/xterm@5.5.0) @@ -29234,12 +30418,12 @@ snapshots: nanostores: 0.10.3 picomatch: 4.0.2 - '@tutorialkit/theme@1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@tutorialkit/theme@1.5.0(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@iconify-json/ph': 1.2.2 '@iconify-json/svg-spinners': 1.2.2 fast-glob: 3.3.3 - unocss: 0.59.4(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + unocss: 0.59.4(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) transitivePeerDependencies: - '@unocss/webpack' - postcss @@ -29259,7 +30443,7 @@ snapshots: '@types/acorn@4.0.6': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/aria-query@5.0.4': {} @@ -29267,24 +30451,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.27.1 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.26.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.27.1 '@types/body-parser@1.19.5': dependencies: @@ -29327,7 +30511,7 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.12 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/eslint@8.56.12': dependencies: @@ -29340,12 +30524,14 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree@1.0.5': {} '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} + '@types/express-serve-static-core@4.19.5': dependencies: '@types/node': 20.16.10 @@ -29644,44 +30830,74 @@ snapshots: '@types/node': 20.16.10 optional: true - '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/type-utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/type-utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.3 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/type-utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 7.0.3 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.20.0 '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.20.0 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.0 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.20.0(eslint@8.57.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/rule-tester@8.32.1(eslint@8.57.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/parser': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) ajv: 6.12.6 eslint: 8.57.0 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - semver: 7.6.3 + semver: 7.7.1 transitivePeerDependencies: - supports-color - typescript @@ -29696,14 +30912,19 @@ snapshots: '@typescript-eslint/types': 8.20.0 '@typescript-eslint/visitor-keys': 8.20.0 - '@typescript-eslint/type-utils@8.20.0(eslint@8.57.0)(typescript@5.7.3)': + '@typescript-eslint/scope-manager@8.32.1': dependencies: - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) - debug: 4.3.7 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + + '@typescript-eslint/type-utils@8.32.1(eslint@8.57.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.0 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -29711,7 +30932,9 @@ snapshots: '@typescript-eslint/types@8.20.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.3)': + '@typescript-eslint/types@8.32.1': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -29719,34 +30942,48 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.1 - tsutils: 3.21.0(typescript@5.7.3) + tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.20.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.20.0 '@typescript-eslint/visitor-keys': 8.20.0 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.0(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.7.3)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.7.1 @@ -29754,14 +30991,14 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) eslint: 8.57.0 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -29775,6 +31012,11 @@ snapshots: '@typescript-eslint/types': 8.20.0 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.32.1': + dependencies: + '@typescript-eslint/types': 8.32.1 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.0': {} '@unhead/dom@1.11.6': @@ -29796,22 +31038,22 @@ snapshots: '@unhead/schema': 1.11.6 '@unhead/shared': 1.11.6 - '@unhead/vue@1.11.6(vue@3.5.6(typescript@5.7.3))': + '@unhead/vue@1.11.6(vue@3.5.6(typescript@5.8.3))': dependencies: '@unhead/schema': 1.11.6 '@unhead/shared': 1.11.6 defu: 6.1.4 hookable: 5.5.3 unhead: 1.11.6 - vue: 3.5.6(typescript@5.7.3) + vue: 3.5.6(typescript@5.8.3) - '@unocss/astro@0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@unocss/astro@0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@unocss/core': 0.59.4 '@unocss/reset': 0.59.4 - '@unocss/vite': 0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@unocss/vite': 0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) optionalDependencies: - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - rollup @@ -29919,9 +31161,9 @@ snapshots: '@unocss/transformer-attributify-jsx-babel@0.59.4': dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.9) - '@babel/preset-typescript': 7.24.7(@babel/core@7.26.9) + '@babel/core': 7.27.1 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.27.1) + '@babel/preset-typescript': 7.24.7(@babel/core@7.27.1) '@unocss/core': 0.59.4 transitivePeerDependencies: - supports-color @@ -29944,7 +31186,7 @@ snapshots: dependencies: '@unocss/core': 0.59.4 - '@unocss/vite@0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@unocss/vite@0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.0(rollup@4.22.0) @@ -29956,7 +31198,7 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.3 magic-string: 0.30.17 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - rollup @@ -29969,7 +31211,7 @@ snapshots: '@vanilla-extract/babel-plugin-debug-ids@1.0.6': dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.27.1 transitivePeerDependencies: - supports-color @@ -29990,10 +31232,10 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)': + '@vanilla-extract/integration@6.5.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)': dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.26.0) + '@babel/core': 7.27.1 + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.27.1) '@vanilla-extract/babel-plugin-debug-ids': 1.0.6 '@vanilla-extract/css': 1.15.5(babel-plugin-macros@3.1.0) esbuild: 0.19.5 @@ -30003,8 +31245,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.1 outdent: 0.8.0 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) - vite-node: 1.6.0(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + vite-node: 1.6.0(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -30199,50 +31441,54 @@ snapshots: minimatch: 7.4.6 semver: 7.6.3 - '@vitejs/plugin-basic-ssl@1.2.0(vite@6.1.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.2.2)(sass-embedded@1.85.1)(sass@1.85.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@vitejs/plugin-basic-ssl@2.0.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: - vite: 6.1.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.2.2)(sass-embedded@1.85.1)(sass@1.85.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) - '@vitejs/plugin-basic-ssl@1.2.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) - '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0))': + '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.3.0)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': + dependencies: + vite: 6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.3.0)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) + + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@vitejs/plugin-react@4.3.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0))(vue@3.5.6(typescript@5.7.3))': + '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1))(vue@3.5.6(typescript@5.8.3))': dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.9) - '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.9) - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) - vue: 3.5.6(typescript@5.7.3) + '@babel/core': 7.27.1 + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.27.1) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.27.1) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + vue: 3.5.6(typescript@5.8.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.1.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0))(vue@3.5.6(typescript@5.7.3))': + '@vitejs/plugin-vue@5.1.4(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1))(vue@3.5.6(typescript@5.8.3))': dependencies: - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) - vue: 3.5.6(typescript@5.7.3) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + vue: 3.5.6(typescript@5.8.3) '@vitest/expect@2.0.5': dependencies: @@ -30258,13 +31504,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.5(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))': + '@vitest/mocker@3.0.5(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) '@vitest/pretty-format@2.0.5': dependencies: @@ -30316,12 +31562,12 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@volar/kit@2.4.12(typescript@5.7.3)': + '@volar/kit@2.4.12(typescript@5.8.3)': dependencies: '@volar/language-service': 2.4.12 '@volar/typescript': 2.4.12 typesafe-path: 0.2.2 - typescript: 5.7.3 + typescript: 5.8.3 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 @@ -30366,52 +31612,52 @@ snapshots: '@vscode/l10n@0.0.18': {} - '@vue-macros/common@1.14.0(rollup@4.22.0)(vue@3.5.6(typescript@5.7.3))': + '@vue-macros/common@1.14.0(rollup@4.22.0)(vue@3.5.6(typescript@5.8.3))': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@rollup/pluginutils': 5.1.0(rollup@4.22.0) '@vue/compiler-sfc': 3.5.6 ast-kit: 1.2.0 local-pkg: 0.5.0 magic-string-ast: 0.6.2 optionalDependencies: - vue: 3.5.6(typescript@5.7.3) + vue: 3.5.6(typescript@5.8.3) transitivePeerDependencies: - rollup '@vue/babel-helper-vue-transform-on@1.2.5': {} - '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.9)': + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.27.1)': dependencies: - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.9) - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.27.1) + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 '@vue/babel-helper-vue-transform-on': 1.2.5 - '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.9) + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.27.1) html-tags: 3.3.1 svg-tags: 1.0.0 optionalDependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.27.1 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.9)': + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.27.1)': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/parser': 7.26.9 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.27.2 '@vue/compiler-sfc': 3.5.6 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.6': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.27.2 '@vue/shared': 3.5.6 entities: 4.5.0 estree-walker: 2.0.2 @@ -30424,7 +31670,7 @@ snapshots: '@vue/compiler-sfc@3.5.6': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.27.2 '@vue/compiler-core': 3.5.6 '@vue/compiler-dom': 3.5.6 '@vue/compiler-ssr': 3.5.6 @@ -30441,15 +31687,15 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.4.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(vue@3.5.6(typescript@5.7.3))': + '@vue/devtools-core@7.4.4(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(vue@3.5.6(typescript@5.8.3))': dependencies: '@vue/devtools-kit': 7.4.4 '@vue/devtools-shared': 7.4.5 mitt: 3.0.1 nanoid: 3.3.8 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) - vue: 3.5.6(typescript@5.7.3) + vite-hot-client: 0.2.3(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) + vue: 3.5.6(typescript@5.8.3) transitivePeerDependencies: - vite @@ -30483,61 +31729,35 @@ snapshots: '@vue/shared': 3.5.6 csstype: 3.1.3 - '@vue/server-renderer@3.5.6(vue@3.5.6(typescript@5.7.3))': + '@vue/server-renderer@3.5.6(vue@3.5.6(typescript@5.8.3))': dependencies: '@vue/compiler-ssr': 3.5.6 '@vue/shared': 3.5.6 - vue: 3.5.6(typescript@5.7.3) + vue: 3.5.6(typescript@5.8.3) '@vue/shared@3.5.6': {} '@web3-storage/multipart-parser@1.0.0': {} - '@webassemblyjs/ast@1.12.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - '@webassemblyjs/helper-api-error@1.11.6': {} - '@webassemblyjs/helper-api-error@1.13.2': {} - '@webassemblyjs/helper-buffer@1.12.1': {} - '@webassemblyjs/helper-buffer@1.14.1': {} - '@webassemblyjs/helper-numbers@1.11.6': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - '@webassemblyjs/helper-numbers@1.13.2': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.13.2 '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - '@webassemblyjs/helper-wasm-section@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/helper-wasm-section@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -30545,37 +31765,16 @@ snapshots: '@webassemblyjs/helper-wasm-bytecode': 1.13.2 '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/ieee754@1.11.6': - dependencies: - '@xtuc/ieee754': 1.2.0 - '@webassemblyjs/ieee754@1.13.2': dependencies: '@xtuc/ieee754': 1.2.0 - '@webassemblyjs/leb128@1.11.6': - dependencies: - '@xtuc/long': 4.2.2 - '@webassemblyjs/leb128@1.13.2': dependencies: '@xtuc/long': 4.2.2 - '@webassemblyjs/utf8@1.11.6': {} - '@webassemblyjs/utf8@1.13.2': {} - '@webassemblyjs/wasm-edit@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 - '@webassemblyjs/wasm-edit@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -30587,14 +31786,6 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 '@webassemblyjs/wast-printer': 1.14.1 - '@webassemblyjs/wasm-gen@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-gen@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -30603,13 +31794,6 @@ snapshots: '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wasm-opt@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wasm-opt@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -30617,15 +31801,6 @@ snapshots: '@webassemblyjs/wasm-gen': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wasm-parser@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-parser@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -30635,11 +31810,6 @@ snapshots: '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wast-printer@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@xtuc/long': 4.2.2 - '@webassemblyjs/wast-printer@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 @@ -30647,22 +31817,22 @@ snapshots: '@webcontainer/api@1.5.1': {} - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4))': dependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) optionalDependencies: - webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8) '@xhmikosr/archive-type@7.0.0': dependencies: @@ -30812,10 +31982,6 @@ snapshots: dependencies: acorn: 8.14.0 - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -30856,7 +32022,7 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@2.2.37(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.5.6(typescript@5.7.3)): + ai@2.2.37(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.5.6(typescript@5.8.3)): dependencies: eventsource-parser: 1.0.0 nanoid: 3.3.6 @@ -30864,12 +32030,12 @@ snapshots: sswr: 2.0.0(svelte@4.2.19) swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.5.6(typescript@5.7.3)) + swrv: 1.0.4(vue@3.5.6(typescript@5.8.3)) optionalDependencies: react: 18.3.1 solid-js: 1.8.22 svelte: 4.2.19 - vue: 3.5.6(typescript@5.7.3) + vue: 3.5.6(typescript@5.8.3) ajv-formats@2.1.1(ajv@8.12.0): optionalDependencies: @@ -30931,20 +32097,20 @@ snapshots: '@algolia/requester-node-http': 4.24.0 '@algolia/transporter': 4.24.0 - angular-eslint@19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript-eslint@8.20.0(eslint@8.57.0)(typescript@5.7.3))(typescript@5.7.3): + angular-eslint@19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript-eslint@8.32.1(eslint@8.57.0)(typescript@5.8.3))(typescript@5.8.3): dependencies: '@angular-devkit/core': 19.2.0(chokidar@3.6.0) '@angular-devkit/schematics': 19.2.0(chokidar@3.6.0) - '@angular-eslint/builder': 19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.7.3) - '@angular-eslint/eslint-plugin': 19.2.0(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) - '@angular-eslint/eslint-plugin-template': 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) - '@angular-eslint/schematics': 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.20.0(eslint@8.57.0)(typescript@5.7.3))(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.7.3) - '@angular-eslint/template-parser': 19.2.0(eslint@8.57.0)(typescript@5.7.3) + '@angular-eslint/builder': 19.2.0(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.8.3) + '@angular-eslint/eslint-plugin': 19.2.0(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) + '@angular-eslint/eslint-plugin-template': 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) + '@angular-eslint/schematics': 19.2.0(@typescript-eslint/types@8.20.0)(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(chokidar@3.6.0)(eslint@8.57.0)(typescript@5.8.3) + '@angular-eslint/template-parser': 19.2.0(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 - typescript: 5.7.3 - typescript-eslint: 8.20.0(eslint@8.57.0)(typescript@5.7.3) + typescript: 5.8.3 + typescript-eslint: 8.32.1(eslint@8.57.0)(typescript@5.8.3) transitivePeerDependencies: - chokidar - supports-color @@ -31169,7 +32335,7 @@ snapshots: ast-kit@1.2.0: dependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.2 pathe: 1.1.2 ast-types-flow@0.0.8: {} @@ -31180,19 +32346,19 @@ snapshots: ast-walker-scope@0.6.2: dependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.2 ast-kit: 1.2.0 astral-regex@2.0.0: {} astring@1.9.0: {} - astro-expressive-code@0.35.6(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3)): + astro-expressive-code@0.35.6(astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3)): dependencies: - astro: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3) + astro: 4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3) rehype-expressive-code: 0.35.6 - astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3): + astro@4.15.0(@types/node@20.16.10)(less@4.1.3)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3): dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/internal-helpers': 0.4.1 @@ -31248,17 +32414,17 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 tinyexec: 0.3.2 - tsconfck: 3.1.5(typescript@5.7.3) + tsconfck: 3.1.5(typescript@5.8.3) unist-util-visit: 5.0.0 vfile: 6.0.3 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) - vitefu: 0.2.5(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + vitefu: 0.2.5(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)) which-pm: 3.0.1 xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) - zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.24.2) + zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.24.2) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -31302,20 +32468,10 @@ snapshots: postcss: 8.4.38 postcss-value-parser: 4.2.0 - autoprefixer@10.4.20(postcss@8.5.2): + autoprefixer@10.4.21(postcss@8.5.3): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001701 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.2 - postcss-value-parser: 4.2.0 - - autoprefixer@10.4.20(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001701 + caniuse-lite: 1.0.30001717 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -31375,26 +32531,32 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + '@babel/core': 7.27.1 + find-up: 5.0.0 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + + babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) - babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: '@babel/core': 7.26.9 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) babel-plugin-const-enum@1.2.0(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.26.9) - '@babel/traverse': 7.26.9 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color @@ -31410,14 +32572,14 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.27.1 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -31439,6 +32601,15 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.27.1): + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.27.1 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.27.1) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 @@ -31463,6 +32634,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.1): + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.27.1) + core-js-compat: 3.40.0 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 @@ -31477,12 +32656,19 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.26.9)(@babel/traverse@7.26.9): + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.27.1): + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.26.9)(@babel/traverse@7.27.1): dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 optionalDependencies: - '@babel/traverse': 7.26.9 + '@babel/traverse': 7.27.1 babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): dependencies: @@ -31491,7 +32677,7 @@ snapshots: '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.25.2) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) @@ -31510,7 +32696,7 @@ snapshots: '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.0) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) @@ -31522,24 +32708,24 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.9): + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.1): dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.9) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.9) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.26.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.9) + '@babel/core': 7.27.1 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.1) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.1) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.1) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.1) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.1) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.1) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.1) babel-preset-jest@29.6.3(@babel/core@7.25.2): dependencies: @@ -31580,13 +32766,13 @@ snapshots: bcryptjs@2.4.3: {} - beasties@0.2.0: + beasties@0.3.3: dependencies: css-select: 5.1.0 css-what: 6.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - htmlparser2: 9.1.0 + htmlparser2: 10.0.0 picocolors: 1.1.1 postcss: 8.5.3 postcss-media-query-parser: 0.2.3 @@ -31731,13 +32917,6 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) - browserslist@4.24.2: - dependencies: - caniuse-lite: 1.0.30001701 - electron-to-chromium: 1.5.65 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) - browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001701 @@ -31942,7 +33121,7 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001701 + caniuse-lite: 1.0.30001717 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -32151,7 +33330,7 @@ snapshots: code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 acorn: 8.14.0 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -32221,7 +33400,7 @@ snapshots: commander@10.0.1: {} - commander@13.0.0: {} + commander@14.0.0: {} commander@2.20.3: {} @@ -32466,7 +33645,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@10.2.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + copy-webpack-plugin@10.2.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -32474,17 +33653,26 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - copy-webpack-plugin@12.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + copy-webpack-plugin@10.2.4(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 - globby: 14.0.2 + globby: 12.2.0 normalize-path: 3.0.0 - schema-utils: 4.3.0 + schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + copy-webpack-plugin@13.0.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + glob-parent: 6.0.2 + normalize-path: 3.0.0 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + tinyglobby: 0.2.13 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) core-js-compat@3.38.1: dependencies: @@ -32537,23 +33725,23 @@ snapshots: optionalDependencies: typescript: 5.3.3 - cosmiconfig@8.3.6(typescript@5.7.3): + cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 - cosmiconfig@9.0.0(typescript@5.7.3): + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 crc-32@1.2.2: {} @@ -32562,13 +33750,13 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.5.2 - create-jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -32625,7 +33813,7 @@ snapshots: postcss: 8.4.38 postcss-selector-parser: 6.1.2 - css-loader@6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + css-loader@6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 @@ -32637,9 +33825,9 @@ snapshots: semver: 7.7.1 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - css-loader@7.1.2(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + css-loader@6.11.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 @@ -32651,9 +33839,23 @@ snapshots: semver: 7.7.1 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) - css-minimizer-webpack-plugin@5.0.1(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + css-loader@7.1.2(@rspack/core@1.3.9(@swc/helpers@0.5.11))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) + postcss-value-parser: 4.2.0 + semver: 7.7.2 + optionalDependencies: + '@rspack/core': 1.3.9(@swc/helpers@0.5.11) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + + css-minimizer-webpack-plugin@5.0.1(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: '@jridgewell/trace-mapping': 0.3.25 cssnano: 6.1.2(postcss@8.4.38) @@ -32661,7 +33863,19 @@ snapshots: postcss: 8.4.38 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + optionalDependencies: + esbuild: 0.25.0 + + css-minimizer-webpack-plugin@5.0.1(esbuild@0.25.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + cssnano: 6.1.2(postcss@8.4.38) + jest-worker: 29.7.0 + postcss: 8.4.38 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) optionalDependencies: esbuild: 0.25.0 @@ -32682,7 +33896,7 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-selector-parser@3.1.2: {} @@ -33225,7 +34439,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 4.3.1 - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -33290,8 +34504,6 @@ snapshots: electron-to-chromium@1.5.25: {} - electron-to-chromium@1.5.65: {} - emittery@0.13.1: {} emmet@2.4.11: @@ -33349,6 +34561,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.0: {} + env-paths@2.2.1: {} envinfo@7.14.0: {} @@ -33626,7 +34840,7 @@ snapshots: transitivePeerDependencies: - supports-color - esbuild-wasm@0.25.0: {} + esbuild-wasm@0.25.4: {} esbuild@0.16.3: optionalDependencies: @@ -33838,6 +35052,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.0 '@esbuild/win32-x64': 0.25.0 + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -33858,21 +35100,21 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@15.3.0(eslint@8.57.0)(typescript@5.7.3): + eslint-config-next@15.3.0(eslint@8.57.0)(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 15.3.0 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.1(eslint@8.57.0) eslint-plugin-react: 7.37.5(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.0) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -33890,33 +35132,43 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.3 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.8.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + dependencies: + debug: 3.2.7(supports-color@8.1.1) + optionalDependencies: + '@typescript-eslint/parser': 8.32.1(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -33925,7 +35177,7 @@ snapshots: eslint: 8.57.0 globals: 13.24.0 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -33936,7 +35188,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -33948,7 +35200,36 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.8.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7(supports-color@8.1.1) + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + string.prototype.trimend: 1.0.8 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.32.1(eslint@8.57.0)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -34027,10 +35308,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@0.8.0(eslint@8.57.0)(typescript@5.7.3): + eslint-plugin-storybook@0.8.0(eslint@8.57.0)(typescript@5.8.3): dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 requireindex: 1.2.0 ts-dedent: 2.2.0 @@ -34109,8 +35390,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -34129,11 +35410,11 @@ snapshots: estree-util-attach-comments@2.1.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-build-jsx@2.2.2: dependencies: @@ -34156,7 +35437,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 estree-util-to-js@1.2.0: @@ -34191,7 +35472,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} @@ -34482,11 +35763,11 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -34502,11 +35783,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + file-loader@6.2.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: loader-utils: 2.0.3 schema-utils: 3.3.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) file-type@16.5.4: dependencies: @@ -34640,6 +35921,10 @@ snapshots: optionalDependencies: debug: 4.3.7 + follow-redirects@1.15.9(debug@4.4.0): + optionalDependencies: + debug: 4.4.0(supports-color@8.1.1) + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -34655,7 +35940,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@7.2.13(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + fork-ts-checker-webpack-plugin@7.2.13(typescript@5.8.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: '@babel/code-frame': 7.24.7 chalk: 4.1.2 @@ -34669,12 +35954,12 @@ snapshots: schema-utils: 3.3.0 semver: 7.6.3 tapable: 2.2.1 - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + typescript: 5.8.3 + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + fork-ts-checker-webpack-plugin@7.2.13(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.24.7 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -34684,12 +35969,29 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.1 + semver: 7.6.3 tapable: 2.2.1 - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + typescript: 5.8.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + '@babel/code-frame': 7.27.1 + chalk: 4.1.2 + chokidar: 3.6.0 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.6.0 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.7.2 + tapable: 2.2.1 + typescript: 5.8.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: '@babel/code-frame': 7.26.2 chalk: 4.1.2 @@ -34701,10 +36003,10 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.1 + semver: 7.7.2 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) form-data-encoder@1.7.2: {} @@ -35295,7 +36597,7 @@ snapshots: hast-util-to-estree@2.3.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 '@types/unist': 2.0.11 @@ -35315,7 +36617,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -35350,7 +36652,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -35482,14 +36784,21 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.0 htmlparser2@6.1.0: dependencies: @@ -35498,13 +36807,6 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 - htmlparser2@9.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - http-assert@1.5.0: dependencies: deep-equal: 1.0.1 @@ -35557,7 +36859,7 @@ snapshots: http-proxy-middleware@2.0.7(@types/express@4.17.21): dependencies: '@types/http-proxy': 1.17.15 - http-proxy: 1.18.1(debug@4.3.7) + http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 @@ -35577,6 +36879,25 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-middleware@3.0.5: + dependencies: + '@types/http-proxy': 1.17.15 + debug: 4.4.0(supports-color@8.1.1) + http-proxy: 1.18.1(debug@4.4.0) + is-glob: 4.0.3 + is-plain-object: 5.0.0 + micromatch: 4.0.8 + transitivePeerDependencies: + - supports-color + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9(debug@4.3.7) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + http-proxy@1.18.1(debug@4.3.7): dependencies: eventemitter3: 4.0.7 @@ -35585,6 +36906,14 @@ snapshots: transitivePeerDependencies: - debug + http-proxy@1.18.1(debug@4.4.0): + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9(debug@4.4.0) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + http-server@14.1.0: dependencies: basic-auth: 2.0.1 @@ -35592,7 +36921,7 @@ snapshots: corser: 2.0.1 he: 1.2.0 html-encoding-sniffer: 3.0.0 - http-proxy: 1.18.1(debug@4.3.7) + http-proxy: 1.18.1 mime: 1.6.0 minimist: 1.2.8 opener: 1.5.2 @@ -35782,7 +37111,7 @@ snapshots: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.8.1 + rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 @@ -35801,7 +37130,7 @@ snapshots: mute-stream: 1.0.0 ora: 5.4.1 run-async: 3.0.0 - rxjs: 7.8.1 + rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 @@ -36074,11 +37403,11 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-reference@3.0.2: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-regex@1.1.4: dependencies: @@ -36216,8 +37545,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.26.9 - '@babel/parser': 7.26.3 + '@babel/core': 7.27.1 + '@babel/parser': 7.26.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -36226,11 +37555,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.2 + '@babel/core': 7.27.1 + '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -36242,7 +37571,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -36338,16 +37667,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.6.2 @@ -36357,7 +37686,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 @@ -36383,7 +37712,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.16.10 - ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3) + ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -36463,7 +37792,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -36559,15 +37888,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.26.9 - '@babel/generator': 7.26.9 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.9) - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.26.9) - '@babel/types': 7.26.3 + '@babel/core': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.27.1) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.27.1) + '@babel/types': 7.27.1 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -36578,7 +37907,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -36624,12 +37953,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -36786,7 +38115,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.1 + semver: 7.7.2 jsprim@2.0.2: dependencies: @@ -36907,18 +38236,24 @@ snapshots: dependencies: readable-stream: 2.3.8 - less-loader@11.1.0(less@4.1.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + less-loader@11.1.0(less@4.1.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - less-loader@12.2.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(less@4.2.2)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + less-loader@11.1.0(less@4.1.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: - less: 4.2.2 + klona: 2.0.6 + less: 4.1.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + less-loader@12.3.0(@rspack/core@1.3.9(@swc/helpers@0.5.11))(less@4.3.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + less: 4.3.0 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) less@4.1.3: dependencies: @@ -36934,7 +38269,7 @@ snapshots: needle: 3.3.1 source-map: 0.6.1 - less@4.2.2: + less@4.3.0: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 @@ -36970,11 +38305,23 @@ snapshots: transitivePeerDependencies: - supports-color - license-webpack-plugin@4.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + license-webpack-plugin@4.0.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: webpack-sources: 3.2.3 optionalDependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + + license-webpack-plugin@4.0.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + webpack-sources: 3.2.3 + optionalDependencies: + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + license-webpack-plugin@4.0.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + webpack-sources: 3.2.3 + optionalDependencies: + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) lie@3.3.0: dependencies: @@ -37018,13 +38365,13 @@ snapshots: log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.4.1 - rxjs: 7.8.1 + rxjs: 7.8.2 through: 2.3.8 wrap-ansi: 7.0.0 optionalDependencies: enquirer: 2.3.6 - listr2@8.2.5: + listr2@8.3.3: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -37033,7 +38380,7 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 - lmdb@3.2.6: + lmdb@3.3.0: dependencies: msgpackr: 1.11.2 node-addon-api: 6.1.0 @@ -37041,12 +38388,13 @@ snapshots: ordered-binary: 1.5.3 weak-lru-cache: 1.2.2 optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 3.2.6 - '@lmdb/lmdb-darwin-x64': 3.2.6 - '@lmdb/lmdb-linux-arm': 3.2.6 - '@lmdb/lmdb-linux-arm64': 3.2.6 - '@lmdb/lmdb-linux-x64': 3.2.6 - '@lmdb/lmdb-win32-x64': 3.2.6 + '@lmdb/lmdb-darwin-arm64': 3.3.0 + '@lmdb/lmdb-darwin-x64': 3.3.0 + '@lmdb/lmdb-linux-arm': 3.3.0 + '@lmdb/lmdb-linux-arm64': 3.3.0 + '@lmdb/lmdb-linux-x64': 3.3.0 + '@lmdb/lmdb-win32-arm64': 3.3.0 + '@lmdb/lmdb-win32-x64': 3.3.0 optional: true load-json-file@4.0.0: @@ -37272,10 +38620,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.15: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -37286,8 +38630,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 source-map-js: 1.2.1 make-dir@2.1.0: @@ -37302,7 +38646,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -37665,7 +39009,7 @@ snapshots: media-query-parser@2.0.2: dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.27.1 media-typer@0.3.0: {} @@ -37673,13 +39017,6 @@ snapshots: dependencies: fs-monkey: 1.0.6 - memfs@4.12.0: - dependencies: - '@jsonjoy.com/json-pack': 1.1.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.3.0(tslib@2.8.1) - tree-dump: 1.0.2(tslib@2.8.1) - tslib: 2.8.1 - memfs@4.17.0: dependencies: '@jsonjoy.com/json-pack': 1.1.0(tslib@2.8.1) @@ -37734,7 +39071,7 @@ snapshots: metro-babel-transformer@0.80.12: dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.27.1 flow-enums-runtime: 0.0.6 hermes-parser: 0.23.1 nullthrows: 1.1.1 @@ -37793,7 +39130,7 @@ snapshots: metro-minify-terser@0.80.12: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.39.0 + terser: 5.39.1 metro-resolver@0.80.12: dependencies: @@ -37801,13 +39138,13 @@ snapshots: metro-runtime@0.80.12: dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.27.1 flow-enums-runtime: 0.0.6 metro-source-map@0.80.12: dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 flow-enums-runtime: 0.0.6 invariant: 2.2.4 metro-symbolicate: 0.80.12 @@ -37832,10 +39169,10 @@ snapshots: metro-transform-plugins@0.80.12: dependencies: - '@babel/core': 7.26.9 - '@babel/generator': 7.26.9 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 + '@babel/core': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: @@ -37843,10 +39180,10 @@ snapshots: metro-transform-worker@0.80.12(bufferutil@4.0.7): dependencies: - '@babel/core': 7.26.9 - '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/core': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 flow-enums-runtime: 0.0.6 metro: 0.80.12(bufferutil@4.0.7) metro-babel-transformer: 0.80.12 @@ -37863,13 +39200,13 @@ snapshots: metro@0.80.12(bufferutil@4.0.7): dependencies: - '@babel/code-frame': 7.24.7 - '@babel/core': 7.26.9 - '@babel/generator': 7.26.9 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -38025,7 +39362,7 @@ snapshots: micromark-extension-mdx-expression@1.0.8: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -38036,7 +39373,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -38048,7 +39385,7 @@ snapshots: micromark-extension-mdx-jsx@1.0.5: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-is-identifier-name: 2.1.0 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 @@ -38060,7 +39397,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -38081,7 +39418,7 @@ snapshots: micromark-extension-mdxjs-esm@1.0.5: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 micromark-core-commonmark: 1.1.0 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 @@ -38093,7 +39430,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -38153,7 +39490,7 @@ snapshots: micromark-factory-mdx-expression@1.0.9: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 micromark-util-symbol: 1.1.0 @@ -38164,7 +39501,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -38281,7 +39618,7 @@ snapshots: micromark-util-events-to-acorn@1.2.3: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/unist': 2.0.11 estree-util-visit: 1.2.1 micromark-util-symbol: 1.1.0 @@ -38291,7 +39628,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -38356,7 +39693,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -38432,16 +39769,21 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.4.7(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + mini-css-extract-plugin@2.4.7(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: schema-utils: 4.2.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - mini-css-extract-plugin@2.9.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + mini-css-extract-plugin@2.4.7(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: - schema-utils: 4.3.0 + schema-utils: 4.2.0 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + mini-css-extract-plugin@2.9.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + schema-utils: 4.3.2 tapable: 2.2.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) mini-svg-data-uri@1.4.4: {} @@ -38698,47 +40040,48 @@ snapshots: - '@babel/core' - babel-plugin-macros - ng-packagr@19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))(tslib@2.7.0)(typescript@5.7.3): + ng-packagr@20.0.0-rc.1(@angular/compiler-cli@20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3))(tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))(tslib@2.7.0)(typescript@5.8.3): dependencies: - '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.7.3) - '@rollup/plugin-json': 6.1.0(rollup@4.34.8) + '@ampproject/remapping': 2.3.0 + '@angular/compiler-cli': 20.0.0-rc.2(@angular/compiler@20.0.0-rc.2)(typescript@5.8.3) + '@rollup/plugin-json': 6.1.0(rollup@4.40.2) '@rollup/wasm-node': 4.27.4 ajv: 8.17.1 ansi-colors: 4.1.3 browserslist: 4.24.4 chokidar: 4.0.1 - commander: 13.0.0 - convert-source-map: 2.0.0 + commander: 14.0.0 dependency-graph: 1.0.0 esbuild: 0.25.0 - fast-glob: 3.3.3 find-cache-dir: 3.3.2 injection-js: 2.4.0 jsonc-parser: 3.3.1 - less: 4.2.2 + less: 4.3.0 ora: 5.3.0 - piscina: 4.8.0 - postcss: 8.5.2 - rxjs: 7.8.1 - sass: 1.85.0 + piscina: 5.0.0 + postcss: 8.5.3 + rollup-plugin-dts: 6.2.1(rollup@4.40.2)(typescript@5.8.3) + rxjs: 7.8.2 + sass: 1.88.0 + tinyglobby: 0.2.13 tslib: 2.7.0 - typescript: 5.7.3 + typescript: 5.8.3 optionalDependencies: - rollup: 4.34.8 - tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + rollup: 4.40.2 + tailwindcss: 3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) nitropack@2.9.7(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(encoding@0.1.13)(magicast@0.3.5)(webpack-sources@3.2.3): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 '@netlify/functions': 2.8.1 - '@rollup/plugin-alias': 5.1.0(rollup@4.30.1) - '@rollup/plugin-commonjs': 25.0.8(rollup@4.30.1) - '@rollup/plugin-inject': 5.0.5(rollup@4.30.1) - '@rollup/plugin-json': 6.1.0(rollup@4.30.1) - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.30.1) - '@rollup/plugin-replace': 5.0.7(rollup@4.30.1) - '@rollup/plugin-terser': 0.4.4(rollup@4.30.1) - '@rollup/pluginutils': 5.1.0(rollup@4.30.1) + '@rollup/plugin-alias': 5.1.0(rollup@4.40.2) + '@rollup/plugin-commonjs': 25.0.8(rollup@4.40.2) + '@rollup/plugin-inject': 5.0.5(rollup@4.40.2) + '@rollup/plugin-json': 6.1.0(rollup@4.40.2) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.40.2) + '@rollup/plugin-replace': 5.0.7(rollup@4.40.2) + '@rollup/plugin-terser': 0.4.4(rollup@4.40.2) + '@rollup/pluginutils': 5.1.0(rollup@4.40.2) '@types/http-proxy': 1.17.15 '@vercel/nft': 0.26.5(encoding@0.1.13) archiver: 7.0.1 @@ -38781,10 +40124,10 @@ snapshots: pkg-types: 1.2.0 pretty-bytes: 6.1.1 radix3: 1.1.2 - rollup: 4.30.1 - rollup-plugin-visualizer: 5.12.0(rollup@4.30.1) + rollup: 4.40.2 + rollup-plugin-visualizer: 5.12.0(rollup@4.40.2) scule: 1.3.0 - semver: 7.7.1 + semver: 7.7.2 serve-placeholder: 2.0.2 serve-static: 1.16.2 std-env: 3.7.0 @@ -38792,7 +40135,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.3.1(webpack-sources@3.2.3) unenv: 1.10.0 - unimport: 3.12.0(rollup@4.30.1)(webpack-sources@3.2.3) + unimport: 3.12.0(rollup@4.40.2)(webpack-sources@3.2.3) unstorage: 1.12.0(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(ioredis@5.4.1) unwasm: 0.3.9(webpack-sources@3.2.3) transitivePeerDependencies: @@ -38871,7 +40214,7 @@ snapshots: make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.7.1 + semver: 7.7.2 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: @@ -38922,13 +40265,13 @@ snapshots: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.15.1 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-package-data@7.0.0: dependencies: hosted-git-info: 8.0.2 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -38945,11 +40288,11 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 npm-install-checks@7.1.1: dependencies: - semver: 7.7.1 + semver: 7.7.2 npm-normalize-package-bin@1.0.1: {} @@ -38961,7 +40304,7 @@ snapshots: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-name: 5.0.1 npm-package-arg@11.0.1: @@ -38975,10 +40318,10 @@ snapshots: dependencies: hosted-git-info: 8.0.2 proc-log: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-name: 6.0.0 - npm-packlist@9.0.0: + npm-packlist@10.0.0: dependencies: ignore-walk: 7.0.0 @@ -38987,14 +40330,14 @@ snapshots: npm-install-checks: 7.1.1 npm-normalize-package-bin: 4.0.0 npm-package-arg: 12.0.2 - semver: 7.7.1 + semver: 7.7.2 npm-pick-manifest@8.0.2: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.7.1 + semver: 7.7.2 npm-registry-fetch@18.0.2: dependencies: @@ -39034,18 +40377,18 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - nuxt@3.13.2(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(@parcel/watcher@2.4.1)(@types/node@20.16.10)(bufferutil@4.0.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(webpack-sources@3.2.3): + nuxt@3.13.2(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(@parcel/watcher@2.4.1)(@types/node@20.16.10)(bufferutil@4.0.7)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(webpack-sources@3.2.3): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.4.2(bufferutil@4.0.7)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1))(vue@3.5.6(typescript@5.7.3))(webpack-sources@3.2.3) + '@nuxt/devtools': 1.4.2(bufferutil@4.0.7)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1))(vue@3.5.6(typescript@5.8.3))(webpack-sources@3.2.3) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3) '@nuxt/schema': 3.13.2(rollup@4.22.0)(webpack-sources@3.2.3) '@nuxt/telemetry': 2.6.0(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3) - '@nuxt/vite-builder': 3.13.2(@types/node@20.16.10)(eslint@8.57.0)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(typescript@5.7.3)(vue@3.5.6(typescript@5.7.3))(webpack-sources@3.2.3) + '@nuxt/vite-builder': 3.13.2(@types/node@20.16.10)(eslint@8.57.0)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(typescript@5.8.3)(vue@3.5.6(typescript@5.8.3))(webpack-sources@3.2.3) '@unhead/dom': 1.11.6 '@unhead/shared': 1.11.6 '@unhead/ssr': 1.11.6 - '@unhead/vue': 1.11.6(vue@3.5.6(typescript@5.7.3)) + '@unhead/vue': 1.11.6(vue@3.5.6(typescript@5.8.3)) '@vue/shared': 3.5.6 acorn: 8.12.1 c12: 1.11.2(magicast@0.3.5) @@ -39093,13 +40436,13 @@ snapshots: unhead: 1.11.6 unimport: 3.12.0(rollup@4.22.0)(webpack-sources@3.2.3) unplugin: 1.14.1(webpack-sources@3.2.3) - unplugin-vue-router: 0.10.8(rollup@4.22.0)(vue-router@4.4.5(vue@3.5.6(typescript@5.7.3)))(vue@3.5.6(typescript@5.7.3))(webpack-sources@3.2.3) + unplugin-vue-router: 0.10.8(rollup@4.22.0)(vue-router@4.4.5(vue@3.5.6(typescript@5.8.3)))(vue@3.5.6(typescript@5.8.3))(webpack-sources@3.2.3) unstorage: 1.12.0(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(ioredis@5.4.1) untyped: 1.4.2 - vue: 3.5.6(typescript@5.7.3) + vue: 3.5.6(typescript@5.8.3) vue-bundle-renderer: 2.1.0 vue-devtools-stub: 0.1.0 - vue-router: 4.4.5(vue@3.5.6(typescript@5.7.3)) + vue-router: 4.4.5(vue@3.5.6(typescript@5.8.3)) optionalDependencies: '@parcel/watcher': 2.4.1 '@types/node': 20.16.10 @@ -39149,7 +40492,7 @@ snapshots: nwsapi@2.2.12: {} - nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)): + nx@21.1.0-beta.2(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -39197,7 +40540,7 @@ snapshots: '@nx/nx-linux-x64-musl': 21.1.0-beta.2 '@nx/nx-win32-arm64-msvc': 21.1.0-beta.2 '@nx/nx-win32-x64-msvc': 21.1.0-beta.2 - '@swc-node/register': 1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.7.3) + '@swc-node/register': 1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.21)(typescript@5.8.3) '@swc/core': 1.5.7(@swc/helpers@0.5.11) transitivePeerDependencies: - debug @@ -39349,6 +40692,13 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 + open@10.1.2: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -39525,7 +40875,7 @@ snapshots: dependencies: quansync: 0.2.10 - pacote@20.0.0: + pacote@21.0.0: dependencies: '@npmcli/git': 6.0.1 '@npmcli/installed-package-contents': 3.0.0 @@ -39536,7 +40886,7 @@ snapshots: fs-minipass: 3.0.3 minipass: 7.1.2 npm-package-arg: 12.0.2 - npm-packlist: 9.0.0 + npm-packlist: 10.0.0 npm-pick-manifest: 10.0.0 npm-registry-fetch: 18.0.2 proc-log: 5.0.0 @@ -39591,7 +40941,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -39623,9 +40973,9 @@ snapshots: dependencies: parse-path: 7.0.0 - parse5-html-rewriting-stream@7.0.0: + parse5-html-rewriting-stream@7.1.0: dependencies: - entities: 4.5.0 + entities: 6.0.0 parse5: 7.1.2 parse5-sax-parser: 7.0.0 @@ -39709,7 +41059,7 @@ snapshots: periscopic@3.1.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 3.0.3 is-reference: 3.0.2 @@ -39762,11 +41112,11 @@ snapshots: pirates@4.0.6: {} - piscina@4.7.0: + piscina@4.8.0: optionalDependencies: '@napi-rs/nice': 1.0.1 - piscina@4.8.0: + piscina@5.0.0: optionalDependencies: '@napi-rs/nice': 1.0.1 @@ -39810,7 +41160,7 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 portfinder@1.0.32: dependencies: @@ -40039,51 +41389,51 @@ snapshots: postcss: 8.4.38 postcss-value-parser: 4.2.0 - postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3) + ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: lilconfig: 3.1.2 yaml: 2.6.1 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3) + ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3) - postcss-loader@6.2.1(postcss@8.4.38)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + postcss-loader@6.2.1(postcss@8.4.38)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.38 - semver: 7.7.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + semver: 7.7.2 + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - postcss-loader@8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + postcss-loader@8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: - cosmiconfig: 9.0.0(typescript@5.7.3) + cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.6 postcss: 8.4.38 semver: 7.7.1 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript - postcss-loader@8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.5.2)(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + postcss-loader@8.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: - cosmiconfig: 9.0.0(typescript@5.7.3) + cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.6 - postcss: 8.5.2 + postcss: 8.5.3 semver: 7.7.1 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) transitivePeerDependencies: - typescript @@ -40601,12 +41951,6 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.1 - postcss@8.5.2: - dependencies: - nanoid: 3.3.8 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.3: dependencies: nanoid: 3.3.8 @@ -40858,15 +42202,15 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 - react-docgen-typescript@2.2.2(typescript@5.7.3): + react-docgen-typescript@2.2.2(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 react-docgen@7.0.3: dependencies: - '@babel/core': 7.26.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/core': 7.27.1 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 '@types/doctrine': 0.0.9 @@ -41136,7 +42480,7 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 @@ -41152,14 +42496,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -41181,7 +42525,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.27.1 reflect-metadata@0.2.2: {} @@ -41224,7 +42568,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.27.1 regex-parser@2.3.0: {} @@ -41301,7 +42645,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/hast': 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: @@ -41568,7 +42912,15 @@ snapshots: globby: 10.0.1 is-plain-object: 3.0.1 - rollup-plugin-postcss@4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + rollup-plugin-dts@6.2.1(rollup@4.40.2)(typescript@5.8.3): + dependencies: + magic-string: 0.30.17 + rollup: 4.40.2 + typescript: 5.8.3 + optionalDependencies: + '@babel/code-frame': 7.27.1 + + rollup-plugin-postcss@4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 @@ -41577,7 +42929,7 @@ snapshots: p-queue: 6.6.2 pify: 5.0.0 postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) postcss-modules: 4.3.1(postcss@8.4.38) promise.series: 0.2.0 resolve: 1.22.8 @@ -41587,7 +42939,7 @@ snapshots: transitivePeerDependencies: - ts-node - rollup-plugin-typescript2@0.36.0(rollup@4.22.0)(typescript@5.7.3): + rollup-plugin-typescript2@0.36.0(rollup@4.22.0)(typescript@5.8.3): dependencies: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 @@ -41595,7 +42947,7 @@ snapshots: rollup: 4.22.0 semver: 7.6.3 tslib: 2.7.0 - typescript: 5.7.3 + typescript: 5.8.3 rollup-plugin-visualizer@5.12.0(rollup@4.22.0): dependencies: @@ -41606,14 +42958,14 @@ snapshots: optionalDependencies: rollup: 4.22.0 - rollup-plugin-visualizer@5.12.0(rollup@4.30.1): + rollup-plugin-visualizer@5.12.0(rollup@4.40.2): dependencies: open: 8.4.2 picomatch: 2.3.1 source-map: 0.7.4 yargs: 17.6.2 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.2 rollup-pluginutils@2.8.2: dependencies: @@ -41641,31 +42993,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.22.0 fsevents: 2.3.3 - rollup@4.30.1: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.30.1 - '@rollup/rollup-android-arm64': 4.30.1 - '@rollup/rollup-darwin-arm64': 4.30.1 - '@rollup/rollup-darwin-x64': 4.30.1 - '@rollup/rollup-freebsd-arm64': 4.30.1 - '@rollup/rollup-freebsd-x64': 4.30.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 - '@rollup/rollup-linux-arm-musleabihf': 4.30.1 - '@rollup/rollup-linux-arm64-gnu': 4.30.1 - '@rollup/rollup-linux-arm64-musl': 4.30.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 - '@rollup/rollup-linux-riscv64-gnu': 4.30.1 - '@rollup/rollup-linux-s390x-gnu': 4.30.1 - '@rollup/rollup-linux-x64-gnu': 4.30.1 - '@rollup/rollup-linux-x64-musl': 4.30.1 - '@rollup/rollup-win32-arm64-msvc': 4.30.1 - '@rollup/rollup-win32-ia32-msvc': 4.30.1 - '@rollup/rollup-win32-x64-msvc': 4.30.1 - fsevents: 2.3.3 - rollup@4.34.8: dependencies: '@types/estree': 1.0.6 @@ -41691,6 +43018,32 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 + rollup@4.40.2: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.2 + '@rollup/rollup-android-arm64': 4.40.2 + '@rollup/rollup-darwin-arm64': 4.40.2 + '@rollup/rollup-darwin-x64': 4.40.2 + '@rollup/rollup-freebsd-arm64': 4.40.2 + '@rollup/rollup-freebsd-x64': 4.40.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 + '@rollup/rollup-linux-arm-musleabihf': 4.40.2 + '@rollup/rollup-linux-arm64-gnu': 4.40.2 + '@rollup/rollup-linux-arm64-musl': 4.40.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-musl': 4.40.2 + '@rollup/rollup-linux-s390x-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-musl': 4.40.2 + '@rollup/rollup-win32-arm64-msvc': 4.40.2 + '@rollup/rollup-win32-ia32-msvc': 4.40.2 + '@rollup/rollup-win32-x64-msvc': 4.40.2 + fsevents: 2.3.3 + run-applescript@7.0.0: {} run-async@2.4.1: {} @@ -41703,7 +43056,11 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 s.color@0.0.15: {} @@ -41819,7 +43176,7 @@ snapshots: buffer-builder: 0.2.0 colorjs.io: 0.5.2 immutable: 5.0.3 - rxjs: 7.8.1 + rxjs: 7.8.2 supports-color: 8.1.1 sync-child-process: 1.0.2 varint: 6.0.0 @@ -41849,23 +43206,41 @@ snapshots: dependencies: suf-log: 2.5.3 - sass-loader@16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.55.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + sass-loader@16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.55.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: neo-async: 2.6.2 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) sass: 1.55.0 sass-embedded: 1.85.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) - sass-loader@16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + sass-loader@16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: neo-async: 2.6.2 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) sass: 1.85.0 sass-embedded: 1.85.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + + sass-loader@16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.85.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + neo-async: 2.6.2 + optionalDependencies: + '@rspack/core': 1.3.9(@swc/helpers@0.5.11) + sass: 1.85.0 + sass-embedded: 1.85.1 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + sass-loader@16.0.5(@rspack/core@1.3.9(@swc/helpers@0.5.11))(sass-embedded@1.85.1)(sass@1.88.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + neo-async: 2.6.2 + optionalDependencies: + '@rspack/core': 1.3.9(@swc/helpers@0.5.11) + sass: 1.88.0 + sass-embedded: 1.85.1 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) sass@1.55.0: dependencies: @@ -41881,6 +43256,14 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.4.1 + sass@1.88.0: + dependencies: + chokidar: 4.0.1 + immutable: 5.0.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.4.1 + sax@1.4.1: {} saxes@6.0.0: @@ -41915,6 +43298,13 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) + schema-utils@4.3.2: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + scule@1.3.0: {} search-insights@2.17.2: {} @@ -41955,6 +43345,8 @@ snapshots: semver@7.7.1: {} + semver@7.7.2: {} + send@0.18.0: dependencies: debug: 2.6.9 @@ -42083,7 +43475,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.7.1 + semver: 7.7.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -42298,11 +43690,23 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + source-map-loader@5.0.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + + source-map-loader@5.0.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + iconv-lite: 0.6.3 + source-map-js: 1.2.1 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + source-map-loader@5.0.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + iconv-lite: 0.6.3 + source-map-js: 1.2.1 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) source-map-support@0.5.13: dependencies: @@ -42372,7 +43776,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -42672,9 +44076,13 @@ snapshots: style-inject@0.3.0: {} - style-loader@3.3.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + style-loader@3.3.4(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + + style-loader@3.3.4(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) style-mod@4.1.2: {} @@ -42716,12 +44124,12 @@ snapshots: postcss: 8.5.3 postcss-selector-parser: 6.1.2 - stylus-loader@7.1.3(stylus@0.64.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + stylus-loader@7.1.3(stylus@0.64.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: fast-glob: 3.3.3 normalize-path: 3.0.0 stylus: 0.64.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) stylus@0.64.0: dependencies: @@ -42776,7 +44184,7 @@ snapshots: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 acorn: 8.14.0 aria-query: 5.3.2 axobject-query: 4.1.0 @@ -42825,9 +44233,9 @@ snapshots: swrev@4.0.0: {} - swrv@1.0.4(vue@3.5.6(typescript@5.7.3)): + swrv@1.0.4(vue@3.5.6(typescript@5.8.3)): dependencies: - vue: 3.5.6(typescript@5.7.3) + vue: 3.5.6(typescript@5.8.3) symbol-observable@4.0.0: {} @@ -42845,7 +44253,7 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)): + tailwindcss@3.4.4(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -42864,7 +44272,7 @@ snapshots: postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.4.38) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -42927,42 +44335,66 @@ snapshots: temp-dir: 2.0.0 uuid: 3.4.0 - terser-webpack-plugin@5.3.10(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + terser-webpack-plugin@5.3.10(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.33.0 - webpack: 5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.11) esbuild: 0.25.0 - terser-webpack-plugin@5.3.10(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + terser-webpack-plugin@5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 3.3.0 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.33.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + terser: 5.39.1 + webpack: 5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.11) esbuild: 0.25.0 - terser-webpack-plugin@5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + terser-webpack-plugin@5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 4.3.0 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + terser: 5.39.1 + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.11) esbuild: 0.25.0 + terser-webpack-plugin@5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.39.1 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + optionalDependencies: + '@swc/core': 1.5.7(@swc/helpers@0.5.11) + esbuild: 0.25.0 + + terser-webpack-plugin@5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.39.1 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + optionalDependencies: + '@swc/core': 1.5.7(@swc/helpers@0.5.11) + esbuild: 0.25.4 + terser@5.16.1: dependencies: '@jridgewell/source-map': 0.3.6 @@ -42984,6 +44416,13 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + terser@5.39.1: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -43063,9 +44502,14 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + tinyglobby@0.2.6: dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 tinypool@1.0.2: {} @@ -43159,11 +44603,15 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.0(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 - ts-checker-rspack-plugin@1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(typescript@5.7.3): + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + ts-checker-rspack-plugin@1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.11))(typescript@5.8.3): dependencies: '@babel/code-frame': 7.26.2 '@rspack/lite-tapable': 1.0.1 @@ -43171,7 +44619,7 @@ snapshots: memfs: 4.17.0 minimatch: 9.0.5 picocolors: 1.1.1 - typescript: 5.7.3 + typescript: 5.8.3 optionalDependencies: '@rspack/core': 1.3.9(@swc/helpers@0.5.11) @@ -43179,17 +44627,17 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.0(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.25.0)(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.1.0(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.25.0)(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.7.3 + typescript: 5.8.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 @@ -43197,17 +44645,27 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.25.2) esbuild: 0.25.0 - ts-loader@9.5.1(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + ts-loader@9.5.1(typescript@5.8.3)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 micromatch: 4.0.8 semver: 7.6.3 source-map: 0.7.4 - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + typescript: 5.8.3 + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.7.3): + ts-loader@9.5.1(typescript@5.8.3)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.17.1 + micromatch: 4.0.8 + semver: 7.6.3 + source-map: 0.7.4 + typescript: 5.8.3 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -43221,15 +44679,15 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.7.3 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.11) - tsconfck@3.1.5(typescript@5.7.3): + tsconfck@3.1.5(typescript@5.8.3): optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 tsconfig-paths-webpack-plugin@4.0.0: dependencies: @@ -43268,10 +44726,10 @@ snapshots: tsscmp@1.0.6: {} - tsutils@3.21.0(typescript@5.7.3): + tsutils@3.21.0(typescript@5.8.3): dependencies: tslib: 1.14.1 - typescript: 5.7.3 + typescript: 5.8.3 tuf-js@3.0.1: dependencies: @@ -43397,32 +44855,32 @@ snapshots: typedarray@0.0.6: {} - typedoc-plugin-markdown@3.17.1(typedoc@0.25.12(typescript@5.7.3)): + typedoc-plugin-markdown@3.17.1(typedoc@0.25.12(typescript@5.8.3)): dependencies: handlebars: 4.7.7 - typedoc: 0.25.12(typescript@5.7.3) + typedoc: 0.25.12(typescript@5.8.3) - typedoc@0.25.12(typescript@5.7.3): + typedoc@0.25.12(typescript@5.8.3): dependencies: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.3 shiki: 0.14.7 - typescript: 5.7.3 + typescript: 5.8.3 typesafe-path@0.2.2: {} typescript-auto-import-cache@0.3.5: dependencies: - semver: 7.7.1 + semver: 7.7.2 - typescript-eslint@8.20.0(eslint@8.57.0)(typescript@5.7.3): + typescript-eslint@8.32.1(eslint@8.57.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.0)(typescript@5.7.3))(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.20.0(eslint@8.57.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -43430,6 +44888,8 @@ snapshots: typescript@5.7.3: {} + typescript@5.8.3: {} + ua-parser-js@1.0.40: {} ufo@1.5.4: {} @@ -43476,7 +44936,7 @@ snapshots: dependencies: acorn: 8.14.0 estree-walker: 3.0.3 - magic-string: 0.30.15 + magic-string: 0.30.17 unplugin: 1.14.1(webpack-sources@3.2.3) transitivePeerDependencies: - webpack-sources @@ -43551,7 +45011,7 @@ snapshots: estree-walker: 3.0.3 fast-glob: 3.3.3 local-pkg: 0.5.0 - magic-string: 0.30.15 + magic-string: 0.30.17 mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.2.0 @@ -43562,15 +45022,15 @@ snapshots: - rollup - webpack-sources - unimport@3.12.0(rollup@4.30.1)(webpack-sources@3.2.3): + unimport@3.12.0(rollup@4.40.2)(webpack-sources@3.2.3): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.30.1) + '@rollup/pluginutils': 5.1.0(rollup@4.40.2) acorn: 8.14.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 fast-glob: 3.3.3 local-pkg: 0.5.0 - magic-string: 0.30.15 + magic-string: 0.30.17 mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.2.0 @@ -43702,9 +45162,9 @@ snapshots: unix-crypt-td-js@1.1.4: {} - unocss@0.59.4(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)): + unocss@0.59.4(postcss@8.4.38)(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)): dependencies: - '@unocss/astro': 0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@unocss/astro': 0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@unocss/cli': 0.59.4(rollup@4.22.0) '@unocss/core': 0.59.4 '@unocss/extractor-arbitrary-variants': 0.59.4 @@ -43723,9 +45183,9 @@ snapshots: '@unocss/transformer-compile-class': 0.59.4 '@unocss/transformer-directives': 0.59.4 '@unocss/transformer-variant-group': 0.59.4 - '@unocss/vite': 0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@unocss/vite': 0.59.4(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) optionalDependencies: - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - postcss - rollup @@ -43733,11 +45193,11 @@ snapshots: unpipe@1.0.0: {} - unplugin-vue-router@0.10.8(rollup@4.22.0)(vue-router@4.4.5(vue@3.5.6(typescript@5.7.3)))(vue@3.5.6(typescript@5.7.3))(webpack-sources@3.2.3): + unplugin-vue-router@0.10.8(rollup@4.22.0)(vue-router@4.4.5(vue@3.5.6(typescript@5.8.3)))(vue@3.5.6(typescript@5.8.3))(webpack-sources@3.2.3): dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.1 '@rollup/pluginutils': 5.1.0(rollup@4.22.0) - '@vue-macros/common': 1.14.0(rollup@4.22.0)(vue@3.5.6(typescript@5.7.3)) + '@vue-macros/common': 1.14.0(rollup@4.22.0)(vue@3.5.6(typescript@5.8.3)) ast-walker-scope: 0.6.2 chokidar: 3.6.0 fast-glob: 3.3.3 @@ -43750,7 +45210,7 @@ snapshots: unplugin: 1.14.1(webpack-sources@3.2.3) yaml: 2.6.1 optionalDependencies: - vue-router: 4.4.5(vue@3.5.6(typescript@5.7.3)) + vue-router: 4.4.5(vue@3.5.6(typescript@5.8.3)) transitivePeerDependencies: - rollup - vue @@ -43792,9 +45252,9 @@ snapshots: untyped@1.4.2: dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.1 '@babel/standalone': 7.25.6 - '@babel/types': 7.26.3 + '@babel/types': 7.27.1 defu: 6.1.4 jiti: 1.21.6 mri: 1.2.0 @@ -43821,12 +45281,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.1(browserslist@4.24.2): - dependencies: - browserslist: 4.24.2 - escalade: 3.2.0 - picocolors: 1.1.1 - update-browserslist-db@1.1.1(browserslist@4.24.4): dependencies: browserslist: 4.24.4 @@ -43943,9 +45397,9 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - valibot@0.41.0(typescript@5.7.3): + valibot@0.41.0(typescript@5.8.3): optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 validate-npm-package-license@3.0.4: dependencies: @@ -44063,34 +45517,17 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-hot-client@0.2.3(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)): + vite-hot-client@0.2.3(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)): dependencies: - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) - vite-node@1.6.0(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0): - dependencies: - cac: 6.7.14 - debug: 4.3.7 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite-node@2.1.1(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0): + vite-node@1.6.0(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@8.1.1) pathe: 1.1.2 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + picocolors: 1.1.1 + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) transitivePeerDependencies: - '@types/node' - less @@ -44102,13 +45539,30 @@ snapshots: - supports-color - terser - vite-node@3.0.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1): + vite-node@2.1.1(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1): + dependencies: + cac: 6.7.14 + debug: 4.4.0(supports-color@8.1.1) + pathe: 1.1.2 + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-node@3.0.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.2 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - '@types/node' - jiti @@ -44123,9 +45577,9 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.8.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.7.3)(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)): + vite-plugin-checker@0.8.0(eslint@8.57.0)(optionator@0.9.4)(typescript@5.8.3)(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)): dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 ansi-escapes: 4.3.2 chalk: 4.1.2 chokidar: 3.6.0 @@ -44135,7 +45589,7 @@ snapshots: npm-run-path: 4.0.1 strip-ansi: 6.0.1 tiny-invariant: 1.3.3 - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.12 @@ -44143,42 +45597,42 @@ snapshots: optionalDependencies: eslint: 8.57.0 optionator: 0.9.4 - typescript: 5.7.3 + typescript: 5.8.3 - vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)): + vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3))(rollup@4.22.0)(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.22.0) debug: 4.4.0(supports-color@8.1.1) error-stack-parser-es: 0.1.5 fs-extra: 11.2.0 - open: 10.1.0 + open: 10.1.2 perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) optionalDependencies: '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.22.0)(webpack-sources@3.2.3) transitivePeerDependencies: - rollup - supports-color - vite-plugin-vue-inspector@5.2.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)): + vite-plugin-vue-inspector@5.2.0(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)): dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.9) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9) - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.9) - '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.9) + '@babel/core': 7.27.1 + '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.27.1) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.27.1) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.27.1) '@vue/compiler-dom': 3.5.6 kolorist: 1.8.0 magic-string: 0.30.17 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) transitivePeerDependencies: - supports-color - vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0): + vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1): dependencies: esbuild: 0.21.5 postcss: 8.5.3 @@ -44190,25 +45644,9 @@ snapshots: sass: 1.55.0 sass-embedded: 1.85.1 stylus: 0.64.0 - terser: 5.39.0 + terser: 5.39.1 - vite@6.1.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.2.2)(sass-embedded@1.85.1)(sass@1.85.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1): - dependencies: - esbuild: 0.24.2 - postcss: 8.5.3 - rollup: 4.34.8 - optionalDependencies: - '@types/node': 20.16.10 - fsevents: 2.3.3 - jiti: 1.21.6 - less: 4.2.2 - sass: 1.85.0 - sass-embedded: 1.85.1 - stylus: 0.64.0 - terser: 5.39.0 - yaml: 2.6.1 - - vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1): + vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1): dependencies: esbuild: 0.25.0 postcss: 8.5.3 @@ -44221,17 +45659,55 @@ snapshots: sass: 1.55.0 sass-embedded: 1.85.1 stylus: 0.64.0 - terser: 5.39.0 + terser: 5.39.1 yaml: 2.6.1 - vitefu@0.2.5(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)): + vite@6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1): + dependencies: + esbuild: 0.25.0 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.2 + tinyglobby: 0.2.13 optionalDependencies: - vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0) + '@types/node': 20.16.10 + fsevents: 2.3.3 + jiti: 1.21.6 + less: 4.1.3 + sass: 1.88.0 + sass-embedded: 1.85.1 + stylus: 0.64.0 + terser: 5.39.1 + yaml: 2.6.1 - vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1): + vite@6.3.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.3.0)(sass-embedded@1.85.1)(sass@1.88.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1): + dependencies: + esbuild: 0.25.0 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.2 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 20.16.10 + fsevents: 2.3.3 + jiti: 1.21.6 + less: 4.3.0 + sass: 1.88.0 + sass-embedded: 1.85.1 + stylus: 0.64.0 + terser: 5.39.1 + yaml: 2.6.1 + + vitefu@0.2.5(vite@5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)): + optionalDependencies: + vite: 5.4.11(@types/node@20.16.10)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1) + + vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.16.10)(jiti@1.21.6)(jsdom@20.0.3(bufferutil@4.0.7))(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1)) + '@vitest/mocker': 3.0.5(vite@6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1)) '@vitest/pretty-format': 3.0.5 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -44247,8 +45723,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) - vite-node: 3.0.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.0)(yaml@2.6.1) + vite: 6.2.0(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) + vite-node: 3.0.5(@types/node@20.16.10)(jiti@1.21.6)(less@4.1.3)(sass-embedded@1.85.1)(sass@1.55.0)(stylus@0.64.0)(terser@5.39.1)(yaml@2.6.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -44311,7 +45787,7 @@ snapshots: volar-service-typescript@0.0.62(@volar/language-service@2.4.12): dependencies: path-browserify: 1.0.1 - semver: 7.7.1 + semver: 7.7.2 typescript-auto-import-cache: 0.3.5 vscode-languageserver-textdocument: 1.0.12 vscode-nls: 5.2.0 @@ -44355,7 +45831,7 @@ snapshots: vscode-languageclient@7.0.0: dependencies: minimatch: 3.1.2 - semver: 7.7.1 + semver: 7.7.2 vscode-languageserver-protocol: 3.16.0 vscode-languageserver-protocol@3.16.0: @@ -44398,20 +45874,20 @@ snapshots: vue-devtools-stub@0.1.0: {} - vue-router@4.4.5(vue@3.5.6(typescript@5.7.3)): + vue-router@4.4.5(vue@3.5.6(typescript@5.8.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.6(typescript@5.7.3) + vue: 3.5.6(typescript@5.8.3) - vue@3.5.6(typescript@5.7.3): + vue@3.5.6(typescript@5.8.3): dependencies: '@vue/compiler-dom': 3.5.6 '@vue/compiler-sfc': 3.5.6 '@vue/runtime-dom': 3.5.6 - '@vue/server-renderer': 3.5.6(vue@3.5.6(typescript@5.7.3)) + '@vue/server-renderer': 3.5.6(vue@3.5.6(typescript@5.8.3)) '@vue/shared': 3.5.6 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 w3c-keyname@2.2.8: {} @@ -44463,12 +45939,12 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0): + webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -44477,33 +45953,55 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-dev-server: 5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8) - webpack-dev-middleware@6.1.3(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + webpack-dev-middleware@6.1.3(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: colorette: 2.0.20 memfs: 3.6.0 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.3.0 + schema-utils: 4.3.2 optionalDependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + webpack-dev-middleware@7.4.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: colorette: 2.0.20 - memfs: 4.12.0 + memfs: 4.17.0 mime-types: 2.1.35 on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.3.0 + schema-utils: 4.3.2 optionalDependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) - webpack-dev-server@5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + webpack-dev-middleware@7.4.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + colorette: 2.0.20 + memfs: 4.17.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.2 + optionalDependencies: + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + + webpack-dev-middleware@7.4.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + colorette: 2.0.20 + memfs: 4.17.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.2 + optionalDependencies: + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + + webpack-dev-server@5.2.0(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -44530,18 +46028,18 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-dev-middleware: 7.4.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) ws: 8.18.0(bufferutil@4.0.7) optionalDependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -44569,11 +46067,89 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + webpack-dev-middleware: 7.4.2(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) ws: 8.18.0(bufferutil@4.0.7) optionalDependencies: - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/express-serve-static-core': 4.19.5 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.12 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.7.5 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.9.1 + open: 10.1.0 + p-retry: 6.2.0 + schema-utils: 4.3.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + ws: 8.18.0(bufferutil@4.0.7) + optionalDependencies: + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-dev-server@5.2.1(bufferutil@4.0.7)(webpack-cli@5.1.4)(webpack@5.99.8): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/express-serve-static-core': 4.19.5 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.12 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.7.5 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.9.1 + open: 10.1.0 + p-retry: 6.2.0 + schema-utils: 4.3.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + ws: 8.18.0(bufferutil@4.0.7) + optionalDependencies: + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) transitivePeerDependencies: - bufferutil - debug @@ -44602,27 +46178,41 @@ snapshots: webpack-sources@3.2.3: {} - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): dependencies: typed-assert: 1.0.9 - webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)) + webpack: 5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) optionalDependencies: - html-webpack-plugin: 5.5.0(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + html-webpack-plugin: 5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)): + dependencies: + typed-assert: 1.0.9 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4) + optionalDependencies: + html-webpack-plugin: 5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)))(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))): + dependencies: + typed-assert: 1.0.9 + webpack: 5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)) + optionalDependencies: + html-webpack-plugin: 5.5.0(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)): + webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)): dependencies: '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 acorn-import-attributes: 1.9.5(acorn@8.14.0) - browserslist: 4.24.2 + browserslist: 4.24.4 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 + es-module-lexer: 1.6.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -44633,20 +46223,20 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.94.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0)): + webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 @@ -44663,13 +46253,79 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.0 + schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0))) + terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.98.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.98.0) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.0)(webpack-cli@5.1.4)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8)): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack@5.99.8(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.25.4)(webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8))) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.99.8) transitivePeerDependencies: - '@swc/core' - esbuild @@ -44964,9 +46620,9 @@ snapshots: dependencies: zod: 3.24.2 - zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.24.2): + zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.24.2): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 zod: 3.24.2 zod@3.23.8: {} diff --git a/scripts/angular-support-upgrades/build-migrations.ts b/scripts/angular-support-upgrades/build-migrations.ts index b0071218e3..96fbaaed73 100644 --- a/scripts/angular-support-upgrades/build-migrations.ts +++ b/scripts/angular-support-upgrades/build-migrations.ts @@ -1,17 +1,21 @@ import axios from 'axios'; import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; -import { gt, major, minor, parse } from 'semver'; +import { compare, gt, major, minor, parse } from 'semver'; import { + getAngularCliMigrationDocs, getAngularCliMigrationGenerator, getAngularCliMigrationGeneratorSpec, } from './files/angular-cli-upgrade-migration'; +const migrationGeneratorPrefix = 'update-angular-cli-version-'; + async function addMigrationPackageGroup( angularPackageMigrations: Record, targetNxVersion: string, targetNxMigrationVersion: string, - packageVersionMap: Map + packageVersionMap: Map, + isPrerelease: boolean ) { angularPackageMigrations.packageJsonUpdates[targetNxVersion] = { version: `${targetNxMigrationVersion}`, @@ -54,7 +58,7 @@ async function addMigrationPackageGroup( angularPackageMigrations.packageJsonUpdates[targetNxVersion].packages[ pkgName ] = { - version: `~${version}`, + version: isPrerelease ? version : `~${version}`, alwaysAddToPackageJson: pkgName === '@angular/core', }; } @@ -89,30 +93,120 @@ async function getPromptAndRequiredVersions( return { angularCoreRequirement, promptVersion }; } +function findPreviousVersion( + packageUpdates: Record< + string, + { + version: string; + packages: Record; + } + >, + angularCoreNewVersion: string +): string { + const sortedUpdates = Object.values(packageUpdates).sort((a, b) => + compare(b.version, a.version) + ); + + const { + major: newMajorVersion, + minor: newMinorVersion, + patch: newPatchVersion, + } = parse(angularCoreNewVersion)!; + + const previousUpdate = sortedUpdates.find((update: any) => { + if (!update.packages['@angular/core']) { + return false; + } + + const { + major: updateMajorVersion, + minor: updateMinorVersion, + patch: updatePatchVersion, + } = parse(update.packages['@angular/core'].version.replace(/^[~^]/, ''))!; + + return ( + updateMajorVersion !== newMajorVersion || + updateMinorVersion !== newMinorVersion || + updatePatchVersion !== newPatchVersion + ); + })!; + + return previousUpdate.packages['@angular/core'].version.replace(/^[~^]/, ''); +} + +function deletePreviousPrereleaseMigration( + angularPackageMigrations: Record, + angularCoreVersion: string +) { + const { major, minor, patch } = parse(angularCoreVersion)!; + + const existingMigration = Object.keys( + angularPackageMigrations.generators + ).find((migration) => { + if (!migration.startsWith(migrationGeneratorPrefix)) { + return false; + } + + const angularCliVersion = migration.replace(migrationGeneratorPrefix, ''); + + if (!/^[0-9]+-[0-9]+-[0-9]+-.*$/.test(angularCliVersion)) { + return false; + } + + const [existingMajor, existingMinor, existingPatch] = + angularCliVersion.split('-'); + + return ( + +existingMajor === major && + +existingMinor === minor && + +existingPatch === patch + ); + }); + + if (existingMigration) { + delete angularPackageMigrations.generators[existingMigration]; + } +} + export async function buildMigrations( packageVersionMap: Map, targetNxVersion: string, - targetNxMigrationVersion: string + targetNxMigrationVersion: string, + isPrerelease: boolean ) { console.log('⏳ - Writing migrations...'); const pathToMigrationsJsonFile = 'packages/angular/migrations.json'; const angularPackageMigrations = JSON.parse( readFileSync(pathToMigrationsJsonFile, { encoding: 'utf-8' }) ); + const previousVersion = findPreviousVersion( + angularPackageMigrations.packageJsonUpdates, + packageVersionMap.get('@angular/core')! + ); await addMigrationPackageGroup( angularPackageMigrations, targetNxVersion, targetNxMigrationVersion, - packageVersionMap + packageVersionMap, + isPrerelease ); const angularCLIVersion = packageVersionMap.get('@angular/cli') as string; - const angularCliMigrationGeneratorContents = - getAngularCliMigrationGenerator(angularCLIVersion); + const angularCliMigrationGeneratorContents = getAngularCliMigrationGenerator( + angularCLIVersion, + isPrerelease + ); const angularCliMigrationGeneratorSpecContents = getAngularCliMigrationGeneratorSpec(); + const { major, minor } = parse(angularCLIVersion)!; + const newVersion = `${major}.${minor}.0`; + const angularCliMigrationDocsContents = getAngularCliMigrationDocs( + previousVersion, + newVersion + ); + // Create the directory update-targetNxVersion.dasherize() // Write the generator // Update angularPackageMigrations @@ -120,19 +214,29 @@ export async function buildMigrations( const migrationGeneratorFolderName = 'update-' + targetNxVersion.replace(/\./g, '-'); const migrationFileName = 'update-angular-cli'; - const generatorName = `update-angular-cli-version-${angularCLIVersion.replace( + const generatorName = `${migrationGeneratorPrefix}${angularCLIVersion.replace( /\./g, '-' )}`; - const angularCoreVersion = packageVersionMap.get('@angular/core'); + const angularCoreVersion = packageVersionMap.get('@angular/core')!; + + if (isPrerelease) { + deletePreviousPrereleaseMigration( + angularPackageMigrations, + angularCoreVersion + ); + } + angularPackageMigrations.generators[generatorName] = { cli: 'nx', version: targetNxMigrationVersion, requires: { '@angular/core': `>=${angularCoreVersion}`, }, - description: `Update the @angular/cli package version to ~${angularCLIVersion}.`, + description: `Update the @angular/cli package version to ${ + isPrerelease ? angularCLIVersion : `~${angularCLIVersion}` + }.`, factory: `./src/migrations/${migrationGeneratorFolderName}/${migrationFileName}`, }; @@ -157,6 +261,10 @@ export async function buildMigrations( pathToMigrationFolder, `${migrationFileName}.spec.ts` ); + const pathToMigrationDocsFile = join( + pathToMigrationFolder, + `${migrationFileName}.md` + ); writeFileSync( pathToMigrationGeneratorFile, angularCliMigrationGeneratorContents @@ -165,6 +273,7 @@ export async function buildMigrations( pathToMigrationGeneratorSpecFile, angularCliMigrationGeneratorSpecContents ); + writeFileSync(pathToMigrationDocsFile, angularCliMigrationDocsContents); console.log('✅ - Wrote migrations'); } diff --git a/scripts/angular-support-upgrades/fetch-versions-from-registry.ts b/scripts/angular-support-upgrades/fetch-versions-from-registry.ts index 1d4d69d211..f6d9ac8180 100644 --- a/scripts/angular-support-upgrades/fetch-versions-from-registry.ts +++ b/scripts/angular-support-upgrades/fetch-versions-from-registry.ts @@ -25,6 +25,7 @@ const packagesToUpdate: PackageSpec[] = [ '@angular/common', '@angular/compiler', '@angular/compiler-cli', + '@angular/platform-browser', '@angular/router', ], }, diff --git a/scripts/angular-support-upgrades/files/angular-cli-upgrade-migration.ts b/scripts/angular-support-upgrades/files/angular-cli-upgrade-migration.ts index 8988502e5e..a1f4f46a65 100644 --- a/scripts/angular-support-upgrades/files/angular-cli-upgrade-migration.ts +++ b/scripts/angular-support-upgrades/files/angular-cli-upgrade-migration.ts @@ -1,8 +1,9 @@ export const getAngularCliMigrationGenerator = ( - version: string + version: string, + isPrerelease: boolean ) => `import { formatFiles, Tree, updateJson } from '@nx/devkit'; -export const angularCliVersion = '~${version}'; +export const angularCliVersion = '${isPrerelease ? version : `~${version}`}'; export default async function (tree: Tree) { let shouldFormat = false; @@ -69,3 +70,37 @@ describe('update-angular-cli migration', () => { }); }); `; + +export const getAngularCliMigrationDocs = ( + fromVersion: string, + toVersion: string +) => `#### Sample Code Changes + +Update the \`@angular/cli\` package version in the \`package.json\` file at the workspace root to **~${toVersion}**. + +{% tabs %} +{% tab label="Before" %} + +\`\`\`json {% fileName="package.json" %} +{ + "devDependencies": { + "@angular/cli": "~${fromVersion}" + } +} +\`\`\` + +{% /tab %} +{% tab label="After" %} + +\`\`\`json {% highlightLines=[3] fileName="package.json" %} +{ + "devDependencies": { + "@angular/cli": "~${toVersion}" + } +} +\`\`\` + +{% /tab %} + +{% /tabs %} +`; diff --git a/scripts/angular-support-upgrades/init-upgrade.ts b/scripts/angular-support-upgrades/init-upgrade.ts index f21dd40d25..7e77bdda92 100644 --- a/scripts/angular-support-upgrades/init-upgrade.ts +++ b/scripts/angular-support-upgrades/init-upgrade.ts @@ -10,6 +10,7 @@ * */ import { execSync } from 'child_process'; +import { prerelease } from 'semver'; import { buildMigrations } from './build-migrations'; import { fetchVersionsFromRegistry } from './fetch-versions-from-registry'; import { updatePackageJsonForAngular } from './update-package-jsons'; @@ -33,13 +34,17 @@ async function run() { const packageVersionMap = await fetchVersionsFromRegistry( argv.angularVersion ); - await updatePackageJsonForAngular(packageVersionMap); + + const isPrerelease = + prerelease(packageVersionMap.get('@angular/cli')!) !== null; + await updatePackageJsonForAngular(packageVersionMap, isPrerelease); await buildMigrations( packageVersionMap, argv.targetNxVersion, - argv.targetNxMigrationVersion + argv.targetNxMigrationVersion, + isPrerelease ); - updateVersionUtils(packageVersionMap); + updateVersionUtils(packageVersionMap, isPrerelease); console.log('⏳ - Installing packages...'); execSync('pnpm install', { diff --git a/scripts/angular-support-upgrades/update-package-jsons.ts b/scripts/angular-support-upgrades/update-package-jsons.ts index 66b98b903b..0ae3dab097 100644 --- a/scripts/angular-support-upgrades/update-package-jsons.ts +++ b/scripts/angular-support-upgrades/update-package-jsons.ts @@ -2,29 +2,36 @@ import { readFileSync, writeFileSync } from 'fs'; function updatePackageJson( pathToPkgJson: string, - packageVersionMap: Map + packageVersionMap: Map, + isPrerelease: boolean ) { const pkgJson = JSON.parse( readFileSync(pathToPkgJson, { encoding: 'utf-8' }) ); for (const [pkgName, version] of packageVersionMap.entries()) { + const versionToUse = isPrerelease ? version : `~${version}`; if (pkgJson.devDependencies?.[pkgName]) { - pkgJson.devDependencies[pkgName] = `~${version}`; + pkgJson.devDependencies[pkgName] = versionToUse; } if (pkgJson.dependencies?.[pkgName]) { - pkgJson.dependencies[pkgName] = `~${version}`; + pkgJson.dependencies[pkgName] = versionToUse; } } - writeFileSync(pathToPkgJson, JSON.stringify(pkgJson, null, 2)); + writeFileSync(pathToPkgJson, `${JSON.stringify(pkgJson, null, 2)}\n`); } export async function updatePackageJsonForAngular( - packageVersionMap: Map + packageVersionMap: Map, + isPrerelease: boolean ) { console.log('⏳ - Writing package.json files...'); - updatePackageJson('package.json', packageVersionMap); - updatePackageJson('packages/angular/package.json', packageVersionMap); + updatePackageJson('package.json', packageVersionMap, isPrerelease); + updatePackageJson( + 'packages/angular/package.json', + packageVersionMap, + isPrerelease + ); console.log('✅ - Wrote package.json files'); } diff --git a/scripts/angular-support-upgrades/update-version-utils.ts b/scripts/angular-support-upgrades/update-version-utils.ts index 5c6f9c54db..84fefdc871 100644 --- a/scripts/angular-support-upgrades/update-version-utils.ts +++ b/scripts/angular-support-upgrades/update-version-utils.ts @@ -1,6 +1,9 @@ import { readFileSync, writeFileSync } from 'fs'; -function updateAngularVersionUtils(packageVersionMap: Map) { +function updateAngularVersionUtils( + packageVersionMap: Map, + isPrerelease: boolean +) { const pathToFile = 'packages/angular/src/utils/versions.ts'; let versionUtilContents = readFileSync(pathToFile, { encoding: 'utf-8' }); @@ -9,23 +12,30 @@ function updateAngularVersionUtils(packageVersionMap: Map) { const ngPackagrVersion = packageVersionMap.get('ng-packagr')!; versionUtilContents = versionUtilContents.replace( - /export const angularVersion = '~.+';/, - `export const angularVersion = '~${angularVersion}';` + /export const angularVersion = '.+';/, + `export const angularVersion = '${ + isPrerelease ? angularVersion : `~${angularVersion}` + }';` ); versionUtilContents = versionUtilContents.replace( - /export const angularDevkitVersion = '~.+';/, - `export const angularDevkitVersion = '~${angularDevkitVersion}';` + /export const angularDevkitVersion = '.+';/, + `export const angularDevkitVersion = '${ + isPrerelease ? angularDevkitVersion : `~${angularDevkitVersion}` + }';` ); versionUtilContents = versionUtilContents.replace( - /export const ngPackagrVersion = '~.+';/, - `export const ngPackagrVersion = '~${ngPackagrVersion}';` + /export const ngPackagrVersion = '.+';/, + `export const ngPackagrVersion = '${ + isPrerelease ? ngPackagrVersion : `~${ngPackagrVersion}` + }';` ); writeFileSync(pathToFile, versionUtilContents); } function updateWorkspaceAngularVersionUtils( - packageVersionMap: Map + packageVersionMap: Map, + isPrerelease: boolean ) { const pathToFile = 'packages/workspace/src/utils/versions.ts'; let versionUtilContents = readFileSync(pathToFile, { encoding: 'utf-8' }); @@ -33,16 +43,21 @@ function updateWorkspaceAngularVersionUtils( const angularDevkitVersion = packageVersionMap.get('@angular/cli')!; versionUtilContents = versionUtilContents.replace( - /export const angularCliVersion = '~.+';/, - `export const angularCliVersion = '~${angularDevkitVersion}';` + /export const angularCliVersion = '.+';/, + `export const angularCliVersion = '${ + isPrerelease ? angularDevkitVersion : `~${angularDevkitVersion}` + }';` ); writeFileSync(pathToFile, versionUtilContents); } -export function updateVersionUtils(packageVersionMap: Map) { +export function updateVersionUtils( + packageVersionMap: Map, + isPrerelease: boolean +) { console.log('⏳ - Writing Util Files...'); - updateAngularVersionUtils(packageVersionMap); - updateWorkspaceAngularVersionUtils(packageVersionMap); + updateAngularVersionUtils(packageVersionMap, isPrerelease); + updateWorkspaceAngularVersionUtils(packageVersionMap, isPrerelease); console.log('✅ - Wrote Util Files'); } diff --git a/tools/documentation/create-embeddings/src/main.mts b/tools/documentation/create-embeddings/src/main.mts index 1bdd36c8bd..27a4c241cc 100644 --- a/tools/documentation/create-embeddings/src/main.mts +++ b/tools/documentation/create-embeddings/src/main.mts @@ -14,13 +14,13 @@ import { fromMarkdown } from 'mdast-util-from-markdown'; import { toMarkdown } from 'mdast-util-to-markdown'; import { toString } from 'mdast-util-to-string'; import { u } from 'unist-builder'; -import mapJson from '../../../../docs/map.json' assert { type: 'json' }; -import manifestsCI from '../../../../docs/generated/manifests/ci.json' assert { type: 'json' }; -import manifestsExtending from '../../../../docs/generated/manifests/extending-nx.json' assert { type: 'json' }; -import manifestsNx from '../../../../docs/generated/manifests/nx.json' assert { type: 'json' }; -import manifestsPackages from '../../../../docs/generated/manifests/nx-api.json' assert { type: 'json' }; -import manifestsTags from '../../../../docs/generated/manifests/tags.json' assert { type: 'json' }; -import communityPlugins from '../../../../community/approved-plugins.json' assert { type: 'json' }; +import mapJson from '../../../../docs/map.json' with { type: 'json' }; +import manifestsCI from '../../../../docs/generated/manifests/ci.json' with { type: 'json' }; +import manifestsExtending from '../../../../docs/generated/manifests/extending-nx.json' with { type: 'json' }; +import manifestsNx from '../../../../docs/generated/manifests/nx.json' with { type: 'json' }; +import manifestsPackages from '../../../../docs/generated/manifests/nx-api.json' with { type: 'json' }; +import manifestsTags from '../../../../docs/generated/manifests/tags.json' with { type: 'json' }; +import communityPlugins from '../../../../community/approved-plugins.json' with { type: 'json' }; let identityMap = {};