diff --git a/docs/generated/cli/create-nx-workspace.md b/docs/generated/cli/create-nx-workspace.md index 2d26849dfb966..6b8696a24da7b 100644 --- a/docs/generated/cli/create-nx-workspace.md +++ b/docs/generated/cli/create-nx-workspace.md @@ -145,6 +145,8 @@ Customizes the initial content of your workspace. Default presets include: ["app Type: `boolean` +Default: `true` + Add a routing setup for an Angular app ### skipGit @@ -155,10 +157,18 @@ Default: `false` Skip initializing a git repository +### ssr + +Type: `boolean` + +Enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) for the Angular application + ### standaloneApi Type: `boolean` +Default: `true` + Use Standalone Components if generating an Angular app ### style diff --git a/docs/generated/packages/angular/executors/browser-esbuild.json b/docs/generated/packages/angular/executors/browser-esbuild.json index 242977c7b3520..03f1e40231c39 100644 --- a/docs/generated/packages/angular/executors/browser-esbuild.json +++ b/docs/generated/packages/angular/executors/browser-esbuild.json @@ -245,7 +245,7 @@ }, "outputPath": { "type": "string", - "description": "The full path for the new output directory, relative to the current workspace.\nBy default, writes output to a folder named dist/ in the current project." + "description": "The full path for the new output directory, relative to the current workspace." }, "resourcesOutputPath": { "type": "string", @@ -292,12 +292,12 @@ }, "vendorChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", + "description": "Generate a separate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", "default": false }, "commonChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing code used across multiple bundles.", + "description": "Generate a separate bundle containing code used across multiple bundles.", "default": true }, "baseHref": { @@ -426,6 +426,7 @@ }, { "const": false, + "type": "boolean", "description": "Does not generate an `index.html` file." } ] @@ -503,7 +504,7 @@ "enum": ["none", "anonymous", "use-credentials"] }, "allowedCommonJsDependencies": { - "description": "A list of CommonJS packages that are allowed to be used without a build time warning.", + "description": "A list of CommonJS or AMD packages that are allowed to be used without a build time warning. Use `'*'` to allow all.", "type": "array", "items": { "type": "string" }, "default": [] 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 c2e62d1cda4d2..ac812527ebb12 100644 --- a/docs/generated/packages/angular/executors/module-federation-dev-server.json +++ b/docs/generated/packages/angular/executors/module-federation-dev-server.json @@ -9,12 +9,18 @@ "description": "The module-federation-dev-server executor is reserved exclusively for use with host Module Federation applications. It allows the user to specify which remote applications should be served with the host.", "type": "object", "presets": [ - { "name": "Using a Different Port", "keys": ["browserTarget", "port"] } + { "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]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.", + "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 in Nx v18." + }, + "buildTarget": { + "type": "string", + "description": "A build builder target to serve in the format of `project:target[:configuration]`.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$" }, "port": { @@ -129,8 +135,11 @@ } }, "additionalProperties": false, - "required": ["browserTarget"], - "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 \"browserTarget\": \"host:build:production\"\n },\n \"development\": {\n \"browserTarget\": \"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 \"browserTarget\": \"host:build:production\"\n },\n \"development\": {\n \"browserTarget\": \"host:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n \"options\": {\n \"port\": 4200,\n \"publicHost\": \"http://localhost:4200\",\n \"devRemotes\": [\"remote1\", \"remote2\"]\n }\n }\n}\n```\n\n{% /tab %}\n\n{% /tabs %}\n" + "anyOf": [ + { "required": ["buildTarget"] }, + { "required": ["browserTarget"] } + ], + "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\": [\"remote1\", \"remote2\"]\n }\n }\n}\n```\n\n{% /tab %}\n\n{% /tabs %}\n" }, "description": "The module-federation-dev-server executor is reserved exclusively for use with host Module Federation applications. It allows the user to specify which remote applications should be served with the host.", "aliases": [], diff --git a/docs/generated/packages/angular/executors/webpack-browser.json b/docs/generated/packages/angular/executors/webpack-browser.json index 549d90b3b2d98..3b49517589e60 100644 --- a/docs/generated/packages/angular/executors/webpack-browser.json +++ b/docs/generated/packages/angular/executors/webpack-browser.json @@ -75,7 +75,7 @@ "oneOf": [ { "type": "array", - "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'. _Note: supported in Angular versions >= 15.0.0_.", + "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'.", "items": { "type": "string", "uniqueItems": true }, "default": [] }, @@ -137,7 +137,7 @@ "input": { "type": "string", "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less|styl)$" + "pattern": "\\.(?:css|scss|sass|less)$" }, "bundleName": { "type": "string", @@ -156,7 +156,7 @@ { "type": "string", "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less|styl)$" + "pattern": "\\.(?:css|scss|sass|less)$" } ] }, @@ -282,7 +282,7 @@ }, "outputPath": { "type": "string", - "description": "The full path for the new output directory, relative to the current workspace.\n\nBy default, writes output to a folder named dist/ in the current project." + "description": "The full path for the new output directory, relative to the current workspace." }, "resourcesOutputPath": { "type": "string", @@ -330,12 +330,12 @@ }, "vendorChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", + "description": "Generate a separate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", "default": false }, "commonChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing code used across multiple bundles.", + "description": "Generate a separate bundle containing code used across multiple bundles.", "default": true }, "baseHref": { @@ -537,7 +537,7 @@ "enum": ["none", "anonymous", "use-credentials"] }, "allowedCommonJsDependencies": { - "description": "A list of CommonJS packages that are allowed to be used without a build time warning.", + "description": "A list of CommonJS or AMD packages that are allowed to be used without a build time warning. Use `'*'` to allow all.", "type": "array", "items": { "type": "string" }, "default": [] diff --git a/docs/generated/packages/angular/executors/webpack-dev-server.json b/docs/generated/packages/angular/executors/webpack-dev-server.json index a67ca82d4760b..4dff6e90b9d62 100644 --- a/docs/generated/packages/angular/executors/webpack-dev-server.json +++ b/docs/generated/packages/angular/executors/webpack-dev-server.json @@ -7,15 +7,21 @@ "$schema": "http://json-schema.org/draft-07/schema", "title": "Schema for Webpack Dev Server", "description": "The webpack-dev-server executor is very similar to the standard dev server builder provided by the Angular Devkit. It is usually used in tandem with `@nx/angular:webpack-browser` when your Angular application uses a custom webpack configuration.", - "examplesFile": "##### Seving an application with 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\nYour `project.json` file should contain a `build` and `serve` target that matches the following:\n\n```json\n\"build\": {\n \"executor\": \"@nx/angular:webpack-browser\",\n \"options\": {\n ...\n \"customWebpackConfig\": {\n \"path\": \"apps/appName/webpack.config.js\"\n }\n }\n},\n\"serve\": {\n \"executor\": \"@nx/angular:webpack-dev-server\",\n \"configurations\": {\n \"production\": {\n \"browserTarget\": \"appName:build:production\"\n },\n \"development\": {\n \"browserTarget\": \"appName:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n}\n```\n", + "examplesFile": "##### Seving an application with 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\nYour `project.json` file should contain a `build` and `serve` target that matches the following:\n\n```json\n\"build\": {\n \"executor\": \"@nx/angular:webpack-browser\",\n \"options\": {\n ...\n \"customWebpackConfig\": {\n \"path\": \"apps/appName/webpack.config.js\"\n }\n }\n},\n\"serve\": {\n \"executor\": \"@nx/angular:webpack-dev-server\",\n \"configurations\": {\n \"production\": {\n \"buildTarget\": \"appName:build:production\"\n },\n \"development\": {\n \"buildTarget\": \"appName:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n}\n```\n", "type": "object", "presets": [ - { "name": "Using a Different Port", "keys": ["browserTarget", "port"] } + { "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]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.", + "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 in Nx v18." + }, + "buildTarget": { + "type": "string", + "description": "A build builder target to serve in the format of `project:target[:configuration]`.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$" }, "port": { @@ -106,7 +112,10 @@ } }, "additionalProperties": false, - "required": ["browserTarget"] + "anyOf": [ + { "required": ["buildTarget"] }, + { "required": ["browserTarget"] } + ] }, "description": "The `webpack-dev-server` executor is very similar to the standard `dev-server` builder provided by the Angular Devkit. It is usually used in tandem with `@nrwl/angular:webpack-browser` when your Angular application uses a custom webpack configuration.", "aliases": [], diff --git a/docs/generated/packages/angular/executors/webpack-server.json b/docs/generated/packages/angular/executors/webpack-server.json index 6dd917c2cd839..9dc0d2f70ba63 100644 --- a/docs/generated/packages/angular/executors/webpack-server.json +++ b/docs/generated/packages/angular/executors/webpack-server.json @@ -187,7 +187,7 @@ }, "vendorChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time. _Note: supported in Angular versions >= 15.1.0_", + "description": "Generate a separate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time. _Note: supported in Angular versions >= 15.1.0_", "default": false }, "verbose": { @@ -263,13 +263,6 @@ "items": { "type": "string" }, "default": [] }, - "bundleDependencies": { - "description": "Which external dependencies to bundle into the bundle. By default, all of node_modules will be bundled. _Note: This is only supported in Angular versions >= 14.0.0, < 15.0.0. It was removed in Angular 15._", - "oneOf": [ - { "type": "boolean" }, - { "type": "string", "enum": ["none", "all"] } - ] - }, "statsJson": { "type": "boolean", "description": "Generates a 'stats.json' file which can be analyzed using tools such as 'webpack-bundle-analyzer'.", diff --git a/docs/generated/packages/angular/generators/application.json b/docs/generated/packages/angular/generators/application.json index fa7a163df6ac4..0f786b6610de8 100644 --- a/docs/generated/packages/angular/generators/application.json +++ b/docs/generated/packages/angular/generators/application.json @@ -53,9 +53,8 @@ }, "routing": { "type": "boolean", - "description": "Generate a routing module.", - "default": false, - "x-prompt": "Would you like to configure routing for this application?", + "description": "Enable routing for the application.", + "default": true, "x-priority": "important" }, "inlineStyle": { @@ -152,8 +151,9 @@ "default": false }, "standalone": { - "description": "Generate an application that is setup to use standalone components. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Generate an application that is setup to use standalone components.", "type": "boolean", + "default": true, "x-priority": "important" }, "rootProject": { @@ -169,10 +169,17 @@ "default": false }, "bundler": { - "description": "Bundler to use to build the application.", + "description": "Bundler to use to build the application. It defaults to `esbuild` for Angular versions >= 17.0.0. Otherwise, it defaults to `webpack`. _Note: The `esbuild` bundler is only considered stable from Angular v17._", "type": "string", "enum": ["webpack", "esbuild"], - "default": "webpack" + "x-prompt": "Which bundler do you want to use to build the application?", + "x-priority": "important" + }, + "ssr": { + "description": "Creates an application with Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) enabled.", + "type": "boolean", + "x-prompt": "Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)?", + "default": false } }, "additionalProperties": false, diff --git a/docs/generated/packages/angular/generators/component.json b/docs/generated/packages/angular/generators/component.json index 8af01710c8708..f2b737df15653 100644 --- a/docs/generated/packages/angular/generators/component.json +++ b/docs/generated/packages/angular/generators/component.json @@ -58,9 +58,9 @@ "alias": "t" }, "standalone": { - "description": "Whether the generated component is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "Whether the generated component is standalone.", "type": "boolean", - "default": false, + "default": true, "x-priority": "important" }, "viewEncapsulation": { diff --git a/docs/generated/packages/angular/generators/directive.json b/docs/generated/packages/angular/generators/directive.json index d2a60d2339be1..f28658b10bf32 100644 --- a/docs/generated/packages/angular/generators/directive.json +++ b/docs/generated/packages/angular/generators/directive.json @@ -59,9 +59,9 @@ "description": "The HTML selector to use for this directive." }, "standalone": { - "description": "Whether the generated directive is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "Whether the generated directive is standalone.", "type": "boolean", - "default": false + "default": true }, "flat": { "type": "boolean", diff --git a/docs/generated/packages/angular/generators/federate-module.json b/docs/generated/packages/angular/generators/federate-module.json index 2656515cbf058..dde3b3cdd89a7 100644 --- a/docs/generated/packages/angular/generators/federate-module.json +++ b/docs/generated/packages/angular/generators/federate-module.json @@ -67,9 +67,9 @@ "default": "cypress" }, "standalone": { - "description": "Whether to generate the remote application with standalone components if it needs to be created. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Whether to generate the remote application with standalone components if it needs to be created.", "type": "boolean", - "default": false + "default": true }, "host": { "type": "string", diff --git a/docs/generated/packages/angular/generators/host.json b/docs/generated/packages/angular/generators/host.json index 18eef256069fe..840972322e92c 100644 --- a/docs/generated/packages/angular/generators/host.json +++ b/docs/generated/packages/angular/generators/host.json @@ -162,8 +162,8 @@ }, "standalone": { "type": "boolean", - "description": "Whether to generate a host application that uses standalone components. _Note: This is only supported in Angular versions >= 14.1.0_", - "default": false + "description": "Whether to generate a host application that uses standalone components.", + "default": true }, "ssr": { "description": "Whether to configure SSR for the host application", diff --git a/docs/generated/packages/angular/generators/library.json b/docs/generated/packages/angular/generators/library.json index 77e8e9998e2a7..f7fe88c1e2f5c 100644 --- a/docs/generated/packages/angular/generators/library.json +++ b/docs/generated/packages/angular/generators/library.json @@ -141,65 +141,65 @@ }, "standalone": { "type": "boolean", - "description": "Generate a library that uses a standalone component instead of a module as the entry point. _Note: This is only supported in Angular versions >= 14.1.0_", - "default": false + "description": "Generate a library that uses a standalone component instead of a module as the entry point.", + "default": true }, "displayBlock": { - "description": "Specifies if the component generated style will contain `:host { display: block; }`. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Specifies if the component generated style will contain `:host { display: block; }`. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "boolean", "default": false, "alias": "b" }, "inlineStyle": { - "description": "Include styles inline in the component.ts file. Only CSS styles can be included inline. By default, an external styles file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Include styles inline in the component.ts file. Only CSS styles can be included inline. By default, an external styles file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "boolean", "default": false, "alias": "s" }, "inlineTemplate": { - "description": "Include template inline in the component.ts file. By default, an external template file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Include template inline in the component.ts file. By default, an external template file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "boolean", "default": false, "alias": "t" }, "viewEncapsulation": { - "description": "The view encapsulation strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "The view encapsulation strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "enum": ["Emulated", "None", "ShadowDom"], "type": "string", "alias": "v" }, "changeDetection": { - "description": "The change detection strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "The change detection strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "enum": ["Default", "OnPush"], "type": "string", "default": "Default", "alias": "c" }, "style": { - "description": "The file extension or preprocessor to use for style files, or `none` to skip generating the style file. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "The file extension or preprocessor to use for style files, or `none` to skip generating the style file. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "string", "default": "css", "enum": ["css", "scss", "sass", "less", "none"] }, "skipTests": { "type": "boolean", - "description": "Do not create `spec.ts` test files for the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Do not create `spec.ts` test files for the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "default": false }, "selector": { "type": "string", "format": "html-selector", - "description": "The HTML selector to use for this component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_" + "description": "The HTML selector to use for this component. Disclaimer: This option is only valid when `--standalone` is set to `true`." }, "skipSelector": { "type": "boolean", "default": false, - "description": "Specifies if the component should have a selector or not. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_" + "description": "Specifies if the component should have a selector or not. Disclaimer: This option is only valid when `--standalone` is set to `true`." }, "flat": { "type": "boolean", "default": false, - "description": "Ensure the generated standalone component is not placed in a subdirectory. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_" + "description": "Ensure the generated standalone component is not placed in a subdirectory. Disclaimer: This option is only valid when `--standalone` is set to `true`." } }, "additionalProperties": false, diff --git a/docs/generated/packages/angular/generators/ngrx-feature-store.json b/docs/generated/packages/angular/generators/ngrx-feature-store.json index b153f50db15d4..18fba35179939 100644 --- a/docs/generated/packages/angular/generators/ngrx-feature-store.json +++ b/docs/generated/packages/angular/generators/ngrx-feature-store.json @@ -18,13 +18,13 @@ }, "parent": { "type": "string", - "description": "The path to the file where the state will be registered. For NgModule usage, this will be your Feature Module. For Standalone API usage, this will be your Routes definition file for your feature state. The host directory will create/use the new state directory. _Note: The Standalone API usage is only supported in Angular versions >= 14.1.0_.", + "description": "The path to the file where the state will be registered. For NgModule usage, this will be your Feature Module. For Standalone API usage, this will be your 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" }, "route": { "type": "string", - "description": "The route that the Standalone NgRx Providers should be added to. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "The route that the Standalone NgRx Providers should be added to.", "default": "''" }, "minimal": { diff --git a/docs/generated/packages/angular/generators/ngrx-root-store.json b/docs/generated/packages/angular/generators/ngrx-root-store.json index d34284e9b7044..e26d2706b98da 100644 --- a/docs/generated/packages/angular/generators/ngrx-root-store.json +++ b/docs/generated/packages/angular/generators/ngrx-root-store.json @@ -29,7 +29,7 @@ }, "route": { "type": "string", - "description": "The route that the Standalone NgRx Providers should be added to. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "The route that the Standalone NgRx Providers should be added to.", "default": "''" }, "directory": { diff --git a/docs/generated/packages/angular/generators/ngrx.json b/docs/generated/packages/angular/generators/ngrx.json index 2b34ae403bcd0..87f0aa9d86135 100644 --- a/docs/generated/packages/angular/generators/ngrx.json +++ b/docs/generated/packages/angular/generators/ngrx.json @@ -42,13 +42,13 @@ }, "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. _Note: The Standalone API usage is only supported in Angular versions >= 14.1.0_.", + "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" }, "route": { "type": "string", - "description": "The route that the Standalone NgRx Providers should be added to. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "The route that the Standalone NgRx Providers should be added to.", "default": "''" }, "directory": { diff --git a/docs/generated/packages/angular/generators/pipe.json b/docs/generated/packages/angular/generators/pipe.json index e022ed06fc4e7..09566384fb263 100644 --- a/docs/generated/packages/angular/generators/pipe.json +++ b/docs/generated/packages/angular/generators/pipe.json @@ -51,9 +51,9 @@ "description": "Do not import this pipe into the owning NgModule." }, "standalone": { - "description": "Whether the generated pipe is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "Whether the generated pipe is standalone.", "type": "boolean", - "default": false + "default": true }, "module": { "type": "string", diff --git a/docs/generated/packages/angular/generators/remote.json b/docs/generated/packages/angular/generators/remote.json index 457fb29289c7e..ee4e9d16373c6 100644 --- a/docs/generated/packages/angular/generators/remote.json +++ b/docs/generated/packages/angular/generators/remote.json @@ -155,9 +155,9 @@ "x-priority": "internal" }, "standalone": { - "description": "Whether to generate a remote application with standalone components. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Whether to generate a remote application with standalone components.", "type": "boolean", - "default": false + "default": true }, "ssr": { "description": "Whether to configure SSR for the remote application to be consumed by a host application using SSR.", diff --git a/docs/generated/packages/angular/generators/scam-to-standalone.json b/docs/generated/packages/angular/generators/scam-to-standalone.json index 1c64ecc99a0d1..3d98861b10198 100644 --- a/docs/generated/packages/angular/generators/scam-to-standalone.json +++ b/docs/generated/packages/angular/generators/scam-to-standalone.json @@ -6,7 +6,7 @@ "$id": "GeneratorAngularScamToStandalone", "cli": "nx", "title": "Convert an Inline SCAM to Standalone Component", - "description": "Convert an Inline SCAM to a Standalone Component. _Note: This generator is only supported with Angular versions >= 14.1.0_.", + "description": "Convert an Inline SCAM to a Standalone Component.", "type": "object", "properties": { "component": { diff --git a/docs/generated/packages/angular/generators/setup-mf.json b/docs/generated/packages/angular/generators/setup-mf.json index d9c47472c1ad8..196986cf8a4ea 100644 --- a/docs/generated/packages/angular/generators/setup-mf.json +++ b/docs/generated/packages/angular/generators/setup-mf.json @@ -71,8 +71,8 @@ }, "standalone": { "type": "boolean", - "description": "Whether the application is a standalone application. _Note: This is only supported in Angular versions >= 14.1.0_", - "default": false + "description": "Whether the application is a standalone application.", + "default": true }, "typescriptConfiguration": { "type": "boolean", diff --git a/docs/generated/packages/angular/generators/setup-ssr.json b/docs/generated/packages/angular/generators/setup-ssr.json index a891887dd37af..84c632b4147dc 100644 --- a/docs/generated/packages/angular/generators/setup-ssr.json +++ b/docs/generated/packages/angular/generators/setup-ssr.json @@ -19,7 +19,7 @@ "appId": { "type": "string", "format": "html-selector", - "description": "The `appId` to use with `withServerTransition`. _Note: This is only used in Angular versions <16.0.0. It's deprecated since Angular 16._", + "description": "The `appId` to use with `withServerTransition`. _Note: This is only used in Angular versions <16.0.0. It's deprecated since Angular 16 and not supported since Angular 17._", "default": "serverApp" }, "main": { @@ -51,11 +51,11 @@ }, "standalone": { "type": "boolean", - "description": "Use Standalone Components to bootstrap SSR. _Note: This is only supported in Angular versions >= 14.1.0_." + "description": "Use Standalone Components to bootstrap SSR." }, "hydration": { "type": "boolean", - "description": "Set up Hydration for the SSR application. _Note: This is only supported in Angular versions >= 16.0.0_." + "description": "Set up Hydration for the SSR application. It defaults to `true` for Angular versions >= 17.0.0. Otherwise, it defaults to `false`. _Note: This is only supported in Angular versions >= 16.0.0_." }, "skipFormat": { "type": "boolean", diff --git a/docs/generated/packages/nx/documents/create-nx-workspace.md b/docs/generated/packages/nx/documents/create-nx-workspace.md index 2d26849dfb966..6b8696a24da7b 100644 --- a/docs/generated/packages/nx/documents/create-nx-workspace.md +++ b/docs/generated/packages/nx/documents/create-nx-workspace.md @@ -145,6 +145,8 @@ Customizes the initial content of your workspace. Default presets include: ["app Type: `boolean` +Default: `true` + Add a routing setup for an Angular app ### skipGit @@ -155,10 +157,18 @@ Default: `false` Skip initializing a git repository +### ssr + +Type: `boolean` + +Enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) for the Angular application + ### standaloneApi Type: `boolean` +Default: `true` + Use Standalone Components if generating an Angular app ### style diff --git a/docs/generated/packages/workspace/generators/new.json b/docs/generated/packages/workspace/generators/new.json index c4bb61ebfae93..ead20a62830d0 100644 --- a/docs/generated/packages/workspace/generators/new.json +++ b/docs/generated/packages/workspace/generators/new.json @@ -69,6 +69,11 @@ "description": "The tool to use for running e2e tests.", "type": "string", "enum": ["cypress", "playwright", "jest", "detox", "none"] + }, + "ssr": { + "description": "Enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) for the Angular application.", + "type": "boolean", + "default": false } }, "additionalProperties": true, diff --git a/docs/generated/packages/workspace/generators/preset.json b/docs/generated/packages/workspace/generators/preset.json index 2e1376287c3b9..4c8e09ab65d32 100644 --- a/docs/generated/packages/workspace/generators/preset.json +++ b/docs/generated/packages/workspace/generators/preset.json @@ -86,6 +86,11 @@ "description": "The tool to use for running e2e tests.", "type": "string", "enum": ["cypress", "playwright", "jest", "detox", "none"] + }, + "ssr": { + "description": "Enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) for the Angular application.", + "type": "boolean", + "default": false } }, "required": ["preset", "name"], diff --git a/docs/shared/migration/migration-angular.md b/docs/shared/migration/migration-angular.md index 152e4f6c778d5..e00bdd42620c6 100644 --- a/docs/shared/migration/migration-angular.md +++ b/docs/shared/migration/migration-angular.md @@ -85,13 +85,17 @@ The automated migration supports Angular CLI workspaces with a standard structur Currently, the automated migration supports workspaces using the following executors (builders): +- `@angular-devkit/build-angular:application` - `@angular-devkit/build-angular:browser` +- `@angular-devkit/build-angular:browser-esbuild` - `@angular-devkit/build-angular:dev-server` - `@angular-devkit/build-angular:extract-i18n` - `@angular-devkit/build-angular:karma` - `@angular-devkit/build-angular:ng-packagr` +- `@angular-devkit/build-angular:prerender` - `@angular-devkit/build-angular:protractor` - `@angular-devkit/build-angular:server` +- `@angular-devkit/build-angular:ssr-dev-server` - `@angular-eslint/builder:lint` - `@cypress/schematic:cypress` - `@nguniversal/builders:prerender` diff --git a/e2e/angular-core/src/module-federation.test.ts b/e2e/angular-core/src/module-federation.test.ts index 1b1ed145e066b..c2d5e6f1cc59c 100644 --- a/e2e/angular-core/src/module-federation.test.ts +++ b/e2e/angular-core/src/module-federation.test.ts @@ -37,11 +37,11 @@ describe('Angular Module Federation', () => { // generate host app runCLI( - `generate @nx/angular:host ${hostApp} --style=css --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:host ${hostApp} --style=css --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); // generate remote app runCLI( - `generate @nx/angular:remote ${remoteApp1} --host=${hostApp} --port=${remotePort} --style=css --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:remote ${remoteApp1} --host=${hostApp} --port=${remotePort} --style=css --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); // check files are generated without the layout directory ("apps/") @@ -56,7 +56,7 @@ describe('Angular Module Federation', () => { // generate a shared lib with a seconary entry point runCLI( - `generate @nx/angular:library ${sharedLib} --buildable --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:library ${sharedLib} --buildable --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); runCLI( `generate @nx/angular:library-secondary-entry-point --library=${sharedLib} --name=${secondaryEntry} --no-interactive` @@ -157,10 +157,10 @@ describe('Angular Module Federation', () => { // generate apps runCLI( - `generate @nx/angular:application ${app1} --routing --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:application ${app1} --routing --bundler=webpack --project-name-and-root-format=as-provided --no-interactive` ); runCLI( - `generate @nx/angular:application ${app2} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:application ${app2} --bundler=webpack --project-name-and-root-format=as-provided --no-interactive` ); // convert apps @@ -260,11 +260,11 @@ describe('Angular Module Federation', () => { // generate host app runCLI( - `generate @nx/angular:host ${hostApp} --project-name-and-root-format=derived --no-interactive` + `generate @nx/angular:host ${hostApp} --no-standalone --project-name-and-root-format=derived --no-interactive` ); // generate remote app runCLI( - `generate @nx/angular:remote ${remoteApp} --host=${hostApp} --port=${remotePort} --project-name-and-root-format=derived --no-interactive` + `generate @nx/angular:remote ${remoteApp} --host=${hostApp} --port=${remotePort} --no-standalone --project-name-and-root-format=derived --no-interactive` ); // check files are generated with the layout directory ("apps/") @@ -344,7 +344,8 @@ describe('Angular Module Federation', () => { @Component({ selector: 'proj-root', - template: \`
{{title}}
\` + template: \`
{{title}}
\`, + standalone: true }) export class AppComponent { title = \`shell is \${isEven(2) ? 'even' : 'odd'}\`; @@ -421,7 +422,8 @@ describe('Angular Module Federation', () => { @Component({ selector: 'proj-${remote}-entry', - template: \`
{{title}}
\` + template: \`
{{title}}
\`, + standalone: true }) export class RemoteEntryComponent { title = \`shell is \${isEven(2) ? 'even' : 'odd'}\`; @@ -437,7 +439,8 @@ describe('Angular Module Federation', () => { name: '${remote}', remotes: ['${childRemote}'], exposes: { - './Module': '${remote}/src/app/remote-entry/entry.module.ts', + './Routes': '${remote}/src/app/remote-entry/entry.routes.ts', + './Module': '${remote}/src/app/remote-entry/entry.component.ts', }, }; diff --git a/e2e/angular-core/src/ng-add.test.ts b/e2e/angular-core/src/ng-add.test.ts index 31db4f3789e63..5c65714750d31 100644 --- a/e2e/angular-core/src/ng-add.test.ts +++ b/e2e/angular-core/src/ng-add.test.ts @@ -114,7 +114,9 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { '.vscode/extensions.json', '.prettierrc', `apps/${project}/src/main.ts`, - `apps/${project}/src/app/app.module.ts` + `apps/${project}/src/app/app.config.ts`, + `apps/${project}/src/app/app.component.ts`, + `apps/${project}/src/app/app.routes.ts` ); // check the right VSCode extensions are recommended @@ -178,11 +180,11 @@ 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:browser', + executor: '@angular-devkit/build-angular:application', options: { outputPath: `dist/apps/${project}`, index: `apps/${project}/src/index.html`, - main: `apps/${project}/src/main.ts`, + browser: `apps/${project}/src/main.ts`, polyfills: [`zone.js`], tsConfig: `apps/${project}/tsconfig.app.json`, assets: [ @@ -209,12 +211,9 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { outputHashing: 'all', }, development: { - buildOptimizer: false, optimization: false, - vendorChunk: true, extractLicenses: false, sourceMap: true, - namedChunks: true, }, }, defaultConfiguration: 'production', @@ -222,8 +221,8 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { expect(projectConfig.targets.serve).toEqual({ executor: '@angular-devkit/build-angular:dev-server', configurations: { - production: { browserTarget: `${project}:build:production` }, - development: { browserTarget: `${project}:build:development` }, + production: { buildTarget: `${project}:build:production` }, + development: { buildTarget: `${project}:build:development` }, }, defaultConfiguration: 'development', }); @@ -258,7 +257,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { }); runCLI(`build ${project} --configuration production --outputHashing none`); - checkFilesExist(`dist/apps/${project}/main.js`); + checkFilesExist(`dist/apps/${project}/browser/main.js`); }); it('should handle a workspace with cypress v9', () => { @@ -451,7 +450,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { expect(output).toContain( `Successfully ran target build for project ${project}` ); - checkFilesExist(`dist/apps/${project}/main.js`); + checkFilesExist(`dist/apps/${project}/browser/main.js`); output = runCLI(`build ${project} --outputHashing none`); expect(output).toContain( @@ -469,7 +468,7 @@ describe('convert Angular CLI workspace to an Nx workspace', () => { expect(output).toContain( `Successfully ran target build for project ${app1}` ); - checkFilesExist(`dist/apps/${app1}/main.js`); + checkFilesExist(`dist/apps/${app1}/browser/main.js`); output = runCLI(`build ${app1} --outputHashing none`); expect(output).toContain( diff --git a/e2e/angular-core/src/projects.test.ts b/e2e/angular-core/src/projects.test.ts index f57bdd54613c5..9f800070df576 100644 --- a/e2e/angular-core/src/projects.test.ts +++ b/e2e/angular-core/src/projects.test.ts @@ -28,10 +28,10 @@ describe('Angular Projects', () => { beforeAll(() => { proj = newProject(); runCLI( - `generate @nx/angular:app ${app1} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:app ${app1} --no-standalone --bundler=webpack --project-name-and-root-format=as-provided --no-interactive` ); runCLI( - `generate @nx/angular:lib ${lib1} --add-module-spec --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:lib ${lib1} --no-standalone --add-module-spec --project-name-and-root-format=as-provided --no-interactive` ); app1DefaultModule = readFile(`${app1}/src/app/app.module.ts`); app1DefaultComponentTemplate = readFile( @@ -52,7 +52,7 @@ describe('Angular Projects', () => { it('should successfully generate apps and libs and work correctly', async () => { const standaloneApp = uniq('standalone-app'); runCLI( - `generate @nx/angular:app ${standaloneApp} --directory=my-dir/${standaloneApp} --standalone=true --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:app ${standaloneApp} --directory=my-dir/${standaloneApp} --bundler=webpack --project-name-and-root-format=as-provided --no-interactive` ); const esbuildApp = uniq('esbuild-app'); @@ -65,12 +65,18 @@ describe('Angular Projects', () => { ` import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; - import { ${names(lib1).className}Module } from '@${proj}/${lib1}'; + import { RouterModule } from '@angular/router'; import { AppComponent } from './app.component'; + import { appRoutes } from './app.routes'; import { NxWelcomeComponent } from './nx-welcome.component'; + import { ${names(lib1).className}Module } from '@${proj}/${lib1}'; @NgModule({ - imports: [BrowserModule, ${names(lib1).className}Module], + imports: [ + BrowserModule, + RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + ${names(lib1).className}Module + ], declarations: [AppComponent, NxWelcomeComponent], bootstrap: [AppComponent] }) @@ -84,14 +90,14 @@ describe('Angular Projects', () => { ); checkFilesExist(`dist/${app1}/main.js`); checkFilesExist(`dist/my-dir/${standaloneApp}/main.js`); - checkFilesExist(`dist/my-dir/${esbuildApp}/main.js`); + checkFilesExist(`dist/my-dir/${esbuildApp}/browser/main.js`); // This is a loose requirement because there are a lot of // influences external from this project that affect this. const es2015BundleSize = getSize(tmpProjPath(`dist/${app1}/main.js`)); console.log( `The current es2015 bundle size is ${es2015BundleSize / 1000} KB` ); - expect(es2015BundleSize).toBeLessThanOrEqual(160000); + expect(es2015BundleSize).toBeLessThanOrEqual(220000); // check unit tests runCLI( @@ -195,35 +201,40 @@ describe('Angular Projects', () => { // ARRANGE const esbuildApp = uniq('esbuild-app'); runCLI( - `generate @nx/angular:app ${esbuildApp} --bundler=esbuild --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:app ${esbuildApp} --bundler=esbuild --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); const buildableLib = uniq('buildlib1'); const buildableChildLib = uniq('buildlib2'); runCLI( - `generate @nx/angular:library ${buildableLib} --buildable=true --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:library ${buildableLib} --buildable=true --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); runCLI( - `generate @nx/angular:library ${buildableChildLib} --buildable=true --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:library ${buildableChildLib} --buildable=true --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); // update the app module to include a ref to the buildable lib updateFile( `${app1}/src/app/app.module.ts`, ` - import { BrowserModule } from '@angular/platform-browser'; 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'; import {${ names(buildableLib).className }Module} from '@${proj}/${buildableLib}'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; - @NgModule({ declarations: [AppComponent, NxWelcomeComponent], - imports: [BrowserModule, ${names(buildableLib).className}Module], + imports: [ + BrowserModule, + RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + ${names(buildableLib).className}Module + ], providers: [], bootstrap: [AppComponent], }) @@ -233,18 +244,23 @@ describe('Angular Projects', () => { updateFile( `${esbuildApp}/src/app/app.module.ts`, ` - import { BrowserModule } from '@angular/platform-browser'; 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'; import {${ names(buildableLib).className }Module} from '@${proj}/${buildableLib}'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; - @NgModule({ declarations: [AppComponent, NxWelcomeComponent], - imports: [BrowserModule, ${names(buildableLib).className}Module], + imports: [ + BrowserModule, + RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + ${names(buildableLib).className}Module + ], providers: [], bootstrap: [AppComponent], }) @@ -283,6 +299,9 @@ describe('Angular Projects', () => { config.targets.build.executor = '@nx/angular:browser-esbuild'; config.targets.build.options = { ...config.targets.build.options, + outputPath: `dist/${esbuildApp}`, + main: config.targets.build.options.browser, + browser: undefined, buildLibsFromSource: false, }; return config; @@ -316,14 +335,14 @@ describe('Angular Projects', () => { const entryPoint = uniq('entrypoint'); runCLI( - `generate @nx/angular:lib ${lib} --publishable --importPath=@${proj}/${lib} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:lib ${lib} --publishable --importPath=@${proj}/${lib} --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); runCLI( `generate @nx/angular:secondary-entry-point --name=${entryPoint} --library=${lib} --no-interactive` ); runCLI( - `generate @nx/angular:library ${childLib} --publishable=true --importPath=@${proj}/${childLib} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:library ${childLib} --publishable=true --importPath=@${proj}/${childLib} --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); runCLI( `generate @nx/angular:secondary-entry-point --name=sub --library=${childLib} --no-interactive` @@ -359,7 +378,7 @@ describe('Angular Projects', () => { const libName = uniq('lib1'); runCLI( - `generate @nx/angular:app ${appName} --project-name-and-root-format=derived --no-interactive` + `generate @nx/angular:app ${appName} --no-standalone --project-name-and-root-format=derived --no-interactive` ); // check files are generated with the layout directory ("apps/") @@ -375,7 +394,7 @@ describe('Angular Projects', () => { ); runCLI( - `generate @nx/angular:lib ${libName} --buildable --project-name-and-root-format=derived` + `generate @nx/angular:lib ${libName} --no-standalone --buildable --project-name-and-root-format=derived` ); // check files are generated with the layout directory ("libs/") @@ -400,12 +419,12 @@ describe('Angular Projects', () => { // assert scoped project names are not supported when --project-name-and-root-format=derived expect(() => runCLI( - `generate @nx/angular:lib ${libName} --buildable --project-name-and-root-format=derived` + `generate @nx/angular:lib ${libName} --buildable --no-standalone --project-name-and-root-format=derived` ) ).toThrow(); runCLI( - `generate @nx/angular:lib ${libName} --buildable --project-name-and-root-format=as-provided` + `generate @nx/angular:lib ${libName} --buildable --no-standalone --project-name-and-root-format=as-provided` ); // check files are generated without the layout directory ("libs/") and diff --git a/e2e/angular-extensions/src/cypress-component-tests.test.ts b/e2e/angular-extensions/src/cypress-component-tests.test.ts index 179dd210c30bd..beca757a45351 100644 --- a/e2e/angular-extensions/src/cypress-component-tests.test.ts +++ b/e2e/angular-extensions/src/cypress-component-tests.test.ts @@ -130,7 +130,7 @@ describe('Angular Cypress Component Tests', () => { function createApp(appName: string) { runCLI( - `generate @nx/angular:app ${appName} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:app ${appName} --bundler=webpack --project-name-and-root-format=as-provided --no-interactive` ); runCLI( `generate @nx/angular:component fancy-component --project=${appName} --no-interactive` diff --git a/e2e/angular-extensions/src/misc.test.ts b/e2e/angular-extensions/src/misc.test.ts index b4dd87c0042ab..dbe8a5b5bef79 100644 --- a/e2e/angular-extensions/src/misc.test.ts +++ b/e2e/angular-extensions/src/misc.test.ts @@ -50,7 +50,8 @@ describe('Move Angular Project', () => { expect(moveOutput).toContain( `CREATE ${newPath}/src/app/app.component.html` ); - expect(moveOutput).toContain(`CREATE ${newPath}/src/app/app.module.ts`); + expect(moveOutput).toContain(`CREATE ${newPath}/src/app/app.component.ts`); + expect(moveOutput).toContain(`CREATE ${newPath}/src/app/app.config.ts`); expect(moveOutput).toContain(`CREATE ${newPath}/src/assets/.gitkeep`); }); @@ -98,7 +99,7 @@ describe('Move Angular Project', () => { const lib1 = uniq('mylib'); const lib2 = uniq('mylib'); runCLI( - `generate @nx/angular:lib ${lib1} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:lib ${lib1} --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); /** @@ -106,7 +107,7 @@ describe('Move Angular Project', () => { */ runCLI( - `generate @nx/angular:lib ${lib2} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:lib ${lib2} --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); updateFile( @@ -154,7 +155,7 @@ describe('Move Angular Project', () => { const lib1 = uniq('mylib'); const lib2 = uniq('mylib'); runCLI( - `generate @nx/angular:lib ${lib1} --project-name-and-root-format=derived --no-interactive` + `generate @nx/angular:lib ${lib1} --no-standalone --project-name-and-root-format=derived --no-interactive` ); /** @@ -162,7 +163,7 @@ describe('Move Angular Project', () => { */ runCLI( - `generate @nx/angular:lib ${lib2} --project-name-and-root-format=derived --no-interactive` + `generate @nx/angular:lib ${lib2} --no-standalone --project-name-and-root-format=derived --no-interactive` ); updateFile( diff --git a/e2e/angular-extensions/src/ngrx.test.ts b/e2e/angular-extensions/src/ngrx.test.ts index b880f5a7b27b3..ebc49a85516f6 100644 --- a/e2e/angular-extensions/src/ngrx.test.ts +++ b/e2e/angular-extensions/src/ngrx.test.ts @@ -21,7 +21,7 @@ describe('Angular Package', () => { it('should work', async () => { const myapp = uniq('myapp'); runCLI( - `generate @nx/angular:app ${myapp} --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:app ${myapp} --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); // Generate root ngrx state management @@ -37,13 +37,13 @@ describe('Angular Package', () => { const mylib = uniq('mylib'); // Generate feature library and ngrx state within that library runCLI( - `g @nx/angular:lib ${mylib} --prefix=fl --project-name-and-root-format=as-provided` + `g @nx/angular:lib ${mylib} --prefix=fl --no-standalone --project-name-and-root-format=as-provided` ); runCLI( `generate @nx/angular:ngrx flights --parent=${mylib}/src/lib/${mylib}.module.ts --facade` ); - expect(runCLI(`build ${myapp}`)).toMatch(/main\.[a-z0-9]+\.js/); + expect(runCLI(`build ${myapp}`)).toMatch(/main-[a-zA-Z0-9]+\.js/); expectTestsPass(await runCLIAsync(`test ${myapp} --no-watch`)); // TODO: remove this condition if (getSelectedPackageManager() !== 'pnpm') { @@ -54,7 +54,7 @@ describe('Angular Package', () => { it('should work with creators', async () => { const myapp = uniq('myapp'); runCLI( - `generate @nx/angular:app ${myapp} --routing --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:app ${myapp} --routing --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); // Generate root ngrx state management @@ -72,7 +72,7 @@ describe('Angular Package', () => { const mylib = uniq('mylib'); // Generate feature library and ngrx state within that library runCLI( - `g @nx/angular:lib ${mylib} --prefix=fl --project-name-and-root-format=as-provided` + `g @nx/angular:lib ${mylib} --prefix=fl --no-standalone --project-name-and-root-format=as-provided` ); const flags = `--facade --barrels`; @@ -80,7 +80,7 @@ describe('Angular Package', () => { `generate @nx/angular:ngrx flights --parent=${mylib}/src/lib/${mylib}.module.ts ${flags}` ); - expect(runCLI(`build ${myapp}`)).toMatch(/main\.[a-z0-9]+\.js/); + expect(runCLI(`build ${myapp}`)).toMatch(/main-[a-zA-Z0-9]+\.js/); expectTestsPass(await runCLIAsync(`test ${myapp} --no-watch`)); // TODO: remove this condition if (getSelectedPackageManager() !== 'pnpm') { @@ -91,7 +91,7 @@ describe('Angular Package', () => { it('should work with creators using --module', async () => { const myapp = uniq('myapp'); runCLI( - `generate @nx/angular:app ${myapp} --routing --project-name-and-root-format=as-provided --no-interactive` + `generate @nx/angular:app ${myapp} --routing --no-standalone --project-name-and-root-format=as-provided --no-interactive` ); // Generate root ngrx state management @@ -109,7 +109,7 @@ describe('Angular Package', () => { const mylib = uniq('mylib'); // Generate feature library and ngrx state within that library runCLI( - `g @nx/angular:lib ${mylib} --prefix=fl --project-name-and-root-format=as-provided` + `g @nx/angular:lib ${mylib} --prefix=fl --no-standalone --project-name-and-root-format=as-provided` ); const flags = `--facade --barrels`; @@ -117,7 +117,7 @@ describe('Angular Package', () => { `generate @nx/angular:ngrx flights --module=${mylib}/src/lib/${mylib}.module.ts ${flags}` ); - expect(runCLI(`build ${myapp}`)).toMatch(/main\.[a-z0-9]+\.js/); + expect(runCLI(`build ${myapp}`)).toMatch(/main-[a-zA-Z0-9]+\.js/); expectTestsPass(await runCLIAsync(`test ${myapp} --no-watch`)); // TODO: remove this condition if (getSelectedPackageManager() !== 'pnpm') { diff --git a/e2e/angular-extensions/src/tailwind.test.ts b/e2e/angular-extensions/src/tailwind.test.ts index de275e8c33cc1..d0cecf18fd5fe 100644 --- a/e2e/angular-extensions/src/tailwind.test.ts +++ b/e2e/angular-extensions/src/tailwind.test.ts @@ -316,37 +316,23 @@ describe('Tailwind support', () => { }); describe('Applications', () => { - const updateAppComponent = (app: string) => { - updateFile( - `${app}/src/app/app.component.html`, - `` - ); - - updateFile( - `${app}/src/app/app.component.css`, - `.custom-btn { - @apply m-md p-sm; - }` + const readAppStylesBundle = (outputPath: string) => { + const stylesBundlePath = listFiles(outputPath).find((file) => + /^styles[\.-]/.test(file) ); - }; - - const readAppStylesBundle = (app: string) => { - const stylesBundlePath = listFiles(`dist/${app}`).find((file) => - file.startsWith('styles.') - ); - const stylesBundle = readFile(`dist/${app}/${stylesBundlePath}`); + const stylesBundle = readFile(`${outputPath}/${stylesBundlePath}`); return stylesBundle; }; const assertAppComponentStyles = ( - app: string, + outputPath: string, appSpacing: typeof spacing['root'] ) => { - const mainBundlePath = listFiles(`dist/${app}`).find((file) => - file.startsWith('main.') + const mainBundlePath = listFiles(outputPath).find((file) => + /^main[\.-]/.test(file) ); - const mainBundle = readFile(`dist/${app}/${mainBundlePath}`); + const mainBundle = readFile(`${outputPath}/${mainBundlePath}`); let expectedStylesRegex = new RegExp( `styles:\\[\\"\\.custom\\-btn\\[_ngcontent\\-%COMP%\\]{margin:${appSpacing.md};padding:${appSpacing.sm}}\\"\\]` ); @@ -354,25 +340,13 @@ describe('Tailwind support', () => { expect(mainBundle).toMatch(expectedStylesRegex); }; - it('should build correctly and only output the tailwind utilities used', async () => { - const appWithTailwind = uniq('app-with-tailwind'); - runCLI( - `generate @nx/angular:app ${appWithTailwind} --add-tailwind --project-name-and-root-format=as-provided --no-interactive` - ); - updateJson(join(appWithTailwind, 'project.json'), (config) => { - config.targets.build.executor = '@nx/angular:webpack-browser'; - config.targets.build.options = { - ...config.targets.build.options, - buildLibsFromSource: false, - }; - return config; - }); + const setupTailwindAndProjectDependencies = (appName: string) => { updateTailwindConfig( - `${appWithTailwind}/tailwind.config.js`, + `${appName}/tailwind.config.js`, spacing.projectVariant1 ); updateFile( - `${appWithTailwind}/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}'; @@ -389,12 +363,58 @@ describe('Tailwind support', () => { export class AppModule {} ` ); - updateAppComponent(appWithTailwind); + updateFile( + `${appName}/src/app/app.component.html`, + `` + ); + + updateFile( + `${appName}/src/app/app.component.css`, + `.custom-btn { + @apply m-md p-sm; + }` + ); + }; + + it('should build correctly and only output the tailwind utilities used', async () => { + const appWithTailwind = uniq('app-with-tailwind'); + runCLI( + `generate @nx/angular:app ${appWithTailwind} --add-tailwind --project-name-and-root-format=as-provided --no-interactive` + ); + setupTailwindAndProjectDependencies(appWithTailwind); + + runCLI(`build ${appWithTailwind}`); + + const outputPath = `dist/${appWithTailwind}/browser`; + assertAppComponentStyles(outputPath, spacing.projectVariant1); + let stylesBundle = readAppStylesBundle(outputPath); + expect(stylesBundle).toContain('.text-white'); + expect(stylesBundle).not.toContain('.text-black'); + expect(stylesBundle).toContain(`.${buildLibWithTailwind.buttonBgColor}`); + expect(stylesBundle).toContain(`.${pubLibWithTailwind.buttonBgColor}`); + expect(stylesBundle).not.toContain(`.${defaultButtonBgColor}`); + }); + + it('should build correctly and only output the tailwind utilities used when using webpack and incremental builds', async () => { + const appWithTailwind = uniq('app-with-tailwind'); + runCLI( + `generate @nx/angular:app ${appWithTailwind} --add-tailwind --bundler=webpack --project-name-and-root-format=as-provided --no-interactive` + ); + setupTailwindAndProjectDependencies(appWithTailwind); + updateJson(join(appWithTailwind, 'project.json'), (config) => { + config.targets.build.executor = '@nx/angular:webpack-browser'; + config.targets.build.options = { + ...config.targets.build.options, + buildLibsFromSource: false, + }; + return config; + }); runCLI(`build ${appWithTailwind}`); - assertAppComponentStyles(appWithTailwind, spacing.projectVariant1); - let stylesBundle = readAppStylesBundle(appWithTailwind); + const outputPath = `dist/${appWithTailwind}`; + assertAppComponentStyles(outputPath, spacing.projectVariant1); + let stylesBundle = readAppStylesBundle(outputPath); expect(stylesBundle).toContain('.text-white'); expect(stylesBundle).not.toContain('.text-black'); expect(stylesBundle).toContain(`.${buildLibWithTailwind.buttonBgColor}`); diff --git a/e2e/cypress/src/cypress.test.ts b/e2e/cypress/src/cypress.test.ts index 8d320461136a9..5a9f532f03025 100644 --- a/e2e/cypress/src/cypress.test.ts +++ b/e2e/cypress/src/cypress.test.ts @@ -187,7 +187,9 @@ async function testCtAndE2eInProject( ) { let appName = uniq(`${projectType}-cy-app`); runCLI( - `generate @nx/${projectType}:app ${appName} --e2eTestRunner=none --no-interactive` + `generate @nx/${projectType}:app ${appName} --e2eTestRunner=none --no-interactive ${ + projectType === 'angular' ? '--bundler=webpack' : '' + }` ); runCLI( `generate @nx/${projectType}:component btn --project=${appName} --no-interactive` diff --git a/e2e/node/src/node.test.ts b/e2e/node/src/node.test.ts index fa21c9304ab2f..8270aecf11c96 100644 --- a/e2e/node/src/node.test.ts +++ b/e2e/node/src/node.test.ts @@ -528,7 +528,7 @@ ${jslib}(); runCLI(`generate @nx/nest:app ${nestapp} --linter=eslint`); setMaxWorkers(join('apps', nestapp, 'project.json')); - packageInstall('@nestjs/swagger', undefined, '^6.0.0'); + packageInstall('@nestjs/swagger', undefined, '^7.0.0'); updateJson(join('apps', nestapp, 'project.json'), (config) => { config.targets.build.options.tsPlugins = ['@nestjs/swagger/plugin']; @@ -641,7 +641,7 @@ describe('nest libraries', function () { const nestlib = uniq('nestlib'); runCLI(`generate @nx/nest:lib ${nestlib} --buildable`); - packageInstall('@nestjs/swagger', undefined, '~6.3.0'); + packageInstall('@nestjs/swagger', undefined, '^7.0.0'); updateJson(join('libs', nestlib, 'project.json'), (config) => { config.targets.build.options.transformers = [ diff --git a/e2e/nx-init/src/nx-init-angular.test.ts b/e2e/nx-init/src/nx-init-angular.test.ts index ab94b99f62c7a..3f7a7489837c9 100644 --- a/e2e/nx-init/src/nx-init-angular.test.ts +++ b/e2e/nx-init/src/nx-init-angular.test.ts @@ -49,7 +49,7 @@ describe('nx init (Angular CLI)', () => { expect(coldBuildOutput).toContain( `Successfully ran target build for project ${project}` ); - checkFilesExist(`dist/${project}/main.js`); + checkFilesExist(`dist/${project}/browser/main.js`); // run build again to check is coming from cache const cachedBuildOutput = runCLI(`build ${project} --outputHashing none`); @@ -83,7 +83,7 @@ describe('nx init (Angular CLI)', () => { expect(coldBuildOutput).toContain( `Successfully ran target build for project ${project}` ); - checkFilesExist(`dist/apps/${project}/main.js`); + checkFilesExist(`dist/apps/${project}/browser/main.js`); // run build again to check is coming from cache const cachedBuildOutput = runCLI(`build ${project} --outputHashing none`); diff --git a/e2e/utils/create-project-utils.ts b/e2e/utils/create-project-utils.ts index efcec24270566..ba434e9fbd8ba 100644 --- a/e2e/utils/create-project-utils.ts +++ b/e2e/utils/create-project-utils.ts @@ -151,6 +151,7 @@ export function runCreateWorkspace( docker, nextAppDir, e2eTestRunner, + ssr, }: { preset: string; appName?: string; @@ -167,6 +168,7 @@ export function runCreateWorkspace( docker?: boolean; nextAppDir?: boolean; e2eTestRunner?: 'cypress' | 'playwright' | 'jest' | 'detox' | 'none'; + ssr?: boolean; } ) { projName = name; @@ -224,6 +226,10 @@ export function runCreateWorkspace( command += ` --verbose`; } + if (ssr !== undefined) { + command += ` --ssr=${ssr}`; + } + try { const create = execSync(`${command}${isVerbose() ? ' --verbose' : ''}`, { cwd, diff --git a/e2e/workspace-create/src/create-nx-workspace.test.ts b/e2e/workspace-create/src/create-nx-workspace.test.ts index 6099be22a2134..c2f20436772c2 100644 --- a/e2e/workspace-create/src/create-nx-workspace.test.ts +++ b/e2e/workspace-create/src/create-nx-workspace.test.ts @@ -32,6 +32,8 @@ describe('create-nx-workspace', () => { standaloneApi: false, routing: false, e2eTestRunner: 'none', + bundler: 'webpack', + ssr: false, }); checkFilesExist('package.json'); @@ -52,6 +54,8 @@ describe('create-nx-workspace', () => { standaloneApi: true, routing: true, e2eTestRunner: 'none', + bundler: 'webpack', + ssr: false, }); checkFilesExist('package.json'); @@ -144,6 +148,8 @@ describe('create-nx-workspace', () => { standaloneApi: false, routing: true, e2eTestRunner: 'none', + bundler: 'webpack', + ssr: false, }); expectCodeIsFormatted(); }); @@ -163,6 +169,8 @@ describe('create-nx-workspace', () => { standaloneApi: false, routing: false, e2eTestRunner: 'none', + bundler: 'webpack', + ssr: false, }) ).toThrow(); }); diff --git a/package.json b/package.json index a4f5060e3dfd7..81ba8e5e0ac10 100644 --- a/package.json +++ b/package.json @@ -26,19 +26,19 @@ }, "devDependencies": { "@actions/core": "^1.10.0", - "@angular-devkit/architect": "~0.1602.0", - "@angular-devkit/build-angular": "~16.2.0", - "@angular-devkit/core": "~16.2.0", - "@angular-devkit/schematics": "~16.2.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", - "@angular/cli": "~16.2.0", - "@angular/common": "~16.2.0", - "@angular/compiler": "~16.2.0", - "@angular/compiler-cli": "~16.2.0", - "@angular/core": "~16.2.0", - "@angular/router": "~16.2.0", + "@angular-devkit/architect": "~0.1700.0-rc.4", + "@angular-devkit/build-angular": "~17.0.0-rc.4", + "@angular-devkit/core": "~17.0.0-rc.4", + "@angular-devkit/schematics": "~17.0.0-rc.4", + "@angular-eslint/eslint-plugin": "~17.0.0-alpha.0", + "@angular-eslint/eslint-plugin-template": "~17.0.0-alpha.0", + "@angular-eslint/template-parser": "~17.0.0-alpha.0", + "@angular/cli": "~17.0.0-rc.4", + "@angular/common": "~17.0.0-rc.3", + "@angular/compiler": "~17.0.0-rc.3", + "@angular/compiler-cli": "~17.0.0-rc.3", + "@angular/core": "~17.0.0-rc.3", + "@angular/router": "~17.0.0-rc.3", "@babel/core": "^7.22.9", "@babel/helper-create-regexp-features-plugin": "^7.22.9", "@babel/plugin-transform-runtime": "^7.22.9", @@ -63,7 +63,6 @@ "@ngrx/effects": "~16.0.0", "@ngrx/router-store": "~16.0.0", "@ngrx/store": "~16.0.0", - "@nguniversal/builders": "~16.2.0", "@nx/angular": "17.0.0-rc.2", "@nx/cypress": "17.0.0-rc.2", "@nx/devkit": "17.0.0-rc.2", @@ -89,7 +88,7 @@ "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^13.0.4", "@rollup/plugin-url": "^7.0.0", - "@schematics/angular": "~16.2.0", + "@schematics/angular": "~17.0.0-rc.4", "@side/jest-runtime": "^1.1.0", "@storybook/addon-essentials": "7.2.2", "@storybook/core-server": "7.2.2", @@ -224,7 +223,7 @@ "mini-css-extract-plugin": "~2.4.7", "minimatch": "3.0.5", "next-sitemap": "^3.1.10", - "ng-packagr": "~16.2.0", + "ng-packagr": "~17.0.0-rc.1", "node-fetch": "^2.6.7", "npm-package-arg": "11.0.1", "nuxi": "npm:nuxi-nightly@3.9.2-1699007958.251cab5", @@ -278,7 +277,7 @@ "tsconfig-paths-webpack-plugin": "4.0.0", "typedoc": "0.25.1", "typedoc-plugin-markdown": "3.16.0", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "unist-builder": "^4.0.0", "unzipper": "^0.10.11", "url-loader": "^4.1.1", @@ -369,4 +368,3 @@ ] } } - diff --git a/packages/angular/.eslintrc.json b/packages/angular/.eslintrc.json index bd0857693476b..4e8a9ae472327 100644 --- a/packages/angular/.eslintrc.json +++ b/packages/angular/.eslintrc.json @@ -71,6 +71,7 @@ "@ngrx/store", "@storybook/angular", "@module-federation/node", + "@nguniversal/builders", // installed dynamically by the library generator "ng-packagr", // ng-packagr deps, some are handled if not installed diff --git a/packages/angular/docs/module-federation-dev-server-examples.md b/packages/angular/docs/module-federation-dev-server-examples.md index 5bf3991d96b3b..6a2088a222f8e 100644 --- a/packages/angular/docs/module-federation-dev-server-examples.md +++ b/packages/angular/docs/module-federation-dev-server-examples.md @@ -12,10 +12,10 @@ See an example set up of it below: "executor": "@nx/angular:module-federation-dev-server", "configurations": { "production": { - "browserTarget": "host:build:production" + "buildTarget": "host:build:production" }, "development": { - "browserTarget": "host:build:development" + "buildTarget": "host:build:development" } }, "defaultConfiguration": "development", @@ -39,10 +39,10 @@ See an example set up of it below: "executor": "@nx/angular:module-federation-dev-server", "configurations": { "production": { - "browserTarget": "host:build:production" + "buildTarget": "host:build:production" }, "development": { - "browserTarget": "host:build:development" + "buildTarget": "host:build:development" } }, "defaultConfiguration": "development", diff --git a/packages/angular/docs/webpack-dev-server-examples.md b/packages/angular/docs/webpack-dev-server-examples.md index 4c37556c81f1e..b5d599edf446d 100644 --- a/packages/angular/docs/webpack-dev-server-examples.md +++ b/packages/angular/docs/webpack-dev-server-examples.md @@ -18,10 +18,10 @@ Your `project.json` file should contain a `build` and `serve` target that matche "executor": "@nx/angular:webpack-dev-server", "configurations": { "production": { - "browserTarget": "appName:build:production" + "buildTarget": "appName:build:production" }, "development": { - "browserTarget": "appName:build:development" + "buildTarget": "appName:build:development" } }, "defaultConfiguration": "development", diff --git a/packages/angular/migrations.json b/packages/angular/migrations.json index efac5a1172b1e..422da7f4be57e 100644 --- a/packages/angular/migrations.json +++ b/packages/angular/migrations.json @@ -278,6 +278,51 @@ }, "description": "Update the @angular/cli package version to ~16.2.0.", "factory": "./src/migrations/update-16-7-0/update-angular-cli" + }, + "update-angular-cli-version-17-0-0-rc-4": { + "cli": "nx", + "version": "17.1.0-beta.3", + "requires": { + "@angular/core": ">=17.0.0-rc.3" + }, + "description": "Update the @angular/cli package version to ~17.0.0-rc.4.", + "factory": "./src/migrations/update-17-1-0/update-angular-cli" + }, + "rename-browser-target-to-build-target": { + "cli": "nx", + "version": "17.1.0-beta.3", + "requires": { + "@angular/core": ">=17.0.0-rc.3" + }, + "description": "Rename 'browserTarget' to 'buildTarget'.", + "factory": "./src/migrations/update-17-1-0/browser-target-to-build-target" + }, + "stub-performance-mark-in-jest-test-setup": { + "cli": "nx", + "version": "17.1.0-beta.3", + "requires": { + "@angular/core": ">=17.0.0-rc.3" + }, + "description": "Stubs out 'performance.mark' in the Jest test setup file.", + "factory": "./src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup" + }, + "replace-nguniversal-builders": { + "cli": "nx", + "version": "17.1.0-beta.3", + "requires": { + "@angular/core": ">=17.0.0-rc.3" + }, + "description": "Replace usages of '@nguniversal/builders' with '@angular-devkit/build-angular'.", + "factory": "./src/migrations/update-17-1-0/replace-nguniversal-builders" + }, + "replace-nguniversal-engines": { + "cli": "nx", + "version": "17.1.0-beta.3", + "requires": { + "@angular/core": ">=17.0.0-rc.3" + }, + "description": "Replace usages of '@nguniversal/' packages with '@angular/ssr'.", + "factory": "./src/migrations/update-17-1-0/replace-nguniversal-engines" } }, "packageJsonUpdates": { @@ -1354,6 +1399,96 @@ "alwaysAddToPackageJson": false } } + }, + "17.1.0": { + "version": "17.1.0-beta.3", + "x-prompt": "Do you want to update the Angular version to v17?", + "requires": { + "@angular/core": ">=16.2.0 <17.0.0-rc.3" + }, + "packages": { + "@angular-devkit/architect": { + "version": "~0.1700.0-rc.4", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/build-angular": { + "version": "~17.0.0-rc.4", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/build-webpack": { + "version": "~0.1700.0-rc.4", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/core": { + "version": "~17.0.0-rc.4", + "alwaysAddToPackageJson": false + }, + "@angular-devkit/schematics": { + "version": "~17.0.0-rc.4", + "alwaysAddToPackageJson": false + }, + "@angular/core": { + "version": "~17.0.0-rc.3", + "alwaysAddToPackageJson": true + }, + "@angular/material": { + "version": "~17.0.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@angular/cdk": { + "version": "~17.0.0-rc.3", + "alwaysAddToPackageJson": false + }, + "@schematics/angular": { + "version": "~17.0.0-rc.4", + "alwaysAddToPackageJson": false + }, + "ng-packagr": { + "version": "~17.0.0-rc.1", + "alwaysAddToPackageJson": false + }, + "zone.js": { + "version": "~0.14.0", + "alwaysAddToPackageJson": false + } + } + }, + "17.1.0-jest": { + "version": "17.1.0-beta.3", + "requires": { + "@angular-devkit/build-angular": ">=13.0.0 <18.0.0", + "@angular/compiler-cli": ">=13.0.0 <18.0.0", + "@angular/core": ">=13.0.0 <18.0.0", + "@angular/platform-browser-dynamic": ">=13.0.0 <18.0.0", + "jest": "^29.0.0" + }, + "packages": { + "jest-preset-angular": { + "version": "~13.1.3", + "alwaysAddToPackageJson": false + } + } + }, + "17.1.0-angular-eslint": { + "version": "17.1.0-beta.3", + "requires": { + "eslint": "^7.20.0 || ^8.0.0", + "@angular/core": ">= 17.0.0-rc.3 < 18.0.0" + }, + "packages": { + "@angular-eslint/eslint-plugin": { + "version": "~17.0.0-alpha.0", + "alwaysAddToPackageJson": false + }, + "@angular-eslint/eslint-plugin-template": { + "version": "~17.0.0-alpha.0", + "alwaysAddToPackageJson": false + }, + "@angular-eslint/template-parser": { + "version": "~17.0.0-alpha.0", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/angular/ng-package.json b/packages/angular/ng-package.json index edf746fb8cf13..03b00ba648607 100644 --- a/packages/angular/ng-package.json +++ b/packages/angular/ng-package.json @@ -9,7 +9,6 @@ "@nx/", "@angular-devkit", "@angular-eslint/", - "@nguniversal/builders", "@schematics", "@phenomnomnominal/tsquery", "@typescript-eslint/", diff --git a/packages/angular/package.json b/packages/angular/package.json index 65393147490dc..fe023c9592656 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -57,7 +57,6 @@ "tslib": "^2.3.0", "webpack": "^5.80.0", "webpack-merge": "^5.8.0", - "enquirer": "^2.3.6", "@nx/devkit": "file:../devkit", "@nx/cypress": "file:../cypress", "@nx/jest": "file:../jest", @@ -68,18 +67,14 @@ "@nx/workspace": "file:../workspace" }, "peerDependencies": { - "@angular-devkit/build-angular": ">= 14.0.0 < 17.0.0", - "@angular-devkit/schematics": ">= 14.0.0 < 17.0.0", - "@schematics/angular": ">= 14.0.0 < 17.0.0", - "@angular-devkit/core": ">= 14.0.0 < 17.0.0", - "@nguniversal/builders": ">= 14.0.0 < 17.0.0", + "@angular-devkit/build-angular": "^17.0.0-rc.4", + "@angular-devkit/schematics": "^17.0.0-rc.4", + "@schematics/angular": "^17.0.0-rc.4", + "@angular-devkit/core": "^17.0.0-rc.4", "rxjs": "^6.5.3 || ^7.5.0", "esbuild": "^0.19.2" }, "peerDependenciesMeta": { - "@nguniversal/builders": { - "optional": true - }, "esbuild": { "optional": true } diff --git a/packages/angular/src/builders/module-federation-dev-server/module-federation-dev-server.impl.ts b/packages/angular/src/builders/module-federation-dev-server/module-federation-dev-server.impl.ts index 25219523786ae..d480a5efb86ed 100644 --- a/packages/angular/src/builders/module-federation-dev-server/module-federation-dev-server.impl.ts +++ b/packages/angular/src/builders/module-federation-dev-server/module-federation-dev-server.impl.ts @@ -1,27 +1,28 @@ -import type { Schema } from './schema'; import { logger, readCachedProjectGraph, readNxJson, workspaceRoot, } from '@nx/devkit'; -import { scheduleTarget } from 'nx/src/adapter/ngcli-adapter'; -import { executeWebpackDevServerBuilder } from '../webpack-dev-server/webpack-dev-server.impl'; -import { readProjectsConfigurationFromProjectGraph } from 'nx/src/project-graph/project-graph'; -import { getExecutorInformation } from 'nx/src/command-line/run/executor-utils'; -import { - getDynamicRemotes, - getStaticRemotes, - validateDevRemotes, -} from '../utilities/module-federation'; -import { existsSync } from 'fs'; -import { extname, join } from 'path'; import { getModuleFederationConfig, getRemotes, } from '@nx/webpack/src/utils/module-federation'; import { fork } from 'child_process'; +import { existsSync } from 'fs'; +import { scheduleTarget } from 'nx/src/adapter/ngcli-adapter'; +import { getExecutorInformation } from 'nx/src/command-line/run/executor-utils'; +import { readProjectsConfigurationFromProjectGraph } from 'nx/src/project-graph/project-graph'; +import { extname, join } from 'path'; import { combineLatest, concatMap, from, switchMap } from 'rxjs'; +import { validateDevRemotes } from '../utilities/module-federation'; +import { executeWebpackDevServerBuilder } from '../webpack-dev-server/webpack-dev-server.impl'; +import type { + NormalizedSchema, + Schema, + SchemaWithBrowserTarget, + SchemaWithBuildTarget, +} from './schema'; export function executeModuleFederationDevServerBuilder( schema: Schema, @@ -29,7 +30,7 @@ export function executeModuleFederationDevServerBuilder( ): ReturnType { // Force Node to resolve to look for the nx binary that is inside node_modules const nxBin = require.resolve('nx/bin/nx'); - const { ...options } = schema; + const options = normalizeOptions(schema); const projectGraph = readCachedProjectGraph(); const { projects: workspaceProjects } = readProjectsConfigurationFromProjectGraph(projectGraph); @@ -44,7 +45,7 @@ export function executeModuleFederationDevServerBuilder( port: options.port, host: options.host, ssl: options.ssl, - buildTarget: options.browserTarget, + buildTarget: options.buildTarget, parallel: false, spa: false, withDeps: false, @@ -272,3 +273,21 @@ export function executeModuleFederationDevServerBuilder( export default require('@angular-devkit/architect').createBuilder( executeModuleFederationDevServerBuilder ); + +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; + } + + return { + ...schema, + buildTarget, + host: schema.host ?? 'localhost', + port: schema.port ?? 4200, + liveReload: schema.liveReload ?? true, + open: schema.open ?? false, + ssl: schema.ssl ?? false, + }; +} diff --git a/packages/angular/src/builders/module-federation-dev-server/schema.d.ts b/packages/angular/src/builders/module-federation-dev-server/schema.d.ts index fc23f6e8f62af..91f28aa177511 100644 --- a/packages/angular/src/builders/module-federation-dev-server/schema.d.ts +++ b/packages/angular/src/builders/module-federation-dev-server/schema.d.ts @@ -1,15 +1,14 @@ -export interface Schema { - browserTarget: string; - port: number; - host: string; +interface BaseSchema { + port?: number; + host?: string; proxyConfig?: string; - ssl: boolean; + ssl?: boolean; sslKey?: string; sslCert?: string; headers?: Record; - open: boolean; + open?: boolean; verbose?: boolean; - liveReload: boolean; + liveReload?: boolean; publicHost?: string; allowedHosts?: string[]; servePath?: string; @@ -24,3 +23,19 @@ export interface Schema { isInitialHost?: boolean; parallel?: number; } + +export type SchemaWithBrowserTarget = BaseSchema & { + browserTarget: string; +}; + +export type SchemaWithBuildTarget = BaseSchema & { + buildTarget: string; +}; + +export type Schema = SchemaWithBrowserTarget | SchemaWithBuildTarget; + +export type NormalizedSchema = SchemaWithBuildTarget & { + liveReload: boolean; + open: boolean; + ssl: boolean; +}; diff --git a/packages/angular/src/builders/module-federation-dev-server/schema.json b/packages/angular/src/builders/module-federation-dev-server/schema.json index 4628a901125d4..df3e7556e0ccf 100644 --- a/packages/angular/src/builders/module-federation-dev-server/schema.json +++ b/packages/angular/src/builders/module-federation-dev-server/schema.json @@ -8,13 +8,19 @@ "presets": [ { "name": "Using a Different Port", - "keys": ["browserTarget", "port"] + "keys": ["buildTarget", "port"] } ], "properties": { "browserTarget": { "type": "string", - "description": "A browser builder target to serve in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.", + "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 in Nx v18." + }, + "buildTarget": { + "type": "string", + "description": "A build builder target to serve in the format of `project:target[:configuration]`.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$" }, "port": { @@ -139,6 +145,6 @@ } }, "additionalProperties": false, - "required": ["browserTarget"], + "anyOf": [{ "required": ["buildTarget"] }, { "required": ["browserTarget"] }], "examplesFile": "../../../docs/module-federation-dev-server-examples.md" } diff --git a/packages/angular/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.ts b/packages/angular/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.ts index 614cd5783fd82..5671a244c4caa 100644 --- a/packages/angular/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.ts +++ b/packages/angular/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.ts @@ -1,22 +1,23 @@ -import type { Schema } from './schema'; -import { readProjectsConfigurationFromProjectGraph } from 'nx/src/project-graph/project-graph'; -import { getExecutorInformation } from 'nx/src/command-line/run/executor-utils'; import { getPackageManagerCommand, readCachedProjectGraph, workspaceRoot, } from '@nx/devkit'; +import { execSync, fork } from 'child_process'; +import { existsSync } from 'fs'; +import { scheduleTarget } from 'nx/src/adapter/ngcli-adapter'; +import { getExecutorInformation } from 'nx/src/command-line/run/executor-utils'; +import { readProjectsConfigurationFromProjectGraph } from 'nx/src/project-graph/project-graph'; +import { extname, join } from 'path'; +import { from } from 'rxjs'; +import { switchMap, tap } from 'rxjs/operators'; +import { getInstalledAngularVersionInfo } from '../../executors/utilities/angular-version-utils'; import { getDynamicRemotes, getStaticRemotes, validateDevRemotes, } from '../utilities/module-federation'; -import { switchMap, tap } from 'rxjs/operators'; -import { from } from 'rxjs'; -import { extname, join } from 'path'; -import { execSync, fork } from 'child_process'; -import { scheduleTarget } from 'nx/src/adapter/ngcli-adapter'; -import { existsSync } from 'fs'; +import type { Schema } from './schema'; export function executeModuleFederationDevSSRBuilder( schema: Schema, @@ -157,11 +158,14 @@ export function executeModuleFederationDevSSRBuilder( remoteProcessPromises.push(remotePromise); } + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(); + const { executeSSRDevServerBuilder } = + angularMajorVersion >= 17 + ? require('@angular-devkit/build-angular') + : require('@nguniversal/builders'); + return from(Promise.all(remoteProcessPromises)).pipe( - switchMap(() => from(import('@nguniversal/builders'))), - switchMap(({ executeSSRDevServerBuilder }) => - executeSSRDevServerBuilder(options, context) - ) + switchMap(() => executeSSRDevServerBuilder(options, context)) ); } diff --git a/packages/angular/src/builders/webpack-browser/schema.json b/packages/angular/src/builders/webpack-browser/schema.json index c2fb2ed8c3359..932562c8a730f 100644 --- a/packages/angular/src/builders/webpack-browser/schema.json +++ b/packages/angular/src/builders/webpack-browser/schema.json @@ -41,7 +41,7 @@ "oneOf": [ { "type": "array", - "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'. _Note: supported in Angular versions >= 15.0.0_.", + "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'.", "items": { "type": "string", "uniqueItems": true @@ -106,7 +106,7 @@ "input": { "type": "string", "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less|styl)$" + "pattern": "\\.(?:css|scss|sass|less)$" }, "bundleName": { "type": "string", @@ -125,7 +125,7 @@ { "type": "string", "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less|styl)$" + "pattern": "\\.(?:css|scss|sass|less)$" } ] }, @@ -228,7 +228,7 @@ }, "outputPath": { "type": "string", - "description": "The full path for the new output directory, relative to the current workspace.\n\nBy default, writes output to a folder named dist/ in the current project." + "description": "The full path for the new output directory, relative to the current workspace." }, "resourcesOutputPath": { "type": "string", @@ -278,12 +278,12 @@ }, "vendorChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", + "description": "Generate a separate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", "default": false }, "commonChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing code used across multiple bundles.", + "description": "Generate a separate bundle containing code used across multiple bundles.", "default": true }, "baseHref": { @@ -439,7 +439,7 @@ "enum": ["none", "anonymous", "use-credentials"] }, "allowedCommonJsDependencies": { - "description": "A list of CommonJS packages that are allowed to be used without a build time warning.", + "description": "A list of CommonJS or AMD packages that are allowed to be used without a build time warning. Use `'*'` to allow all.", "type": "array", "items": { "type": "string" diff --git a/packages/angular/src/builders/webpack-browser/validate-options.ts b/packages/angular/src/builders/webpack-browser/validate-options.ts deleted file mode 100644 index 797f27b446af0..0000000000000 --- a/packages/angular/src/builders/webpack-browser/validate-options.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { stripIndents } from '@nx/devkit'; -import { extname } from 'path'; -import type { VersionInfo } from '../../executors/utilities/angular-version-utils'; -import { getInstalledAngularVersionInfo } from '../../executors/utilities/angular-version-utils'; -import type { BrowserBuilderSchema } from './schema'; - -export function validateOptions(options: BrowserBuilderSchema): void { - const angularVersionInfo = getInstalledAngularVersionInfo(); - validatePolyfills(options, angularVersionInfo); - validateStyles(options, angularVersionInfo); -} - -function validatePolyfills( - options: BrowserBuilderSchema, - { major, version }: VersionInfo -): void { - if (major < 15 && Array.isArray(options.polyfills)) { - throw new Error(stripIndents`The array syntax for the "polyfills" option is supported from Angular >= 15.0.0. You are currently using "${version}". - You can resolve this error by removing the "polyfills" option, setting it to a string value or migrating to Angular 15.0.0.`); - } -} - -function validateStyles( - options: BrowserBuilderSchema, - { major, version }: VersionInfo -): void { - if (!options.styles || !options.styles.length) { - return; - } - - if (major < 15) { - return; - } - - const stylusFiles = []; - options.styles.forEach((style) => { - const styleFile = typeof style === 'string' ? style : style.input; - if (extname(styleFile) === '.styl') { - stylusFiles.push(styleFile); - } - }); - - if (stylusFiles.length) { - throw new Error(stripIndents`Stylus is not supported since Angular v15. You're currently using "${version}". - You have the "styles" option with the following file(s) using the ".styl" extension: ${stylusFiles - .map((x) => `"${x}"`) - .join(', ')}. - Make sure to convert them to a supported extension (".css", ".scss", ".sass", ".less").`); - } -} 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 8192345ab34f7..5e2dee464c0f4 100644 --- a/packages/angular/src/builders/webpack-browser/webpack-browser.impl.ts +++ b/packages/angular/src/builders/webpack-browser/webpack-browser.impl.ts @@ -18,7 +18,6 @@ import { resolveIndexHtmlTransformer, } from '../utilities/webpack'; import type { BrowserBuilderSchema } from './schema'; -import { validateOptions } from './validate-options'; function shouldSkipInitialTargetRun( projectGraph: ProjectGraph, @@ -48,7 +47,6 @@ export function executeWebpackBrowserBuilder( options: BrowserBuilderSchema, context: import('@angular-devkit/architect').BuilderContext ): Observable { - validateOptions(options); options.buildLibsFromSource ??= true; const { diff --git a/packages/angular/src/builders/webpack-dev-server/lib/normalize-options.ts b/packages/angular/src/builders/webpack-dev-server/lib/normalize-options.ts index b8cc2b3fd2f28..7cc9cb1f1ecd7 100644 --- a/packages/angular/src/builders/webpack-dev-server/lib/normalize-options.ts +++ b/packages/angular/src/builders/webpack-dev-server/lib/normalize-options.ts @@ -1,12 +1,24 @@ -import type { Schema } from '../schema'; +import type { + NormalizedSchema, + Schema, + SchemaWithBrowserTarget, + SchemaWithBuildTarget, +} 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; + } -export function normalizeOptions(schema: Schema): Schema { return { - host: 'localhost', - port: 4200, - liveReload: true, - open: false, - ssl: false, ...schema, + buildTarget, + host: schema.host ?? 'localhost', + port: schema.port ?? 4200, + liveReload: schema.liveReload ?? true, + open: schema.open ?? false, + ssl: schema.ssl ?? false, }; } diff --git a/packages/angular/src/builders/webpack-dev-server/schema.d.ts b/packages/angular/src/builders/webpack-dev-server/schema.d.ts index f534977441bf7..88e50eda311f2 100644 --- a/packages/angular/src/builders/webpack-dev-server/schema.d.ts +++ b/packages/angular/src/builders/webpack-dev-server/schema.d.ts @@ -1,15 +1,14 @@ -export interface Schema { - browserTarget: string; - port: number; - host: string; +interface BaseSchema { + port?: number; + host?: string; proxyConfig?: string; - ssl: boolean; + ssl?: boolean; sslKey?: string; sslCert?: string; headers?: Record; - open: boolean; + open?: boolean; verbose?: boolean; - liveReload: boolean; + liveReload?: boolean; publicHost?: string; allowedHosts?: string[]; servePath?: string; @@ -19,3 +18,19 @@ export interface Schema { poll?: number; buildLibsFromSource?: boolean; } + +export type SchemaWithBrowserTarget = BaseSchema & { + browserTarget: string; +}; + +export type SchemaWithBuildTarget = BaseSchema & { + buildTarget: string; +}; + +export type Schema = SchemaWithBrowserTarget | SchemaWithBuildTarget; + +export type NormalizedSchema = SchemaWithBuildTarget & { + liveReload: boolean; + open: boolean; + ssl: boolean; +}; diff --git a/packages/angular/src/builders/webpack-dev-server/schema.json b/packages/angular/src/builders/webpack-dev-server/schema.json index f2f293096bbee..2060a6d2dfb4e 100644 --- a/packages/angular/src/builders/webpack-dev-server/schema.json +++ b/packages/angular/src/builders/webpack-dev-server/schema.json @@ -9,13 +9,19 @@ "presets": [ { "name": "Using a Different Port", - "keys": ["browserTarget", "port"] + "keys": ["buildTarget", "port"] } ], "properties": { "browserTarget": { "type": "string", - "description": "A browser builder target to serve in the format of `project:target[:configuration]`. You can also pass in more than one configuration name as a comma-separated list. Example: `project:target:production,staging`.", + "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 in Nx v18." + }, + "buildTarget": { + "type": "string", + "description": "A build builder target to serve in the format of `project:target[:configuration]`.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$" }, "port": { @@ -112,5 +118,5 @@ } }, "additionalProperties": false, - "required": ["browserTarget"] + "anyOf": [{ "required": ["buildTarget"] }, { "required": ["browserTarget"] }] } diff --git a/packages/angular/src/builders/webpack-dev-server/webpack-dev-server.impl.ts b/packages/angular/src/builders/webpack-dev-server/webpack-dev-server.impl.ts index ed890083fefe7..e981bacf7f61d 100644 --- a/packages/angular/src/builders/webpack-dev-server/webpack-dev-server.impl.ts +++ b/packages/angular/src/builders/webpack-dev-server/webpack-dev-server.impl.ts @@ -2,24 +2,27 @@ import { joinPathFragments, parseTargetString, readCachedProjectGraph, - readNxJson, } from '@nx/devkit'; +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 { DependentBuildableProjectNode } from '@nx/js/src/utils/buildable-libs-utils'; -import { readCachedProjectConfiguration } from 'nx/src/project-graph/project-graph'; import { existsSync } from 'fs'; import { isNpmProject } from 'nx/src/project-graph/operators'; +import { readCachedProjectConfiguration } from 'nx/src/project-graph/project-graph'; +import { from } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { getInstalledAngularVersionInfo } from '../../executors/utilities/angular-version-utils'; +import { createTmpTsConfigForBuildableLibs } from '../utilities/buildable-libs'; import { mergeCustomWebpackConfig, resolveIndexHtmlTransformer, } from '../utilities/webpack'; import { normalizeOptions } from './lib'; -import type { Schema } from './schema'; -import { createTmpTsConfigForBuildableLibs } from '../utilities/buildable-libs'; -import { from } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; -import { getRootTsConfigPath } from '@nx/js'; -import { join } from 'path'; +import type { + NormalizedSchema, + Schema, + SchemaWithBrowserTarget, +} from './schema'; type BuildTargetOptions = { tsConfig: string; @@ -36,7 +39,7 @@ export function executeWebpackDevServerBuilder( const options = normalizeOptions(rawOptions); - const parsedBrowserTarget = parseTargetString(options.browserTarget, { + const parsedBuildTarget = parseTargetString(options.buildTarget, { cwd: context.currentDirectory, projectGraph: readCachedProjectGraph(), projectName: context.target.project, @@ -44,16 +47,16 @@ export function executeWebpackDevServerBuilder( isVerbose: false, }); const browserTargetProjectConfiguration = readCachedProjectConfiguration( - parsedBrowserTarget.project + parsedBuildTarget.project ); const buildTarget = - browserTargetProjectConfiguration.targets[parsedBrowserTarget.target]; + browserTargetProjectConfiguration.targets[parsedBuildTarget.target]; const buildTargetOptions: BuildTargetOptions = { ...buildTarget.options, - ...(parsedBrowserTarget.configuration - ? buildTarget.configurations[parsedBrowserTarget.configuration] + ...(parsedBuildTarget.configuration + ? buildTarget.configurations[parsedBuildTarget.configuration] : buildTarget.defaultConfiguration ? buildTarget.configurations[buildTarget.defaultConfiguration] : {}), @@ -96,7 +99,7 @@ export function executeWebpackDevServerBuilder( if (!buildLibsFromSource) { const { tsConfigPath, dependencies: foundDependencies } = createTmpTsConfigForBuildableLibs(buildTargetOptions.tsConfig, context, { - target: parsedBrowserTarget.target, + target: parsedBuildTarget.target, }); dependencies = foundDependencies; @@ -120,9 +123,11 @@ export function executeWebpackDevServerBuilder( buildTargetOptions.tsConfig = tsConfigPath; } + const delegateBuilderOptions = getDelegateBuilderOptions(options); + return from(import('@angular-devkit/build-angular')).pipe( switchMap(({ executeDevServerBuilder }) => - executeDevServerBuilder(options, context, { + executeDevServerBuilder(delegateBuilderOptions, context, { webpackConfiguration: async (baseWebpackConfig) => { if (!buildLibsFromSource) { const workspaceDependencies = dependencies @@ -137,7 +142,7 @@ export function executeWebpackDevServerBuilder( // @ts-expect-error - difference between angular and webpack plugin definitions bc of webpack versions new WebpackNxBuildCoordinationPlugin( `nx run-many --target=${ - parsedBrowserTarget.target + parsedBuildTarget.target } --projects=${workspaceDependencies.join(',')}` ) ); @@ -173,3 +178,16 @@ export function executeWebpackDevServerBuilder( export default require('@angular-devkit/architect').createBuilder( executeWebpackDevServerBuilder ) as any; + +function getDelegateBuilderOptions(options: NormalizedSchema) { + const delegatedBuilderOptions = { ...options }; + const { major } = getInstalledAngularVersionInfo(); + if (major <= 17) { + ( + delegatedBuilderOptions as unknown as SchemaWithBrowserTarget + ).browserTarget = delegatedBuilderOptions.buildTarget; + delete delegatedBuilderOptions.buildTarget; + } + + return delegatedBuilderOptions; +} diff --git a/packages/angular/src/builders/webpack-server/schema.d.ts b/packages/angular/src/builders/webpack-server/schema.d.ts index cf3001486b7f6..343d77de79845 100644 --- a/packages/angular/src/builders/webpack-server/schema.d.ts +++ b/packages/angular/src/builders/webpack-server/schema.d.ts @@ -5,5 +5,4 @@ export interface Schema extends ServerBuilderOptions { path: string; }; buildLibsFromSource?: boolean; - bundleDependencies?: boolean | 'none' | 'all'; } diff --git a/packages/angular/src/builders/webpack-server/schema.json b/packages/angular/src/builders/webpack-server/schema.json index 4bb2054adb348..df9cfe7a1b181 100644 --- a/packages/angular/src/builders/webpack-server/schema.json +++ b/packages/angular/src/builders/webpack-server/schema.json @@ -128,7 +128,7 @@ }, "vendorChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time. _Note: supported in Angular versions >= 15.1.0_", + "description": "Generate a separate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time. _Note: supported in Angular versions >= 15.1.0_", "default": false }, "verbose": { @@ -209,18 +209,6 @@ }, "default": [] }, - "bundleDependencies": { - "description": "Which external dependencies to bundle into the bundle. By default, all of node_modules will be bundled. _Note: This is only supported in Angular versions >= 14.0.0, < 15.0.0. It was removed in Angular 15._", - "oneOf": [ - { - "type": "boolean" - }, - { - "type": "string", - "enum": ["none", "all"] - } - ] - }, "statsJson": { "type": "boolean", "description": "Generates a 'stats.json' file which can be analyzed using tools such as 'webpack-bundle-analyzer'.", diff --git a/packages/angular/src/builders/webpack-server/validate-options.ts b/packages/angular/src/builders/webpack-server/validate-options.ts index 778660ee3cb1b..9de47194cf709 100644 --- a/packages/angular/src/builders/webpack-server/validate-options.ts +++ b/packages/angular/src/builders/webpack-server/validate-options.ts @@ -8,7 +8,6 @@ export function validateOptions(options: Schema): void { const angularVersionInfo = getInstalledAngularVersionInfo(); validateAssets(options, angularVersionInfo); validateBuildOptimizer(options, angularVersionInfo); - validateBundleDependencies(options, angularVersionInfo); validateVendorChunk(options, angularVersionInfo); } @@ -33,16 +32,6 @@ function validateBuildOptimizer( } } -function validateBundleDependencies( - options: Schema, - { major, version }: VersionInfo -): void { - if (major >= 15 && options.bundleDependencies) { - throw new Error(stripIndents`The "bundleDependencies" option was removed in Angular version 15. You are currently using "${version}". - You can resolve this error by removing the "bundleDependencies" option.`); - } -} - function validateVendorChunk(options: Schema, { version }: VersionInfo): void { if (lt(version, '15.1.0') && options.vendorChunk) { throw new Error(stripIndents`The "vendorChunk" option is supported from Angular >= 15.1.0. You are currently using "${version}". 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 273e21ecbcea4..f9cae7d5600a4 100644 --- a/packages/angular/src/builders/webpack-server/webpack-server.impl.ts +++ b/packages/angular/src/builders/webpack-server/webpack-server.impl.ts @@ -2,8 +2,6 @@ import { joinPathFragments } from '@nx/devkit'; import { existsSync } from 'fs'; import { Observable, from } from 'rxjs'; import { switchMap } from 'rxjs/operators'; -import { lt } from 'semver'; -import { getInstalledAngularVersionInfo } from '../../executors/utilities/angular-version-utils'; import { createTmpTsConfigForBuildableLibs } from '../utilities/buildable-libs'; import { mergeCustomWebpackConfig } from '../utilities/webpack'; import { Schema } from './schema'; @@ -95,15 +93,6 @@ export function executeWebpackServerBuilder( ): Observable { validateOptions(options); - const installedAngularVersionInfo = getInstalledAngularVersionInfo(); - // default bundleDependencies to true if supported by Angular version - if ( - lt(installedAngularVersionInfo.version, '15.0.0') && - options.bundleDependencies === undefined - ) { - options.bundleDependencies = true; - } - options.buildLibsFromSource ??= true; if (!options.buildLibsFromSource) { diff --git a/packages/angular/src/executors/browser-esbuild/browser-esbuild.impl.ts b/packages/angular/src/executors/browser-esbuild/browser-esbuild.impl.ts index 2694cbd230e9f..c9f9a5bae5aef 100644 --- a/packages/angular/src/executors/browser-esbuild/browser-esbuild.impl.ts +++ b/packages/angular/src/executors/browser-esbuild/browser-esbuild.impl.ts @@ -1,5 +1,4 @@ import { type EsBuildSchema } from './schema'; -import { validateOptions } from './lib/validate-options'; import { type DependentBuildableProjectNode } from '@nx/js/src/utils/buildable-libs-utils'; import { type ExecutorContext, readCachedProjectGraph } from '@nx/devkit'; import { createTmpTsConfigForBuildableLibs } from './lib/buildable-libs'; @@ -11,7 +10,6 @@ export default async function* esbuildExecutor( options: EsBuildSchema, context: ExecutorContext ) { - validateOptions(options); options.buildLibsFromSource ??= true; const { buildLibsFromSource, ...delegateExecutorOptions } = options; diff --git a/packages/angular/src/executors/browser-esbuild/lib/validate-options.ts b/packages/angular/src/executors/browser-esbuild/lib/validate-options.ts deleted file mode 100644 index f68ed5c05a986..0000000000000 --- a/packages/angular/src/executors/browser-esbuild/lib/validate-options.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - getInstalledAngularVersionInfo, - VersionInfo, -} from '../../utilities/angular-version-utils'; -import { stripIndents } from '@nx/devkit'; -import { extname } from 'path'; -import { type EsBuildSchema } from '../schema'; - -export function validateOptions(options: EsBuildSchema): void { - const angularVersionInfo = getInstalledAngularVersionInfo(); - validatePolyfills(options, angularVersionInfo); - validateStyles(options, angularVersionInfo); -} - -function validatePolyfills( - options: EsBuildSchema, - { major, version }: VersionInfo -): void { - if (major < 15 && Array.isArray(options.polyfills)) { - throw new Error(stripIndents`The array syntax for the "polyfills" option is supported from Angular >= 15.0.0. You are currently using "${version}". - You can resolve this error by removing the "polyfills" option, setting it to a string value or migrating to Angular 15.0.0.`); - } -} - -function validateStyles( - options: EsBuildSchema, - { major, version }: VersionInfo -): void { - if (!options.styles || !options.styles.length) { - return; - } - - if (major < 15) { - return; - } - - const stylusFiles = []; - options.styles.forEach((style) => { - const styleFile = typeof style === 'string' ? style : style.input; - if (extname(styleFile) === '.styl') { - stylusFiles.push(styleFile); - } - }); - - if (stylusFiles.length) { - throw new Error(stripIndents`Stylus is not supported since Angular v15. You're currently using "${version}". - You have the "styles" option with the following file(s) using the ".styl" extension: ${stylusFiles - .map((x) => `"${x}"`) - .join(', ')}. - Make sure to convert them to a supported extension (".css", ".scss", ".sass", ".less").`); - } -} diff --git a/packages/angular/src/executors/browser-esbuild/schema.json b/packages/angular/src/executors/browser-esbuild/schema.json index fa36ccba93def..481318ccd8b86 100644 --- a/packages/angular/src/executors/browser-esbuild/schema.json +++ b/packages/angular/src/executors/browser-esbuild/schema.json @@ -215,7 +215,7 @@ }, "outputPath": { "type": "string", - "description": "The full path for the new output directory, relative to the current workspace.\nBy default, writes output to a folder named dist/ in the current project." + "description": "The full path for the new output directory, relative to the current workspace." }, "resourcesOutputPath": { "type": "string", @@ -264,12 +264,12 @@ }, "vendorChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", + "description": "Generate a separate bundle containing only vendor libraries. This option should only be used for development to reduce the incremental compilation time.", "default": false }, "commonChunk": { "type": "boolean", - "description": "Generate a seperate bundle containing code used across multiple bundles.", + "description": "Generate a separate bundle containing code used across multiple bundles.", "default": true }, "baseHref": { @@ -401,6 +401,7 @@ }, { "const": false, + "type": "boolean", "description": "Does not generate an `index.html` file." } ] @@ -429,7 +430,7 @@ "enum": ["none", "anonymous", "use-credentials"] }, "allowedCommonJsDependencies": { - "description": "A list of CommonJS packages that are allowed to be used without a build time warning.", + "description": "A list of CommonJS or AMD packages that are allowed to be used without a build time warning. Use `'*'` to allow all.", "type": "array", "items": { "type": "string" diff --git a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-package.transform.ts b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-package.transform.ts index e3d98beb71150..475f8a8ada820 100644 --- a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-package.transform.ts +++ b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-package.transform.ts @@ -59,12 +59,19 @@ export const nxWritePackageTransform = (options: NgPackagrOptions) => } // 6. WRITE PACKAGE.JSON - // As of APF 14 only the primary entrypoint has a package.json + const relativeUnixFromDestPath = (filePath: string) => + ensureUnixPath(path.relative(ngEntryPoint.destinationPath, filePath)); + if (!ngEntryPoint.isSecondaryEntryPoint) { try { logger.info('Writing package manifest'); - const relativeUnixFromDestPath = (filePath: string) => - ensureUnixPath(path.relative(ngEntryPoint.destinationPath, filePath)); + if (!options.watch) { + const primary = ngPackageNode.data.primary; + await writeFile( + path.join(primary.destinationPath, '.npmignore'), + `# Nested package.json's are only needed for development.\n**/package.json` + ); + } await writePackageJson( ngEntryPoint, @@ -100,26 +107,39 @@ export const nxWritePackageTransform = (options: NgPackagrOptions) => } catch (error) { throw error; } - } else if (options.watch) { - // update the watch version of the primary entry point `package.json` file. - // this is needed because of Webpack's 5 `cachemanagedpaths` - // https://github.com/ng-packagr/ng-packagr/issues/2069 - const primary = ngPackageNode.data.primary; - const packageJsonPath = path.join( - primary.destinationPath, - 'package.json' - ); - - if (await exists(packageJsonPath)) { - const packageJson = JSON.parse( - await readFile(packageJsonPath, { encoding: 'utf8' }) - ); - packageJson.version = generateWatchVersion(); - await writeFile( - path.join(primary.destinationPath, 'package.json'), - JSON.stringify(packageJson, undefined, 2) + } else if (ngEntryPoint.isSecondaryEntryPoint) { + if (options.watch) { + // Update the watch version of the primary entry point `package.json` file. + // this is needed because of Webpack's 5 `cachemanagedpaths` + // https://github.com/ng-packagr/ng-packagr/issues/2069 + const primary = ngPackageNode.data.primary; + const packageJsonPath = path.join( + primary.destinationPath, + 'package.json' ); + + if (await exists(packageJsonPath)) { + const packageJson = JSON.parse( + await readFile(packageJsonPath, { encoding: 'utf8' }) + ); + packageJson.version = generateWatchVersion(); + await writeFile( + path.join(primary.destinationPath, 'package.json'), + JSON.stringify(packageJson, undefined, 2) + ); + } } + + // Write a package.json in each secondary entry-point + // This is need for esbuild to secondary entry-points in dist correctly. + await writeFile( + path.join(ngEntryPoint.destinationPath, 'package.json'), + JSON.stringify( + { module: relativeUnixFromDestPath(destinationFiles.fesm2022) }, + undefined, + 2 + ) + ); } logger.info(`Built ${ngEntryPoint.moduleId}`); diff --git a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ngc/compile-source-files.ts b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ngc/compile-source-files.ts index fcc6db9acb959..331095105ea40 100644 --- a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ngc/compile-source-files.ts +++ b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/ngc/compile-source-files.ts @@ -20,10 +20,10 @@ import { } from 'ng-packagr/lib/ng-package/nodes'; import { augmentProgramWithVersioning } from 'ng-packagr/lib/ts/cache-compiler-host'; import * as log from 'ng-packagr/lib/utils/log'; -import { ngCompilerCli } from 'ng-packagr/lib/utils/ng-compiler-cli'; import { join } from 'node:path'; import * as ts from 'typescript'; import { getInstalledAngularVersionInfo } from '../../../utilities/angular-version-utils'; +import { ngCompilerCli } from '../../../utilities/ng-compiler-cli'; import { NgPackagrOptions } from '../ng-package/options.di'; import { StylesheetProcessor } from '../styles/stylesheet-processor'; import { cacheCompilerHost } from '../ts/cache-compiler-host'; @@ -231,6 +231,26 @@ export async function compileSourceFiles( const transformers = angularCompiler.prepareEmit().transformers; + if ('getSemanticDiagnosticsOfNextAffectedFile' in builder) { + while ( + builder.emitNextAffectedFile( + (fileName, data, writeByteOrderMark, onError, sourceFiles) => { + if (fileName.endsWith('.tsbuildinfo')) { + tsCompilerHost.writeFile( + fileName, + data, + writeByteOrderMark, + onError, + sourceFiles + ); + } + } + ) + ) { + // empty + } + } + const angularVersion = getInstalledAngularVersionInfo(); const incrementalCompilation: typeof angularCompiler.incrementalCompilation = angularVersion.major < 16 diff --git a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/styles/stylesheet-processor.ts b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/styles/stylesheet-processor.ts index 42bfa872b8b29..69923851ebd41 100644 --- a/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/styles/stylesheet-processor.ts +++ b/packages/angular/src/executors/ng-packagr-lite/ng-packagr-adjustments/styles/stylesheet-processor.ts @@ -21,7 +21,6 @@ import { dirname, extname, join } from 'path'; import * as postcssPresetEnv from 'postcss-preset-env'; import * as postcssUrl from 'postcss-url'; import { pathToFileURL } from 'node:url'; -import { getInstalledAngularVersionInfo } from '../../../utilities/angular-version-utils'; import { getTailwindPostCssPlugins, getTailwindSetup, @@ -251,19 +250,6 @@ export class StylesheetProcessor { switch (ext) { case '.sass': case '.scss': { - const angularVersion = getInstalledAngularVersionInfo(); - if (angularVersion && angularVersion.major < 15) { - return (await import('sass')) - .renderSync({ - file: filePath, - data: css, - indentedSyntax: '.sass' === ext, - importer: customSassImporter, - includePaths: this.styleIncludePaths, - }) - .css.toString(); - } - return (await import('sass')) .compileString(css, { url: pathToFileURL(filePath), diff --git a/packages/angular/src/executors/package/ng-packagr-adjustments/ngc/compile-source-files.ts b/packages/angular/src/executors/package/ng-packagr-adjustments/ngc/compile-source-files.ts index 7b79f56328fd9..7303ed6475850 100644 --- a/packages/angular/src/executors/package/ng-packagr-adjustments/ngc/compile-source-files.ts +++ b/packages/angular/src/executors/package/ng-packagr-adjustments/ngc/compile-source-files.ts @@ -19,10 +19,10 @@ import { isPackage, } from 'ng-packagr/lib/ng-package/nodes'; import * as log from 'ng-packagr/lib/utils/log'; -import { ngCompilerCli } from 'ng-packagr/lib/utils/ng-compiler-cli'; import { join } from 'node:path'; import * as ts from 'typescript'; import { getInstalledAngularVersionInfo } from '../../../utilities/angular-version-utils'; +import { ngCompilerCli } from '../../../utilities/ng-compiler-cli'; import { NgPackagrOptions } from '../ng-package/options.di'; import { StylesheetProcessor } from '../styles/stylesheet-processor'; import { @@ -244,6 +244,26 @@ export async function compileSourceFiles( const transformers = angularCompiler.prepareEmit().transformers; + if ('getSemanticDiagnosticsOfNextAffectedFile' in builder) { + while ( + builder.emitNextAffectedFile( + (fileName, data, writeByteOrderMark, onError, sourceFiles) => { + if (fileName.endsWith('.tsbuildinfo')) { + tsCompilerHost.writeFile( + fileName, + data, + writeByteOrderMark, + onError, + sourceFiles + ); + } + } + ) + ) { + // empty + } + } + const angularVersion = getInstalledAngularVersionInfo(); const incrementalCompilation: typeof angularCompiler.incrementalCompilation = angularVersion.major < 16 diff --git a/packages/angular/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.ts b/packages/angular/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.ts index 2cb05da94c423..e3a10b87e7d7b 100644 --- a/packages/angular/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.ts +++ b/packages/angular/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.ts @@ -21,7 +21,6 @@ import { dirname, extname, join } from 'path'; import * as postcssPresetEnv from 'postcss-preset-env'; import * as postcssUrl from 'postcss-url'; import { pathToFileURL } from 'node:url'; -import { getInstalledAngularVersionInfo } from '../../../utilities/angular-version-utils'; import { getTailwindPostCssPlugins, getTailwindSetup, @@ -244,19 +243,6 @@ export class StylesheetProcessor { switch (ext) { case '.sass': case '.scss': { - const angularVersion = getInstalledAngularVersionInfo(); - if (angularVersion && angularVersion.major < 15) { - return (await import('sass')) - .renderSync({ - file: filePath, - data: css, - indentedSyntax: '.sass' === ext, - importer: customSassImporter, - includePaths: this.styleIncludePaths, - }) - .css.toString(); - } - return (await import('sass')) .compileString(css, { url: pathToFileURL(filePath), diff --git a/packages/angular/src/executors/utilities/ng-compiler-cli.ts b/packages/angular/src/executors/utilities/ng-compiler-cli.ts new file mode 100644 index 0000000000000..2577b960ef3ef --- /dev/null +++ b/packages/angular/src/executors/utilities/ng-compiler-cli.ts @@ -0,0 +1,31 @@ +export function ngCompilerCli(): Promise< + typeof import('@angular/compiler-cli') +> { + return loadEsmModule('@angular/compiler-cli'); +} + +/** + * Lazily compiled dynamic import loader function. + */ +let load: ((modulePath: string | URL) => Promise) | undefined; + +/** + * This uses a dynamic import to load a module which may be ESM. + * CommonJS code can load ESM code via a dynamic import. Unfortunately, TypeScript + * will currently, unconditionally downlevel dynamic import into a require call. + * require calls cannot load ESM code and will result in a runtime error. To workaround + * this, a Function constructor is used to prevent TypeScript from changing the dynamic import. + * Once TypeScript provides support for keeping the dynamic import this workaround can + * be dropped. + * + * @param modulePath The path of the module to load. + * @returns A Promise that resolves to the dynamically imported module. + */ +export function loadEsmModule(modulePath: string | URL): Promise { + load ??= new Function('modulePath', `return import(modulePath);`) as Exclude< + typeof load, + undefined + >; + + return load(modulePath); +} 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 4a116b4918647..deedf6d74c44f 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 @@ -48,52 +48,3 @@ exports[`addLinting generator should correctly generate the .eslintrc.json file ], } `; - -exports[`addLinting generator support angular v14 should correctly generate the .eslintrc.json file 1`] = ` -{ - "extends": [ - "../../.eslintrc.json", - ], - "ignorePatterns": [ - "!**/*", - ], - "overrides": [ - { - "extends": [ - "plugin:@nx/angular", - "plugin:@angular-eslint/template/process-inline-templates", - ], - "files": [ - "*.ts", - ], - "rules": { - "@angular-eslint/component-selector": [ - "error", - { - "prefix": "my-org", - "style": "kebab-case", - "type": "element", - }, - ], - "@angular-eslint/directive-selector": [ - "error", - { - "prefix": "myOrg", - "style": "camelCase", - "type": "attribute", - }, - ], - }, - }, - { - "extends": [ - "plugin:@nx/angular-template", - ], - "files": [ - "*.html", - ], - "rules": {}, - }, - ], -} -`; 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 f298773d34dad..459e64c6000c0 100644 --- a/packages/angular/src/generators/add-linting/add-linting.spec.ts +++ b/packages/angular/src/generators/add-linting/add-linting.spec.ts @@ -3,7 +3,6 @@ import { addProjectConfiguration, readJson, readProjectConfiguration, - updateJson, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import * as linter from '@nx/eslint'; @@ -82,83 +81,4 @@ describe('addLinting generator', () => { outputs: ['{options.outputFile}'], }); }); - - describe('support angular v14', () => { - beforeEach(() => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - }, - })); - - addProjectConfiguration(tree, appProjectName, { - root: appProjectRoot, - prefix: 'myOrg', - projectType: 'application', - targets: {}, - } as ProjectConfiguration); - }); - - it('should invoke the lintProjectGenerator', async () => { - jest.spyOn(linter, 'lintProjectGenerator'); - - await addLintingGenerator(tree, { - prefix: 'myOrg', - projectName: appProjectName, - projectRoot: appProjectRoot, - }); - - expect(linter.lintProjectGenerator).toHaveBeenCalled(); - }); - - it('should add the Angular specific EsLint devDependencies', async () => { - await addLintingGenerator(tree, { - prefix: 'myOrg', - projectName: appProjectName, - projectRoot: appProjectRoot, - }); - - const { dependencies, devDependencies } = readJson(tree, 'package.json'); - expect(dependencies['@angular/core']).toEqual('14.1.0'); - expect(devDependencies['@angular-eslint/eslint-plugin']).toBeDefined(); - expect( - devDependencies['@angular-eslint/eslint-plugin-template'] - ).toBeDefined(); - expect(devDependencies['@angular-eslint/template-parser']).toBeDefined(); - }); - - it('should correctly generate the .eslintrc.json file', async () => { - await addLintingGenerator(tree, { - prefix: 'myOrg', - projectName: appProjectName, - projectRoot: appProjectRoot, - }); - - const eslintConfig = readJson(tree, `${appProjectRoot}/.eslintrc.json`); - expect(eslintConfig).toMatchSnapshot(); - }); - - it('should update the project with the right lint target configuration', async () => { - await addLintingGenerator(tree, { - prefix: 'myOrg', - projectName: appProjectName, - projectRoot: appProjectRoot, - }); - - const project = readProjectConfiguration(tree, appProjectName); - expect(project.targets.lint).toEqual({ - executor: '@nx/eslint:lint', - options: { - lintFilePatterns: [ - `${appProjectRoot}/**/*.ts`, - `${appProjectRoot}/**/*.html`, - ], - }, - outputs: ['{options.outputFile}'], - }); - }); - }); }); 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 d7c8e0b891959..72cc77007c42f 100644 --- a/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap +++ b/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap @@ -9,10 +9,7 @@ import { appRoutes } from './app.routes'; @NgModule({ declarations: [AppComponent], - imports: [ - BrowserModule, - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), - ], + imports: [BrowserModule, RouterModule.forRoot(appRoutes)], providers: [], bootstrap: [AppComponent], }) @@ -219,12 +216,9 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "build": { "configurations": { "development": { - "buildOptimizer": false, "extractLicenses": false, - "namedChunks": true, "optimization": false, "sourceMap": true, - "vendorChunk": true, }, "production": { "budgets": [ @@ -243,14 +237,14 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:browser", + "executor": "@angular-devkit/build-angular:application", "options": { "assets": [ "apps/my-dir/my-app/src/favicon.ico", "apps/my-dir/my-app/src/assets", ], + "browser": "apps/my-dir/my-app/src/main.ts", "index": "apps/my-dir/my-app/src/index.html", - "main": "apps/my-dir/my-app/src/main.ts", "outputPath": "dist/apps/my-dir/my-app", "polyfills": [ "zone.js", @@ -268,7 +262,7 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "extract-i18n": { "executor": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "my-dir-my-app:build", + "buildTarget": "my-dir-my-app:build", }, }, "lint": { @@ -286,10 +280,10 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "serve": { "configurations": { "development": { - "browserTarget": "my-dir-my-app:build:development", + "buildTarget": "my-dir-my-app:build:development", }, "production": { - "browserTarget": "my-dir-my-app:build:production", + "buildTarget": "my-dir-my-app:build:production", }, }, "defaultConfiguration": "development", @@ -299,6 +293,7 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "executor": "@nx/web:file-server", "options": { "buildTarget": "my-dir-my-app:build", + "staticFilePath": "dist/apps/my-dir/my-app/browser", }, }, "test": { @@ -417,6 +412,7 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "strictTemplates": true, }, "compilerOptions": { + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, @@ -456,12 +452,9 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "build": { "configurations": { "development": { - "buildOptimizer": false, "extractLicenses": false, - "namedChunks": true, "optimization": false, "sourceMap": true, - "vendorChunk": true, }, "production": { "budgets": [ @@ -480,14 +473,14 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:browser", + "executor": "@angular-devkit/build-angular:application", "options": { "assets": [ "apps/my-app/src/favicon.ico", "apps/my-app/src/assets", ], + "browser": "apps/my-app/src/main.ts", "index": "apps/my-app/src/index.html", - "main": "apps/my-app/src/main.ts", "outputPath": "dist/apps/my-app", "polyfills": [ "zone.js", @@ -505,7 +498,7 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "extract-i18n": { "executor": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "my-app:build", + "buildTarget": "my-app:build", }, }, "lint": { @@ -523,10 +516,10 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "serve": { "configurations": { "development": { - "browserTarget": "my-app:build:development", + "buildTarget": "my-app:build:development", }, "production": { - "browserTarget": "my-app:build:production", + "buildTarget": "my-app:build:production", }, }, "defaultConfiguration": "development", @@ -536,6 +529,7 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "executor": "@nx/web:file-server", "options": { "buildTarget": "my-app:build", + "staticFilePath": "dist/apps/my-app/browser", }, }, "test": { @@ -654,6 +648,7 @@ exports[`app --project-name-and-root-format=derived should generate correctly wh "strictTemplates": true, }, "compilerOptions": { + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, @@ -693,14 +688,11 @@ bootstrapApplication(AppComponent, appConfig).catch((err) => exports[`app --standalone should generate a standalone app correctly with routing 2`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; export const appConfig: ApplicationConfig = { - providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + providers: [provideRouter(appRoutes)], }; " `; @@ -837,6 +829,7 @@ exports[`app --strict should enable strict type checking: app tsconfig.json 1`] "strictTemplates": true, }, "compilerOptions": { + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, @@ -893,6 +886,17 @@ exports[`app --strict should enable strict type checking: e2e tsconfig.json 1`] } `; +exports[`app angular v15 support should import "ApplicationConfig" from "@angular/platform-browser" 1`] = ` +"import { ApplicationConfig } from '@angular/platform-browser'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes)], +}; +" +`; + exports[`app at the root should accept numbers in the path 1`] = `"src/9-websites/my-app"`; exports[`app nested should create project configs 1`] = ` @@ -908,12 +912,9 @@ exports[`app nested should create project configs 1`] = ` "build": { "configurations": { "development": { - "buildOptimizer": false, "extractLicenses": false, - "namedChunks": true, "optimization": false, "sourceMap": true, - "vendorChunk": true, }, "production": { "budgets": [ @@ -932,14 +933,14 @@ exports[`app nested should create project configs 1`] = ` }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:browser", + "executor": "@angular-devkit/build-angular:application", "options": { "assets": [ "my-dir/my-app/src/favicon.ico", "my-dir/my-app/src/assets", ], + "browser": "my-dir/my-app/src/main.ts", "index": "my-dir/my-app/src/index.html", - "main": "my-dir/my-app/src/main.ts", "outputPath": "dist/my-dir/my-app", "polyfills": [ "zone.js", @@ -957,7 +958,7 @@ exports[`app nested should create project configs 1`] = ` "extract-i18n": { "executor": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "my-app:build", + "buildTarget": "my-app:build", }, }, "lint": { @@ -975,10 +976,10 @@ exports[`app nested should create project configs 1`] = ` "serve": { "configurations": { "development": { - "browserTarget": "my-app:build:development", + "buildTarget": "my-app:build:development", }, "production": { - "browserTarget": "my-app:build:production", + "buildTarget": "my-app:build:production", }, }, "defaultConfiguration": "development", @@ -988,6 +989,7 @@ exports[`app nested should create project configs 1`] = ` "executor": "@nx/web:file-server", "options": { "buildTarget": "my-app:build", + "staticFilePath": "dist/my-dir/my-app/browser", }, }, "test": { @@ -1059,12 +1061,9 @@ exports[`app not nested should create project configs 1`] = ` "build": { "configurations": { "development": { - "buildOptimizer": false, "extractLicenses": false, - "namedChunks": true, "optimization": false, "sourceMap": true, - "vendorChunk": true, }, "production": { "budgets": [ @@ -1083,14 +1082,14 @@ exports[`app not nested should create project configs 1`] = ` }, }, "defaultConfiguration": "production", - "executor": "@angular-devkit/build-angular:browser", + "executor": "@angular-devkit/build-angular:application", "options": { "assets": [ "my-app/src/favicon.ico", "my-app/src/assets", ], + "browser": "my-app/src/main.ts", "index": "my-app/src/index.html", - "main": "my-app/src/main.ts", "outputPath": "dist/my-app", "polyfills": [ "zone.js", @@ -1108,7 +1107,7 @@ exports[`app not nested should create project configs 1`] = ` "extract-i18n": { "executor": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "my-app:build", + "buildTarget": "my-app:build", }, }, "lint": { @@ -1126,10 +1125,10 @@ exports[`app not nested should create project configs 1`] = ` "serve": { "configurations": { "development": { - "browserTarget": "my-app:build:development", + "buildTarget": "my-app:build:development", }, "production": { - "browserTarget": "my-app:build:production", + "buildTarget": "my-app:build:production", }, }, "defaultConfiguration": "development", @@ -1139,6 +1138,7 @@ exports[`app not nested should create project configs 1`] = ` "executor": "@nx/web:file-server", "options": { "buildTarget": "my-app:build", + "staticFilePath": "dist/my-app/browser", }, }, "test": { @@ -1257,6 +1257,7 @@ exports[`app not nested should generate files: tsconfig.json 1`] = ` "strictTemplates": true, }, "compilerOptions": { + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, diff --git a/packages/angular/src/generators/application/application.spec.ts b/packages/angular/src/generators/application/application.spec.ts index ad7c53dbbe6ad..609370130233d 100644 --- a/packages/angular/src/generators/application/application.spec.ts +++ b/packages/angular/src/generators/application/application.spec.ts @@ -7,7 +7,6 @@ import { readJson, readNxJson, readProjectConfiguration, - stripIndents, updateJson, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -189,6 +188,24 @@ 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 builder', async () => { + await generateApp(appTree, 'my-app', { bundler: 'webpack' }); + + expect( + readJson(appTree, 'my-app/tsconfig.json').compilerOptions + .esModuleInterop + ).toBeUndefined(); + }); }); describe('nested', () => { @@ -354,13 +371,31 @@ describe('app', () => { }, ].forEach(hasJsonValue); }); + + it('should set esModuleInterop when using the application builder', async () => { + await generateApp(appTree, 'my-app', { rootProject: true }); + + expect( + readJson(appTree, 'tsconfig.json').compilerOptions.esModuleInterop + ).toBe(true); + }); + + it('should not set esModuleInterop when using the browser builder', async () => { + await generateApp(appTree, 'my-app', { + rootProject: true, + bundler: 'webpack', + }); + + expect( + readJson(appTree, 'tsconfig.json').compilerOptions.esModuleInterop + ).toBeUndefined(); + }); }); describe('routing', () => { it('should include RouterTestingModule', async () => { - await generateApp(appTree, 'my-app', { + await generateApp(appTree, 'myApp', { directory: 'my-dir/my-app', - routing: true, }); expect( appTree.read('my-dir/my-app/src/app/app.module.ts', 'utf-8') @@ -371,9 +406,8 @@ describe('app', () => { }); it('should not modify tests when --skip-tests is set', async () => { - await generateApp(appTree, 'my-app', { + await generateApp(appTree, 'myApp', { directory: 'my-dir/my-app', - routing: true, skipTests: true, }); expect( @@ -748,7 +782,6 @@ describe('app', () => { // ACT await generateApp(appTree, 'standalone', { standalone: true, - routing: true, }); // ASSERT @@ -794,46 +827,6 @@ describe('app', () => { appTree.read('standalone/src/app/nx-welcome.component.ts', 'utf-8') ).toContain('standalone: true'); }); - - it('should prompt for standalone components and not use them when the user selects false', async () => { - // ARRANGE - process.env.NX_INTERACTIVE = 'true'; - // @ts-ignore - enquirer.prompt = jest - .fn() - .mockReturnValue(Promise.resolve({ 'standalone-components': false })); - - // ACT - await generateApp(appTree, 'nostandalone'); - - // ASSERT - expect(appTree.exists('nostandalone/src/app/app.module.ts')).toBeTruthy(); - expect(enquirer.prompt).toHaveBeenCalled(); - - // CLEANUP - process.env.NX_INTERACTIVE = undefined; - }); - - it('should prompt for standalone components and use them when the user selects true', async () => { - // ARRANGE - process.env.NX_INTERACTIVE = 'true'; - // @ts-ignore - enquirer.prompt = jest - .fn() - .mockReturnValue(Promise.resolve({ 'standalone-components': true })); - - // ACT - await generateApp(appTree, 'nostandalone'); - - // ASSERT - expect( - appTree.exists('nostandalone/src/app/app.module.ts') - ).not.toBeTruthy(); - expect(enquirer.prompt).toHaveBeenCalled(); - - // CLEANUP - process.env.NX_INTERACTIVE = undefined; - }); }); it('should generate correct main.ts', async () => { @@ -880,29 +873,9 @@ describe('app', () => { }); }); - it('should error correctly when Angular version does not support standalone', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - '@angular/core': '14.0.0', - }, - })); - - // ACT & ASSERT - await expect( - generateApp(tree, 'my-app', { - standalone: true, - }) - ).rejects - .toThrow(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using 14.0.0. - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); - }); - describe('--minimal', () => { it('should skip "nx-welcome.component.ts" file and references for non-standalone apps without routing', async () => { - await generateApp(appTree, 'plain', { minimal: true }); + await generateApp(appTree, 'plain', { minimal: true, routing: false }); expect( appTree.exists('plain/src/app/nx-welcome.component.ts') @@ -922,7 +895,7 @@ describe('app', () => { }); it('should skip "nx-welcome.component.ts" file and references for non-standalone apps with routing', async () => { - await generateApp(appTree, 'plain', { minimal: true, routing: true }); + await generateApp(appTree, 'plain', { minimal: true }); expect( appTree.exists('plain/src/app/nx-welcome.component.ts') @@ -942,7 +915,11 @@ describe('app', () => { }); it('should skip "nx-welcome.component.ts" file and references for standalone apps without routing', async () => { - await generateApp(appTree, 'plain', { minimal: true, standalone: true }); + await generateApp(appTree, 'plain', { + minimal: true, + standalone: true, + routing: false, + }); expect( appTree.exists('plain/src/app/nx-welcome.component.ts') @@ -962,7 +939,6 @@ describe('app', () => { await generateApp(appTree, 'plain', { minimal: true, standalone: true, - routing: true, }); expect( @@ -981,23 +957,91 @@ describe('app', () => { it('should generate a correct build target for --bundler=esbuild', async () => { await generateApp(appTree, 'ngesbuild', { - routing: true, bundler: 'esbuild', }); const project = readProjectConfiguration(appTree, 'ngesbuild'); expect(project.targets.build.executor).toEqual( - '@angular-devkit/build-angular:browser-esbuild' + '@angular-devkit/build-angular:application' ); + expect( + project.targets.build.configurations.development.buildOptimizer + ).toBeUndefined(); expect( project.targets.build.configurations.development.namedChunks ).toBeUndefined(); expect( project.targets.build.configurations.development.vendorChunks ).toBeUndefined(); + expect(project.targets.build.configurations.production.budgets) + .toMatchInlineSnapshot(` + [ + { + "maximumError": "1mb", + "maximumWarning": "500kb", + "type": "initial", + }, + { + "maximumError": "4kb", + "maximumWarning": "2kb", + "type": "anyComponentStyle", + }, + ] + `); + }); + + it('should generate a correct build target for --bundler=webpack', async () => { + await generateApp(appTree, 'app1', { + bundler: 'webpack', + }); + + const project = readProjectConfiguration(appTree, 'app1'); + expect(project.targets.build.executor).toEqual( + '@angular-devkit/build-angular:browser' + ); expect( - project.targets.build.configurations.production.budgets - ).toBeUndefined(); + project.targets.build.configurations.development.buildOptimizer + ).toBe(false); + expect(project.targets.build.configurations.development.namedChunks).toBe( + true + ); + expect(project.targets.build.configurations.development.vendorChunk).toBe( + true + ); + expect(project.targets.build.configurations.production.budgets) + .toMatchInlineSnapshot(` + [ + { + "maximumError": "1mb", + "maximumWarning": "500kb", + "type": "initial", + }, + { + "maximumError": "4kb", + "maximumWarning": "2kb", + "type": "anyComponentStyle", + }, + ] + `); + }); + + it('should generate target options "browser" and "buildTarget"', async () => { + await generateApp(appTree, 'my-app', { standalone: true }); + + const project = readProjectConfiguration(appTree, 'my-app'); + expect(project.targets.build.options.browser).toBeDefined(); + expect( + project.targets.serve.configurations.development.buildTarget + ).toBeDefined(); + }); + }); + + describe('--ssr', () => { + it('should generate with ssr set up', async () => { + await generateApp(appTree, 'app1', { ssr: true }); + + expect(appTree.exists('app1/src/main.server.ts')).toBe(true); + expect(appTree.exists('app1/server.ts')).toBe(true); }); }); @@ -1079,6 +1123,67 @@ describe('app', () => { expect(tsconfigE2E).toMatchSnapshot('e2e tsconfig.json'); }); }); + + describe('angular v15 support', () => { + beforeEach(() => { + appTree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + updateJson(appTree, 'package.json', (json) => ({ + ...json, + dependencies: { + ...json.dependencies, + '@angular/core': '~15.2.0', + }, + })); + }); + + it('should import "ApplicationConfig" from "@angular/platform-browser"', async () => { + await generateApp(appTree, 'my-app', { standalone: true }); + + expect( + appTree.read('my-app/src/app/app.config.ts', 'utf-8') + ).toMatchSnapshot(); + }); + + it('should use "@angular-devkit/build-angular:browser-esbuild" for --bundler=esbuild', async () => { + await generateApp(appTree, 'my-app', { + standalone: true, + bundler: 'esbuild', + }); + + const project = readProjectConfiguration(appTree, 'my-app'); + expect(project.targets.build.executor).toEqual( + '@angular-devkit/build-angular:browser-esbuild' + ); + }); + + it('should generate target options "main" and "browserTarget"', async () => { + await generateApp(appTree, 'my-app', { standalone: true }); + + const project = readProjectConfiguration(appTree, 'my-app'); + expect(project.targets.build.options.main).toBeDefined(); + expect( + project.targets.serve.configurations.development.browserTarget + ).toBeDefined(); + }); + + it('should not set esModuleInterop when using the browser-esbuild builder', async () => { + await generateApp(appTree, 'my-app', { bundler: 'esbuild' }); + + 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(); + }); + }); }); async function generateApp( @@ -1092,6 +1197,7 @@ async function generateApp( e2eTestRunner: E2eTestRunner.Cypress, unitTestRunner: UnitTestRunner.Jest, linter: Linter.EsLint, + standalone: false, ...options, }); } diff --git a/packages/angular/src/generators/application/application.ts b/packages/angular/src/generators/application/application.ts index 049bbaba11966..3d7e189966ff9 100644 --- a/packages/angular/src/generators/application/application.ts +++ b/packages/angular/src/generators/application/application.ts @@ -4,13 +4,12 @@ import { installPackagesTask, offsetFromRoot, readNxJson, - stripIndents, Tree, updateNxJson, } from '@nx/devkit'; import { angularInitGenerator } from '../init/init'; +import { setupSsr } from '../setup-ssr/setup-ssr'; import { setupTailwindGenerator } from '../setup-tailwind/setup-tailwind'; -import { getInstalledAngularVersionInfo } from '../utils/version-utils'; import { addE2e, addLinting, @@ -24,8 +23,6 @@ import { updateEditorTsConfig, } from './lib'; import type { Schema } from './schema'; -import { gte, lt } from 'semver'; -import { prompt } from 'enquirer'; export async function applicationGenerator( tree: Tree, @@ -41,25 +38,6 @@ export async function applicationGeneratorInternal( tree: Tree, schema: Partial ): Promise { - const installedAngularVersionInfo = getInstalledAngularVersionInfo(tree); - - if (lt(installedAngularVersionInfo.version, '14.1.0') && schema.standalone) { - throw new Error(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using ${installedAngularVersionInfo.version}. - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); - } - - if ( - gte(installedAngularVersionInfo.version, '14.1.0') && - schema.standalone === undefined && - process.env.NX_INTERACTIVE === 'true' - ) { - schema.standalone = await prompt({ - name: 'standalone-components', - message: 'Would you like to use Standalone Components?', - type: 'confirm', - }).then((a) => a['standalone-components']); - } - const options = await normalizeOptions(tree, schema); const rootOffset = offsetFromRoot(options.appProjectRoot); @@ -101,6 +79,13 @@ export async function applicationGeneratorInternal( setApplicationStrictDefault(tree, false); } + if (options.ssr) { + await setupSsr(tree, { + project: options.name, + standalone: options.standalone, + }); + } + if (!options.skipFormat) { await formatFiles(tree); } diff --git a/packages/angular/src/generators/application/files/base/tsconfig.app.json__tpl__ b/packages/angular/src/generators/application/files/base/tsconfig.app.json__tpl__ index 2d91132ac88c2..61dcf0ec390a8 100644 --- a/packages/angular/src/generators/application/files/base/tsconfig.app.json__tpl__ +++ b/packages/angular/src/generators/application/files/base/tsconfig.app.json__tpl__ @@ -4,7 +4,7 @@ "outDir": "<%= rootOffset %>dist/out-tsc", "types": [] }, - "files": ["src/main.ts"<% if(installedAngularInfo.major === 14) { %>, "src/polyfills.ts"<% } %>], + "files": ["src/main.ts"], "include": ["src/**/*.d.ts"], "exclude": ["jest.config.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 574499b52ee13..404a81173f6bf 100644 --- a/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ +++ b/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ @@ -1,7 +1,8 @@ { "compilerOptions": { - "target": <% if(installedAngularInfo.major === 14) { %>"es2020"<% } else { %>"es2022"<% } %><% if(installedAngularInfo.major === 15) { %>, - "useDefineForClassFields": false<% } %> + "target": "es2022", + "useDefineForClassFields": false<% if (isUsingApplicationBuilder) { %>, + "esModuleInterop": true<% } %> }, "files": [], "include": [], 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__ index c44aa7f8f46d8..745b195cc451a 100644 --- 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__ @@ -9,7 +9,7 @@ import { NxWelcomeComponent } from './nx-welcome.component';<% } %> declarations: [AppComponent<% if(!minimal) { %>, NxWelcomeComponent<% } %>], imports: [ BrowserModule,<% if(routing) { %> - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }),<% } %> + RouterModule.forRoot(appRoutes),<% } %> ], providers: [], bootstrap: [AppComponent], diff --git a/packages/angular/src/generators/application/files/ng-module/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/ng-module/src/app/nx-welcome.component.ts__tpl__ index 7089208c7e598..a00978de1779d 100644 --- a/packages/angular/src/generators/application/files/ng-module/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/ng-module/src/app/nx-welcome.component.ts__tpl__ @@ -742,9 +742,9 @@ import { Component, ViewEncapsulation } from '@angular/core'; Add UI library
# Generate UI lib
-nx g @nx/angular:lib ui
+nx g @nx/angular:lib ui
 # Add a component
-nx g @nx/angular:component button --project ui
+nx g @nx/angular:component button --project ui
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 8640123932894..16de2365d275e 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,11 +1,5 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';<% if(installedAngularInfo.major === 14) { %> -import { enableProdMode } from '@angular/core';<% } %> -import { AppModule } from './app/app.module';<% if(installedAngularInfo.major === 14) { %> -import { environment } from './environments/environment'; - -if(environment.production) { - enableProdMode(); -}<% } %> +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { AppModule } from './app/app.module'; platformBrowserDynamic() .bootstrapModule(AppModule) 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 0be643ee357a4..37ff93aee71e4 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,7 @@ import { ApplicationConfig } from <% if (installedAngularInfo.major >= 16) { %>'@angular/core';<% } else { %>'@angular/platform-browser';<% } %><% if (routing) { %> -import { provideRouter, withEnabledBlockingInitialNavigation } from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes';<% } %> export const appConfig: ApplicationConfig = { - providers: [<% if (routing) { %>provideRouter(appRoutes, withEnabledBlockingInitialNavigation()) <% } %>] + providers: [<% if (routing) { %>provideRouter(appRoutes) <% } %>] }; diff --git a/packages/angular/src/generators/application/files/standalone-components/src/app/nx-welcome.component.ts__tpl__ b/packages/angular/src/generators/application/files/standalone-components/src/app/nx-welcome.component.ts__tpl__ index a5ca96c8786e1..385effefd2abf 100644 --- a/packages/angular/src/generators/application/files/standalone-components/src/app/nx-welcome.component.ts__tpl__ +++ b/packages/angular/src/generators/application/files/standalone-components/src/app/nx-welcome.component.ts__tpl__ @@ -745,9 +745,9 @@ import { CommonModule } from '@angular/common'; Add UI library
# Generate UI lib
-nx g @nx/angular:lib ui
+nx g @nx/angular:lib ui
 # Add a component
-nx g @nx/angular:component button --project ui
+nx g @nx/angular:component button --project ui
diff --git a/packages/angular/src/generators/application/files/tsconfig.editor.json__tpl__ b/packages/angular/src/generators/application/files/tsconfig.editor.json__tpl__ deleted file mode 100644 index 57caccc2ab346..0000000000000 --- a/packages/angular/src/generators/application/files/tsconfig.editor.json__tpl__ +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["src/**/*.ts"], - "compilerOptions": {} -} diff --git a/packages/angular/src/generators/application/files/v14/.browserlistrc__tpl__ b/packages/angular/src/generators/application/files/v14/.browserlistrc__tpl__ deleted file mode 100644 index 4f9ac26980c15..0000000000000 --- a/packages/angular/src/generators/application/files/v14/.browserlistrc__tpl__ +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR diff --git a/packages/angular/src/generators/application/files/v14/src/environments/environment.prod.ts__tpl__ b/packages/angular/src/generators/application/files/v14/src/environments/environment.prod.ts__tpl__ deleted file mode 100644 index 3612073bc31cd..0000000000000 --- a/packages/angular/src/generators/application/files/v14/src/environments/environment.prod.ts__tpl__ +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/packages/angular/src/generators/application/files/v14/src/environments/environment.ts__tpl__ b/packages/angular/src/generators/application/files/v14/src/environments/environment.ts__tpl__ deleted file mode 100644 index 8c29253accfd8..0000000000000 --- a/packages/angular/src/generators/application/files/v14/src/environments/environment.ts__tpl__ +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/plugins/zone-error'; diff --git a/packages/angular/src/generators/application/files/v14/src/polyfills.ts__tpl__ b/packages/angular/src/generators/application/files/v14/src/polyfills.ts__tpl__ deleted file mode 100644 index 429bb9ef2d340..0000000000000 --- a/packages/angular/src/generators/application/files/v14/src/polyfills.ts__tpl__ +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes recent versions of Safari, Chrome (including - * Opera), Edge on the desktop, and iOS and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/packages/angular/src/generators/application/lib/add-e2e.ts b/packages/angular/src/generators/application/lib/add-e2e.ts index a836bd8f67611..9719db5b6dce9 100644 --- a/packages/angular/src/generators/application/lib/add-e2e.ts +++ b/packages/angular/src/generators/application/lib/add-e2e.ts @@ -1,3 +1,4 @@ +import { configurationGenerator } from '@nx/cypress'; import type { Tree } from '@nx/devkit'; import { addDependenciesToPackageJson, @@ -9,8 +10,8 @@ import { updateProjectConfiguration, } from '@nx/devkit'; import { nxVersion } from '../../../utils/versions'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema } from './normalized-schema'; -import { configurationGenerator } from '@nx/cypress'; export async function addE2e(tree: Tree, options: NormalizedSchema) { if (options.e2eTestRunner === 'cypress') { @@ -70,12 +71,19 @@ function addFileServerTarget( ) { addDependenciesToPackageJson(tree, {}, { '@nx/web': nxVersion }); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + const isUsingApplicationBuilder = + angularMajorVersion >= 17 && options.bundler === 'esbuild'; + const projectConfig = readProjectConfiguration(tree, options.name); projectConfig.targets[targetName] = { executor: '@nx/web:file-server', options: { buildTarget: `${options.name}:build`, port: options.port, + staticFilePath: isUsingApplicationBuilder + ? joinPathFragments(options.outputPath, 'browser') + : undefined, }, }; updateProjectConfiguration(tree, options.name, projectConfig); diff --git a/packages/angular/src/generators/application/lib/add-unit-test-runner.ts b/packages/angular/src/generators/application/lib/add-unit-test-runner.ts index 165082806e93d..9fa38b3064f03 100644 --- a/packages/angular/src/generators/application/lib/add-unit-test-runner.ts +++ b/packages/angular/src/generators/application/lib/add-unit-test-runner.ts @@ -1,9 +1,8 @@ import { Tree, joinPathFragments } from '@nx/devkit'; -import type { NormalizedSchema } from './normalized-schema'; - import { configurationGenerator } from '@nx/jest'; - import { UnitTestRunner } from '../../../utils/test-runners'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; +import type { NormalizedSchema } from './normalized-schema'; export async function addUnitTestRunner(host: Tree, options: NormalizedSchema) { if (options.unitTestRunner === UnitTestRunner.Jest) { @@ -20,6 +19,7 @@ export async function addUnitTestRunner(host: Tree, options: NormalizedSchema) { 'src', 'test-setup.ts' ); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(host); if (options.strict && host.exists(setupFile)) { const contents = host.read(setupFile, 'utf-8'); host.write( @@ -31,7 +31,17 @@ globalThis.ngJest = { errorOnUnknownProperties: true, }, }; -${contents}` +${contents}${ + angularMajorVersion >= 17 + ? ` +/** + * Angular uses performance.mark() which is not supported by jsdom. Stub it out + * to avoid errors. + */ +global.performance.mark = jest.fn(); +` + : '' + }` ); } } diff --git a/packages/angular/src/generators/application/lib/create-files.ts b/packages/angular/src/generators/application/lib/create-files.ts index 88c4601dadc01..0379dad1caf95 100644 --- a/packages/angular/src/generators/application/lib/create-files.ts +++ b/packages/angular/src/generators/application/lib/create-files.ts @@ -12,6 +12,9 @@ export async function createFiles( rootOffset: string ) { const installedAngularInfo = getInstalledAngularVersionInfo(tree); + const isUsingApplicationBuilder = + installedAngularInfo.major >= 17 && options.bundler === 'esbuild'; + const substitutions = { rootSelector: `${options.prefix}-root`, appName: options.name, @@ -26,6 +29,7 @@ export async function createFiles( rootTsConfig: joinPathFragments(rootOffset, getRootTsConfigFileName(tree)), installedAngularInfo, rootOffset, + isUsingApplicationBuilder, tpl: '', }; @@ -36,15 +40,6 @@ export async function createFiles( substitutions ); - if (installedAngularInfo.major === 14) { - generateFiles( - tree, - joinPathFragments(__dirname, '../files/v14'), - options.appProjectRoot, - substitutions - ); - } - if (options.standalone) { generateFiles( tree, @@ -53,7 +48,7 @@ export async function createFiles( substitutions ); } else { - await generateFiles( + generateFiles( tree, joinPathFragments(__dirname, '../files/ng-module'), options.appProjectRoot, @@ -65,7 +60,13 @@ export async function createFiles( tree, options.appProjectRoot, 'app', - options, + { + bundler: options.bundler, + rootProject: options.rootProject, + strict: options.strict, + style: options.style, + esModuleInterop: isUsingApplicationBuilder, + }, getRelativePathToRootTsConfig(tree, options.appProjectRoot) ); diff --git a/packages/angular/src/generators/application/lib/create-project.ts b/packages/angular/src/generators/application/lib/create-project.ts index 76f29504fb4a8..8b750757b7db0 100644 --- a/packages/angular/src/generators/application/lib/create-project.ts +++ b/packages/angular/src/generators/application/lib/create-project.ts @@ -5,70 +5,79 @@ import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { NormalizedSchema } from './normalized-schema'; export function createProject(tree: Tree, options: NormalizedSchema) { - const installedAngularInfo = getInstalledAngularVersionInfo(tree); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + const buildExecutor = options.bundler === 'webpack' ? '@angular-devkit/build-angular:browser' + : angularMajorVersion >= 17 + ? '@angular-devkit/build-angular:application' : '@angular-devkit/build-angular:browser-esbuild'; + const buildTargetOptionName = + angularMajorVersion >= 17 ? 'buildTarget' : 'browserTarget'; + const buildMainOptionName = + angularMajorVersion >= 17 && options.bundler === 'esbuild' + ? 'browser' + : 'main'; + + let budgets = undefined; + if (options.bundler === 'webpack' || angularMajorVersion >= 17) { + if (options.strict) { + budgets = [ + { type: 'initial', maximumWarning: '500kb', maximumError: '1mb' }, + { + type: 'anyComponentStyle', + maximumWarning: '2kb', + maximumError: '4kb', + }, + ]; + } 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.appProjectRoot}/src`, + sourceRoot: options.appProjectSourceRoot, tags: options.parsedTags, targets: { build: { executor: buildExecutor, outputs: ['{options.outputPath}'], options: { - outputPath: `dist/${ - !options.rootProject ? options.appProjectRoot : options.name - }`, - index: `${options.appProjectRoot}/src/index.html`, - main: `${options.appProjectRoot}/src/main.ts`, - polyfills: - installedAngularInfo.major === 14 - ? `${options.appProjectRoot}/src/polyfills.ts` - : ['zone.js'], + outputPath: options.outputPath, + index: `${options.appProjectSourceRoot}/index.html`, + [buildMainOptionName]: `${options.appProjectSourceRoot}/main.ts`, + polyfills: ['zone.js'], tsConfig: `${options.appProjectRoot}/tsconfig.app.json`, + inlineStyleLanguage, assets: [ - `${options.appProjectRoot}/src/favicon.ico`, - `${options.appProjectRoot}/src/assets`, + `${options.appProjectSourceRoot}/favicon.ico`, + `${options.appProjectSourceRoot}/assets`, ], - styles: [`${options.appProjectRoot}/src/styles.${options.style}`], + styles: [`${options.appProjectSourceRoot}/styles.${options.style}`], scripts: [], }, configurations: { production: { - budgets: - options.bundler === 'webpack' - ? [ - { - type: 'initial', - maximumWarning: '500kb', - maximumError: '1mb', - }, - { - type: 'anyComponentStyle', - maximumWarning: '2kb', - maximumError: '4kb', - }, - ] - : undefined, - fileReplacements: - installedAngularInfo.major === 14 - ? [ - { - replace: `${options.appProjectRoot}/src/environments/environment.ts`, - with: `${options.appProjectRoot}/src/environments/environment.prod.ts`, - }, - ] - : undefined, + budgets, outputHashing: 'all', }, development: { - buildOptimizer: false, + buildOptimizer: options.bundler === 'webpack' ? false : undefined, optimization: false, vendorChunk: options.bundler === 'webpack' ? true : undefined, extractLicenses: false, @@ -87,10 +96,10 @@ export function createProject(tree: Tree, options: NormalizedSchema) { : undefined, configurations: { production: { - browserTarget: `${options.name}:build:production`, + [buildTargetOptionName]: `${options.name}:build:production`, }, development: { - browserTarget: `${options.name}:build:development`, + [buildTargetOptionName]: `${options.name}:build:development`, }, }, defaultConfiguration: 'development', @@ -98,7 +107,7 @@ export function createProject(tree: Tree, options: NormalizedSchema) { 'extract-i18n': { executor: '@angular-devkit/build-angular:extract-i18n', options: { - browserTarget: `${options.name}:build`, + [buildTargetOptionName]: `${options.name}:build`, }, }, }, diff --git a/packages/angular/src/generators/application/lib/normalize-options.ts b/packages/angular/src/generators/application/lib/normalize-options.ts index d3e481b744a84..e8d989d216d9a 100644 --- a/packages/angular/src/generators/application/lib/normalize-options.ts +++ b/packages/angular/src/generators/application/lib/normalize-options.ts @@ -1,11 +1,12 @@ -import { Tree } from '@nx/devkit'; +import { joinPathFragments, type Tree } from '@nx/devkit'; import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; -import { getNpmScope } from '@nx/js/src/utils/package-json/get-npm-scope'; import { Linter } from '@nx/eslint'; +import { getNpmScope } from '@nx/js/src/utils/package-json/get-npm-scope'; import { E2eTestRunner, UnitTestRunner } from '../../../utils/test-runners'; import { normalizeNewProjectPrefix } from '../../utils/project'; import type { Schema } from '../schema'; import type { NormalizedSchema } from './normalized-schema'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; export async function normalizeOptions( host: Tree, @@ -39,10 +40,16 @@ export async function normalizeOptions( 'app' ); + let bundler = options.bundler; + if (!bundler) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(host); + bundler = angularMajorVersion >= 17 ? 'esbuild' : 'webpack'; + } + // Set defaults and then overwrite with user options return { style: 'css', - routing: false, + routing: true, inlineStyle: false, inlineTemplate: false, skipTests: options.unitTestRunner === UnitTestRunner.None, @@ -51,13 +58,20 @@ export async function normalizeOptions( e2eTestRunner: E2eTestRunner.Cypress, linter: Linter.EsLint, strict: true, - bundler: options.bundler ?? 'webpack', + standalone: true, ...options, prefix, name: appProjectName, appProjectRoot, + appProjectSourceRoot: `${appProjectRoot}/src`, e2eProjectRoot, e2eProjectName, parsedTags, + bundler, + outputPath: joinPathFragments( + 'dist', + !options.rootProject ? appProjectRoot : appProjectName + ), + ssr: options.ssr ?? false, }; } diff --git a/packages/angular/src/generators/application/lib/normalized-schema.ts b/packages/angular/src/generators/application/lib/normalized-schema.ts index dbfd8f83fa740..b1a5dd3675d76 100644 --- a/packages/angular/src/generators/application/lib/normalized-schema.ts +++ b/packages/angular/src/generators/application/lib/normalized-schema.ts @@ -8,7 +8,9 @@ export interface NormalizedSchema extends Schema { e2eTestRunner: E2eTestRunner; prefix: string; appProjectRoot: string; + appProjectSourceRoot: string; e2eProjectName: string; e2eProjectRoot: string; parsedTags: string[]; + outputPath: string; } diff --git a/packages/angular/src/generators/application/schema.d.ts b/packages/angular/src/generators/application/schema.d.ts index cdb84fd5f505a..2ab398d60b007 100644 --- a/packages/angular/src/generators/application/schema.d.ts +++ b/packages/angular/src/generators/application/schema.d.ts @@ -30,4 +30,5 @@ export interface Schema { rootProject?: boolean; minimal?: boolean; bundler?: 'webpack' | 'esbuild'; + ssr?: boolean; } diff --git a/packages/angular/src/generators/application/schema.json b/packages/angular/src/generators/application/schema.json index 1cc21df7cb186..6de1e0bf3b1e4 100644 --- a/packages/angular/src/generators/application/schema.json +++ b/packages/angular/src/generators/application/schema.json @@ -56,9 +56,8 @@ }, "routing": { "type": "boolean", - "description": "Generate a routing module.", - "default": false, - "x-prompt": "Would you like to configure routing for this application?", + "description": "Enable routing for the application.", + "default": true, "x-priority": "important" }, "inlineStyle": { @@ -155,8 +154,9 @@ "default": false }, "standalone": { - "description": "Generate an application that is setup to use standalone components. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Generate an application that is setup to use standalone components.", "type": "boolean", + "default": true, "x-priority": "important" }, "rootProject": { @@ -172,10 +172,17 @@ "default": false }, "bundler": { - "description": "Bundler to use to build the application.", + "description": "Bundler to use to build the application. It defaults to `esbuild` for Angular versions >= 17.0.0. Otherwise, it defaults to `webpack`. _Note: The `esbuild` bundler is only considered stable from Angular v17._", "type": "string", "enum": ["webpack", "esbuild"], - "default": "webpack" + "x-prompt": "Which bundler do you want to use to build the application?", + "x-priority": "important" + }, + "ssr": { + "description": "Creates an application with Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) enabled.", + "type": "boolean", + "x-prompt": "Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)?", + "default": false } }, "additionalProperties": false, diff --git a/packages/angular/src/generators/component/component.spec.ts b/packages/angular/src/generators/component/component.spec.ts index c425e77f72035..d1968c4402273 100644 --- a/packages/angular/src/generators/component/component.spec.ts +++ b/packages/angular/src/generators/component/component.spec.ts @@ -1,9 +1,4 @@ -import { - addProjectConfiguration, - stripIndents, - updateJson, - writeJson, -} from '@nx/devkit'; +import { addProjectConfiguration, writeJson } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { componentGenerator } from './component'; @@ -33,6 +28,7 @@ describe('component Generator', () => { await componentGenerator(tree, { name: 'example', project: 'lib1', + standalone: false, }); // ASSERT @@ -79,6 +75,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', skipTests: true, + standalone: false, }); // ASSERT @@ -113,6 +110,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', inlineTemplate: true, + standalone: false, }); // ASSERT @@ -150,6 +148,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', inlineStyle: true, + standalone: false, }); // ASSERT @@ -187,6 +186,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', style: 'none', + standalone: false, }); // ASSERT @@ -232,6 +232,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', export: true, + standalone: false, }); // ASSERT @@ -270,7 +271,6 @@ describe('component Generator', () => { await componentGenerator(tree, { name: 'example', project: 'lib1', - standalone: true, export: true, }); @@ -314,6 +314,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', export: false, + standalone: false, }); // ASSERT @@ -354,7 +355,6 @@ describe('component Generator', () => { await componentGenerator(tree, { name: 'example', project: 'lib1', - standalone: true, export: false, }); @@ -397,6 +397,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', skipImport: true, + standalone: false, }); // ASSERT @@ -437,6 +438,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', export: true, + standalone: false, }); // ASSERT @@ -476,6 +478,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', export: true, + standalone: false, }); // ASSERT @@ -511,6 +514,7 @@ describe('component Generator', () => { project: 'lib1', flat: true, export: true, + standalone: false, }); // ASSERT @@ -551,6 +555,7 @@ describe('component Generator', () => { project: 'lib1', flat: true, export: false, + standalone: false, }); // ASSERT @@ -595,6 +600,7 @@ describe('component Generator', () => { project: 'lib1', path: 'libs/lib1/src/lib/mycomp', export: true, + standalone: false, }); // ASSERT @@ -638,6 +644,7 @@ describe('component Generator', () => { project: 'lib1', path: 'apps/app1/src/mycomp', export: false, + standalone: false, }) ).rejects.toThrow(); }); @@ -683,6 +690,7 @@ describe('component Generator', () => { project: 'lib1', module, export: true, + standalone: false, }); // ASSERT @@ -723,6 +731,7 @@ describe('component Generator', () => { project: 'shared-ui', export: true, flat: false, + standalone: false, }); // ASSERT @@ -771,6 +780,7 @@ describe('component Generator', () => { project: 'lib1', module: 'not-exported', export: true, + standalone: false, }); // ASSERT @@ -808,6 +818,7 @@ describe('component Generator', () => { project: 'lib1', path: 'libs/lib1/src/lib', module: 'not-found', + standalone: false, }) ).rejects.toThrow(); }); @@ -849,6 +860,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', path: 'libs/lib1/src/lib', + standalone: false, }) ).rejects.toThrow(); }); @@ -902,6 +914,7 @@ describe('component Generator', () => { project: 'lib1', path: 'libs/lib1/secondary/src/lib', export: true, + standalone: false, }); // ASSERT @@ -961,6 +974,7 @@ describe('component Generator', () => { name: 'example', project: 'lib1', export: true, + standalone: false, }); // ASSERT @@ -971,32 +985,4 @@ describe('component Generator', () => { expect(indexSource).toBe(''); }); }); - - it('should error correctly when Angular version does not support standalone', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - '@angular/core': '14.0.0', - }, - })); - - addProjectConfiguration(tree, 'lib1', { - projectType: 'library', - sourceRoot: 'libs/lib1/src', - root: 'libs/lib1', - }); - - // ACT & ASSERT - await expect( - componentGenerator(tree, { - name: 'example', - project: 'lib1', - standalone: true, - }) - ).rejects - .toThrow(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using "14.0.0". - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); - }); }); diff --git a/packages/angular/src/generators/component/component.ts b/packages/angular/src/generators/component/component.ts index 5f9c3a383561c..a6ff38ce1ba0e 100644 --- a/packages/angular/src/generators/component/component.ts +++ b/packages/angular/src/generators/component/component.ts @@ -10,7 +10,6 @@ import { exportComponentInEntryPoint, findModuleFromOptions, normalizeOptions, - validateOptions, } from './lib'; import type { Schema } from './schema'; @@ -25,7 +24,6 @@ export async function componentGeneratorInternal( tree: Tree, rawOptions: Schema ) { - validateOptions(tree, rawOptions); const options = await normalizeOptions(tree, rawOptions); generateFiles( diff --git a/packages/angular/src/generators/component/lib/index.ts b/packages/angular/src/generators/component/lib/index.ts index 46e96e2292c93..33dc5c4e3a267 100644 --- a/packages/angular/src/generators/component/lib/index.ts +++ b/packages/angular/src/generators/component/lib/index.ts @@ -1,4 +1,3 @@ export * from './component'; export * from './module'; export * from './normalize-options'; -export * from './validate-options'; diff --git a/packages/angular/src/generators/component/lib/normalize-options.ts b/packages/angular/src/generators/component/lib/normalize-options.ts index 66485636ba7a8..180044ebe24a8 100644 --- a/packages/angular/src/generators/component/lib/normalize-options.ts +++ b/packages/angular/src/generators/component/lib/normalize-options.ts @@ -46,6 +46,7 @@ export async function normalizeOptions( projectName, changeDetection: options.changeDetection ?? 'Default', style: options.style ?? 'css', + standalone: options.standalone ?? true, directory, fileName, filePath, diff --git a/packages/angular/src/generators/component/lib/validate-options.ts b/packages/angular/src/generators/component/lib/validate-options.ts deleted file mode 100644 index d51a443cd84fb..0000000000000 --- a/packages/angular/src/generators/component/lib/validate-options.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { Tree } from '@nx/devkit'; -import { validateStandaloneOption } from '../../utils/validations'; -import type { Schema } from '../schema'; - -export function validateOptions(tree: Tree, options: Schema): void { - validateStandaloneOption(tree, options.standalone); -} diff --git a/packages/angular/src/generators/component/schema.json b/packages/angular/src/generators/component/schema.json index d66db2fcdc5d4..a67189761c62f 100644 --- a/packages/angular/src/generators/component/schema.json +++ b/packages/angular/src/generators/component/schema.json @@ -60,9 +60,9 @@ "alias": "t" }, "standalone": { - "description": "Whether the generated component is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "Whether the generated component is standalone.", "type": "boolean", - "default": false, + "default": true, "x-priority": "important" }, "viewEncapsulation": { 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 8ab0c77dc39b5..c13466ced2f5e 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 @@ -221,6 +221,7 @@ describe('Cypress Component Testing Configuration', () => { it('should use own project config', async () => { await generateTestApplication(tree, { name: 'fancy-app', + bundler: 'webpack', }); await componentGenerator(tree, { name: 'fancy-cmp', @@ -259,6 +260,7 @@ describe('Cypress Component Testing Configuration', () => { it('should use the project graph to find the correct project config', async () => { await generateTestApplication(tree, { name: 'fancy-app', + bundler: 'webpack', }); await generateTestLibrary(tree, { name: 'fancy-lib', 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 d17661c43c188..372a6cfdfdc53 100644 --- a/packages/angular/src/generators/directive/__snapshots__/directive.spec.ts.snap +++ b/packages/angular/src/generators/directive/__snapshots__/directive.spec.ts.snap @@ -1,30 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`directive generator should export the directive correctly when flat=false and path is nested deeper 1`] = ` -"import { Directive } from '@angular/core'; - -@Directive({ - selector: '[projTest]', -}) -export class TestDirective { - constructor() {} -} -" -`; - -exports[`directive generator should export the directive correctly when flat=false and path is nested deeper 2`] = ` -"import { TestDirective } from './test.directive'; - -describe('TestDirective', () => { - it('should create an instance', () => { - const directive = new TestDirective(); - expect(directive).toBeTruthy(); - }); -}); -" -`; - -exports[`directive generator should export the directive correctly when flat=false and path is nested deeper 3`] = ` +exports[`directive generator --no-standalone should export the directive correctly when flat=false and path is nested deeper 1`] = ` "import { NgModule } from '@angular/core'; import { TestDirective } from './my-directives/test/test.directive'; @NgModule({ @@ -36,7 +12,7 @@ export class TestModule {} " `; -exports[`directive generator should generate a directive with test files and attach to the NgModule automatically 1`] = ` +exports[`directive generator --no-standalone should generate a directive with test files and attach to the NgModule automatically 1`] = ` "import { Directive } from '@angular/core'; @Directive({ @@ -48,7 +24,7 @@ export class TestDirective { " `; -exports[`directive generator should generate a directive with test files and attach to the NgModule automatically 2`] = ` +exports[`directive generator --no-standalone should generate a directive with test files and attach to the NgModule automatically 2`] = ` "import { TestDirective } from './test.directive'; describe('TestDirective', () => { @@ -60,7 +36,7 @@ describe('TestDirective', () => { " `; -exports[`directive generator should generate a directive with test files and attach to the NgModule automatically 3`] = ` +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'; @NgModule({ @@ -72,7 +48,7 @@ export class TestModule {} " `; -exports[`directive generator should import the directive correctly when flat=false 1`] = ` +exports[`directive generator --no-standalone should import the directive correctly when flat=false 1`] = ` "import { Directive } from '@angular/core'; @Directive({ @@ -84,7 +60,7 @@ export class TestDirective { " `; -exports[`directive generator should import the directive correctly when flat=false 2`] = ` +exports[`directive generator --no-standalone should import the directive correctly when flat=false 2`] = ` "import { TestDirective } from './test.directive'; describe('TestDirective', () => { @@ -96,7 +72,7 @@ describe('TestDirective', () => { " `; -exports[`directive generator should import the directive correctly when flat=false 3`] = ` +exports[`directive generator --no-standalone should import the directive correctly when flat=false 3`] = ` "import { NgModule } from '@angular/core'; import { TestDirective } from './test/test.directive'; @NgModule({ @@ -108,7 +84,7 @@ export class TestModule {} " `; -exports[`directive generator should import the directive correctly when flat=false and path is nested deeper 1`] = ` +exports[`directive generator --no-standalone should import the directive correctly when flat=false and path is nested deeper 1`] = ` "import { Directive } from '@angular/core'; @Directive({ @@ -120,7 +96,7 @@ export class TestDirective { " `; -exports[`directive generator should import the directive correctly when flat=false and path is nested deeper 2`] = ` +exports[`directive generator --no-standalone should import the directive correctly when flat=false and path is nested deeper 2`] = ` "import { TestDirective } from './test.directive'; describe('TestDirective', () => { @@ -132,31 +108,7 @@ describe('TestDirective', () => { " `; -exports[`directive generator should import the directive correctly when flat=false and path is nested deeper 3`] = ` -"import { NgModule } from '@angular/core'; -import { TestDirective } from './my-directives/test/test.directive'; -@NgModule({ - imports: [], - declarations: [TestDirective], - exports: [], -}) -export class TestModule {} -" -`; - -exports[`directive generator should not generate test file when skipTests=true 1`] = ` -"import { Directive } from '@angular/core'; - -@Directive({ - selector: '[projTest]', -}) -export class TestDirective { - constructor() {} -} -" -`; - -exports[`directive generator should not generate test file when skipTests=true 2`] = ` +exports[`directive generator --no-standalone should import the directive correctly when flat=false and path is nested deeper 3`] = ` "import { NgModule } from '@angular/core'; import { TestDirective } from './my-directives/test/test.directive'; @NgModule({ @@ -168,42 +120,7 @@ export class TestModule {} " `; -exports[`directive generator should not import the directive when skipImport=true 1`] = ` -"import { Directive } from '@angular/core'; - -@Directive({ - selector: '[projTest]', -}) -export class TestDirective { - constructor() {} -} -" -`; - -exports[`directive generator should not import the directive when skipImport=true 2`] = ` -"import { TestDirective } from './test.directive'; - -describe('TestDirective', () => { - it('should create an instance', () => { - const directive = new TestDirective(); - expect(directive).toBeTruthy(); - }); -}); -" -`; - -exports[`directive generator should not import the directive when skipImport=true 3`] = ` -"import { NgModule } from '@angular/core'; -@NgModule({ - imports: [], - declarations: [], - exports: [], -}) -export class TestModule {} -" -`; - -exports[`directive generator should not import the directive when standalone=true 1`] = ` +exports[`directive generator should generate correctly 1`] = ` "import { Directive } from '@angular/core'; @Directive({ @@ -216,7 +133,7 @@ export class TestDirective { " `; -exports[`directive generator should not import the directive when standalone=true 2`] = ` +exports[`directive generator should generate correctly 2`] = ` "import { TestDirective } from './test.directive'; describe('TestDirective', () => { @@ -227,14 +144,3 @@ describe('TestDirective', () => { }); " `; - -exports[`directive generator should not import the directive when standalone=true 3`] = ` -"import { NgModule } from '@angular/core'; -@NgModule({ - imports: [], - declarations: [], - exports: [], -}) -export class TestModule {} -" -`; diff --git a/packages/angular/src/generators/directive/directive.spec.ts b/packages/angular/src/generators/directive/directive.spec.ts index b6717d28c38c5..196a1e87803a3 100644 --- a/packages/angular/src/generators/directive/directive.spec.ts +++ b/packages/angular/src/generators/directive/directive.spec.ts @@ -14,22 +14,9 @@ describe('directive generator', () => { sourceRoot: 'test/src', projectType: 'application', }); - - tree.write( - 'test/src/app/test.module.ts', - `import {NgModule} from "@angular/core"; - @NgModule({ - imports: [], - declarations: [], - exports: [] - }) - export class TestModule {}` - ); }); - it('should generate a directive with test files and attach to the NgModule automatically', async () => { - // ARRANGE - + it('should generate correctly', async () => { // ACT await generateDirectiveWithDefaultOptions(tree); @@ -40,130 +27,155 @@ describe('directive generator', () => { expect( tree.read('test/src/app/test.directive.spec.ts', 'utf-8') ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); }); - it('should import the directive correctly when flat=false', async () => { + it('should not import the directive into an existing module', async () => { // ARRANGE + addModule(tree); // ACT - await generateDirectiveWithDefaultOptions(tree, { flat: false }); - - // ASSERT - expect( - tree.read('test/src/app/test/test.directive.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')).toMatchSnapshot(); - }); - - it('should not import the directive when standalone=true', async () => { - // ARRANGE - - // ACT - await generateDirectiveWithDefaultOptions(tree, { standalone: true }); + await generateDirectiveWithDefaultOptions(tree); // 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.module.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + 'TestDirective' + ); }); - it('should import the directive correctly when flat=false and path is nested deeper', async () => { + it('should not generate test file when skipTests=true', async () => { // ARRANGE // ACT await generateDirectiveWithDefaultOptions(tree, { flat: false, path: 'test/src/app/my-directives', + skipTests: true, }); // ASSERT expect( - tree.read('test/src/app/my-directives/test/test.directive.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read( - 'test/src/app/my-directives/test/test.directive.spec.ts', - 'utf-8' - ) - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); + tree.exists('test/src/app/my-directives/test/test.directive.spec.ts') + ).toBeFalsy(); }); - it('should export the directive correctly when flat=false and path is nested deeper', async () => { - // ARRANGE - - // ACT - await generateDirectiveWithDefaultOptions(tree, { - flat: false, - path: 'test/src/app/my-directives', - export: true, + describe('--no-standalone', () => { + beforeEach(() => { + addModule(tree); }); - // ASSERT - expect( - tree.read('test/src/app/my-directives/test/test.directive.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read( - 'test/src/app/my-directives/test/test.directive.spec.ts', - 'utf-8' - ) - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); - }); - - it('should not import the directive when skipImport=true', async () => { - // ARRANGE - - // ACT - await generateDirectiveWithDefaultOptions(tree, { - flat: false, - path: 'test/src/app/my-directives', - skipImport: true, + it('should generate a directive with test files and attach to the NgModule automatically', async () => { + // ARRANGE + + // ACT + await generateDirectiveWithDefaultOptions(tree, { standalone: 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.module.ts', 'utf-8') + ).toMatchSnapshot(); }); - // ASSERT - expect( - tree.read('test/src/app/my-directives/test/test.directive.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.read( - 'test/src/app/my-directives/test/test.directive.spec.ts', - 'utf-8' - ) - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); - }); + it('should import the directive correctly when flat=false', async () => { + // ARRANGE + + // ACT + await generateDirectiveWithDefaultOptions(tree, { + flat: false, + standalone: false, + }); + + // ASSERT + expect( + tree.read('test/src/app/test/test.directive.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') + ).toMatchSnapshot(); + }); - it('should not generate test file when skipTests=true', async () => { - // ARRANGE + it('should import the directive correctly when flat=false and path is nested deeper', async () => { + // ARRANGE + + // ACT + await generateDirectiveWithDefaultOptions(tree, { + flat: false, + path: 'test/src/app/my-directives', + standalone: false, + }); + + // ASSERT + expect( + tree.read('test/src/app/my-directives/test/test.directive.ts', 'utf-8') + ).toMatchSnapshot(); + expect( + tree.read( + 'test/src/app/my-directives/test/test.directive.spec.ts', + 'utf-8' + ) + ).toMatchSnapshot(); + expect( + tree.read('test/src/app/test.module.ts', 'utf-8') + ).toMatchSnapshot(); + }); - // ACT - await generateDirectiveWithDefaultOptions(tree, { - flat: false, - path: 'test/src/app/my-directives', - skipTests: true, + it('should export the directive correctly when flat=false and path is nested deeper', async () => { + // ARRANGE + + // ACT + await generateDirectiveWithDefaultOptions(tree, { + flat: false, + path: 'test/src/app/my-directives', + export: true, + standalone: false, + }); + + // ASSERT + expect( + tree.read('test/src/app/test.module.ts', 'utf-8') + ).toMatchSnapshot(); }); - // ASSERT - expect( - tree.read('test/src/app/my-directives/test/test.directive.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.exists('test/src/app/my-directives/test/test.directive.spec.ts') - ).toBeFalsy(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); + it('should not import the directive when skipImport=true', async () => { + // ARRANGE + + // ACT + await generateDirectiveWithDefaultOptions(tree, { + flat: false, + path: 'test/src/app/my-directives', + skipImport: true, + standalone: false, + }); + + // ASSERT + expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + 'TestDirective' + ); + }); }); }); +function addModule(tree: Tree) { + tree.write( + 'test/src/app/test.module.ts', + `import {NgModule} from "@angular/core"; + @NgModule({ + imports: [], + declarations: [], + exports: [] + }) + export class TestModule {}` + ); +} + async function generateDirectiveWithDefaultOptions( tree: Tree, overrides: Partial = {} diff --git a/packages/angular/src/generators/directive/directive.ts b/packages/angular/src/generators/directive/directive.ts index f26419c308824..dfc3625a0cdbf 100644 --- a/packages/angular/src/generators/directive/directive.ts +++ b/packages/angular/src/generators/directive/directive.ts @@ -6,11 +6,10 @@ import { names, } from '@nx/devkit'; import { addToNgModule, findModule } from '../utils'; -import { normalizeOptions, validateOptions } from './lib'; +import { normalizeOptions } from './lib'; import type { Schema } from './schema'; export async function directiveGenerator(tree: Tree, schema: Schema) { - validateOptions(tree, schema); const options = await normalizeOptions(tree, schema); generateFiles( diff --git a/packages/angular/src/generators/directive/lib/index.ts b/packages/angular/src/generators/directive/lib/index.ts index da94c6f89ca24..f9451963f55a2 100644 --- a/packages/angular/src/generators/directive/lib/index.ts +++ b/packages/angular/src/generators/directive/lib/index.ts @@ -1,2 +1 @@ export * from './normalize-options'; -export * from './validate-options'; diff --git a/packages/angular/src/generators/directive/lib/normalize-options.ts b/packages/angular/src/generators/directive/lib/normalize-options.ts index eb81eeb99f143..ac797d3118dbc 100644 --- a/packages/angular/src/generators/directive/lib/normalize-options.ts +++ b/packages/angular/src/generators/directive/lib/normalize-options.ts @@ -48,5 +48,6 @@ export async function normalizeOptions( filePath, symbolName, selector, + standalone: options.standalone ?? true, }; } diff --git a/packages/angular/src/generators/directive/lib/validate-options.ts b/packages/angular/src/generators/directive/lib/validate-options.ts deleted file mode 100644 index d51a443cd84fb..0000000000000 --- a/packages/angular/src/generators/directive/lib/validate-options.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { Tree } from '@nx/devkit'; -import { validateStandaloneOption } from '../../utils/validations'; -import type { Schema } from '../schema'; - -export function validateOptions(tree: Tree, options: Schema): void { - validateStandaloneOption(tree, options.standalone); -} diff --git a/packages/angular/src/generators/directive/schema.json b/packages/angular/src/generators/directive/schema.json index 9ac21fb8dcca7..d09ad646feb8e 100644 --- a/packages/angular/src/generators/directive/schema.json +++ b/packages/angular/src/generators/directive/schema.json @@ -66,9 +66,9 @@ "description": "The HTML selector to use for this directive." }, "standalone": { - "description": "Whether the generated directive is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "Whether the generated directive is standalone.", "type": "boolean", - "default": false + "default": true }, "flat": { "type": "boolean", diff --git a/packages/angular/src/generators/federate-module/federate-module.ts b/packages/angular/src/generators/federate-module/federate-module.ts index b03f567c3b8d4..88f83a1909f08 100644 --- a/packages/angular/src/generators/federate-module/federate-module.ts +++ b/packages/angular/src/generators/federate-module/federate-module.ts @@ -19,6 +19,9 @@ export async function federateModuleGenerator(tree: Tree, schema: Schema) { Path: ${schema.path}`); } + + schema.standalone = schema.standalone ?? true; + const { tasks, projectRoot, remoteName } = await addRemote(tree, schema); addFileToRemoteTsconfig(tree, remoteName, schema.path); diff --git a/packages/angular/src/generators/federate-module/lib/add-remote.ts b/packages/angular/src/generators/federate-module/lib/add-remote.ts index 13c061fa72cb5..7132a1ec222fa 100644 --- a/packages/angular/src/generators/federate-module/lib/add-remote.ts +++ b/packages/angular/src/generators/federate-module/lib/add-remote.ts @@ -1,11 +1,9 @@ -import { GeneratorCallback, stripIndents, type Tree } from '@nx/devkit'; +import type { GeneratorCallback, Tree } from '@nx/devkit'; import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; -import { lt } from 'semver'; -import { getRemoteIfExists } from './check-remote-exists'; -import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; -import { type Schema } from '../schema'; -import remoteGenerator from '../../remote/remote'; import { E2eTestRunner, UnitTestRunner } from '../../../utils/test-runners'; +import remoteGenerator from '../../remote/remote'; +import { type Schema } from '../schema'; +import { getRemoteIfExists } from './check-remote-exists'; export async function addRemote(tree: Tree, schema: Schema) { const tasks: GeneratorCallback[] = []; @@ -14,16 +12,6 @@ export async function addRemote(tree: Tree, schema: Schema) { let projectRoot, remoteName; if (!remote) { - const installedAngularVersionInfo = getInstalledAngularVersionInfo(tree); - - if ( - lt(installedAngularVersionInfo.version, '14.1.0') && - schema.standalone - ) { - throw new Error(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using ${installedAngularVersionInfo.version}. - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); - } - const remoteGeneratorCallback = await remoteGenerator(tree, { name: schema.remote, directory: schema.remoteDirectory, diff --git a/packages/angular/src/generators/federate-module/schema.json b/packages/angular/src/generators/federate-module/schema.json index 49caf7c66f0e6..e2ae3cf35691a 100644 --- a/packages/angular/src/generators/federate-module/schema.json +++ b/packages/angular/src/generators/federate-module/schema.json @@ -67,9 +67,9 @@ "default": "cypress" }, "standalone": { - "description": "Whether to generate the remote application with standalone components if it needs to be created. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Whether to generate the remote application with standalone components if it needs to be created.", "type": "boolean", - "default": false + "default": true }, "host": { "type": "string", 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 8a5311a66028a..30e904136e3de 100644 --- a/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap +++ b/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap @@ -1,8 +1,81 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Host App Generator --ssr compat should generate the correct main.server.ts 1`] = ` +"import 'zone.js/dist/zone-node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { ngExpressEngine } from '@nguniversal/express-engine'; +import * as express from 'express'; +import * as cors from 'cors'; +import { existsSync } from 'fs'; +import { join } from 'path'; + +import bootstrap from './bootstrap.server'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const browserBundles = join(process.cwd(), 'dist/test/browser'); + + server.use(cors()); + const indexHtml = existsSync(join(browserBundles, 'index.original.html')) + ? 'index.original.html' + : 'index'; + + // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) + server.engine( + 'html', + ngExpressEngine({ + bootstrap, + }) + ); + + server.set('view engine', 'html'); + server.set('views', browserBundles); + + // Serve static files from /browser + server.get( + '*.*', + express.static(browserBundles, { + maxAge: '1y', + }) + ); + + // All regular routes use the Universal engine + server.get('*', (req, res) => { + // keep it async to avoid blocking the server thread + + res.render(indexHtml, { + providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], + req, + }); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(\`Node Express server listening on http://localhost:\${port}\`); + }); +} + +run(); + +export default bootstrap; +" +`; + exports[`Host App Generator --ssr should generate the correct files 1`] = ` "import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; +import { + BrowserModule, + provideClientHydration, +} from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; import { AppComponent } from './app.component'; import { appRoutes } from './app.routes'; @@ -10,11 +83,8 @@ import { NxWelcomeComponent } from './nx-welcome.component'; @NgModule({ declarations: [AppComponent, NxWelcomeComponent], - imports: [ - BrowserModule, - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), - ], - providers: [], + imports: [BrowserModule, RouterModule.forRoot(appRoutes)], + providers: [provideClientHydration()], bootstrap: [AppComponent], }) export class AppModule {} @@ -37,54 +107,55 @@ exports[`Host App Generator --ssr should generate the correct files 3`] = ` `; exports[`Host App Generator --ssr should generate the correct files 4`] = ` -"import 'zone.js/dist/zone-node'; +"import 'zone.js/node'; import { APP_BASE_HREF } from '@angular/common'; -import { ngExpressEngine } from '@nguniversal/express-engine'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; import * as cors from 'cors'; -import { existsSync } from 'fs'; -import { join } from 'path'; - +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; import { AppServerModule } from './bootstrap.server'; // The Express app is exported so that it can be used by serverless Functions. export function app(): express.Express { const server = express(); - const browserBundles = join(process.cwd(), 'dist/test/browser'); + const distFolder = join(process.cwd(), 'dist/test/browser'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); server.use(cors()); - const indexHtml = existsSync(join(browserBundles, 'index.original.html')) - ? 'index.original.html' - : 'index'; - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine( - 'html', - ngExpressEngine({ - bootstrap: AppServerModule, - }) - ); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); - server.set('views', browserBundles); + server.set('views', distFolder); + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); // Serve static files from /browser server.get( '*.*', - express.static(browserBundles, { + express.static(distFolder, { maxAge: '1y', }) ); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - // keep it async to avoid blocking the server thread - - res.render(indexHtml, { - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - req, - }); + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap: AppServerModule, + 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; @@ -102,7 +173,7 @@ function run(): void { run(); -export * from './bootstrap.server'; +export default AppServerModule; " `; @@ -209,54 +280,55 @@ export default bootstrap; `; exports[`Host App Generator --ssr should generate the correct files for standalone 3`] = ` -"import 'zone.js/dist/zone-node'; +"import 'zone.js/node'; import { APP_BASE_HREF } from '@angular/common'; -import { ngExpressEngine } from '@nguniversal/express-engine'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; import * as cors from 'cors'; -import { existsSync } from 'fs'; -import { join } from 'path'; - +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; import bootstrap from './bootstrap.server'; // The Express app is exported so that it can be used by serverless Functions. export function app(): express.Express { const server = express(); - const browserBundles = join(process.cwd(), 'dist/test/browser'); + const distFolder = join(process.cwd(), 'dist/test/browser'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); server.use(cors()); - const indexHtml = existsSync(join(browserBundles, 'index.original.html')) - ? 'index.original.html' - : 'index'; - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine( - 'html', - ngExpressEngine({ - bootstrap, - }) - ); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); - server.set('views', browserBundles); + server.set('views', distFolder); + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); // Serve static files from /browser server.get( '*.*', - express.static(browserBundles, { + express.static(distFolder, { maxAge: '1y', }) ); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - // keep it async to avoid blocking the server thread - - res.render(indexHtml, { - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - req, - }); + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap, + 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; @@ -313,14 +385,12 @@ export const appRoutes: Route[] = [ exports[`Host App Generator --ssr should generate the correct files for standalone 8`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; +import { provideClientHydration } from '@angular/platform-browser'; export const appConfig: ApplicationConfig = { - providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + providers: [provideClientHydration(), provideRouter(appRoutes)], }; " `; @@ -408,54 +478,55 @@ export default bootstrap; `; exports[`Host App Generator --ssr should generate the correct files for standalone when --typescript=true 3`] = ` -"import 'zone.js/dist/zone-node'; +"import 'zone.js/node'; import { APP_BASE_HREF } from '@angular/common'; -import { ngExpressEngine } from '@nguniversal/express-engine'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; import * as cors from 'cors'; -import { existsSync } from 'fs'; -import { join } from 'path'; - +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; import bootstrap from './bootstrap.server'; // The Express app is exported so that it can be used by serverless Functions. export function app(): express.Express { const server = express(); - const browserBundles = join(process.cwd(), 'dist/test/browser'); + const distFolder = join(process.cwd(), 'dist/test/browser'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); server.use(cors()); - const indexHtml = existsSync(join(browserBundles, 'index.original.html')) - ? 'index.original.html' - : 'index'; - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine( - 'html', - ngExpressEngine({ - bootstrap, - }) - ); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); - server.set('views', browserBundles); + server.set('views', distFolder); + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); // Serve static files from /browser server.get( '*.*', - express.static(browserBundles, { + express.static(distFolder, { maxAge: '1y', }) ); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - // keep it async to avoid blocking the server thread - - res.render(indexHtml, { - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - req, - }); + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap, + 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; @@ -517,14 +588,12 @@ export const appRoutes: Route[] = [ exports[`Host App Generator --ssr should generate the correct files for standalone when --typescript=true 8`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; +import { provideClientHydration } from '@angular/platform-browser'; export const appConfig: ApplicationConfig = { - providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + providers: [provideClientHydration(), provideRouter(appRoutes)], }; " `; @@ -591,7 +660,10 @@ 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 { BrowserModule } from '@angular/platform-browser'; +import { + BrowserModule, + provideClientHydration, +} from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; import { AppComponent } from './app.component'; import { appRoutes } from './app.routes'; @@ -599,11 +671,8 @@ import { NxWelcomeComponent } from './nx-welcome.component'; @NgModule({ declarations: [AppComponent, NxWelcomeComponent], - imports: [ - BrowserModule, - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), - ], - providers: [], + imports: [BrowserModule, RouterModule.forRoot(appRoutes)], + providers: [provideClientHydration()], bootstrap: [AppComponent], }) export class AppModule {} @@ -626,54 +695,55 @@ exports[`Host App Generator --ssr should generate the correct files when --types `; exports[`Host App Generator --ssr should generate the correct files when --typescript=true 4`] = ` -"import 'zone.js/dist/zone-node'; +"import 'zone.js/node'; import { APP_BASE_HREF } from '@angular/common'; -import { ngExpressEngine } from '@nguniversal/express-engine'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; import * as cors from 'cors'; -import { existsSync } from 'fs'; -import { join } from 'path'; - +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; import { AppServerModule } from './bootstrap.server'; // The Express app is exported so that it can be used by serverless Functions. export function app(): express.Express { const server = express(); - const browserBundles = join(process.cwd(), 'dist/test/browser'); + const distFolder = join(process.cwd(), 'dist/test/browser'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); server.use(cors()); - const indexHtml = existsSync(join(browserBundles, 'index.original.html')) - ? 'index.original.html' - : 'index'; - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine( - 'html', - ngExpressEngine({ - bootstrap: AppServerModule, - }) - ); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); - server.set('views', browserBundles); + server.set('views', distFolder); + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); // Serve static files from /browser server.get( '*.*', - express.static(browserBundles, { + express.static(distFolder, { maxAge: '1y', }) ); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - // keep it async to avoid blocking the server thread - - res.render(indexHtml, { - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - req, - }); + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap: AppServerModule, + 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; @@ -691,7 +761,7 @@ function run(): void { run(); -export * from './bootstrap.server'; +export default AppServerModule; " `; @@ -868,8 +938,9 @@ describe('AppComponent', () => { RouterTestingModule.withRoutes([ { path: '', component: NxWelcomeComponent }, ]), + AppComponent, + NxWelcomeComponent, ], - declarations: [AppComponent, NxWelcomeComponent], }).compileComponents(); }); @@ -912,8 +983,9 @@ describe('AppComponent', () => { RouterTestingModule.withRoutes([ { path: '', component: NxWelcomeComponent }, ]), + AppComponent, + NxWelcomeComponent, ], - declarations: [AppComponent, NxWelcomeComponent], }).compileComponents(); }); diff --git a/packages/angular/src/generators/host/files/common/src/main.server.ts__tmpl__ b/packages/angular/src/generators/host/files/common/pre-v17/src/main.server.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/host/files/common/src/main.server.ts__tmpl__ rename to packages/angular/src/generators/host/files/common/pre-v17/src/main.server.ts__tmpl__ diff --git a/packages/angular/src/generators/host/files/common/v17+/src/main.server.ts__tmpl__ b/packages/angular/src/generators/host/files/common/v17+/src/main.server.ts__tmpl__ new file mode 100644 index 0000000000000..3242070ad583d --- /dev/null +++ b/packages/angular/src/generators/host/files/common/v17+/src/main.server.ts__tmpl__ @@ -0,0 +1,67 @@ +import 'zone.js/node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; +import * as express from 'express'; +import * as cors from 'cors'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import<% if(standalone) { %> bootstrap <% } else { %> { AppServerModule } <% } %>from './bootstrap.server'; + +// 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(), '<%= browserBundleOutput %>'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); + + server.use(cors()); + + 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) { %>: AppServerModule<% } %>, + 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'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +run(); + +export default <% if (standalone) { %>bootstrap<% } else { %>AppServerModule<% } %>; diff --git a/packages/angular/src/generators/host/host.spec.ts b/packages/angular/src/generators/host/host.spec.ts index c6dc2b6fe65b5..46f5836e42b18 100644 --- a/packages/angular/src/generators/host/host.spec.ts +++ b/packages/angular/src/generators/host/host.spec.ts @@ -1,4 +1,4 @@ -import { stripIndents, updateJson } from '@nx/devkit'; +import { updateJson } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { getProjects, @@ -19,6 +19,7 @@ describe('Host App Generator', () => { await generateTestHostApplication(tree, { name: 'test', typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -32,6 +33,7 @@ describe('Host App Generator', () => { await generateTestHostApplication(tree, { name: 'test', typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -45,6 +47,7 @@ describe('Host App Generator', () => { await generateTestRemoteApplication(tree, { name: 'remote', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -52,6 +55,7 @@ describe('Host App Generator', () => { name: 'test', remotes: ['remote'], typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -65,6 +69,7 @@ describe('Host App Generator', () => { await generateTestRemoteApplication(tree, { name: 'remote', typescriptConfiguration: true, + standalone: false, }); // ACT @@ -72,6 +77,7 @@ describe('Host App Generator', () => { name: 'test', remotes: ['remote'], typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -89,6 +95,7 @@ describe('Host App Generator', () => { name: 'host-app', remotes: ['remote1', 'remote2'], typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -119,6 +126,7 @@ describe('Host App Generator', () => { name: 'host-app', remotes: ['remote1', 'remote2'], typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -145,6 +153,7 @@ describe('Host App Generator', () => { await generateTestRemoteApplication(tree, { name: 'remote1', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -152,6 +161,7 @@ describe('Host App Generator', () => { name: 'host-app', remotes: ['remote1', 'remote2', 'remote3'], typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -169,6 +179,7 @@ describe('Host App Generator', () => { await generateTestRemoteApplication(tree, { name: 'remote1', typescriptConfiguration: true, + standalone: false, }); // ACT @@ -176,6 +187,7 @@ describe('Host App Generator', () => { name: 'host-app', remotes: ['remote1', 'remote2', 'remote3'], typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -193,6 +205,7 @@ describe('Host App Generator', () => { await generateTestRemoteApplication(tree, { name: 'remote1', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -201,6 +214,7 @@ describe('Host App Generator', () => { directory: 'foo/host-app', remotes: ['remote1', 'remote2', 'remote3'], typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -218,6 +232,7 @@ describe('Host App Generator', () => { await generateTestRemoteApplication(tree, { name: 'remote1', typescriptConfiguration: true, + standalone: false, }); // ACT @@ -226,6 +241,7 @@ describe('Host App Generator', () => { directory: 'foo/host-app', remotes: ['remote1', 'remote2', 'remote3'], typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -245,7 +261,6 @@ describe('Host App Generator', () => { await generateTestHostApplication(tree, { name: 'host', remotes: ['remote1'], - standalone: true, }); // ASSERT @@ -264,7 +279,6 @@ describe('Host App Generator', () => { await generateTestHostApplication(tree, { name: 'host', remotes: ['remote1'], - standalone: true, }); // ASSERT @@ -282,7 +296,6 @@ describe('Host App Generator', () => { name: 'dashboard', remotes: ['remote1'], directory: 'test/dashboard', - standalone: true, }); // ASSERT @@ -300,6 +313,7 @@ describe('Host App Generator', () => { name: 'dashboard', remotes: ['remote1'], e2eTestRunner: E2eTestRunner.None, + standalone: false, }); // ASSERT @@ -318,6 +332,7 @@ describe('Host App Generator', () => { name: 'test', ssr: true, typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -353,6 +368,7 @@ describe('Host App Generator', () => { name: 'test', ssr: true, typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -386,7 +402,6 @@ describe('Host App Generator', () => { // ACT await generateTestHostApplication(tree, { name: 'test', - standalone: true, ssr: true, typescriptConfiguration: false, }); @@ -426,7 +441,6 @@ describe('Host App Generator', () => { // ACT await generateTestHostApplication(tree, { name: 'test', - standalone: true, ssr: true, typescriptConfiguration: true, }); @@ -458,27 +472,22 @@ describe('Host App Generator', () => { expect(project.targets.server).toMatchSnapshot(); expect(project.targets['serve-ssr']).toMatchSnapshot(); }); - }); - it('should error correctly when Angular version does not support standalone', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - '@angular/core': '14.0.0', - }, - })); - - // ACT & ASSERT - await expect( - generateTestHostApplication(tree, { - name: 'test', - standalone: true, - }) - ).rejects - .toThrow(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using 14.0.0. - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); + describe('compat', () => { + it('should generate the correct main.server.ts', async () => { + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + '@angular/core': '15.2.0', + }, + })); + + await generateTestHostApplication(tree, { name: 'test', ssr: true }); + + expect(tree.read(`test/src/main.server.ts`, 'utf-8')).toMatchSnapshot(); + }); + }); }); describe('--project-name-and-root-format=derived', () => { @@ -489,6 +498,7 @@ describe('Host App Generator', () => { name: 'remote1', projectNameAndRootFormat: 'derived', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -497,6 +507,7 @@ describe('Host App Generator', () => { remotes: ['remote1', 'remote2', 'remote3'], projectNameAndRootFormat: 'derived', typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -515,6 +526,7 @@ describe('Host App Generator', () => { name: 'remote1', projectNameAndRootFormat: 'derived', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -524,6 +536,7 @@ describe('Host App Generator', () => { remotes: ['remote1', 'remote2', 'remote3'], projectNameAndRootFormat: 'derived', typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -541,6 +554,7 @@ describe('Host App Generator', () => { name: 'remote1', projectNameAndRootFormat: 'derived', typescriptConfiguration: true, + standalone: false, }); // ACT @@ -550,6 +564,7 @@ describe('Host App Generator', () => { remotes: ['remote1', 'remote2', 'remote3'], projectNameAndRootFormat: 'derived', typescriptConfiguration: true, + standalone: false, }); // ASSERT diff --git a/packages/angular/src/generators/host/host.ts b/packages/angular/src/generators/host/host.ts index 7cff6f5780c9a..2884d5792f86a 100644 --- a/packages/angular/src/generators/host/host.ts +++ b/packages/angular/src/generators/host/host.ts @@ -3,17 +3,14 @@ import { getProjects, joinPathFragments, runTasksInSerial, - stripIndents, Tree, } from '@nx/devkit'; import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; -import { lt } from 'semver'; import { E2eTestRunner } from '../../utils/test-runners'; import applicationGenerator from '../application/application'; import remoteGenerator from '../remote/remote'; import { setupMf } from '../setup-mf/setup-mf'; -import { getInstalledAngularVersionInfo } from '../utils/version-utils'; -import { addSsr } from './lib'; +import { updateSsrSetup } from './lib'; import type { Schema } from './schema'; export async function host(tree: Tree, options: Schema) { @@ -24,14 +21,8 @@ export async function host(tree: Tree, options: Schema) { } export async function hostInternal(tree: Tree, schema: Schema) { - const installedAngularVersionInfo = getInstalledAngularVersionInfo(tree); - - if (lt(installedAngularVersionInfo.version, '14.1.0') && schema.standalone) { - throw new Error(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using ${installedAngularVersionInfo.version}. - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); - } - const { typescriptConfiguration = true, ...options }: Schema = schema; + options.standalone = options.standalone ?? true; const projects = getProjects(tree); @@ -60,10 +51,11 @@ export async function hostInternal(tree: Tree, schema: Schema) { const appInstallTask = await applicationGenerator(tree, { ...options, - standalone: options.standalone ?? false, + standalone: options.standalone, routing: true, port: 4200, skipFormat: true, + bundler: 'webpack', }); const skipE2E = @@ -81,11 +73,12 @@ export async function hostInternal(tree: Tree, schema: Schema) { e2eProjectName: skipE2E ? undefined : `${hostProjectName}-e2e`, prefix: options.prefix, typescriptConfiguration, + standalone: options.standalone, }); let installTasks = [appInstallTask]; if (options.ssr) { - let ssrInstallTask = await addSsr( + let ssrInstallTask = await updateSsrSetup( tree, options, hostProjectName, diff --git a/packages/angular/src/generators/host/lib/index.ts b/packages/angular/src/generators/host/lib/index.ts index b0b15a6bb4b21..3e6fefd341be2 100644 --- a/packages/angular/src/generators/host/lib/index.ts +++ b/packages/angular/src/generators/host/lib/index.ts @@ -1 +1 @@ -export * from './add-ssr'; +export * from './update-ssr-setup'; diff --git a/packages/angular/src/generators/host/lib/add-ssr.ts b/packages/angular/src/generators/host/lib/update-ssr-setup.ts similarity index 74% rename from packages/angular/src/generators/host/lib/add-ssr.ts rename to packages/angular/src/generators/host/lib/update-ssr-setup.ts index b162c36a67ba5..68635e822d9fe 100644 --- a/packages/angular/src/generators/host/lib/add-ssr.ts +++ b/packages/angular/src/generators/host/lib/update-ssr-setup.ts @@ -6,19 +6,16 @@ import { readProjectConfiguration, updateProjectConfiguration, } from '@nx/devkit'; -import type { Schema } from '../schema'; - -import setupSsr from '../../setup-ssr/setup-ssr'; +import { join } from 'path'; import { corsVersion, - expressVersion, moduleFederationNodeVersion, typesCorsVersion, - typesExpressVersion, } from '../../../utils/versions'; -import { join } from 'path'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; +import type { Schema } from '../schema'; -export async function addSsr( +export async function updateSsrSetup( tree: Tree, options: Schema, appName: string, @@ -26,11 +23,6 @@ export async function addSsr( ) { let project = readProjectConfiguration(tree, appName); - await setupSsr(tree, { - project: appName, - standalone: options.standalone, - }); - tree.rename( joinPathFragments(project.sourceRoot, 'main.server.ts'), joinPathFragments(project.sourceRoot, 'bootstrap.server.ts') @@ -40,18 +32,23 @@ export async function addSsr( "import('./src/main.server');" ); - const browserBundleOutput = joinPathFragments( - project.targets.build.options.outputPath, - 'browser' + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + generateFiles( + tree, + join( + __dirname, + '../files/common', + angularMajorVersion >= 17 ? 'v17+' : 'pre-v17' + ), + project.root, + { + appName, + browserBundleOutput: project.targets.build.options.outputPath, + standalone: options.standalone, + tmpl: '', + } ); - generateFiles(tree, join(__dirname, '../files/common'), project.root, { - appName, - browserBundleOutput, - standalone: options.standalone, - tmpl: '', - }); - const pathToTemplateFiles = typescriptConfiguration ? 'ts' : 'js'; generateFiles( @@ -83,12 +80,10 @@ export async function addSsr( tree, { cors: corsVersion, - express: expressVersion, '@module-federation/node': moduleFederationNodeVersion, }, { '@types/cors': typesCorsVersion, - '@types/express': typesExpressVersion, } ); diff --git a/packages/angular/src/generators/host/schema.json b/packages/angular/src/generators/host/schema.json index 890a298c2992a..6fdb48fff646b 100644 --- a/packages/angular/src/generators/host/schema.json +++ b/packages/angular/src/generators/host/schema.json @@ -165,8 +165,8 @@ }, "standalone": { "type": "boolean", - "description": "Whether to generate a host application that uses standalone components. _Note: This is only supported in Angular versions >= 14.1.0_", - "default": false + "description": "Whether to generate a host application that uses standalone components.", + "default": true }, "ssr": { "description": "Whether to configure SSR for the host application", diff --git a/packages/angular/src/generators/init/init.spec.ts b/packages/angular/src/generators/init/init.spec.ts index 47babcef7a8a4..5082444b1a30f 100644 --- a/packages/angular/src/generators/init/init.spec.ts +++ b/packages/angular/src/generators/init/init.spec.ts @@ -375,7 +375,7 @@ bar }); }); - describe('v14 support', () => { + describe('v15 support', () => { let tree: Tree; beforeEach(() => { tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); @@ -383,7 +383,7 @@ bar ...json, dependencies: { ...json.dependencies, - '@angular/core': '~14.2.0', + '@angular/core': '~15.2.0', }, })); }); @@ -400,43 +400,43 @@ bar const { dependencies, devDependencies } = readJson(tree, 'package.json'); expect(dependencies['@angular/animations']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(dependencies['@angular/common']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(dependencies['@angular/compiler']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(dependencies['@angular/core']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(dependencies['@angular/platform-browser']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(dependencies['@angular/platform-browser-dynamic']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(dependencies['@angular/router']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(dependencies['rxjs']).toEqual( - backwardCompatibleVersions.angularV14.rxjsVersion + backwardCompatibleVersions.angularV15.rxjsVersion ); expect(dependencies['zone.js']).toEqual( - backwardCompatibleVersions.angularV14.zoneJsVersion + backwardCompatibleVersions.angularV15.zoneJsVersion ); expect(devDependencies['@angular/cli']).toEqual( - backwardCompatibleVersions.angularV14.angularDevkitVersion + backwardCompatibleVersions.angularV15.angularDevkitVersion ); expect(devDependencies['@angular/compiler-cli']).toEqual( - backwardCompatibleVersions.angularV14.angularDevkitVersion + backwardCompatibleVersions.angularV15.angularDevkitVersion ); expect(devDependencies['@angular/language-service']).toEqual( - backwardCompatibleVersions.angularV14.angularVersion + backwardCompatibleVersions.angularV15.angularVersion ); expect(devDependencies['@angular-devkit/build-angular']).toEqual( - backwardCompatibleVersions.angularV14.angularDevkitVersion + backwardCompatibleVersions.angularV15.angularDevkitVersion ); // codelyzer should no longer be there by default @@ -449,11 +449,11 @@ bar ...json, dependencies: { ...json.dependencies, - '@angular/core': '~14.0.0', + '@angular/core': '~15.0.0', }, devDependencies: { ...json.devDependencies, - '@angular-devkit/build-angular': '~14.0.0', + '@angular-devkit/build-angular': '~15.0.0', }, })); @@ -463,20 +463,20 @@ bar // ASSERT const { dependencies, devDependencies } = readJson(tree, 'package.json'); - expect(dependencies['@angular/animations']).toBe('~14.0.0'); - expect(dependencies['@angular/common']).toBe('~14.0.0'); - expect(dependencies['@angular/compiler']).toBe('~14.0.0'); - expect(dependencies['@angular/core']).toBe('~14.0.0'); - expect(dependencies['@angular/platform-browser']).toBe('~14.0.0'); - expect(dependencies['@angular/platform-browser-dynamic']).toBe('~14.0.0'); - expect(dependencies['@angular/router']).toBe('~14.0.0'); + expect(dependencies['@angular/animations']).toBe('~15.0.0'); + expect(dependencies['@angular/common']).toBe('~15.0.0'); + expect(dependencies['@angular/compiler']).toBe('~15.0.0'); + expect(dependencies['@angular/core']).toBe('~15.0.0'); + expect(dependencies['@angular/platform-browser']).toBe('~15.0.0'); + expect(dependencies['@angular/platform-browser-dynamic']).toBe('~15.0.0'); + expect(dependencies['@angular/router']).toBe('~15.0.0'); expect(dependencies['rxjs']).toBeDefined(); expect(dependencies['tslib']).toBeDefined(); expect(dependencies['zone.js']).toBeDefined(); - expect(devDependencies['@angular/cli']).toBe('~14.0.0'); - expect(devDependencies['@angular/compiler-cli']).toBe('~14.0.0'); - expect(devDependencies['@angular/language-service']).toBe('~14.0.0'); - expect(devDependencies['@angular-devkit/build-angular']).toBe('~14.0.0'); + expect(devDependencies['@angular/cli']).toBe('~15.0.0'); + expect(devDependencies['@angular/compiler-cli']).toBe('~15.0.0'); + expect(devDependencies['@angular/language-service']).toBe('~15.0.0'); + expect(devDependencies['@angular-devkit/build-angular']).toBe('~15.0.0'); }); it('should not overwrite already installed dependencies', async () => { @@ -485,8 +485,8 @@ bar ...json, dependencies: { ...json.dependencies, - '@angular/animations': '~14.0.1', - '@angular/core': '~14.0.0', + '@angular/animations': '~15.0.1', + '@angular/core': '~15.0.0', }, })); @@ -496,8 +496,8 @@ bar // ASSERT const { dependencies } = readJson(tree, 'package.json'); - expect(dependencies['@angular/animations']).toBe('~14.0.1'); - expect(dependencies['@angular/core']).toBe('~14.0.0'); + expect(dependencies['@angular/animations']).toBe('~15.0.1'); + expect(dependencies['@angular/core']).toBe('~15.0.0'); }); describe('--unit-test-runner', () => { @@ -516,7 +516,7 @@ bar expect(devDependencies['@nx/jest']).toBeDefined(); expect(devDependencies['jest']).toBeDefined(); expect(devDependencies['jest-preset-angular']).toEqual( - backwardCompatibleVersions.angularV14.jestPresetAngularVersion + backwardCompatibleVersions.angularV15.jestPresetAngularVersion ); }); 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 cac7e9d2e869a..f5d052c4c9e80 100644 --- a/packages/angular/src/generators/library/__snapshots__/library.spec.ts.snap +++ b/packages/angular/src/generators/library/__snapshots__/library.spec.ts.snap @@ -1,50 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`lib --angular-14 should generate a library with a standalone component as entry point with angular 14.1.0 1`] = ` -"export * from './lib/my-lib/my-lib.component'; -" -`; - -exports[`lib --angular-14 should generate a library with a standalone component as entry point with angular 14.1.0 2`] = ` -"import { Component } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -@Component({ - selector: 'proj-my-lib', - standalone: true, - imports: [CommonModule], - templateUrl: './my-lib.component.html', - styleUrls: ['./my-lib.component.css'], -}) -export class MyLibComponent {} -" -`; - -exports[`lib --angular-14 should generate a library with a standalone component as entry point with angular 14.1.0 3`] = ` -"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(); - }); -}); -" -`; - exports[`lib --standalone should generate a library with a standalone component and have it flat 1`] = ` "export * from './lib/my-lib.component'; " diff --git a/packages/angular/src/generators/library/lib/normalize-options.ts b/packages/angular/src/generators/library/lib/normalize-options.ts index 583438f99afec..e52c98622c386 100644 --- a/packages/angular/src/generators/library/lib/normalize-options.ts +++ b/packages/angular/src/generators/library/lib/normalize-options.ts @@ -11,6 +11,7 @@ export async function normalizeOptions( host: Tree, schema: Schema ): Promise { + schema.standalone = schema.standalone ?? true; // Create a schema with populated default values const options: Schema = { buildable: false, diff --git a/packages/angular/src/generators/library/library.spec.ts b/packages/angular/src/generators/library/library.spec.ts index 1b080293f7af1..0f0c4bd90ffe4 100644 --- a/packages/angular/src/generators/library/library.spec.ts +++ b/packages/angular/src/generators/library/library.spec.ts @@ -10,7 +10,6 @@ import { } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { Linter } from '@nx/eslint'; -import { backwardCompatibleVersions } from '../../utils/backward-compatible-versions'; import { createApp } from '../../utils/nx-devkit/testing'; import { UnitTestRunner } from '../../utils/test-runners'; import { @@ -42,6 +41,7 @@ describe('lib', () => { unitTestRunner: UnitTestRunner.Jest, simpleName: false, strict: true, + standalone: false, ...opts, }); } @@ -1679,124 +1679,6 @@ describe('lib', () => { }); }); - describe('--angular-14', () => { - beforeEach(() => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - }, - })); - }); - - it('should create a local tsconfig.json', async () => { - // ACT - await runLibraryGeneratorWithOpts(); - - // ASSERT - const tsconfigJson = readJson(tree, 'my-lib/tsconfig.json'); - expect(tsconfigJson).toEqual({ - extends: '../tsconfig.base.json', - angularCompilerOptions: { - enableI18nLegacyMessageIdFormat: false, - strictInjectionParameters: true, - strictInputAccessModifiers: true, - strictTemplates: true, - }, - compilerOptions: { - forceConsistentCasingInFileNames: true, - noFallthroughCasesInSwitch: true, - noPropertyAccessFromIndexSignature: true, - noImplicitOverride: true, - noImplicitReturns: true, - strict: true, - target: 'es2020', - useDefineForClassFields: false, - }, - files: [], - include: [], - references: [ - { - path: './tsconfig.lib.json', - }, - { - path: './tsconfig.spec.json', - }, - ], - }); - }); - - it('should create a local package.json', async () => { - // ACT - await runLibraryGeneratorWithOpts({ - publishable: true, - importPath: '@myorg/lib', - }); - - // ASSERT - const tsconfigJson = readJson(tree, 'my-lib/package.json'); - expect(tsconfigJson).toMatchInlineSnapshot(` - { - "dependencies": { - "tslib": "^2.3.0", - }, - "name": "@myorg/lib", - "peerDependencies": { - "@angular/common": "^14.1.0", - "@angular/core": "^14.1.0", - }, - "sideEffects": false, - "version": "0.0.1", - } - `); - }); - - it('should generate a library with a standalone component as entry point with angular 14.1.0', async () => { - await runLibraryGeneratorWithOpts({ standalone: true }); - - 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') - ).toMatchSnapshot(); - expect( - tree.read('my-lib/src/lib/my-lib/my-lib.component.spec.ts', 'utf-8') - ).toMatchSnapshot(); - }); - - it('should throw an error when trying to generate a library with a standalone component as entry point when angular version is < 14.1.0', async () => { - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.0.0', - }, - })); - - await expect( - runLibraryGeneratorWithOpts({ standalone: true }) - ).rejects.toThrow( - `The \"--standalone\" option is not supported in Angular versions < 14.1.0.` - ); - }); - - it('should update package.json with correct versions when buildable', async () => { - // ACT - await runLibraryGeneratorWithOpts({ buildable: true }); - - // ASSERT - const packageJson = readJson(tree, '/package.json'); - expect(packageJson.devDependencies['ng-packagr']).toEqual( - backwardCompatibleVersions.angularV14.ngPackagrVersion - ); - expect(packageJson.devDependencies['postcss']).toBeDefined(); - expect(packageJson.devDependencies['postcss-import']).toBeDefined(); - expect(packageJson.devDependencies['postcss-preset-env']).toBeDefined(); - expect(packageJson.devDependencies['postcss-url']).toBeDefined(); - }); - }); - describe('--project-name-and-root-format=derived', () => { it('should generate correctly when no directory is provided', async () => { await runLibraryGeneratorWithOpts({ diff --git a/packages/angular/src/generators/library/library.ts b/packages/angular/src/generators/library/library.ts index 3d96504c33cde..6ba1528547bb0 100644 --- a/packages/angular/src/generators/library/library.ts +++ b/packages/angular/src/generators/library/library.ts @@ -8,7 +8,6 @@ import { import { configurationGenerator } from '@nx/jest'; import { Linter } from '@nx/eslint'; import { addTsConfigPath } from '@nx/js'; -import { lt } from 'semver'; import init from '../../generators/init/init'; import { E2eTestRunner } from '../../utils/test-runners'; import addLintingGenerator from '../add-linting/add-linting'; @@ -66,13 +65,6 @@ export async function libraryGeneratorInternal( ); } - const userInstalledAngularVersion = getInstalledAngularVersionInfo(tree); - if (lt(userInstalledAngularVersion.version, '14.1.0') && schema.standalone) { - throw new Error( - `The "--standalone" option is not supported in Angular versions < 14.1.0.` - ); - } - const options = await normalizeOptions(tree, schema); const { libraryOptions } = options; @@ -149,6 +141,7 @@ async function addUnitTestRunner( 'src', 'test-setup.ts' ); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(host); if (options.strict && host.exists(setupFile)) { const contents = host.read(setupFile, 'utf-8'); host.write( @@ -160,7 +153,17 @@ globalThis.ngJest = { errorOnUnknownProperties: true, }, }; -${contents}` +${contents}${ + angularMajorVersion >= 17 + ? ` +/** +* Angular uses performance.mark() which is not supported by jsdom. Stub it out +* to avoid errors. +*/ +global.performance.mark = jest.fn(); +` + : '' + }` ); } } diff --git a/packages/angular/src/generators/library/schema.json b/packages/angular/src/generators/library/schema.json index ca2858fae504c..da68e2fcd7047 100644 --- a/packages/angular/src/generators/library/schema.json +++ b/packages/angular/src/generators/library/schema.json @@ -141,65 +141,65 @@ }, "standalone": { "type": "boolean", - "description": "Generate a library that uses a standalone component instead of a module as the entry point. _Note: This is only supported in Angular versions >= 14.1.0_", - "default": false + "description": "Generate a library that uses a standalone component instead of a module as the entry point.", + "default": true }, "displayBlock": { - "description": "Specifies if the component generated style will contain `:host { display: block; }`. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Specifies if the component generated style will contain `:host { display: block; }`. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "boolean", "default": false, "alias": "b" }, "inlineStyle": { - "description": "Include styles inline in the component.ts file. Only CSS styles can be included inline. By default, an external styles file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Include styles inline in the component.ts file. Only CSS styles can be included inline. By default, an external styles file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "boolean", "default": false, "alias": "s" }, "inlineTemplate": { - "description": "Include template inline in the component.ts file. By default, an external template file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Include template inline in the component.ts file. By default, an external template file is created and referenced in the component.ts file. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "boolean", "default": false, "alias": "t" }, "viewEncapsulation": { - "description": "The view encapsulation strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "The view encapsulation strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "enum": ["Emulated", "None", "ShadowDom"], "type": "string", "alias": "v" }, "changeDetection": { - "description": "The change detection strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "The change detection strategy to use in the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "enum": ["Default", "OnPush"], "type": "string", "default": "Default", "alias": "c" }, "style": { - "description": "The file extension or preprocessor to use for style files, or `none` to skip generating the style file. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "The file extension or preprocessor to use for style files, or `none` to skip generating the style file. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "type": "string", "default": "css", "enum": ["css", "scss", "sass", "less", "none"] }, "skipTests": { "type": "boolean", - "description": "Do not create `spec.ts` test files for the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Do not create `spec.ts` test files for the new component. Disclaimer: This option is only valid when `--standalone` is set to `true`.", "default": false }, "selector": { "type": "string", "format": "html-selector", - "description": "The HTML selector to use for this component. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_" + "description": "The HTML selector to use for this component. Disclaimer: This option is only valid when `--standalone` is set to `true`." }, "skipSelector": { "type": "boolean", "default": false, - "description": "Specifies if the component should have a selector or not. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_" + "description": "Specifies if the component should have a selector or not. Disclaimer: This option is only valid when `--standalone` is set to `true`." }, "flat": { "type": "boolean", "default": false, - "description": "Ensure the generated standalone component is not placed in a subdirectory. Disclaimer: This option is only valid when `--standalone` is set to `true`. _Note: This is only supported in Angular versions >= 14.1.0_" + "description": "Ensure the generated standalone component is not placed in a subdirectory. Disclaimer: This option is only valid when `--standalone` is set to `true`." } }, "additionalProperties": false, diff --git a/packages/angular/src/generators/move/move.spec.ts b/packages/angular/src/generators/move/move.spec.ts index ec73ac120e4fb..19efdffcbffbc 100644 --- a/packages/angular/src/generators/move/move.spec.ts +++ b/packages/angular/src/generators/move/move.spec.ts @@ -39,6 +39,7 @@ describe('@nx/angular:move', () => { simpleName: true, skipFormat: false, unitTestRunner: UnitTestRunner.Jest, + standalone: false, }); jest @@ -335,6 +336,7 @@ describe('@nx/angular:move', () => { simpleName: true, skipFormat: false, unitTestRunner: UnitTestRunner.Jest, + standalone: false, }); addProjectToGraph('my-lib'); @@ -355,7 +357,11 @@ describe('@nx/angular:move', () => { }); it('should move project correctly when --project-name-and-root-format=derived', async () => { - await generateTestLibrary(tree, { name: 'mylib2', buildable: true }); + await generateTestLibrary(tree, { + name: 'mylib2', + buildable: true, + standalone: false, + }); addProjectToGraph('mylib2'); await angularMoveGenerator(tree, { 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 8e58b23884017..6fb91bf392228 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 @@ -125,7 +125,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:browser", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders: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-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."` ); }); @@ -148,7 +148,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:browser", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders: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-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."` ); }); @@ -167,7 +167,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:browser", "@angular-devkit/build-angular:protractor", "@cypress/schematic:cypress", "@angular-devkit/build-angular:extract-i18n", "@nguniversal/builders:prerender", "@angular-devkit/build-angular:dev-server", "@angular-devkit/build-angular:server", "@nguniversal/builders: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-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."` ); }); @@ -657,7 +657,7 @@ describe('app migrator', () => { expect(sourceRoot).toBe('apps/app1/src'); }); - it('should update build target', async () => { + it('should update build target correctly when using webpack', async () => { const project = addProject('app1', { root: '', sourceRoot: 'src', @@ -721,6 +721,92 @@ describe('app migrator', () => { }); }); + it('should update build target correctly when using esbuild', async () => { + const project = addProject('app1', { + root: '', + sourceRoot: 'src', + architect: { + build: { + builder: '@angular-devkit/build-angular:application', + options: { + outputPath: 'dist/app1', + index: 'src/index.html', + browser: 'src/main.ts', + polyfills: ['src/polyfills.ts'], + tsConfig: 'tsconfig.app.json', + assets: ['src/favicon.ico', 'src/assets'], + styles: ['src/styles.css'], + scripts: [], + }, + configurations: { + production: { + budgets: [ + { + type: 'initial', + maximumWarning: '500kb', + maximumError: '1mb', + }, + { + type: 'anyComponentStyle', + maximumWarning: '2kb', + maximumError: '4kb', + }, + ], + outputHashing: 'all', + }, + development: { + optimization: false, + extractLicenses: false, + sourceMap: true, + }, + }, + defaultConfiguration: 'production', + }, + }, + }); + const migrator = new AppMigrator(tree, {}, project); + + await migrator.migrate(); + + const { targets } = readProjectConfiguration(tree, 'app1'); + expect(targets.build).toStrictEqual({ + executor: '@angular-devkit/build-angular:application', + options: { + outputPath: 'dist/apps/app1', + index: 'apps/app1/src/index.html', + browser: 'apps/app1/src/main.ts', + polyfills: ['apps/app1/src/polyfills.ts'], + tsConfig: 'apps/app1/tsconfig.app.json', + assets: ['apps/app1/src/favicon.ico', 'apps/app1/src/assets'], + styles: ['apps/app1/src/styles.css'], + scripts: [], + }, + configurations: { + production: { + budgets: [ + { + type: 'initial', + maximumWarning: '500kb', + maximumError: '1mb', + }, + { + type: 'anyComponentStyle', + maximumWarning: '2kb', + maximumError: '4kb', + }, + ], + outputHashing: 'all', + }, + development: { + optimization: false, + extractLicenses: false, + sourceMap: true, + }, + }, + defaultConfiguration: 'production', + }); + }); + it('should update build target with array of polyfills', async () => { const project = addProject('app1', { root: '', 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 ceac9a222c41b..34cae6c5d1c58 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 @@ -32,7 +32,13 @@ type SupportedTargets = | 'server' | 'serveSsr'; const supportedTargets: Record = { - build: { builders: ['@angular-devkit/build-angular:browser'] }, + build: { + builders: [ + '@angular-devkit/build-angular:application', + '@angular-devkit/build-angular:browser', + '@angular-devkit/build-angular:browser-esbuild', + ], + }, e2e: { acceptMultipleDefinitions: true, builders: [ @@ -41,10 +47,20 @@ const supportedTargets: Record = { ], }, i18n: { builders: ['@angular-devkit/build-angular:extract-i18n'] }, - prerender: { builders: ['@nguniversal/builders:prerender'] }, + prerender: { + builders: [ + '@nguniversal/builders:prerender', + '@angular-devkit/build-angular:prerender', + ], + }, serve: { builders: ['@angular-devkit/build-angular:dev-server'] }, server: { builders: ['@angular-devkit/build-angular:server'] }, - serveSsr: { builders: ['@nguniversal/builders:ssr-dev-server'] }, + serveSsr: { + builders: [ + '@nguniversal/builders:ssr-dev-server', + '@angular-devkit/build-angular:ssr-dev-server', + ], + }, }; // TODO(leo): this will replace `supportedTargets` once the full refactor is done. @@ -223,10 +239,21 @@ export class AppMigrator extends ProjectMigrator { this.project.newRoot, this.targetNames.server ? 'browser' : '' ); - buildOptions.index = - buildOptions.index && this.convertAsset(buildOptions.index); + if (buildOptions.index) { + if (typeof buildOptions.index === 'string') { + buildOptions.index = this.convertAsset(buildOptions.index); + } else { + buildOptions.index.input = + buildOptions.index.input && + this.convertAsset(buildOptions.index.input); + } + } buildOptions.main = buildOptions.main && this.convertAsset(buildOptions.main); + buildOptions.browser = + buildOptions.browser && this.convertAsset(buildOptions.browser); + buildOptions.server = + buildOptions.server && this.convertAsset(buildOptions.server); buildOptions.polyfills = buildOptions.polyfills && (Array.isArray(buildOptions.polyfills) @@ -250,6 +277,22 @@ export class AppMigrator extends ProjectMigrator { replace: this.convertAsset(replacement.replace), with: this.convertAsset(replacement.with), })); + buildOptions.serviceWorker = + buildOptions.serviceWorker && + typeof buildOptions.serviceWorker === 'string' && + this.convertAsset(buildOptions.serviceWorker); + buildOptions.ngswConfigPath = + buildOptions.ngswConfigPath && + this.convertAsset(buildOptions.ngswConfigPath); + if (buildOptions.prerender?.routesFile) { + buildOptions.prerender.routesFile = this.convertAsset( + buildOptions.prerender.routesFile + ); + } + buildOptions.ssr = + buildOptions.ssr && + typeof buildOptions.ssr === 'string' && + this.convertAsset(buildOptions.ssr); } private convertServerOptions(serverOptions: any): void { @@ -389,15 +432,16 @@ export class AppMigrator extends ProjectMigrator { return; } - const serveSsrTarget = - this.projectConfig.targets[this.targetNames.serveSsr]; + const ssrTarget = + this.targetNames.serveSsr ?? this.targetNames['serve-ssr']; + const serveSsrTarget = this.projectConfig.targets[ssrTarget]; if ( !serveSsrTarget.options && (!serveSsrTarget.configurations || !Object.keys(serveSsrTarget.configurations).length) ) { this.logger.warn( - `The target "${this.targetNames.serveSsr}" is not specifying any options or configurations. Skipping updating the target configuration.` + `The target "${ssrTarget}" is not specifying any options or configurations. Skipping updating the target configuration.` ); return; } diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.actions.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.actions.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.actions.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.actions.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.effects.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.effects.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.effects.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.effects.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.effects.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.effects.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.effects.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.effects.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.facade.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.facade.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.facade.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.facade.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.facade.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.facade.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.facade.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.facade.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.models.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.models.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.models.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.models.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.reducer.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.reducer.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.reducer.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.reducer.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.reducer.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.reducer.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.reducer.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.reducer.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.selectors.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.selectors.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.selectors.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.selectors.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.selectors.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.selectors.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.selectors.ts__tmpl__ rename to packages/angular/src/generators/ngrx-feature-store/files/__directory__/__fileName__.selectors.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ deleted file mode 100644 index c4c787a91cb64..0000000000000 --- a/packages/angular/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core'; -import { createEffect, Actions, ofType } from '@ngrx/effects'; - -import * as <%= className %>Actions from './<%= relativeFileName %>.actions'; -import * as <%= className %>Feature from './<%= relativeFileName %>.reducer'; - -import {switchMap, catchError, of} from 'rxjs'; - -@Injectable() -export class <%= className %>Effects { - init$ = createEffect(() => this.actions$.pipe( - ofType(<%= className %>Actions.init<%= className %>), - switchMap(() => of(<%= className %>Actions.load<%= className %>Success({ <%= propertyName %>: [] }))), - catchError((error) => { - console.error('Error', error); - return of(<%= className %>Actions.load<%= className %>Failure({ error })); - } - ) - )); - - constructor(private readonly actions$: Actions) {} -} diff --git a/packages/angular/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ b/packages/angular/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ deleted file mode 100644 index 61e66dcd8c1ac..0000000000000 --- a/packages/angular/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { select, Store, Action } from '@ngrx/store'; - -import * as <%= className %>Actions from './<%= relativeFileName %>.actions'; -import * as <%= className %>Feature from './<%= relativeFileName %>.reducer'; -import * as <%= className %>Selectors from './<%= relativeFileName %>.selectors'; - -@Injectable() -export class <%= className %>Facade { - /** - * Combine pieces of state using createSelector, - * and expose them as observables through the facade. - */ - loaded$ = this.store.pipe(select(<%= className %>Selectors.select<%= className %>Loaded)); - all<%= className %>$ = this.store.pipe(select(<%= className %>Selectors.selectAll<%= className %>)); - selected<%= className %>$ = this.store.pipe(select(<%= className %>Selectors.selectEntity)); - - constructor(private readonly store: Store) {} - - /** - * Use the initialization action to perform one - * or more tasks in your Effects. - */ - init() { - this.store.dispatch(<%= className %>Actions.init<%= className %>()); - } -} diff --git a/packages/angular/src/generators/ngrx-feature-store/lib/generate-files.ts b/packages/angular/src/generators/ngrx-feature-store/lib/generate-files.ts index caee51b914021..a2de9ee60dc20 100644 --- a/packages/angular/src/generators/ngrx-feature-store/lib/generate-files.ts +++ b/packages/angular/src/generators/ngrx-feature-store/lib/generate-files.ts @@ -2,7 +2,6 @@ import type { Tree } from '@nx/devkit'; import { generateFiles, joinPathFragments, names } from '@nx/devkit'; import type { NormalizedNgRxFeatureStoreGeneratorOptions } from './normalize-options'; import { lt } from 'semver'; -import { getInstalledAngularVersion } from '../../utils/version-utils'; export function generateFilesFromTemplates( tree: Tree, @@ -15,7 +14,7 @@ export function generateFilesFromTemplates( generateFiles( tree, - joinPathFragments(__dirname, '..', 'files', 'base'), + joinPathFragments(__dirname, '..', 'files'), options.parentDirectory, { ...options, @@ -27,22 +26,6 @@ export function generateFilesFromTemplates( } ); - const angularVersion = getInstalledAngularVersion(tree); - if (lt(angularVersion, '14.1.0')) { - generateFiles( - tree, - joinPathFragments(__dirname, '..', 'files', 'no-inject'), - options.parentDirectory, - { - ...options, - ...projectNames, - fileName, - relativeFileName: projectNames.fileName, - tmpl: '', - } - ); - } - if (!options.facade) { tree.delete( joinPathFragments( diff --git a/packages/angular/src/generators/ngrx-feature-store/lib/validate-options.ts b/packages/angular/src/generators/ngrx-feature-store/lib/validate-options.ts index a13e9dddc46d7..be93fe817cd7a 100644 --- a/packages/angular/src/generators/ngrx-feature-store/lib/validate-options.ts +++ b/packages/angular/src/generators/ngrx-feature-store/lib/validate-options.ts @@ -1,12 +1,5 @@ import type { Tree } from '@nx/devkit'; import { Schema } from '../schema'; -import { - getInstalledAngularVersionInfo, - getInstalledPackageVersionInfo, -} from '../..//utils/version-utils'; -import { getPkgVersionForAngularMajorVersion } from '../../../utils/version-utils'; -import { coerce, lt, major } from 'semver'; -import { tsquery } from '@phenomnomnominal/tsquery'; export function validateOptions(tree: Tree, options: Schema): void { if (!options.parent) { @@ -16,35 +9,4 @@ export function validateOptions(tree: Tree, options: Schema): void { if (options.parent && !tree.exists(options.parent)) { throw new Error(`Parent does not exist: ${options.parent}.`); } - - const angularVersionInfo = getInstalledAngularVersionInfo(tree); - const intendedNgRxVersionForAngularMajor = - getPkgVersionForAngularMajorVersion( - 'ngrxVersion', - angularVersionInfo.major - ); - - const ngrxMajorVersion = - getInstalledPackageVersionInfo(tree, '@ngrx/store')?.major ?? - major(coerce(intendedNgRxVersionForAngularMajor)); - - if (lt(angularVersionInfo.version, '14.1.0') || ngrxMajorVersion < 15) { - const parentContent = tree.read(options.parent, 'utf-8'); - const { tsquery } = require('@phenomnomnominal/tsquery'); - const ast = tsquery.ast(parentContent); - - const NG_MODULE_DECORATOR_SELECTOR = - 'ClassDeclaration > Decorator > CallExpression:has(Identifier[name=NgModule])'; - const nodes = tsquery(ast, NG_MODULE_DECORATOR_SELECTOR, { - visitAllChildren: true, - }); - if (nodes.length === 0) { - throw new Error( - `The provided parent path "${options.parent}" does not contain an "NgModule". ` + - 'Please make sure to provide a path to an "NgModule" where the state will be registered. ' + - 'If you are trying to use a "Routes" definition file (for Standalone API usage), ' + - 'please note this is not supported in Angular versions lower than 14.1.0.' - ); - } - } } diff --git a/packages/angular/src/generators/ngrx-feature-store/schema.json b/packages/angular/src/generators/ngrx-feature-store/schema.json index 70915740f7c91..c0f1adb56e846 100644 --- a/packages/angular/src/generators/ngrx-feature-store/schema.json +++ b/packages/angular/src/generators/ngrx-feature-store/schema.json @@ -18,13 +18,13 @@ }, "parent": { "type": "string", - "description": "The path to the file where the state will be registered. For NgModule usage, this will be your Feature Module. For Standalone API usage, this will be your Routes definition file for your feature state. The host directory will create/use the new state directory. _Note: The Standalone API usage is only supported in Angular versions >= 14.1.0_.", + "description": "The path to the file where the state will be registered. For NgModule usage, this will be your Feature Module. For Standalone API usage, this will be your 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" }, "route": { "type": "string", - "description": "The route that the Standalone NgRx Providers should be added to. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "The route that the Standalone NgRx Providers should be added to.", "default": "''" }, "minimal": { 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 1a43f6f3c2531..56d8c76445d47 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 @@ -18,7 +18,7 @@ import { UsersFacade } from './+state/users.facade'; declarations: [AppComponent, NxWelcomeComponent], imports: [ BrowserModule, - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + RouterModule.forRoot(appRoutes), StoreModule.forRoot( {}, { @@ -89,7 +89,7 @@ import { UsersEffects } from './+state/users.effects'; declarations: [AppComponent, NxWelcomeComponent], imports: [ BrowserModule, - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + RouterModule.forRoot(appRoutes), StoreModule.forRoot( {}, { @@ -372,7 +372,7 @@ import { StoreRouterConnectingModule } from '@ngrx/router-store'; declarations: [AppComponent, NxWelcomeComponent], imports: [ BrowserModule, - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + RouterModule.forRoot(appRoutes), StoreModule.forRoot( {}, { @@ -409,7 +409,7 @@ import { StoreDevtoolsModule } from '@ngrx/store-devtools'; declarations: [AppComponent, NxWelcomeComponent], imports: [ BrowserModule, - RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + RouterModule.forRoot(appRoutes), StoreModule.forRoot( {}, { @@ -433,10 +433,7 @@ export class AppModule {} exports[`NgRxRootStoreGenerator Standalone APIs should add a facade when --facade=true 1`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; @@ -451,7 +448,7 @@ export const appConfig: ApplicationConfig = { UsersFacade, provideEffects(), provideStore(), - provideRouter(appRoutes, withEnabledBlockingInitialNavigation()), + provideRouter(appRoutes), ], }; " @@ -490,10 +487,7 @@ export class UsersFacade { exports[`NgRxRootStoreGenerator Standalone APIs should add a root module and root state when --minimal=false 1`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; @@ -506,7 +500,7 @@ export const appConfig: ApplicationConfig = { provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(), provideStore(), - provideRouter(appRoutes, withEnabledBlockingInitialNavigation()), + provideRouter(appRoutes), ], }; " @@ -759,30 +753,20 @@ describe('Users Selectors', () => { exports[`NgRxRootStoreGenerator Standalone APIs should add an empty root module when --minimal=true 1`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +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: [ - provideEffects(), - provideStore(), - provideRouter(appRoutes, withEnabledBlockingInitialNavigation()), - ], + providers: [provideEffects(), provideStore(), provideRouter(appRoutes)], }; " `; exports[`NgRxRootStoreGenerator Standalone APIs should instrument the store devtools when "addDevTools: true" 1`] = ` "import { ApplicationConfig, isDevMode } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; @@ -793,7 +777,7 @@ export const appConfig: ApplicationConfig = { provideStoreDevtools({ logOnly: !isDevMode() }), provideEffects(), provideStore(), - provideRouter(appRoutes, withEnabledBlockingInitialNavigation()), + 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 b70ba1d26a950..48a2b86b06100 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,7 +35,8 @@ export function normalizeOptions( project.sourceRoot, 'app/app.config.ts' ); - const appMainPath = project.targets.build.options.main; + const appMainPath = + project.targets.build.options.main ?? project.targets.build.options.browser; /** If NgModule App * -> Use App Module diff --git a/packages/angular/src/generators/ngrx-root-store/lib/validate-options.ts b/packages/angular/src/generators/ngrx-root-store/lib/validate-options.ts index 48f8ab6fc5c0f..ab23ba9396a5f 100644 --- a/packages/angular/src/generators/ngrx-root-store/lib/validate-options.ts +++ b/packages/angular/src/generators/ngrx-root-store/lib/validate-options.ts @@ -1,13 +1,6 @@ import type { Tree } from '@nx/devkit'; import { getProjects, readProjectConfiguration } from '@nx/devkit'; import { Schema } from '../schema'; -import { - getInstalledAngularVersionInfo, - getInstalledPackageVersionInfo, -} from '../../utils/version-utils'; -import { getPkgVersionForAngularMajorVersion } from '../../../utils/version-utils'; -import { coerce, lt, major } from 'semver'; -import { isNgStandaloneApp } from '../../../utils/nx-devkit/ast-utils'; export function validateOptions(tree: Tree, options: Schema): void { if (!getProjects(tree).has(options.project)) { @@ -28,26 +21,4 @@ export function validateOptions(tree: Tree, options: Schema): void { `If generating a global feature state with your root store, you must provide a name for it with '--name'.` ); } - - const angularVersionInfo = getInstalledAngularVersionInfo(tree); - const intendedNgRxVersionForAngularMajor = - getPkgVersionForAngularMajorVersion( - 'ngrxVersion', - angularVersionInfo.major - ); - - const ngrxMajorVersion = - getInstalledPackageVersionInfo(tree, '@ngrx/store')?.major ?? - major(coerce(intendedNgRxVersionForAngularMajor)); - - const isStandalone = isNgStandaloneApp(tree, options.project); - - if (lt(angularVersionInfo.version, '14.1.0') || ngrxMajorVersion < 15) { - if (isStandalone) { - throw new Error( - `The provided project '${options.project}' is set up to use Standalone APIs, however your workspace is not configured to support Standalone APIs. ` + - 'Please make sure to provide a path to an "NgModule" where the state will be registered. ' - ); - } - } } diff --git a/packages/angular/src/generators/ngrx-root-store/schema.json b/packages/angular/src/generators/ngrx-root-store/schema.json index 4c637524c397a..532aab92c18f5 100644 --- a/packages/angular/src/generators/ngrx-root-store/schema.json +++ b/packages/angular/src/generators/ngrx-root-store/schema.json @@ -29,7 +29,7 @@ }, "route": { "type": "string", - "description": "The route that the Standalone NgRx Providers should be added to. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "The route that the Standalone NgRx Providers should be added to.", "default": "''" }, "directory": { 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 7a4129d543f25..b17404224725d 100644 --- a/packages/angular/src/generators/ngrx/__snapshots__/ngrx.spec.ts.snap +++ b/packages/angular/src/generators/ngrx/__snapshots__/ngrx.spec.ts.snap @@ -669,10 +669,7 @@ bootstrapApplication(AppComponent, appConfig).catch((err) => exports[`ngrx Standalone APIs should add a root module with feature module when minimal is set to false 2`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; @@ -685,7 +682,7 @@ export const appConfig: ApplicationConfig = { provideState(fromUsers.USERS_FEATURE_KEY, fromUsers.usersReducer), provideEffects(), provideStore(), - provideRouter(appRoutes, withEnabledBlockingInitialNavigation()), + provideRouter(appRoutes), ], }; " @@ -704,20 +701,13 @@ bootstrapApplication(AppComponent, appConfig).catch((err) => exports[`ngrx Standalone APIs should add an empty provideStore when minimal and root are set to true 2`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +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(), - provideRouter(appRoutes, withEnabledBlockingInitialNavigation()), - ], + providers: [provideEffects(), provideStore(), provideRouter(appRoutes)], }; " `; @@ -735,10 +725,7 @@ bootstrapApplication(AppComponent, appConfig).catch((err) => exports[`ngrx Standalone APIs should add facade provider when facade is true 2`] = ` "import { ApplicationConfig } from '@angular/core'; -import { - provideRouter, - withEnabledBlockingInitialNavigation, -} from '@angular/router'; +import { provideRouter } from '@angular/router'; import { appRoutes } from './app.routes'; import { provideStore, provideState } from '@ngrx/store'; import { provideEffects } from '@ngrx/effects'; @@ -753,7 +740,7 @@ export const appConfig: ApplicationConfig = { provideEffects(), provideStore(), UsersFacade, - provideRouter(appRoutes, withEnabledBlockingInitialNavigation()), + provideRouter(appRoutes), ], }; " @@ -781,120 +768,6 @@ export const appRoutes: Routes = [ " `; -exports[`ngrx angular v14 support should generate the ngrx effects using "inject" for versions >= 14.1.0 1`] = ` -"import { Injectable, inject } from '@angular/core'; -import { createEffect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, catchError, of } from 'rxjs'; -import * as UsersActions from './users.actions'; -import * as UsersFeature from './users.reducer'; - -@Injectable() -export class UsersEffects { - private actions$ = inject(Actions); - - init$ = createEffect(() => - this.actions$.pipe( - ofType(UsersActions.initUsers), - switchMap(() => of(UsersActions.loadUsersSuccess({ users: [] }))), - catchError((error) => { - console.error('Error', error); - return of(UsersActions.loadUsersFailure({ error })); - }) - ) - ); -} -" -`; - -exports[`ngrx angular v14 support should generate the ngrx effects with no usage of "inject" 1`] = ` -"import { Injectable } from '@angular/core'; -import { createEffect, Actions, ofType } from '@ngrx/effects'; - -import * as UsersActions from './users.actions'; -import * as UsersFeature from './users.reducer'; - -import { switchMap, catchError, of } from 'rxjs'; - -@Injectable() -export class UsersEffects { - init$ = createEffect(() => - this.actions$.pipe( - ofType(UsersActions.initUsers), - switchMap(() => of(UsersActions.loadUsersSuccess({ users: [] }))), - catchError((error) => { - console.error('Error', error); - return of(UsersActions.loadUsersFailure({ error })); - }) - ) - ); - - constructor(private readonly actions$: Actions) {} -} -" -`; - -exports[`ngrx angular v14 support should generate the ngrx facade using "inject" for versions >= 14.1.0 1`] = ` -"import { Injectable, inject } from '@angular/core'; -import { select, Store, Action } from '@ngrx/store'; - -import * as UsersActions from './users.actions'; -import * as UsersFeature from './users.reducer'; -import * as UsersSelectors from './users.selectors'; - -@Injectable() -export class UsersFacade { - private readonly store = inject(Store); - - /** - * Combine pieces of state using createSelector, - * and expose them as observables through the facade. - */ - loaded$ = this.store.pipe(select(UsersSelectors.selectUsersLoaded)); - allUsers$ = this.store.pipe(select(UsersSelectors.selectAllUsers)); - selectedUsers$ = this.store.pipe(select(UsersSelectors.selectEntity)); - - /** - * Use the initialization action to perform one - * or more tasks in your Effects. - */ - init() { - this.store.dispatch(UsersActions.initUsers()); - } -} -" -`; - -exports[`ngrx angular v14 support should generate the ngrx facade with no usage of "inject" 1`] = ` -"import { Injectable } from '@angular/core'; -import { select, Store, Action } from '@ngrx/store'; - -import * as UsersActions from './users.actions'; -import * as UsersFeature from './users.reducer'; -import * as UsersSelectors from './users.selectors'; - -@Injectable() -export class UsersFacade { - /** - * Combine pieces of state using createSelector, - * and expose them as observables through the facade. - */ - loaded$ = this.store.pipe(select(UsersSelectors.selectUsersLoaded)); - allUsers$ = this.store.pipe(select(UsersSelectors.selectAllUsers)); - selectedUsers$ = this.store.pipe(select(UsersSelectors.selectEntity)); - - constructor(private readonly store: Store) {} - - /** - * Use the initialization action to perform one - * or more tasks in your Effects. - */ - init() { - this.store.dispatch(UsersActions.initUsers()); - } -} -" -`; - exports[`ngrx rxjs v6 support should generate the ngrx effects using rxjs operators imported from "rxjs/operators" 1`] = ` "import { Injectable, inject } from '@angular/core'; import { createEffect, Actions, ofType } from '@ngrx/effects'; diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.actions.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.actions.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.actions.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.actions.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.effects.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.effects.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.effects.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.effects.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.effects.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.effects.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.effects.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.effects.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.facade.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.facade.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.facade.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.facade.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.facade.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.facade.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.facade.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.facade.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.models.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.models.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.models.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.models.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.reducer.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.reducer.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.reducer.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.reducer.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.reducer.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.reducer.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.reducer.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.reducer.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.selectors.spec.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.selectors.spec.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.selectors.spec.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.selectors.spec.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.selectors.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/__directory__/__fileName__.selectors.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/ngrx/files/base/__directory__/__fileName__.selectors.ts__tmpl__ rename to packages/angular/src/generators/ngrx/files/__directory__/__fileName__.selectors.ts__tmpl__ diff --git a/packages/angular/src/generators/ngrx/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ deleted file mode 100644 index 508c619520756..0000000000000 --- a/packages/angular/src/generators/ngrx/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core'; -import { createEffect, Actions, ofType } from '@ngrx/effects'; - -import * as <%= className %>Actions from './<%= fileName %>.actions'; -import * as <%= className %>Feature from './<%= fileName %>.reducer'; - -import {switchMap, catchError, of} from 'rxjs'; - -@Injectable() -export class <%= className %>Effects { - init$ = createEffect(() => this.actions$.pipe( - ofType(<%= className %>Actions.init<%= className %>), - switchMap(() => of(<%= className %>Actions.load<%= className %>Success({ <%= propertyName %>: [] }))), - catchError((error) => { - console.error('Error', error); - return of(<%= className %>Actions.load<%= className %>Failure({ error })); - } - ) - )); - - constructor(private readonly actions$: Actions) {} -} diff --git a/packages/angular/src/generators/ngrx/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ b/packages/angular/src/generators/ngrx/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ deleted file mode 100644 index b5bd3607baa4f..0000000000000 --- a/packages/angular/src/generators/ngrx/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { select, Store, Action } from '@ngrx/store'; - -import * as <%= className %>Actions from './<%= fileName %>.actions'; -import * as <%= className %>Feature from './<%= fileName %>.reducer'; -import * as <%= className %>Selectors from './<%= fileName %>.selectors'; - -@Injectable() -export class <%= className %>Facade { - /** - * Combine pieces of state using createSelector, - * and expose them as observables through the facade. - */ - loaded$ = this.store.pipe(select(<%= className %>Selectors.select<%= className %>Loaded)); - all<%= className %>$ = this.store.pipe(select(<%= className %>Selectors.selectAll<%= className %>)); - selected<%= className %>$ = this.store.pipe(select(<%= className %>Selectors.selectEntity)); - - constructor(private readonly store: Store) {} - - /** - * Use the initialization action to perform one - * or more tasks in your Effects. - */ - init() { - this.store.dispatch(<%= className %>Actions.init<%= className %>()); - } -} diff --git a/packages/angular/src/generators/ngrx/lib/generate-files.ts b/packages/angular/src/generators/ngrx/lib/generate-files.ts index d0e478de02c89..dcf91e12e4bd5 100644 --- a/packages/angular/src/generators/ngrx/lib/generate-files.ts +++ b/packages/angular/src/generators/ngrx/lib/generate-files.ts @@ -1,7 +1,6 @@ import type { Tree } from '@nx/devkit'; import { generateFiles, joinPathFragments, names } from '@nx/devkit'; import { lt } from 'semver'; -import { getInstalledAngularVersion } from '../../utils/version-utils'; import { NormalizedNgRxGeneratorOptions } from './normalize-options'; /** @@ -16,7 +15,7 @@ export function generateNgrxFilesFromTemplates( generateFiles( tree, - joinPathFragments(__dirname, '..', 'files', 'base'), + joinPathFragments(__dirname, '..', 'files'), options.parentDirectory, { ...options, @@ -26,20 +25,6 @@ export function generateNgrxFilesFromTemplates( } ); - const angularVersion = getInstalledAngularVersion(tree); - if (lt(angularVersion, '14.1.0')) { - generateFiles( - tree, - joinPathFragments(__dirname, '..', 'files', 'no-inject'), - options.parentDirectory, - { - ...options, - ...projectNames, - tmpl: '', - } - ); - } - if (!options.facade) { tree.delete( joinPathFragments( diff --git a/packages/angular/src/generators/ngrx/lib/validate-options.ts b/packages/angular/src/generators/ngrx/lib/validate-options.ts index 5ead456ca43f0..f70302fae4ac4 100644 --- a/packages/angular/src/generators/ngrx/lib/validate-options.ts +++ b/packages/angular/src/generators/ngrx/lib/validate-options.ts @@ -1,11 +1,5 @@ import type { Tree } from '@nx/devkit'; -import { coerce, lt, major } from 'semver'; -import { - getInstalledAngularVersionInfo, - getInstalledPackageVersionInfo, -} from '../../utils/version-utils'; import type { NgRxGeneratorOptions } from '../schema'; -import { getPkgVersionForAngularMajorVersion } from '../../../utils/version-utils'; export function validateOptions( tree: Tree, @@ -20,36 +14,4 @@ export function validateOptions( if (options.parent && !tree.exists(options.parent)) { throw new Error(`Parent does not exist: ${options.parent}.`); } - - const angularVersionInfo = getInstalledAngularVersionInfo(tree); - const intendedNgRxVersionForAngularMajor = - getPkgVersionForAngularMajorVersion( - 'ngrxVersion', - angularVersionInfo.major - ); - - const ngrxMajorVersion = - getInstalledPackageVersionInfo(tree, '@ngrx/store')?.major ?? - major(coerce(intendedNgRxVersionForAngularMajor)); - - if (lt(angularVersionInfo.version, '14.1.0') || ngrxMajorVersion < 15) { - const parentPath = options.parent ?? options.module; - const parentContent = tree.read(parentPath, 'utf-8'); - const { tsquery } = require('@phenomnomnominal/tsquery'); - const ast = tsquery.ast(parentContent); - - const NG_MODULE_DECORATOR_SELECTOR = - 'ClassDeclaration > Decorator > CallExpression:has(Identifier[name=NgModule])'; - const nodes = tsquery(ast, NG_MODULE_DECORATOR_SELECTOR, { - visitAllChildren: true, - }); - if (nodes.length === 0) { - throw new Error( - `The provided parent path "${parentPath}" does not contain an "NgModule". ` + - 'Please make sure to provide a path to an "NgModule" where the state will be registered. ' + - 'If you are trying to use a "Routes" definition file (for Standalone API usage), ' + - 'please note this is not supported in Angular versions lower than 14.1.0.' - ); - } - } } diff --git a/packages/angular/src/generators/ngrx/ngrx.spec.ts b/packages/angular/src/generators/ngrx/ngrx.spec.ts index 71b80ac7e6745..046f781fbecc1 100644 --- a/packages/angular/src/generators/ngrx/ngrx.spec.ts +++ b/packages/angular/src/generators/ngrx/ngrx.spec.ts @@ -633,178 +633,53 @@ describe('ngrx', () => { }); }); - describe('angular v14 support', () => { + describe('angular v15 support', () => { beforeEach(async () => { jest.clearAllMocks(); tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - await generateTestApplication(tree, { name: 'myapp' }); + await generateTestApplication(tree, { name: 'myapp', standalone: false }); devkit.updateJson(tree, 'package.json', (json) => ({ ...json, dependencies: { ...json.dependencies, - '@angular/core': '14.0.0', + '@angular/core': '15.0.0', }, })); }); - it('should install the ngrx 14 packages', async () => { + it('should install the ngrx 15 packages', async () => { await ngrxGenerator(tree, defaultOptions); const packageJson = devkit.readJson(tree, 'package.json'); expect(packageJson.dependencies['@ngrx/store']).toEqual( - backwardCompatibleVersions.angularV14.ngrxVersion + backwardCompatibleVersions.angularV15.ngrxVersion ); expect(packageJson.dependencies['@ngrx/effects']).toEqual( - backwardCompatibleVersions.angularV14.ngrxVersion + backwardCompatibleVersions.angularV15.ngrxVersion ); expect(packageJson.dependencies['@ngrx/entity']).toEqual( - backwardCompatibleVersions.angularV14.ngrxVersion + backwardCompatibleVersions.angularV15.ngrxVersion ); expect(packageJson.dependencies['@ngrx/router-store']).toEqual( - backwardCompatibleVersions.angularV14.ngrxVersion + backwardCompatibleVersions.angularV15.ngrxVersion ); expect(packageJson.dependencies['@ngrx/component-store']).toEqual( - backwardCompatibleVersions.angularV14.ngrxVersion + backwardCompatibleVersions.angularV15.ngrxVersion ); expect(packageJson.devDependencies['@ngrx/schematics']).toEqual( - backwardCompatibleVersions.angularV14.ngrxVersion + backwardCompatibleVersions.angularV15.ngrxVersion ); expect(packageJson.devDependencies['@ngrx/store-devtools']).toEqual( - backwardCompatibleVersions.angularV14.ngrxVersion + backwardCompatibleVersions.angularV15.ngrxVersion ); expect(packageJson.devDependencies['jasmine-marbles']).toBeDefined(); }); - - it('should generate the ngrx effects with no usage of "inject"', async () => { - await ngrxGenerator(tree, defaultOptions); - - expect( - tree.read('myapp/src/app/+state/users.effects.ts', 'utf-8') - ).toMatchSnapshot(); - }); - - it('should generate the ngrx effects using "inject" for versions >= 14.1.0', async () => { - devkit.updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - }, - })); - - await ngrxGenerator(tree, defaultOptions); - - expect( - tree.read('myapp/src/app/+state/users.effects.ts', 'utf-8') - ).toMatchSnapshot(); - }); - - it('should generate the ngrx facade with no usage of "inject"', async () => { - await ngrxGenerator(tree, { ...defaultOptions, facade: true }); - - expect( - tree.read('myapp/src/app/+state/users.facade.ts', 'utf-8') - ).toMatchSnapshot(); - }); - - it('should generate the ngrx facade using "inject" for versions >= 14.1.0', async () => { - devkit.updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - }, - })); - - await ngrxGenerator(tree, { ...defaultOptions, facade: true }); - - expect( - tree.read('myapp/src/app/+state/users.facade.ts', 'utf-8') - ).toMatchSnapshot(); - }); - - it('should throw when Angular version < 14.1 and NgRx < 15 but path to routes file is provided', async () => { - const parentPath = 'myapp/src/app/app.routes.ts'; - tree.write( - parentPath, - `import { Routes } from '@angular/router'; - import { NxWelcomeComponent } from './nx-welcome.component'; - export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent }];` - ); - - devkit.updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - '@ngrx/store': '14.1.0', - }, - })); - - // ACT & ASSERT - await expect( - ngrxGenerator(tree, { - ...defaultStandaloneOptions, - parent: parentPath, - }) - ).rejects.toThrowError( - `The provided parent path "${parentPath}" does not contain an "NgModule".` - ); - }); - - it('should throw when Angular version < 15 and NgRx is not currently installed but path to routes file is provided', async () => { - const parentPath = 'myapp/src/app/app.routes.ts'; - tree.write( - parentPath, - `import { Routes } from '@angular/router'; - import { NxWelcomeComponent } from './nx-welcome.component'; - export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent }];` - ); - - devkit.updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.2.0', - }, - })); - - // ACT & ASSERT - await expect( - ngrxGenerator(tree, { - ...defaultStandaloneOptions, - parent: parentPath, - }) - ).rejects.toThrowError( - `The provided parent path "${parentPath}" does not contain an "NgModule".` - ); - }); - - it('should throw when the provided parent does not have an NgModule', async () => { - const parentPath = 'myapp/src/app/app.routes.ts'; - tree.write( - parentPath, - `import { Routes } from '@angular/router'; - import { NxWelcomeComponent } from './nx-welcome.component'; - export const appRoutes: Routes = [{ path: '', component: NxWelcomeComponent }];` - ); - - // ACT & ASSERT - await expect( - ngrxGenerator(tree, { - ...defaultStandaloneOptions, - parent: parentPath, - }) - ).rejects.toThrowError( - `The provided parent path "${parentPath}" does not contain an "NgModule".` - ); - }); }); describe('rxjs v6 support', () => { beforeEach(async () => { tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - await generateTestApplication(tree, { name: 'myapp' }); + await generateTestApplication(tree, { name: 'myapp', standalone: false }); devkit.updateJson(tree, 'package.json', (json) => ({ ...json, dependencies: { diff --git a/packages/angular/src/generators/ngrx/schema.json b/packages/angular/src/generators/ngrx/schema.json index dbf17be454e44..3ce79b1af633e 100644 --- a/packages/angular/src/generators/ngrx/schema.json +++ b/packages/angular/src/generators/ngrx/schema.json @@ -42,13 +42,13 @@ }, "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. _Note: The Standalone API usage is only supported in Angular versions >= 14.1.0_.", + "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" }, "route": { "type": "string", - "description": "The route that the Standalone NgRx Providers should be added to. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "The route that the Standalone NgRx Providers should be added to.", "default": "''" }, "directory": { 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 96318a7c34079..c0b304c069b82 100644 --- a/packages/angular/src/generators/pipe/__snapshots__/pipe.spec.ts.snap +++ b/packages/angular/src/generators/pipe/__snapshots__/pipe.spec.ts.snap @@ -1,32 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`pipe generator should export the pipe correctly when flat=false and path is nested deeper 1`] = ` -"import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'test', -}) -export class TestPipe implements PipeTransform { - transform(value: unknown, ...args: unknown[]): unknown { - return null; - } -} -" -`; - -exports[`pipe generator should export the pipe correctly when flat=false and path is nested deeper 2`] = ` -"import { TestPipe } from './test.pipe'; - -describe('TestPipe', () => { - it('create an instance', () => { - const pipe = new TestPipe(); - expect(pipe).toBeTruthy(); - }); -}); -" -`; - -exports[`pipe generator should export the pipe correctly when flat=false and path is nested deeper 3`] = ` +exports[`pipe generator --no-standalone should export the pipe correctly when flat=false and path is nested deeper 1`] = ` "import { NgModule } from '@angular/core'; import { TestPipe } from './my-pipes/test/test.pipe'; @NgModule({ @@ -38,7 +12,7 @@ export class TestModule {} " `; -exports[`pipe generator should generate a pipe with test files and attach to the NgModule automatically 1`] = ` +exports[`pipe generator --no-standalone should generate a pipe with test files and attach to the NgModule automatically 1`] = ` "import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ @@ -52,7 +26,7 @@ export class TestPipe implements PipeTransform { " `; -exports[`pipe generator should generate a pipe with test files and attach to the NgModule automatically 2`] = ` +exports[`pipe generator --no-standalone should generate a pipe with test files and attach to the NgModule automatically 2`] = ` "import { TestPipe } from './test.pipe'; describe('TestPipe', () => { @@ -64,7 +38,7 @@ describe('TestPipe', () => { " `; -exports[`pipe generator should generate a pipe with test files and attach to the NgModule automatically 3`] = ` +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'; @NgModule({ @@ -76,7 +50,7 @@ export class TestModule {} " `; -exports[`pipe generator should import the pipe correctly when flat=false 1`] = ` +exports[`pipe generator --no-standalone should import the pipe correctly when flat=false 1`] = ` "import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ @@ -90,7 +64,7 @@ export class TestPipe implements PipeTransform { " `; -exports[`pipe generator should import the pipe correctly when flat=false 2`] = ` +exports[`pipe generator --no-standalone should import the pipe correctly when flat=false 2`] = ` "import { TestPipe } from './test.pipe'; describe('TestPipe', () => { @@ -102,7 +76,7 @@ describe('TestPipe', () => { " `; -exports[`pipe generator should import the pipe correctly when flat=false 3`] = ` +exports[`pipe generator --no-standalone should import the pipe correctly when flat=false 3`] = ` "import { NgModule } from '@angular/core'; import { TestPipe } from './test/test.pipe'; @NgModule({ @@ -114,7 +88,7 @@ export class TestModule {} " `; -exports[`pipe generator should import the pipe correctly when flat=false and path is nested deeper 1`] = ` +exports[`pipe generator --no-standalone should import the pipe correctly when flat=false and path is nested deeper 1`] = ` "import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ @@ -128,7 +102,7 @@ export class TestPipe implements PipeTransform { " `; -exports[`pipe generator should import the pipe correctly when flat=false and path is nested deeper 2`] = ` +exports[`pipe generator --no-standalone should import the pipe correctly when flat=false and path is nested deeper 2`] = ` "import { TestPipe } from './test.pipe'; describe('TestPipe', () => { @@ -140,33 +114,7 @@ describe('TestPipe', () => { " `; -exports[`pipe generator should import the pipe correctly when flat=false and path is nested deeper 3`] = ` -"import { NgModule } from '@angular/core'; -import { TestPipe } from './my-pipes/test/test.pipe'; -@NgModule({ - imports: [], - declarations: [TestPipe], - exports: [], -}) -export class TestModule {} -" -`; - -exports[`pipe generator should not generate test file when skipTests=true 1`] = ` -"import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'test', -}) -export class TestPipe implements PipeTransform { - transform(value: unknown, ...args: unknown[]): unknown { - return null; - } -} -" -`; - -exports[`pipe generator should not generate test file when skipTests=true 2`] = ` +exports[`pipe generator --no-standalone should import the pipe correctly when flat=false and path is nested deeper 3`] = ` "import { NgModule } from '@angular/core'; import { TestPipe } from './my-pipes/test/test.pipe'; @NgModule({ @@ -178,44 +126,7 @@ export class TestModule {} " `; -exports[`pipe generator should not import the pipe when skipImport=true 1`] = ` -"import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'test', -}) -export class TestPipe implements PipeTransform { - transform(value: unknown, ...args: unknown[]): unknown { - return null; - } -} -" -`; - -exports[`pipe generator should not import the pipe when skipImport=true 2`] = ` -"import { TestPipe } from './test.pipe'; - -describe('TestPipe', () => { - it('create an instance', () => { - const pipe = new TestPipe(); - expect(pipe).toBeTruthy(); - }); -}); -" -`; - -exports[`pipe generator should not import the pipe when skipImport=true 3`] = ` -"import { NgModule } from '@angular/core'; -@NgModule({ - imports: [], - declarations: [], - exports: [], -}) -export class TestModule {} -" -`; - -exports[`pipe generator should not import the pipe when standalone=true 1`] = ` +exports[`pipe generator should generate correctly 1`] = ` "import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ @@ -230,7 +141,7 @@ export class TestPipe implements PipeTransform { " `; -exports[`pipe generator should not import the pipe when standalone=true 2`] = ` +exports[`pipe generator should generate correctly 2`] = ` "import { TestPipe } from './test.pipe'; describe('TestPipe', () => { @@ -241,14 +152,3 @@ describe('TestPipe', () => { }); " `; - -exports[`pipe generator should not import the pipe when standalone=true 3`] = ` -"import { NgModule } from '@angular/core'; -@NgModule({ - imports: [], - declarations: [], - exports: [], -}) -export class TestModule {} -" -`; diff --git a/packages/angular/src/generators/pipe/lib/index.ts b/packages/angular/src/generators/pipe/lib/index.ts index da94c6f89ca24..f9451963f55a2 100644 --- a/packages/angular/src/generators/pipe/lib/index.ts +++ b/packages/angular/src/generators/pipe/lib/index.ts @@ -1,2 +1 @@ export * from './normalize-options'; -export * from './validate-options'; diff --git a/packages/angular/src/generators/pipe/lib/normalize-options.ts b/packages/angular/src/generators/pipe/lib/normalize-options.ts index 6cbb2ef182045..ad2a71ec9ed11 100644 --- a/packages/angular/src/generators/pipe/lib/normalize-options.ts +++ b/packages/angular/src/generators/pipe/lib/normalize-options.ts @@ -36,5 +36,6 @@ export async function normalizeOptions( fileName, filePath, symbolName, + standalone: options.standalone ?? true, }; } diff --git a/packages/angular/src/generators/pipe/lib/validate-options.ts b/packages/angular/src/generators/pipe/lib/validate-options.ts deleted file mode 100644 index d51a443cd84fb..0000000000000 --- a/packages/angular/src/generators/pipe/lib/validate-options.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { Tree } from '@nx/devkit'; -import { validateStandaloneOption } from '../../utils/validations'; -import type { Schema } from '../schema'; - -export function validateOptions(tree: Tree, options: Schema): void { - validateStandaloneOption(tree, options.standalone); -} diff --git a/packages/angular/src/generators/pipe/pipe.spec.ts b/packages/angular/src/generators/pipe/pipe.spec.ts index 673fd2ddb9082..d9b881cc93ce3 100644 --- a/packages/angular/src/generators/pipe/pipe.spec.ts +++ b/packages/angular/src/generators/pipe/pipe.spec.ts @@ -14,22 +14,9 @@ describe('pipe generator', () => { sourceRoot: 'test/src', projectType: 'application', }); - - tree.write( - 'test/src/app/test.module.ts', - `import {NgModule} from "@angular/core"; - @NgModule({ - imports: [], - declarations: [], - exports: [] - }) - export class TestModule {}` - ); }); - it('should generate a pipe with test files and attach to the NgModule automatically', async () => { - // ARRANGE - + it('should generate correctly', async () => { // ACT await generatePipeWithDefaultOptions(tree); @@ -38,119 +25,148 @@ describe('pipe generator', () => { expect( tree.read('test/src/app/test.pipe.spec.ts', 'utf-8') ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); - }); - - it('should import the pipe correctly when flat=false', async () => { - // ARRANGE - - // ACT - await generatePipeWithDefaultOptions(tree, { flat: false }); - - // ASSERT - expect( - 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') - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); }); - it('should not import the pipe when standalone=true', async () => { + it('should not import the pipe into an existing module', async () => { // ARRANGE + addModule(tree); // ACT await generatePipeWithDefaultOptions(tree, { standalone: true }); // ASSERT - expect(tree.read('test/src/app/test.pipe.ts', 'utf-8')).toMatchSnapshot(); - expect( - tree.read('test/src/app/test.pipe.spec.ts', 'utf-8') - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + 'TestPipe' + ); }); - it('should import the pipe correctly when flat=false and path is nested deeper', async () => { - // ARRANGE - + it('should not generate test file when skipTests=true', async () => { // ACT await generatePipeWithDefaultOptions(tree, { flat: false, path: 'test/src/app/my-pipes', + skipTests: true, }); // ASSERT expect( - 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') - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); + tree.exists('test/src/app/my-pipes/test/test.pipe.spec.ts') + ).toBeFalsy(); }); - it('should export the pipe correctly when flat=false and path is nested deeper', async () => { - // ARRANGE - - // ACT - await generatePipeWithDefaultOptions(tree, { - flat: false, - path: 'test/src/app/my-pipes', - export: true, + describe('--no-standalone', () => { + beforeEach(() => { + addModule(tree); }); - // ASSERT - expect( - 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') - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); - }); + it('should generate a pipe with test files and attach to the NgModule automatically', async () => { + // ARRANGE - it('should not import the pipe when skipImport=true', async () => { - // ARRANGE + // ACT + await generatePipeWithDefaultOptions(tree, { standalone: false }); - // ACT - await generatePipeWithDefaultOptions(tree, { - flat: false, - path: 'test/src/app/my-pipes', - skipImport: true, + // ASSERT + expect(tree.read('test/src/app/test.pipe.ts', 'utf-8')).toMatchSnapshot(); + expect( + tree.read('test/src/app/test.pipe.spec.ts', 'utf-8') + ).toMatchSnapshot(); + expect( + tree.read('test/src/app/test.module.ts', 'utf-8') + ).toMatchSnapshot(); }); - // ASSERT - expect( - 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') - ).toMatchSnapshot(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); - }); + it('should import the pipe correctly when flat=false', async () => { + // ARRANGE + + // ACT + await generatePipeWithDefaultOptions(tree, { + flat: false, + standalone: false, + }); + + // ASSERT + expect( + 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') + ).toMatchSnapshot(); + expect( + tree.read('test/src/app/test.module.ts', 'utf-8') + ).toMatchSnapshot(); + }); - it('should not generate test file when skipTests=true', async () => { - // ARRANGE + it('should import the pipe correctly when flat=false and path is nested deeper', async () => { + // ARRANGE + + // ACT + await generatePipeWithDefaultOptions(tree, { + flat: false, + path: 'test/src/app/my-pipes', + standalone: false, + }); + + // ASSERT + expect( + 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') + ).toMatchSnapshot(); + expect( + tree.read('test/src/app/test.module.ts', 'utf-8') + ).toMatchSnapshot(); + }); - // ACT - await generatePipeWithDefaultOptions(tree, { - flat: false, - path: 'test/src/app/my-pipes', - skipTests: true, + it('should export the pipe correctly when flat=false and path is nested deeper', async () => { + // ARRANGE + + // ACT + await generatePipeWithDefaultOptions(tree, { + flat: false, + path: 'test/src/app/my-pipes', + export: true, + standalone: false, + }); + + // ASSERT + expect( + tree.read('test/src/app/test.module.ts', 'utf-8') + ).toMatchSnapshot(); }); - // ASSERT - expect( - tree.read('test/src/app/my-pipes/test/test.pipe.ts', 'utf-8') - ).toMatchSnapshot(); - expect( - tree.exists('test/src/app/my-pipes/test/test.pipe.spec.ts') - ).toBeFalsy(); - expect(tree.read('test/src/app/test.module.ts', 'utf-8')).toMatchSnapshot(); + it('should not import the pipe when skipImport=true', async () => { + // ARRANGE + + // ACT + await generatePipeWithDefaultOptions(tree, { + flat: false, + path: 'test/src/app/my-pipes', + skipImport: true, + standalone: false, + }); + + // ASSERT + expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + 'TestPipe' + ); + }); }); }); +function addModule(tree: Tree) { + tree.write( + 'test/src/app/test.module.ts', + `import {NgModule} from "@angular/core"; + @NgModule({ + imports: [], + declarations: [], + exports: [] + }) + export class TestModule {}` + ); +} + async function generatePipeWithDefaultOptions( tree: Tree, overrides: Partial = {} diff --git a/packages/angular/src/generators/pipe/pipe.ts b/packages/angular/src/generators/pipe/pipe.ts index 74ad126c9855a..9b67117f59345 100644 --- a/packages/angular/src/generators/pipe/pipe.ts +++ b/packages/angular/src/generators/pipe/pipe.ts @@ -6,11 +6,10 @@ import { names, } from '@nx/devkit'; import { addToNgModule, findModule } from '../utils'; -import { normalizeOptions, validateOptions } from './lib'; +import { normalizeOptions } from './lib'; import type { Schema } from './schema'; export async function pipeGenerator(tree: Tree, rawOptions: Schema) { - validateOptions(tree, rawOptions); const options = await normalizeOptions(tree, rawOptions); const pipeNames = names(options.name); diff --git a/packages/angular/src/generators/pipe/schema.json b/packages/angular/src/generators/pipe/schema.json index 0be12fae31dbd..bdee60e7d2eff 100644 --- a/packages/angular/src/generators/pipe/schema.json +++ b/packages/angular/src/generators/pipe/schema.json @@ -53,9 +53,9 @@ "description": "Do not import this pipe into the owning NgModule." }, "standalone": { - "description": "Whether the generated pipe is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.", + "description": "Whether the generated pipe is standalone.", "type": "boolean", - "default": false + "default": true }, "module": { "type": "string", 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 abe333132c0a1..39e6f948588b5 100644 --- a/packages/angular/src/generators/remote/__snapshots__/remote.spec.ts.snap +++ b/packages/angular/src/generators/remote/__snapshots__/remote.spec.ts.snap @@ -1,5 +1,81 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`MF Remote App Generator --ssr compat should generate the correct main.server.ts 1`] = ` +"import 'zone.js/dist/zone-node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { ngExpressEngine } from '@nguniversal/express-engine'; +import * as express from 'express'; +import * as cors from 'cors'; +import { existsSync } from 'fs'; +import { join } from 'path'; + +import bootstrap from './bootstrap.server'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const browserBundles = join(process.cwd(), 'dist/test/browser'); + const serverBundles = join(process.cwd(), 'dist/test/server'); + + server.use(cors()); + const indexHtml = existsSync(join(browserBundles, 'index.original.html')) + ? 'index.original.html' + : 'index'; + + // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) + server.engine( + 'html', + ngExpressEngine({ + bootstrap, + }) + ); + + server.set('view engine', 'html'); + server.set('views', browserBundles); + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + // serve static files + server.use('/', express.static(browserBundles, { maxAge: '1y' })); + server.use('/server', express.static(serverBundles, { maxAge: '1y' })); + + // All regular routes use the Universal engine + server.get('*', (req, res) => { + res.render(indexHtml, { + req, + providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], + }); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(\`Node Express server listening on http://localhost:\${port}\`); + + /** + * DO NOT REMOVE IF USING @nx/angular:module-federation-dev-ssr executor + * to serve your Host application with this Remote application. + * This message allows Nx to determine when the Remote is ready to be + * consumed by the Host. + */ + process.send && process.send('nx.server.ready'); + }); +} + +run(); + +export default bootstrap; +" +`; + exports[`MF Remote App Generator --ssr should generate the correct files 1`] = ` "import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; @@ -46,15 +122,14 @@ exports[`MF Remote App Generator --ssr should generate the correct files 3`] = ` `; exports[`MF Remote App Generator --ssr should generate the correct files 4`] = ` -"import 'zone.js/dist/zone-node'; +"import 'zone.js/node'; import { APP_BASE_HREF } from '@angular/common'; -import { ngExpressEngine } from '@nguniversal/express-engine'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; import * as cors from 'cors'; -import { existsSync } from 'fs'; -import { join } from 'path'; - +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; import { AppServerModule } from './bootstrap.server'; // The Express app is exported so that it can be used by serverless Functions. @@ -62,19 +137,13 @@ export function app(): express.Express { const server = express(); const browserBundles = join(process.cwd(), 'dist/test/browser'); const serverBundles = join(process.cwd(), 'dist/test/server'); + const indexHtml = existsSync(join(browserBundles, 'index.original.html')) + ? join(browserBundles, 'index.original.html') + : join(browserBundles, 'index.html'); server.use(cors()); - const indexHtml = existsSync(join(browserBundles, 'index.original.html')) - ? 'index.original.html' - : 'index'; - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine( - 'html', - ngExpressEngine({ - bootstrap: AppServerModule, - }) - ); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); server.set('views', browserBundles); @@ -82,16 +151,24 @@ export function app(): express.Express { // Example Express Rest API endpoints // server.get('/api/**', (req, res) => { }); // Serve static files from /browser - // serve static files server.use('/', express.static(browserBundles, { maxAge: '1y' })); + // Serve static files from /server server.use('/server', express.static(serverBundles, { maxAge: '1y' })); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - res.render(indexHtml, { - req, - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - }); + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap: AppServerModule, + documentFilePath: indexHtml, + url: \`\${protocol}://\${headers.host}\${originalUrl}\`, + publicPath: browserBundles, + providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }], + }) + .then((html) => res.send(html)) + .catch((err) => next(err)); }); return server; @@ -117,7 +194,7 @@ function run(): void { run(); -export * from './bootstrap.server'; +export default AppServerModule; " `; @@ -276,15 +353,14 @@ 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 4`] = ` -"import 'zone.js/dist/zone-node'; +"import 'zone.js/node'; import { APP_BASE_HREF } from '@angular/common'; -import { ngExpressEngine } from '@nguniversal/express-engine'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; import * as cors from 'cors'; -import { existsSync } from 'fs'; -import { join } from 'path'; - +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; import { AppServerModule } from './bootstrap.server'; // The Express app is exported so that it can be used by serverless Functions. @@ -292,19 +368,13 @@ export function app(): express.Express { const server = express(); const browserBundles = join(process.cwd(), 'dist/test/browser'); const serverBundles = join(process.cwd(), 'dist/test/server'); + const indexHtml = existsSync(join(browserBundles, 'index.original.html')) + ? join(browserBundles, 'index.original.html') + : join(browserBundles, 'index.html'); server.use(cors()); - const indexHtml = existsSync(join(browserBundles, 'index.original.html')) - ? 'index.original.html' - : 'index'; - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine( - 'html', - ngExpressEngine({ - bootstrap: AppServerModule, - }) - ); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); server.set('views', browserBundles); @@ -312,16 +382,24 @@ export function app(): express.Express { // Example Express Rest API endpoints // server.get('/api/**', (req, res) => { }); // Serve static files from /browser - // serve static files server.use('/', express.static(browserBundles, { maxAge: '1y' })); + // Serve static files from /server server.use('/server', express.static(serverBundles, { maxAge: '1y' })); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - res.render(indexHtml, { - req, - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - }); + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap: AppServerModule, + documentFilePath: indexHtml, + url: \`\${protocol}://\${headers.host}\${originalUrl}\`, + publicPath: browserBundles, + providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }], + }) + .then((html) => res.send(html)) + .catch((err) => next(err)); }); return server; @@ -347,7 +425,7 @@ function run(): void { run(); -export * from './bootstrap.server'; +export default AppServerModule; " `; diff --git a/packages/angular/src/generators/remote/files/common/src/main.server.ts__tmpl__ b/packages/angular/src/generators/remote/files/common/pre-v17/src/main.server.ts__tmpl__ similarity index 100% rename from packages/angular/src/generators/remote/files/common/src/main.server.ts__tmpl__ rename to packages/angular/src/generators/remote/files/common/pre-v17/src/main.server.ts__tmpl__ diff --git a/packages/angular/src/generators/remote/files/common/v17+/src/main.server.ts__tmpl__ b/packages/angular/src/generators/remote/files/common/v17+/src/main.server.ts__tmpl__ new file mode 100644 index 0000000000000..feb768fdea3e5 --- /dev/null +++ b/packages/angular/src/generators/remote/files/common/v17+/src/main.server.ts__tmpl__ @@ -0,0 +1,74 @@ +import 'zone.js/node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; +import * as express from 'express'; +import * as cors from 'cors'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import<% if(standalone) { %> bootstrap <% } else { %> { AppServerModule } <% } %>from './bootstrap.server'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const browserBundles = join(process.cwd(), '<%= browserBundleOutput %>'); + const serverBundles = join(process.cwd(), '<%= serverBundleOutput %>'); + const indexHtml = existsSync(join(browserBundles, 'index.original.html')) + ? join(browserBundles, 'index.original.html') + : join(browserBundles, 'index.html'); + + server.use(cors()); + + const commonEngine = new CommonEngine(); + + server.set('view engine', 'html'); + server.set('views', browserBundles); + + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + server.use('/', express.static(browserBundles, { maxAge: '1y' })); + // Serve static files from /server + server.use('/server', express.static(serverBundles, { 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) { %>: AppServerModule<% } %>, + documentFilePath: indexHtml, + url: `${protocol}://${headers.host}${originalUrl}`, + publicPath: browserBundles, + 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'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(`Node Express server listening on http://localhost:${port}`); + + /** + * DO NOT REMOVE IF USING @nx/angular:module-federation-dev-ssr executor + * to serve your Host application with this Remote application. + * This message allows Nx to determine when the Remote is ready to be + * consumed by the Host. + */ + process.send && process.send('nx.server.ready'); + }); +} + +run(); + +export default <% if (standalone) { %>bootstrap<% } else { %>AppServerModule<% } %>; diff --git a/packages/angular/src/generators/remote/lib/index.ts b/packages/angular/src/generators/remote/lib/index.ts index ec1360ed68935..89a196c6205a8 100644 --- a/packages/angular/src/generators/remote/lib/index.ts +++ b/packages/angular/src/generators/remote/lib/index.ts @@ -1,2 +1,2 @@ export * from './find-next-available-port'; -export * from './add-ssr'; +export * from './update-ssr-setup'; diff --git a/packages/angular/src/generators/remote/lib/add-ssr.ts b/packages/angular/src/generators/remote/lib/update-ssr-setup.ts similarity index 81% rename from packages/angular/src/generators/remote/lib/add-ssr.ts rename to packages/angular/src/generators/remote/lib/update-ssr-setup.ts index 1604f1f5bc9b3..fa21f80d6d7b8 100644 --- a/packages/angular/src/generators/remote/lib/add-ssr.ts +++ b/packages/angular/src/generators/remote/lib/update-ssr-setup.ts @@ -6,17 +6,15 @@ import { readProjectConfiguration, updateProjectConfiguration, } from '@nx/devkit'; - -import setupSsr from '../../setup-ssr/setup-ssr'; +import { join } from 'path'; import { corsVersion, - expressVersion, moduleFederationNodeVersion, typesCorsVersion, - typesExpressVersion, } from '../../../utils/versions'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; -export async function addSsr( +export async function updateSsrSetup( tree: Tree, { appName, @@ -32,11 +30,6 @@ export async function addSsr( ) { let project = readProjectConfiguration(tree, appName); - await setupSsr(tree, { - project: appName, - standalone, - }); - tree.rename( joinPathFragments(project.sourceRoot, 'main.server.ts'), joinPathFragments(project.sourceRoot, 'bootstrap.server.ts') @@ -47,18 +40,20 @@ export async function addSsr( "import('./src/main.server');" ); - const browserBundleOutput = joinPathFragments( - project.targets.build.options.outputPath, - 'browser' - ); - const serverBundleOutput = joinPathFragments( - project.targets.build.options.outputPath, - 'server' + const browserBundleOutput = project.targets.build.options.outputPath; + const serverBundleOutput = project.targets.build.options.outputPath.replace( + /\/browser$/, + '/server' ); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); generateFiles( tree, - joinPathFragments(__dirname, `../files/common`), + join( + __dirname, + '../files/common', + angularMajorVersion >= 17 ? 'v17+' : 'pre-v17' + ), project.root, { appName, @@ -125,12 +120,10 @@ export async function addSsr( tree, { cors: corsVersion, - express: expressVersion, '@module-federation/node': moduleFederationNodeVersion, }, { '@types/cors': typesCorsVersion, - '@types/express': typesExpressVersion, } ); diff --git a/packages/angular/src/generators/remote/remote.spec.ts b/packages/angular/src/generators/remote/remote.spec.ts index f96a97af65a49..d892ca978767f 100644 --- a/packages/angular/src/generators/remote/remote.spec.ts +++ b/packages/angular/src/generators/remote/remote.spec.ts @@ -4,7 +4,6 @@ import { readJson, readNxJson, readProjectConfiguration, - stripIndents, updateJson, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -24,6 +23,7 @@ describe('MF Remote App Generator', () => { name: 'test', port: 4201, typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -43,6 +43,7 @@ describe('MF Remote App Generator', () => { name: 'test', port: 4201, typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -56,6 +57,7 @@ describe('MF Remote App Generator', () => { await generateTestHostApplication(tree, { name: 'host', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -63,6 +65,7 @@ describe('MF Remote App Generator', () => { name: 'test', host: 'host', typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -77,6 +80,7 @@ describe('MF Remote App Generator', () => { await generateTestHostApplication(tree, { name: 'host', typescriptConfiguration: true, + standalone: false, }); // ACT @@ -84,6 +88,7 @@ describe('MF Remote App Generator', () => { name: 'test', host: 'host', typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -100,6 +105,7 @@ describe('MF Remote App Generator', () => { await generateTestRemoteApplication(tree, { name: 'test', host: 'host', + standalone: false, }); } catch (error) { // ASSERT @@ -115,11 +121,13 @@ describe('MF Remote App Generator', () => { await generateTestRemoteApplication(tree, { name: 'existing', port: 4201, + standalone: false, }); // ACT await generateTestRemoteApplication(tree, { name: 'test', + standalone: false, }); // ASSERT @@ -134,6 +142,7 @@ describe('MF Remote App Generator', () => { // ACT await generateTestRemoteApplication(tree, { name: 'test', + standalone: false, }); // ASSERT @@ -149,6 +158,7 @@ describe('MF Remote App Generator', () => { await generateTestRemoteApplication(tree, { name: 'test', port: 4201, + standalone: false, }); // ASSERT @@ -163,7 +173,6 @@ describe('MF Remote App Generator', () => { // ACT await generateTestRemoteApplication(tree, { name: 'test', - standalone: true, typescriptConfiguration: false, }); @@ -197,7 +206,6 @@ describe('MF Remote App Generator', () => { // ACT await generateTestRemoteApplication(tree, { name: 'test', - standalone: true, typescriptConfiguration: true, }); @@ -228,6 +236,7 @@ describe('MF Remote App Generator', () => { await generateTestRemoteApplication(tree, { name: 'remote1', e2eTestRunner: E2eTestRunner.None, + standalone: false, }); // ASSERT @@ -243,6 +252,7 @@ describe('MF Remote App Generator', () => { await generateTestRemoteApplication(tree, { name: 'test', inlineTemplate: true, + standalone: false, }); // ASSERT @@ -266,7 +276,6 @@ describe('MF Remote App Generator', () => { // ACT await generateTestRemoteApplication(tree, { name: 'test', - standalone: true, }); // ASSERT @@ -288,6 +297,7 @@ describe('MF Remote App Generator', () => { name: 'test', ssr: true, typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -335,6 +345,7 @@ describe('MF Remote App Generator', () => { name: 'test', ssr: true, typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -372,27 +383,22 @@ describe('MF Remote App Generator', () => { ).toMatchSnapshot(); expect(project.targets['static-server']).toMatchSnapshot(); }); - }); - it('should error correctly when Angular version does not support standalone', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - '@angular/core': '14.0.0', - }, - })); - - // ACT & ASSERT - await expect( - generateTestRemoteApplication(tree, { - name: 'test', - standalone: true, - }) - ).rejects - .toThrow(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using 14.0.0. - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); + describe('compat', () => { + it('should generate the correct main.server.ts', async () => { + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + '@angular/core': '15.2.0', + }, + })); + + await generateTestRemoteApplication(tree, { name: 'test', ssr: true }); + + expect(tree.read(`test/src/main.server.ts`, 'utf-8')).toMatchSnapshot(); + }); + }); }); describe('--project-name-and-root-format=derived', () => { @@ -404,6 +410,7 @@ describe('MF Remote App Generator', () => { port: 4201, projectNameAndRootFormat: 'derived', typescriptConfiguration: false, + standalone: false, }); expect(tree.exists('apps/test/webpack.config.js')).toBe(true); @@ -419,6 +426,7 @@ describe('MF Remote App Generator', () => { directory: 'shared', projectNameAndRootFormat: 'derived', typescriptConfiguration: false, + standalone: false, }); expect(tree.exists('apps/shared/test/webpack.config.js')).toBe(true); diff --git a/packages/angular/src/generators/remote/remote.ts b/packages/angular/src/generators/remote/remote.ts index 0393e14db80e7..13d0a9e248649 100644 --- a/packages/angular/src/generators/remote/remote.ts +++ b/packages/angular/src/generators/remote/remote.ts @@ -3,16 +3,13 @@ import { formatFiles, getProjects, runTasksInSerial, - stripIndents, Tree, } from '@nx/devkit'; import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; -import { lt } from 'semver'; import { E2eTestRunner } from '../../utils/test-runners'; import { applicationGenerator } from '../application/application'; import { setupMf } from '../setup-mf/setup-mf'; -import { getInstalledAngularVersionInfo } from '../utils/version-utils'; -import { addSsr, findNextAvailablePort } from './lib'; +import { findNextAvailablePort, updateSsrSetup } from './lib'; import type { Schema } from './schema'; import { swcHelpersVersion } from '@nx/js/src/utils/versions'; @@ -24,14 +21,8 @@ export async function remote(tree: Tree, options: Schema) { } export async function remoteInternal(tree: Tree, schema: Schema) { - const installedAngularVersionInfo = getInstalledAngularVersionInfo(tree); - - if (lt(installedAngularVersionInfo.version, '14.1.0') && schema.standalone) { - throw new Error(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using ${installedAngularVersionInfo.version}. - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); - } - const { typescriptConfiguration = true, ...options }: Schema = schema; + options.standalone = options.standalone ?? true; const projects = getProjects(tree); if (options.host && !projects.has(options.host)) { @@ -54,10 +45,11 @@ export async function remoteInternal(tree: Tree, schema: Schema) { const appInstallTask = await applicationGenerator(tree, { ...options, - standalone: options.standalone ?? false, + standalone: options.standalone, routing: true, port, skipFormat: true, + bundler: 'webpack', }); const skipE2E = @@ -88,7 +80,7 @@ export async function remoteInternal(tree: Tree, schema: Schema) { let installTasks = [appInstallTask, installSwcHelpersTask]; if (options.ssr) { - let ssrInstallTask = await addSsr(tree, { + let ssrInstallTask = await updateSsrSetup(tree, { appName: remoteProjectName, port, typescriptConfiguration, diff --git a/packages/angular/src/generators/remote/schema.json b/packages/angular/src/generators/remote/schema.json index b819e8c7d4af2..f9c106130a47a 100644 --- a/packages/angular/src/generators/remote/schema.json +++ b/packages/angular/src/generators/remote/schema.json @@ -158,9 +158,9 @@ "x-priority": "internal" }, "standalone": { - "description": "Whether to generate a remote application with standalone components. _Note: This is only supported in Angular versions >= 14.1.0_", + "description": "Whether to generate a remote application with standalone components.", "type": "boolean", - "default": false + "default": true }, "ssr": { "description": "Whether to configure SSR for the remote application to be consumed by a host application using SSR.", 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 80b8c9845db39..71bf40cc7b7bf 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 @@ -19,6 +19,7 @@ describe('convertDirectiveToScam', () => { skipImport: true, export: false, flat: false, + standalone: false, }); // ACT @@ -75,6 +76,7 @@ describe('convertDirectiveToScam', () => { skipImport: true, export: false, flat: false, + standalone: false, }); // ACT @@ -125,6 +127,7 @@ describe('convertDirectiveToScam', () => { skipImport: true, export: false, flat: true, + standalone: false, }); // ACT @@ -181,6 +184,7 @@ describe('convertDirectiveToScam', () => { skipImport: true, export: false, flat: true, + standalone: false, }); // ACT @@ -232,6 +236,7 @@ describe('convertDirectiveToScam', () => { export: false, flat: false, path: 'apps/app1/src/app/random', + standalone: false, }); // ACT @@ -289,6 +294,7 @@ describe('convertDirectiveToScam', () => { export: false, flat: true, path: 'apps/app1/src/app/random', + standalone: false, }); // ACT 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 44cd3d46fc614..11c893551eabe 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 @@ -19,6 +19,7 @@ describe('convertPipeToScam', () => { skipImport: true, export: false, flat: false, + standalone: false, }); // ACT @@ -127,6 +128,7 @@ describe('convertPipeToScam', () => { skipImport: true, export: false, flat: true, + standalone: false, }); // ACT @@ -182,6 +184,7 @@ describe('convertPipeToScam', () => { skipImport: true, export: false, flat: true, + standalone: false, }); // ACT @@ -233,6 +236,7 @@ describe('convertPipeToScam', () => { export: false, flat: false, path: 'apps/app1/src/app/random', + standalone: false, }); // ACT @@ -292,6 +296,7 @@ describe('convertPipeToScam', () => { export: false, flat: true, path: 'apps/app1/src/app/random', + standalone: false, }); // ACT 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 d2739e01e5a91..2b318d1d0b8fa 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 @@ -1,4 +1,3 @@ -import { stripIndents, updateJson } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import scamGenerator from '../scam/scam'; import { generateTestApplication } from '../utils/testing'; @@ -78,25 +77,4 @@ describe('scam-to-standalone', () => { " `); }); - - it('should error correctly when Angular version does not support standalone', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - '@angular/core': '14.0.0', - }, - })); - - // ACT & ASSERT - await expect( - scamToStandalone(tree, { - component: 'src/app/bar/bar.component.ts', - project: 'foo', - }) - ).rejects - .toThrow(stripIndents`This generator is only supported with Angular >= 14.1.0. You are currently using 14.0.0. - You can resolve this error by migrating to Angular 14.1.0.`); - }); }); diff --git a/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.ts b/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.ts index 315b9a6e681fc..20d6d80701463 100644 --- a/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.ts +++ b/packages/angular/src/generators/scam-to-standalone/scam-to-standalone.ts @@ -1,10 +1,5 @@ import type { Tree } from '@nx/devkit'; -import { - formatFiles, - getProjects, - joinPathFragments, - stripIndents, -} from '@nx/devkit'; +import { formatFiles, getProjects, joinPathFragments } from '@nx/devkit'; import type { Schema } from './schema'; import { convertScamToStandalone, @@ -15,20 +10,11 @@ import { verifyIsInlineScam, verifyModuleIsScam, } from './lib'; -import { getInstalledAngularVersionInfo } from '../utils/version-utils'; -import { lt } from 'semver'; export async function scamToStandalone( tree: Tree, { component, project: projectName, skipFormat }: Schema ) { - const installedAngularVersionInfo = getInstalledAngularVersionInfo(tree); - - if (lt(installedAngularVersionInfo.version, '14.1.0')) { - throw new Error(stripIndents`This generator is only supported with Angular >= 14.1.0. You are currently using ${installedAngularVersionInfo.version}. - You can resolve this error by migrating to Angular 14.1.0.`); - } - const projects = getProjects(tree); let project = getTargetProject(projectName, projects); diff --git a/packages/angular/src/generators/scam-to-standalone/schema.json b/packages/angular/src/generators/scam-to-standalone/schema.json index 230013ad45148..3987dcb68d3c7 100644 --- a/packages/angular/src/generators/scam-to-standalone/schema.json +++ b/packages/angular/src/generators/scam-to-standalone/schema.json @@ -3,7 +3,7 @@ "$id": "GeneratorAngularScamToStandalone", "cli": "nx", "title": "Convert an Inline SCAM to Standalone Component", - "description": "Convert an Inline SCAM to a Standalone Component. _Note: This generator is only supported with Angular versions >= 14.1.0_.", + "description": "Convert an Inline SCAM to a Standalone Component.", "type": "object", "properties": { "component": { 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 f77ca8e689670..f2c9966b14426 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 @@ -18,6 +18,7 @@ describe('convertComponentToScam', () => { project: 'app1', skipImport: true, export: false, + standalone: false, }); // ACT @@ -72,6 +73,7 @@ describe('convertComponentToScam', () => { project: 'app1', skipImport: true, export: false, + standalone: false, }); // ACT @@ -121,6 +123,7 @@ describe('convertComponentToScam', () => { skipImport: true, export: false, flat: true, + standalone: false, }); // ACT @@ -177,6 +180,7 @@ describe('convertComponentToScam', () => { skipImport: true, export: false, flat: true, + standalone: false, }); // ACT @@ -228,6 +232,7 @@ describe('convertComponentToScam', () => { export: false, flat: true, type: 'random', + standalone: false, }); // ACT @@ -286,6 +291,7 @@ describe('convertComponentToScam', () => { export: false, flat: true, type: 'random', + standalone: false, }); // ACT @@ -338,6 +344,7 @@ describe('convertComponentToScam', () => { export: false, flat: false, path: 'apps/app1/src/app/random', + standalone: false, }); // ACT @@ -395,6 +402,7 @@ describe('convertComponentToScam', () => { export: false, flat: true, path: 'apps/app1/src/app/random', + standalone: false, }); // ACT 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 727e73b54d32d..71f7a92b4e6f4 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 @@ -31,24 +31,11 @@ export function addRemoteEntry( joinPathFragments(appRoot, 'src/app/app.routes.ts'), `{path: '', loadChildren: () => import('./remote-entry/entry.routes').then(m => m.remoteRoutes)}` ); - } else { - if (routing) { - addRoute( - tree, - joinPathFragments(appRoot, 'src/app/app.routes.ts'), - `{path: '', loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule)}` - ); - } - - tree.write( - `${appRoot}/src/app/app.module.ts`, - `/* - * This RemoteEntryModule is imported here to allow TS to find the Module during - * compilation, allowing it to be included in the built bundle. This is required - * for the Module Federation Plugin to expose the Module correctly. - * */ - import { RemoteEntryModule } from './remote-entry/entry.module'; -${tree.read(`${appRoot}/src/app/app.module.ts`, 'utf-8')}` + } else if (routing) { + addRoute( + tree, + joinPathFragments(appRoot, 'src/app/app.routes.ts'), + `{path: '', loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule)}` ); } } 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 f0ebee88b06cb..59478b3b4530c 100644 --- a/packages/angular/src/generators/setup-mf/lib/fix-bootstrap.ts +++ b/packages/angular/src/generators/setup-mf/lib/fix-bootstrap.ts @@ -1,17 +1,12 @@ import type { Tree } from '@nx/devkit'; import { joinPathFragments } from '@nx/devkit'; import type { Schema } from '../schema'; -import { getInstalledAngularMajorVersion } from '../../utils/version-utils'; export function fixBootstrap(tree: Tree, appRoot: string, options: Schema) { const mainFilePath = joinPathFragments(appRoot, 'src/main.ts'); const bootstrapCode = tree.read(mainFilePath, 'utf-8'); - const installedAngularMajor = getInstalledAngularMajorVersion(tree); if (options.standalone && options.mfType === 'remote') { - tree.write( - `${appRoot}/src/bootstrap.ts`, - standaloneBootstrapCode(installedAngularMajor === 14) - ); + tree.write(`${appRoot}/src/bootstrap.ts`, standaloneBootstrapCode()); } else { tree.write(joinPathFragments(appRoot, 'src/bootstrap.ts'), bootstrapCode); } @@ -33,21 +28,11 @@ export function fixBootstrap(tree: Tree, appRoot: string, options: Schema) { ); } -const standaloneBootstrapCode = ( - includeEnvironments: boolean = false -) => `import {bootstrapApplication} from "@angular/platform-browser"; +const standaloneBootstrapCode = + () => `import {bootstrapApplication} from "@angular/platform-browser"; import {appConfig} from './app/app.config'; import {RemoteEntryComponent} from './app/remote-entry/entry.component'; -${ - includeEnvironments - ? `import {enableProdMode} from '@angular/core'; -import {environment} from './environments/environment'; -if(environment.production) { - enableProdMode(); -} -` - : `` -} + bootstrapApplication(RemoteEntryComponent, appConfig).catch((err) => console.error(err) );`; diff --git a/packages/angular/src/generators/setup-mf/lib/index.ts b/packages/angular/src/generators/setup-mf/lib/index.ts index a05cc639b7252..5e50483093940 100644 --- a/packages/angular/src/generators/setup-mf/lib/index.ts +++ b/packages/angular/src/generators/setup-mf/lib/index.ts @@ -6,7 +6,7 @@ export * from './fix-bootstrap'; export * from './generate-config'; export * from './get-remotes-with-ports'; export * from './normalize-options'; -export * from './set-tsconfig-target'; +export * from './update-tsconfig'; export * from './setup-host-if-dynamic'; export * from './setup-serve-target'; export * from './update-host-app-routes'; 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 04ec9ae4e9d78..3338e3b69dc5e 100644 --- a/packages/angular/src/generators/setup-mf/lib/normalize-options.ts +++ b/packages/angular/src/generators/setup-mf/lib/normalize-options.ts @@ -11,5 +11,6 @@ export function normalizeOptions( typescriptConfiguration: options.typescriptConfiguration ?? true, federationType: options.federationType ?? 'static', prefix: options.prefix ?? getProjectPrefix(tree, options.appName), + standalone: options.standalone ?? true, }; } diff --git a/packages/angular/src/generators/setup-mf/lib/set-tsconfig-target.ts b/packages/angular/src/generators/setup-mf/lib/set-tsconfig-target.ts deleted file mode 100644 index 96401331f907d..0000000000000 --- a/packages/angular/src/generators/setup-mf/lib/set-tsconfig-target.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Tree } from '@nx/devkit'; -import type { Schema } from '../schema'; - -import { - updateJson, - readProjectConfiguration, - joinPathFragments, -} from '@nx/devkit'; - -export function updateTsConfigTarget(tree: Tree, schema: Schema) { - const { root } = readProjectConfiguration(tree, schema.appName); - // tsconfig.app.json - updateJson(tree, joinPathFragments(root, `tsconfig.app.json`), (json) => ({ - ...json, - compilerOptions: { - ...json.compilerOptions, - target: 'ES2020', - }, - })); -} diff --git a/packages/angular/src/generators/setup-mf/lib/update-tsconfig.ts b/packages/angular/src/generators/setup-mf/lib/update-tsconfig.ts new file mode 100644 index 0000000000000..4591bf8087dee --- /dev/null +++ b/packages/angular/src/generators/setup-mf/lib/update-tsconfig.ts @@ -0,0 +1,28 @@ +import type { Tree } from '@nx/devkit'; +import type { Schema } from '../schema'; + +import { + updateJson, + readProjectConfiguration, + joinPathFragments, +} from '@nx/devkit'; + +export function updateTsConfig(tree: Tree, schema: Schema) { + const { root } = readProjectConfiguration(tree, schema.appName); + + updateJson(tree, joinPathFragments(root, `tsconfig.app.json`), (json) => { + json.compilerOptions ??= {}; + json.compilerOptions.target = 'ES2020'; + + if (schema.mfType === 'remote') { + json.files ??= []; + json.files.push( + schema.standalone + ? 'src/app/remote-entry/entry.routes.ts' + : 'src/app/remote-entry/entry.module.ts' + ); + } + + return json; + }); +} diff --git a/packages/angular/src/generators/setup-mf/schema.json b/packages/angular/src/generators/setup-mf/schema.json index 69ab1639c41d6..d51c0f38aaff4 100644 --- a/packages/angular/src/generators/setup-mf/schema.json +++ b/packages/angular/src/generators/setup-mf/schema.json @@ -71,8 +71,8 @@ }, "standalone": { "type": "boolean", - "description": "Whether the application is a standalone application. _Note: This is only supported in Angular versions >= 14.1.0_", - "default": false + "description": "Whether the application is a standalone application.", + "default": true }, "typescriptConfiguration": { "type": "boolean", 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 f707e2831da1a..20c4779eb3e20 100644 --- a/packages/angular/src/generators/setup-mf/setup-mf.spec.ts +++ b/packages/angular/src/generators/setup-mf/setup-mf.spec.ts @@ -1,9 +1,4 @@ -import { - readJson, - readProjectConfiguration, - Tree, - updateJson, -} from '@nx/devkit'; +import { readJson, readProjectConfiguration, Tree } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { generateTestApplication } from '../utils/testing'; import { setupMf } from './setup-mf'; @@ -16,10 +11,12 @@ describe('Init MF', () => { await generateTestApplication(tree, { name: 'app1', routing: true, + standalone: false, }); await generateTestApplication(tree, { name: 'remote1', routing: true, + standalone: false, }); }); @@ -34,6 +31,7 @@ describe('Init MF', () => { appName: app, mfType: type, typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -63,6 +61,7 @@ describe('Init MF', () => { appName: app, mfType: type, typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -94,6 +93,7 @@ describe('Init MF', () => { await setupMf(tree, { appName: app, mfType: type, + standalone: false, }); // ASSERT @@ -118,6 +118,7 @@ describe('Init MF', () => { await setupMf(tree, { appName: app, mfType: type, + standalone: false, }); // ASSERT @@ -141,6 +142,7 @@ describe('Init MF', () => { appName: app, mfType: type, typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -169,6 +171,7 @@ describe('Init MF', () => { appName: app, mfType: type, typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -192,6 +195,7 @@ describe('Init MF', () => { appName: 'app1', mfType: 'host', federationType: 'dynamic', + standalone: false, }); // ASSERT @@ -206,6 +210,7 @@ describe('Init MF', () => { appName: 'remote1', mfType: 'remote', prefix: 'my-org', + standalone: false, }); // ASSERT @@ -219,7 +224,11 @@ describe('Init MF', () => { it('should generate the remote entry component correctly when prefix is not provided', async () => { // ACT - await setupMf(tree, { appName: 'remote1', mfType: 'remote' }); + await setupMf(tree, { + appName: 'remote1', + mfType: 'remote', + standalone: false, + }); // ASSERT expect( @@ -234,6 +243,7 @@ describe('Init MF', () => { mfType: 'host', remotes: ['remote1'], typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -252,6 +262,7 @@ describe('Init MF', () => { mfType: 'host', remotes: ['remote1'], typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -269,6 +280,7 @@ describe('Init MF', () => { appName: 'app1', mfType: 'host', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -277,6 +289,7 @@ describe('Init MF', () => { mfType: 'remote', host: 'app1', typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -290,6 +303,7 @@ describe('Init MF', () => { appName: 'app1', mfType: 'host', typescriptConfiguration: true, + standalone: false, }); // ACT @@ -298,6 +312,7 @@ describe('Init MF', () => { mfType: 'remote', host: 'app1', typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -309,12 +324,14 @@ describe('Init MF', () => { // ARRANGE await generateTestApplication(tree, { name: 'remote2', + standalone: false, }); await setupMf(tree, { appName: 'app1', mfType: 'host', typescriptConfiguration: false, + standalone: false, }); await setupMf(tree, { @@ -323,6 +340,7 @@ describe('Init MF', () => { host: 'app1', port: 4201, typescriptConfiguration: false, + standalone: false, }); // ACT @@ -332,6 +350,7 @@ describe('Init MF', () => { host: 'app1', port: 4202, typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -343,12 +362,14 @@ describe('Init MF', () => { // ARRANGE await generateTestApplication(tree, { name: 'remote2', + standalone: false, }); await setupMf(tree, { appName: 'app1', mfType: 'host', typescriptConfiguration: true, + standalone: false, }); await setupMf(tree, { @@ -357,6 +378,7 @@ describe('Init MF', () => { host: 'app1', port: 4201, typescriptConfiguration: true, + standalone: false, }); // ACT @@ -366,6 +388,7 @@ describe('Init MF', () => { host: 'app1', port: 4202, typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -378,12 +401,14 @@ describe('Init MF', () => { await generateTestApplication(tree, { name: 'remote2', routing: true, + standalone: false, }); await setupMf(tree, { appName: 'app1', mfType: 'host', routing: true, + standalone: false, }); await setupMf(tree, { @@ -392,6 +417,7 @@ describe('Init MF', () => { host: 'app1', port: 4201, routing: true, + standalone: false, }); // ACT @@ -401,6 +427,7 @@ describe('Init MF', () => { host: 'app1', port: 4202, routing: true, + standalone: false, }); // ASSERT @@ -413,6 +440,7 @@ describe('Init MF', () => { await generateTestApplication(tree, { name: 'test-app', routing: true, + standalone: false, }); // ACT @@ -421,6 +449,7 @@ describe('Init MF', () => { mfType: 'host', routing: true, e2eProjectName: 'test-app-e2e', + standalone: false, }); // ASSERT @@ -442,6 +471,7 @@ describe('Init MF', () => { routing: true, federationType: 'dynamic', typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -462,6 +492,7 @@ describe('Init MF', () => { routing: true, federationType: 'dynamic', typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -475,49 +506,6 @@ describe('Init MF', () => { }); }); - it('should generate bootstrap with environments for ng14', async () => { - // ARRANGE - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - }, - })); - - await generateTestApplication(tree, { - name: 'ng14', - routing: true, - standalone: true, - }); - - // ACT - await setupMf(tree, { - appName: 'ng14', - mfType: 'host', - routing: true, - standalone: true, - }); - - // ASSERT - expect(tree.read('ng14/src/bootstrap.ts', 'utf-8')).toMatchInlineSnapshot(` - "import { bootstrapApplication } from '@angular/platform-browser'; - import { appConfig } from './app/app.config'; - import { AppComponent } from './app/app.component'; - import { enableProdMode } from '@angular/core'; - import { environment } from './environments/environment'; - - if (environment.production) { - enableProdMode(); - } - - bootstrapApplication(AppComponent, appConfig).catch((err) => - console.error(err) - ); - " - `); - }); - it('should add a remote to dynamic host correctly', async () => { // ARRANGE await setupMf(tree, { @@ -526,6 +514,7 @@ describe('Init MF', () => { routing: true, federationType: 'dynamic', typescriptConfiguration: false, + standalone: false, }); // ACT @@ -536,6 +525,7 @@ describe('Init MF', () => { host: 'app1', routing: true, typescriptConfiguration: false, + standalone: false, }); // ASSERT @@ -558,6 +548,7 @@ describe('Init MF', () => { routing: true, federationType: 'dynamic', typescriptConfiguration: true, + standalone: false, }); // ACT @@ -568,6 +559,7 @@ describe('Init MF', () => { host: 'app1', routing: true, typescriptConfiguration: true, + standalone: false, }); // ASSERT @@ -581,26 +573,4 @@ describe('Init MF', () => { }); expect(tree.read('app1/src/app/app.routes.ts', 'utf-8')).toMatchSnapshot(); }); - - it('should throw an error when installed version of angular < 14.1.0 and --standalone is used', async () => { - // ARRANGE - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.0.0', - }, - })); - - // ACT & ASSERT - await expect( - setupMf(tree, { - appName: 'app1', - mfType: 'host', - standalone: true, - }) - ).rejects.toThrow( - 'The --standalone flag is not supported in your current version of Angular (14.0.0). Please update to a version of Angular that supports Standalone Components (>= 14.1.0).' - ); - }); }); diff --git a/packages/angular/src/generators/setup-mf/setup-mf.ts b/packages/angular/src/generators/setup-mf/setup-mf.ts index c2628d6126ca3..c4ad3cd12f0b4 100644 --- a/packages/angular/src/generators/setup-mf/setup-mf.ts +++ b/packages/angular/src/generators/setup-mf/setup-mf.ts @@ -20,20 +20,11 @@ import { setupTspathForRemote, setupServeTarget, updateHostAppRoutes, - updateTsConfigTarget, + updateTsConfig, } from './lib'; -import { getInstalledAngularVersionInfo } from '../utils/version-utils'; import { nxVersion } from '../../utils/versions'; -import { lt } from 'semver'; export async function setupMf(tree: Tree, rawOptions: Schema) { - const installedAngularInfo = getInstalledAngularVersionInfo(tree); - if (lt(installedAngularInfo.version, '14.1.0') && rawOptions.standalone) { - throw new Error( - `The --standalone flag is not supported in your current version of Angular (${installedAngularInfo.version}). Please update to a version of Angular that supports Standalone Components (>= 14.1.0).` - ); - } - const options = normalizeOptions(tree, rawOptions); const projectConfig = readProjectConfiguration(tree, options.appName); @@ -55,7 +46,7 @@ export async function setupMf(tree: Tree, rawOptions: Schema) { generateWebpackConfig(tree, options, projectConfig.root, remotesWithPorts); changeBuildTarget(tree, options); - updateTsConfigTarget(tree, options); + updateTsConfig(tree, options); setupServeTarget(tree, options); fixBootstrap(tree, projectConfig.root, options); 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 b6b403981c408..794f16662ce39 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 @@ -1,33 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`setupSSR should create the files correctly for ssr 1`] = ` -{ - "configurations": { - "development": { - "buildOptimizer": false, - "extractLicenses": false, - "optimization": false, - "sourceMap": true, - "vendorChunk": true, - }, - "production": { - "outputHashing": "media", - }, - }, - "defaultConfiguration": "production", - "dependsOn": [ - "build", - ], - "executor": "@angular-devkit/build-angular:server", - "options": { - "main": "app1/server.ts", - "outputPath": "dist/app1/server", - "tsConfig": "app1/tsconfig.server.json", - }, -} -`; - -exports[`setupSSR should create the files correctly for ssr 2`] = ` +exports[`setupSSR compat should generate a correct server.ts 1`] = ` "import 'zone.js/dist/zone-node'; import { APP_BASE_HREF } from '@angular/common'; @@ -35,7 +8,6 @@ import { ngExpressEngine } from '@nguniversal/express-engine'; import * as express from 'express'; import { existsSync } from 'fs'; import { join } from 'path'; - import { AppServerModule } from './src/main.server'; // The Express app is exported so that it can be used by serverless Functions. @@ -102,7 +74,237 @@ export * from './src/main.server'; " `; -exports[`setupSSR should create the files correctly for ssr when app is standalone 1`] = ` +exports[`setupSSR with application builder should create the files correctly for ssr 1`] = ` +{ + "configurations": { + "development": { + "extractLicenses": false, + "optimization": false, + "sourceMap": true, + }, + "production": { + "budgets": [ + { + "maximumError": "1mb", + "maximumWarning": "500kb", + "type": "initial", + }, + { + "maximumError": "4kb", + "maximumWarning": "2kb", + "type": "anyComponentStyle", + }, + ], + "outputHashing": "all", + }, + }, + "defaultConfiguration": "production", + "executor": "@angular-devkit/build-angular:application", + "options": { + "assets": [ + "app1/src/favicon.ico", + "app1/src/assets", + ], + "browser": "app1/src/main.ts", + "index": "app1/src/index.html", + "outputPath": "dist/app1", + "polyfills": [ + "zone.js", + ], + "prerender": true, + "scripts": [], + "server": "app1/src/main.server.ts", + "ssr": { + "entry": "app1/server.ts", + }, + "styles": [ + "app1/src/styles.css", + ], + "tsConfig": "app1/tsconfig.app.json", + }, + "outputs": [ + "{options.outputPath}", + ], +} +`; + +exports[`setupSSR with application builder should create the files correctly for ssr 2`] = ` +"import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; +import express from 'express'; +import { fileURLToPath } from 'node:url'; +import { dirname, join, resolve } from 'node:path'; +import { AppServerModule } from './src/main.server'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const serverDistFolder = dirname(fileURLToPath(import.meta.url)); + const browserDistFolder = resolve(serverDistFolder, '../browser'); + const indexHtml = join(serverDistFolder, 'index.server.html'); + + const commonEngine = new CommonEngine(); + + server.set('view engine', 'html'); + server.set('views', browserDistFolder); + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + server.get( + '*.*', + express.static(browserDistFolder, { + maxAge: '1y', + }) + ); + + // All regular routes use the Angular engine + server.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)); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(\`Node Express server listening on http://localhost:\${port}\`); + }); +} +" +`; + +exports[`setupSSR with application builder should create the files correctly for ssr when app is standalone 1`] = ` +{ + "configurations": { + "development": { + "extractLicenses": false, + "optimization": false, + "sourceMap": true, + }, + "production": { + "budgets": [ + { + "maximumError": "1mb", + "maximumWarning": "500kb", + "type": "initial", + }, + { + "maximumError": "4kb", + "maximumWarning": "2kb", + "type": "anyComponentStyle", + }, + ], + "outputHashing": "all", + }, + }, + "defaultConfiguration": "production", + "executor": "@angular-devkit/build-angular:application", + "options": { + "assets": [ + "app1/src/favicon.ico", + "app1/src/assets", + ], + "browser": "app1/src/main.ts", + "index": "app1/src/index.html", + "outputPath": "dist/app1", + "polyfills": [ + "zone.js", + ], + "prerender": true, + "scripts": [], + "server": "app1/src/main.server.ts", + "ssr": { + "entry": "app1/server.ts", + }, + "styles": [ + "app1/src/styles.css", + ], + "tsConfig": "app1/tsconfig.app.json", + }, + "outputs": [ + "{options.outputPath}", + ], +} +`; + +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 } from '@angular/ssr'; +import express from 'express'; +import { fileURLToPath } from 'node:url'; +import { dirname, join, resolve } from 'node:path'; +import bootstrap from './src/main.server'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const serverDistFolder = dirname(fileURLToPath(import.meta.url)); + const browserDistFolder = resolve(serverDistFolder, '../browser'); + const indexHtml = join(serverDistFolder, 'index.server.html'); + + const commonEngine = new CommonEngine(); + + server.set('view engine', 'html'); + server.set('views', browserDistFolder); + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + server.get( + '*.*', + express.static(browserDistFolder, { + maxAge: '1y', + }) + ); + + // All regular routes use the Angular engine + server.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)); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(\`Node Express server listening on http://localhost:\${port}\`); + }); +} +" +`; + +exports[`setupSSR with browser builder should create the files correctly for ssr 1`] = ` { "configurations": { "development": { @@ -129,32 +331,25 @@ exports[`setupSSR should create the files correctly for ssr when app is standalo } `; -exports[`setupSSR should create the files correctly for ssr when app is standalone 2`] = ` -"import 'zone.js/dist/zone-node'; +exports[`setupSSR with browser builder should create the files correctly for ssr 2`] = ` +"import 'zone.js/node'; import { APP_BASE_HREF } from '@angular/common'; -import { ngExpressEngine } from '@nguniversal/express-engine'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; -import { existsSync } from 'fs'; -import { join } from 'path'; - -import bootstrap from './src/main.server'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import { AppServerModule } from './src/main.server'; // 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(), 'dist/app1/browser'); const indexHtml = existsSync(join(distFolder, 'index.original.html')) - ? 'index.original.html' - : 'index'; + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine( - 'html', - ngExpressEngine({ - bootstrap, - }) - ); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); server.set('views', distFolder); @@ -169,12 +364,20 @@ export function app(): express.Express { }) ); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - res.render(indexHtml, { - req, - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - }); + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap: AppServerModule, + 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; @@ -200,11 +403,11 @@ if (moduleFilename === __filename || moduleFilename.includes('iisnode')) { run(); } -export default bootstrap; +export default AppServerModule; " `; -exports[`setupSSR should use fileReplacements if they already exist 1`] = ` +exports[`setupSSR with browser builder should create the files correctly for ssr when app is standalone 1`] = ` { "configurations": { "development": { @@ -215,12 +418,6 @@ exports[`setupSSR should use fileReplacements if they already exist 1`] = ` "vendorChunk": true, }, "production": { - "fileReplacements": [ - { - "replace": "app1/src/environments/environment.ts", - "with": "app1/src/environments/environment.prod.ts", - }, - ], "outputHashing": "media", }, }, @@ -236,3 +433,79 @@ exports[`setupSSR should use fileReplacements if they already exist 1`] = ` }, } `; + +exports[`setupSSR with browser builder should create the files correctly for ssr when app is standalone 2`] = ` +"import 'zone.js/node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; +import * as express from 'express'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import bootstrap from './src/main.server'; + +// 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(), 'dist/app1/browser'); + 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, + 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'] || 4000; + + // 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 bootstrap; +" +`; diff --git a/packages/angular/src/generators/setup-ssr/files/ngmodule/v14/src/__main__ b/packages/angular/src/generators/setup-ssr/files/ngmodule/v14/src/__main__ deleted file mode 100644 index ccb72c72f9e23..0000000000000 --- a/packages/angular/src/generators/setup-ssr/files/ngmodule/v14/src/__main__ +++ /dev/null @@ -1,11 +0,0 @@ -/*************************************************************************************************** - * Initialize the server environment - for example, adding DOM built-in types to the global scope. - * - * NOTE: - * This import must come before any imports (direct or transitive) that rely on DOM built-ins being - * available, such as `@angular/elements`. - */ -import '@angular/platform-server/init'; - -export { <%= rootModuleClassName %> } from './app/<%= rootModuleFileName.slice(0, -3) %>'; -export { renderModule } from '@angular/platform-server'; \ No newline at end of file diff --git a/packages/angular/src/generators/setup-ssr/files/base/tsconfig.server.json__tpl__ b/packages/angular/src/generators/setup-ssr/files/root/tsconfig.server.json__tpl__ similarity index 100% rename from packages/angular/src/generators/setup-ssr/files/base/tsconfig.server.json__tpl__ rename to packages/angular/src/generators/setup-ssr/files/root/tsconfig.server.json__tpl__ diff --git a/packages/angular/src/generators/setup-ssr/files/server/application-builder/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/server/application-builder/__serverFileName__ new file mode 100644 index 0000000000000..37391c4cf3e25 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/files/server/application-builder/__serverFileName__ @@ -0,0 +1,54 @@ +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; +import express from 'express'; +import { fileURLToPath } from 'node:url'; +import { dirname, join, resolve } from 'node:path'; +import <% if (standalone) { %>bootstrap<% } else { %>{ <%= rootModuleClassName %> }<% } %> from './src/<%= 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 serverDistFolder = dirname(fileURLToPath(import.meta.url)); + const browserDistFolder = resolve(serverDistFolder, '../browser'); + const indexHtml = join(serverDistFolder, 'index.server.html'); + + const commonEngine = new CommonEngine(); + + server.set('view engine', 'html'); + server.set('views', browserDistFolder); + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + server.get('*.*', express.static(browserDistFolder, { + 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: browserDistFolder, + 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}`); + }); +} diff --git a/packages/angular/src/generators/setup-ssr/files/standalone/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/server/server-builder/pre-v17/__serverFileName__ similarity index 86% rename from packages/angular/src/generators/setup-ssr/files/standalone/__serverFileName__ rename to packages/angular/src/generators/setup-ssr/files/server/server-builder/pre-v17/__serverFileName__ index c57814dc6c128..4302143d9ac57 100644 --- a/packages/angular/src/generators/setup-ssr/files/standalone/__serverFileName__ +++ b/packages/angular/src/generators/setup-ssr/files/server/server-builder/pre-v17/__serverFileName__ @@ -5,8 +5,7 @@ import {ngExpressEngine} from '@nguniversal/express-engine'; import * as express from 'express'; import {existsSync} from 'fs'; import {join} from 'path'; - -import bootstrap from './src/<%= main.slice(0, -3) %>'; +import <% if (standalone) { %>bootstrap<% } else { %>{ <%= rootModuleClassName %> }<% } %> from './src/<%= main.slice(0, -3) %>'; // The Express app is exported so that it can be used by serverless Functions. export function app(): express.Express { @@ -16,7 +15,7 @@ export function app(): express.Express { // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) server.engine('html', ngExpressEngine({ - bootstrap + bootstrap<% if (!standalone) { %>: <%= rootModuleClassName %><% } %>, })); server.set('view engine', 'html'); @@ -57,4 +56,4 @@ if (moduleFilename === __filename || moduleFilename.includes('iisnode')) { run(); } -export default bootstrap; +export <% if (standalone) { %>default bootstrap<% } else { %>* from './src/<%= main.slice(0, -3) %>'<% } %>; diff --git a/packages/angular/src/generators/setup-ssr/files/ngmodule/base/__serverFileName__ b/packages/angular/src/generators/setup-ssr/files/server/server-builder/v17+/__serverFileName__ similarity index 55% rename from packages/angular/src/generators/setup-ssr/files/ngmodule/base/__serverFileName__ rename to packages/angular/src/generators/setup-ssr/files/server/server-builder/v17+/__serverFileName__ index 5373ef943b2b3..c3e215b7c3b7f 100644 --- a/packages/angular/src/generators/setup-ssr/files/ngmodule/base/__serverFileName__ +++ b/packages/angular/src/generators/setup-ssr/files/server/server-builder/v17+/__serverFileName__ @@ -1,23 +1,21 @@ -import 'zone.js/dist/zone-node'; +import 'zone.js/node'; -import {APP_BASE_HREF} from '@angular/common'; -import {ngExpressEngine} from '@nguniversal/express-engine'; +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; import * as express from 'express'; -import {existsSync} from 'fs'; -import {join} from 'path'; - -import {<%= rootModuleClassName %>} from './src/<%= main.slice(0, -3) %>'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import <% if (standalone) { %>bootstrap<% } else { %>{ <%= rootModuleClassName %> }<% } %> from './src/<%= 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(), '<%= browserBundleOutputPath %>'); - const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index'; + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); - // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) - server.engine('html', ngExpressEngine({ - bootstrap: <%= rootModuleClassName %>, - })); + const commonEngine = new CommonEngine(); server.set('view engine', 'html'); server.set('views', distFolder); @@ -29,9 +27,20 @@ export function app(): express.Express { maxAge: '1y' })); - // All regular routes use the Universal engine - server.get('*', (req, res) => { - res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] }); + // 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; @@ -57,4 +66,4 @@ if (moduleFilename === __filename || moduleFilename.includes('iisnode')) { run(); } -export * from './src/<%= main.slice(0, -3) %>'; +export default <% if (standalone) { %>bootstrap<% } else { %><%= rootModuleClassName %><% } %>; diff --git a/packages/angular/src/generators/setup-ssr/lib/add-dependencies.ts b/packages/angular/src/generators/setup-ssr/lib/add-dependencies.ts new file mode 100644 index 0000000000000..1a08e2fb65816 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/lib/add-dependencies.ts @@ -0,0 +1,36 @@ +import { addDependenciesToPackageJson, type Tree } from '@nx/devkit'; +import { + getInstalledAngularVersionInfo, + getInstalledPackageVersionInfo, + versions, +} from '../../utils/version-utils'; + +export function addDependencies(tree: Tree): void { + const pkgVersions = versions(tree); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + + const dependencies: Record = { + '@angular/platform-server': + getInstalledPackageVersionInfo(tree, '@angular/platform-server') + ?.version ?? pkgVersions.angularVersion, + express: pkgVersions.expressVersion, + }; + const devDependencies: Record = { + '@types/express': pkgVersions.typesExpressVersion, + }; + + if (angularMajorVersion >= 17) { + dependencies['@angular/ssr'] = + getInstalledPackageVersionInfo(tree, '@angular-devkit/build-angular') + ?.version ?? pkgVersions.angularDevkitVersion; + } else { + dependencies['@nguniversal/express-engine'] = + getInstalledPackageVersionInfo(tree, '@nguniversal/express-engine') + ?.version ?? pkgVersions.ngUniversalVersion; + devDependencies['@nguniversal/builders'] = + getInstalledPackageVersionInfo(tree, '@nguniversal/builders')?.version ?? + pkgVersions.ngUniversalVersion; + } + + addDependenciesToPackageJson(tree, dependencies, devDependencies); +} 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 9aada2b97fcdb..0a87fdb9813b4 100644 --- a/packages/angular/src/generators/setup-ssr/lib/generate-files.ts +++ b/packages/angular/src/generators/setup-ssr/lib/generate-files.ts @@ -7,27 +7,28 @@ import { import { lt } from 'semver'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { Schema } from '../schema'; -import { join } from 'path'; -export function generateSSRFiles(tree: Tree, schema: Schema) { - const projectConfig = readProjectConfiguration(tree, schema.project); - const projectRoot = projectConfig.root; - const browserBundleOutputPath = - projectConfig.targets.build.options.outputPath; +export function generateSSRFiles( + tree: Tree, + schema: Schema, + isUsingApplicationBuilder: boolean +) { + const { root: projectRoot, targets } = readProjectConfiguration( + tree, + schema.project + ); + const baseOutputPath = targets.build.options.outputPath; + const browserBundleOutputPath = joinPathFragments(baseOutputPath, 'browser'); const pathToFiles = joinPathFragments(__dirname, '..', 'files'); - - generateFiles(tree, join(pathToFiles, 'base'), projectRoot, { - ...schema, - tpl: '', - }); + const { version: angularVersion, major: angularMajorVersion } = + getInstalledAngularVersionInfo(tree); if (schema.standalone) { generateFiles( tree, joinPathFragments(pathToFiles, 'standalone'), projectRoot, - { ...schema, browserBundleOutputPath, tpl: '' } ); } else { @@ -35,30 +36,31 @@ export function generateSSRFiles(tree: Tree, schema: Schema) { tree, joinPathFragments(pathToFiles, 'ngmodule', 'base'), projectRoot, - { ...schema, browserBundleOutputPath, tpl: '' } ); - const { major: angularMajorVersion, version: angularVersion } = - getInstalledAngularVersionInfo(tree); - - if (angularMajorVersion < 15) { - generateFiles( - tree, - joinPathFragments(pathToFiles, 'ngmodule', 'v14'), - projectRoot, - - { ...schema, browserBundleOutputPath, tpl: '' } - ); - } if (lt(angularVersion, '15.2.0')) { generateFiles( tree, joinPathFragments(pathToFiles, 'ngmodule', 'pre-v15-2'), projectRoot, - { ...schema, browserBundleOutputPath, tpl: '' } ); } } + + generateFiles( + tree, + joinPathFragments( + pathToFiles, + 'server', + ...(isUsingApplicationBuilder + ? ['application-builder'] + : angularMajorVersion >= 17 + ? ['server-builder', 'v17+'] + : ['server-builder', 'pre-v17']) + ), + projectRoot, + { ...schema, browserBundleOutputPath, tpl: '' } + ); } 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 new file mode 100644 index 0000000000000..1a6cdc19cdb27 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/lib/generate-server-ts-config.ts @@ -0,0 +1,43 @@ +import { + generateFiles, + readProjectConfiguration, + updateJson, + type Tree, + joinPathFragments, +} from '@nx/devkit'; +import { join } from 'path'; +import type { Schema } from '../schema'; + +export function setServerTsConfigOptionsForApplicationBuilder( + tree: Tree, + options: Schema +) { + const { targets } = readProjectConfiguration(tree, options.project); + const tsConfigPath = targets.build.options.tsConfig; + + updateJson(tree, tsConfigPath, (json) => { + json.files ??= []; + json.files.push( + joinPathFragments('src', options.main), + joinPathFragments(options.serverFileName) + ); + + json.compilerOptions ??= {}; + json.compilerOptions.types ??= []; + json.compilerOptions.types.push('node'); + + return json; + }); +} + +export function generateTsConfigServerJsonForBrowserBuilder( + tree: Tree, + options: Schema +) { + const { root } = readProjectConfiguration(tree, options.project); + + generateFiles(tree, join(__dirname, '..', 'files', 'root'), root, { + ...options, + tpl: '', + }); +} diff --git a/packages/angular/src/generators/setup-ssr/lib/index.ts b/packages/angular/src/generators/setup-ssr/lib/index.ts index f1cb83e8e5f78..b6cdbe33acdac 100644 --- a/packages/angular/src/generators/setup-ssr/lib/index.ts +++ b/packages/angular/src/generators/setup-ssr/lib/index.ts @@ -1,6 +1,9 @@ +export * from './add-dependencies'; export * from './generate-files'; +export * from './generate-server-ts-config'; export * from './normalize-options'; export * from './update-app-module'; export * from './update-project-config'; export * from './validate-options'; export * from './add-hydration'; +export * from './set-router-initial-navigation'; 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 958b16d88e077..c10ed1b57e011 100644 --- a/packages/angular/src/generators/setup-ssr/lib/normalize-options.ts +++ b/packages/angular/src/generators/setup-ssr/lib/normalize-options.ts @@ -1,10 +1,17 @@ import type { Tree } from '@nx/devkit'; import { isNgStandaloneApp } from '../../../utils/nx-devkit/ast-utils'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { Schema } from '../schema'; export function normalizeOptions(tree: Tree, options: Schema) { const isStandaloneApp = isNgStandaloneApp(tree, options.project); + let hydration = options.hydration; + if (hydration === undefined) { + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + hydration = angularMajorVersion >= 17; + } + return { project: options.project, appId: options.appId ?? 'serverApp', @@ -15,6 +22,6 @@ export function normalizeOptions(tree: Tree, options: Schema) { rootModuleClassName: options.rootModuleClassName ?? 'AppServerModule', skipFormat: options.skipFormat ?? false, standalone: options.standalone ?? isStandaloneApp, - hydration: options.hydration ?? false, + hydration, }; } 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 new file mode 100644 index 0000000000000..2866b7d1f06b8 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.spec.ts @@ -0,0 +1,138 @@ +import { addProjectConfiguration, type Tree } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { setRouterInitialNavigation } from './set-router-initial-navigation'; + +describe('setRouterInitialNavigation', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'app1', { root: 'apps/app1' }); + }); + + describe('standalone', () => { + it('should import and set "withEnabledBlockingInitialNavigation"', () => { + tree.write( + 'apps/app1/src/app.config.ts', + `import { ApplicationConfig } from '@angular/platform-browser'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes)], +}; +` + ); + + setRouterInitialNavigation(tree, { + project: 'app1', + standalone: true, + }); + + expect(tree.read('apps/app1/src/app.config.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { ApplicationConfig } from '@angular/platform-browser'; + import { provideRouter, withEnabledBlockingInitialNavigation } from '@angular/router'; + import { appRoutes } from './app.routes'; + + export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + }; + " + `); + }); + + it('should remove "withDisabledInitialNavigation"', () => { + tree.write( + 'apps/app1/src/app.config.ts', + `import { ApplicationConfig } from '@angular/platform-browser'; +import { + provideRouter, + withDisabledInitialNavigation, +} from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter( + appRoutes, + withDisabledInitialNavigation(), + )], +}; +` + ); + + setRouterInitialNavigation(tree, { + project: 'app1', + standalone: true, + }); + + expect(tree.read('apps/app1/src/app.config.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { ApplicationConfig } from '@angular/platform-browser'; + import { + provideRouter, + withEnabledBlockingInitialNavigation, + } from '@angular/router'; + import { appRoutes } from './app.routes'; + + export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + }; + " + `); + }); + }); + + describe('NgModule', () => { + it(`should set "initialNavigation: 'enabledBlocking'"`, () => { + tree.write( + 'apps/app1/src/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 { appRoutes } from './app.routes'; +import { NxWelcomeComponent } from './nx-welcome.component'; + +@NgModule({ + declarations: [AppComponent, NxWelcomeComponent], + imports: [ + BrowserModule.withServerTransition({ appId: 'serverApp' }), + RouterModule.forRoot(appRoutes), + ], + providers: [], + bootstrap: [AppComponent], +}) +export class AppModule {} +` + ); + + setRouterInitialNavigation(tree, { + project: 'app1', + standalone: false, + }); + + expect(tree.read('apps/app1/src/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.withServerTransition({ appId: 'serverApp' }), + RouterModule.forRoot(appRoutes, { initialNavigation: "enabledBlocking" }), + ], + providers: [], + bootstrap: [AppComponent], + }) + export class AppModule {} + " + `); + }); + }); +}); diff --git a/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.ts b/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.ts new file mode 100644 index 0000000000000..2e517bc2b7e8d --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/lib/set-router-initial-navigation.ts @@ -0,0 +1,242 @@ +import { + readProjectConfiguration, + visitNotIgnoredFiles, + type Tree, +} from '@nx/devkit'; +import { insertImport } from '@nx/js'; +import { tsquery } from '@phenomnomnominal/tsquery'; +import type { + CallExpression, + ImportSpecifier, + ObjectLiteralElementLike, + ObjectLiteralExpression, + Printer, + SourceFile, +} from 'typescript'; +import { + EmitHint, + createPrinter, + factory, + isCallExpression, + isIdentifier, + isPropertyAssignment, +} from 'typescript'; +import type { Schema } from '../schema'; + +export function setRouterInitialNavigation(tree: Tree, options: Schema): void { + const printer = createPrinter(); + const project = readProjectConfiguration(tree, options.project); + + visitNotIgnoredFiles(tree, project.root, (filePath) => { + // we are only interested in .ts files + if (!filePath.endsWith('.ts')) { + return; + } + + if (options.standalone) { + processFileWithStandaloneSetup(tree, filePath, printer); + } else { + processFileWithNgModuleSetup(tree, filePath, printer); + } + }); +} + +function processFileWithStandaloneSetup( + tree: Tree, + filePath: string, + printer: Printer +) { + let content = tree.read(filePath, 'utf-8'); + let sourceFile = tsquery.ast(content); + + const provideRouterCallExpression = + getProvideRouterCallExpression(sourceFile); + if (!provideRouterCallExpression) { + return; + } + + if ( + provideRouterCallExpression.arguments.some( + (arg) => + isCallExpression(arg) && + isIdentifier(arg.expression) && + arg.expression.text === 'withEnabledBlockingInitialNavigation' + ) + ) { + return; + } + + const updatedProvideRouterCallExpression = printer.printNode( + EmitHint.Unspecified, + updateProvideRouterCallExpression(provideRouterCallExpression), + sourceFile + ); + + content = `${content.slice( + 0, + provideRouterCallExpression.getStart() + )}${updatedProvideRouterCallExpression}${content.slice( + provideRouterCallExpression.getEnd() + )}`; + + tree.write(filePath, content); + + sourceFile = tsquery.ast(content); + sourceFile = insertImport( + tree, + sourceFile, + filePath, + 'withEnabledBlockingInitialNavigation', + '@angular/router' + ); + + const withDisabledInitialNavigationImportNode = tsquery( + sourceFile, + 'ImportDeclaration ImportSpecifier:has(Identifier[name=withDisabledInitialNavigation])' + )[0]; + if (!withDisabledInitialNavigationImportNode) { + return; + } + + const hasTrailingComma = + withDisabledInitialNavigationImportNode.parent.elements.hasTrailingComma; + + content = tree.read(filePath, 'utf-8'); + tree.write( + filePath, + `${content.slice( + 0, + withDisabledInitialNavigationImportNode.getStart() + )}${content.slice( + withDisabledInitialNavigationImportNode.getEnd() + + (hasTrailingComma ? 1 : 0) + )}` + ); +} + +function updateProvideRouterCallExpression( + node: CallExpression +): CallExpression { + const filteredArgs = node.arguments.filter( + (arg) => + !( + isCallExpression(arg) && + isIdentifier(arg.expression) && + arg.expression.text === 'withDisabledInitialNavigation' + ) + ); + + const initialNavigationFeatureArg = factory.createCallExpression( + factory.createIdentifier('withEnabledBlockingInitialNavigation'), + [], + [] + ); + + return factory.updateCallExpression( + node, + node.expression, + node.typeArguments, + [...filteredArgs, initialNavigationFeatureArg] + ); +} + +function processFileWithNgModuleSetup( + tree: Tree, + filePath: string, + printer: Printer +) { + const content = tree.read(filePath, 'utf-8'); + const sourceFile = tsquery.ast(content); + + const routerModuleForRootCallExpression = + getRouterModuleForRootCallExpression(sourceFile); + if (!routerModuleForRootCallExpression) { + return; + } + + const updatedRouterModuleForRootCallExpression = printer.printNode( + EmitHint.Unspecified, + updateRouterModuleForRootCallExpression(routerModuleForRootCallExpression), + sourceFile + ); + + tree.write( + filePath, + `${content.slice( + 0, + routerModuleForRootCallExpression.getStart() + )}${updatedRouterModuleForRootCallExpression}${content.slice( + routerModuleForRootCallExpression.getEnd() + )}` + ); +} + +function updateRouterModuleForRootCallExpression( + node: CallExpression +): CallExpression { + const existingOptions = node.arguments[1] as + | ObjectLiteralExpression + | undefined; + + const existingProperties = existingOptions?.properties + ? factory.createNodeArray( + existingOptions.properties.filter( + (exp) => + !( + isPropertyAssignment(exp) && + isIdentifier(exp.name) && + exp.name.text === 'initialNavigation' + ) + ) + ) + : factory.createNodeArray(); + + const enabledLiteral = factory.createStringLiteral('enabledBlocking'); + const initialNavigationProperty = factory.createPropertyAssignment( + 'initialNavigation', + enabledLiteral + ); + + const routerOptions = existingOptions + ? factory.updateObjectLiteralExpression( + existingOptions, + factory.createNodeArray([ + ...existingProperties, + initialNavigationProperty, + ]) + ) + : factory.createObjectLiteralExpression( + factory.createNodeArray([initialNavigationProperty]) + ); + const args = [node.arguments[0], routerOptions]; + + return factory.createCallExpression( + node.expression, + node.typeArguments, + args + ); +} + +function getProvideRouterCallExpression( + sourceFile: SourceFile +): CallExpression | null { + const routerModuleForRootCalls = tsquery( + sourceFile, + 'PropertyAssignment:has(Identifier[name=providers]) > ArrayLiteralExpression CallExpression:has(Identifier[name=provideRouter])', + { visitAllChildren: true } + ) as CallExpression[]; + + return routerModuleForRootCalls.length ? routerModuleForRootCalls[0] : null; +} + +function getRouterModuleForRootCallExpression( + sourceFile: SourceFile +): CallExpression | null { + const routerModuleForRootCalls = tsquery( + sourceFile, + 'Decorator > CallExpression:has(Identifier[name=NgModule]) PropertyAssignment:has(Identifier[name=imports]) > ArrayLiteralExpression CallExpression:has(Identifier[name=forRoot])', + { visitAllChildren: true } + ) as CallExpression[]; + + return routerModuleForRootCalls.length ? routerModuleForRootCalls[0] : null; +} 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 8c1dbe88ddb0b..02d56adee6337 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 @@ -10,10 +10,34 @@ import { updateNxJson, updateProjectConfiguration, } from '@nx/devkit'; +import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import type { Schema } from '../schema'; -export function updateProjectConfig(tree: Tree, schema: Schema) { - let projectConfig = readProjectConfiguration(tree, schema.project); +export function updateProjectConfigForApplicationBuilder( + tree: Tree, + options: Schema +): void { + const project = readProjectConfiguration(tree, options.project); + const buildTarget = project.targets.build; + + buildTarget.options ??= {}; + buildTarget.options.server = joinPathFragments( + project.sourceRoot ?? joinPathFragments(project.root, 'src'), + options.main + ); + buildTarget.options.prerender = true; + buildTarget.options.ssr = { + entry: joinPathFragments(project.root, options.serverFileName), + }; + + updateProjectConfiguration(tree, options.project, project); +} + +export function updateProjectConfigForBrowserBuilder( + tree: Tree, + schema: Schema +) { + const projectConfig = readProjectConfiguration(tree, schema.project); const buildTarget = projectConfig.targets.build; const baseOutputPath = buildTarget.options.outputPath; buildTarget.options.outputPath = joinPathFragments(baseOutputPath, 'browser'); @@ -39,8 +63,13 @@ export function updateProjectConfig(tree: Tree, schema: Schema) { defaultConfiguration: 'production', }; + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + projectConfig.targets['serve-ssr'] = { - executor: '@nguniversal/builders:ssr-dev-server', + executor: + angularMajorVersion >= 17 + ? '@angular-devkit/build-angular:ssr-dev-server' + : '@nguniversal/builders:ssr-dev-server', configurations: { development: { browserTarget: `${schema.project}:build:development`, @@ -55,7 +84,10 @@ export function updateProjectConfig(tree: Tree, schema: Schema) { }; projectConfig.targets.prerender = { - executor: '@nguniversal/builders:prerender', + executor: + angularMajorVersion >= 17 + ? '@angular-devkit/build-angular:prerender' + : '@nguniversal/builders:prerender', options: { routes: ['/'], }, 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 6f8128d2c2a3a..3f0e648925b43 100644 --- a/packages/angular/src/generators/setup-ssr/lib/validate-options.ts +++ b/packages/angular/src/generators/setup-ssr/lib/validate-options.ts @@ -1,19 +1,37 @@ import type { Tree } from '@nx/devkit'; -import { stripIndents } from '@nx/devkit'; -import { - validateProject, - validateStandaloneOption, -} from '../../utils/validations'; +import { readProjectConfiguration, stripIndents } from '@nx/devkit'; +import { validateProject as validateExistingProject } from '../../utils/validations'; import type { Schema } from '../schema'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import { lt } from 'semver'; export function validateOptions(tree: Tree, options: Schema): void { validateProject(tree, options.project); - validateStandaloneOption(tree, options.standalone); + validateBuildTarget(tree, options.project); validateHydrationOption(tree, options.hydration); } +function validateProject(tree: Tree, project: string): void { + validateExistingProject(tree, project); + + const { projectType } = readProjectConfiguration(tree, project); + if (projectType !== 'application') { + throw new Error( + `The "${project}" project is not an application. Only application projects are supported by the "setup-ssr" generator.` + ); + } +} + +function validateBuildTarget(tree: Tree, project: string): void { + const { targets } = readProjectConfiguration(tree, project); + + if (!targets?.build) { + throw new Error( + `The "${project}" project does not have a "build" target. Please add a "build" target.` + ); + } +} + function validateHydrationOption(tree: Tree, hydration: boolean): void { if (!hydration) { return; diff --git a/packages/angular/src/generators/setup-ssr/schema.json b/packages/angular/src/generators/setup-ssr/schema.json index a13fb1ec9a55f..4a569f33d5d67 100644 --- a/packages/angular/src/generators/setup-ssr/schema.json +++ b/packages/angular/src/generators/setup-ssr/schema.json @@ -19,7 +19,7 @@ "appId": { "type": "string", "format": "html-selector", - "description": "The `appId` to use with `withServerTransition`. _Note: This is only used in Angular versions <16.0.0. It's deprecated since Angular 16._", + "description": "The `appId` to use with `withServerTransition`. _Note: This is only used in Angular versions <16.0.0. It's deprecated since Angular 16 and not supported since Angular 17._", "default": "serverApp" }, "main": { @@ -51,11 +51,11 @@ }, "standalone": { "type": "boolean", - "description": "Use Standalone Components to bootstrap SSR. _Note: This is only supported in Angular versions >= 14.1.0_." + "description": "Use Standalone Components to bootstrap SSR." }, "hydration": { "type": "boolean", - "description": "Set up Hydration for the SSR application. _Note: This is only supported in Angular versions >= 16.0.0_." + "description": "Set up Hydration for the SSR application. It defaults to `true` for Angular versions >= 17.0.0. Otherwise, it defaults to `false`. _Note: This is only supported in Angular versions >= 16.0.0_." }, "skipFormat": { "type": "boolean", 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 9695086801c09..ece4ee2a2f009 100644 --- a/packages/angular/src/generators/setup-ssr/setup-ssr.spec.ts +++ b/packages/angular/src/generators/setup-ssr/setup-ssr.spec.ts @@ -3,208 +3,325 @@ import { readJson, readProjectConfiguration, updateJson, - updateProjectConfiguration, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { PackageJson } from 'nx/src/utils/package-json'; -import { angularVersion, ngUniversalVersion } from '../../utils/versions'; +import { backwardCompatibleVersions } from '../../utils/backward-compatible-versions'; +import { + angularDevkitVersion, + angularVersion, + expressVersion, + typesExpressVersion, +} from '../../utils/versions'; import { generateTestApplication } from '../utils/testing'; import { setupSsr } from './setup-ssr'; describe('setupSSR', () => { - it('should create the files correctly for ssr', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + describe('with application builder', () => { + it('should create the files correctly for ssr', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { + name: 'app1', + standalone: false, + }); - await generateTestApplication(tree, { - name: 'app1', + // ACT + await setupSsr(tree, { project: 'app1' }); + + // ASSERT + expect( + readProjectConfiguration(tree, 'app1').targets.build + ).toMatchSnapshot(); + expect(tree.read('app1/server.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('app1/src/main.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "export { AppServerModule } from './app/app.server.module'; + " + `); + expect(tree.read('app1/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)); + " + `); + 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', + 'server.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 { AppModule } from './app.module'; + import { AppComponent } from './app.component'; + + @NgModule({ + imports: [AppModule, ServerModule], + bootstrap: [AppComponent], + }) + export class AppServerModule {} + " + `); + expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { + BrowserModule, + provideClientHydration, + } 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: [provideClientHydration()], + bootstrap: [AppComponent], + }) + export class AppModule {} + " + `); + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults.server).toBeUndefined(); }); - // ACT - await setupSsr(tree, { project: 'app1' }); + it('should create the files correctly for ssr when app is standalone', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { name: 'app1' }); - // ASSERT - expect( - readProjectConfiguration(tree, 'app1').targets.server - ).toMatchSnapshot(); - expect(tree.read('app1/server.ts', 'utf-8')).toMatchSnapshot(); - expect(tree.read('app1/src/main.server.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "export { AppServerModule } from './app/app.server.module'; - " - `); - expect(tree.read('app1/src/main.ts', 'utf-8')).toMatchInlineSnapshot(` - "import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - import { AppModule } from './app/app.module'; + // ACT + await setupSsr(tree, { project: 'app1' }); - platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); - " - `); - expect(tree.read('app1/tsconfig.server.json', 'utf-8')) - .toMatchInlineSnapshot(` - "/* To learn more about this file see: https://angular.io/config/tsconfig. */ - { - "extends": "./tsconfig.app.json", - "compilerOptions": { - "outDir": "../../out-tsc/server", - "target": "es2019", - "types": ["node"] - }, - "files": ["src/main.server.ts", "server.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'; + // ASSERT + expect( + readProjectConfiguration(tree, 'app1').targets.build + ).toMatchSnapshot(); + expect(tree.read('app1/server.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('app1/src/main.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { bootstrapApplication } from '@angular/platform-browser'; + import { AppComponent } from './app/app.component'; + import { config } from './app/app.config.server'; - import { AppModule } from './app.module'; - import { AppComponent } from './app.component'; + const bootstrap = () => bootstrapApplication(AppComponent, config); - @NgModule({ - imports: [AppModule, ServerModule], - bootstrap: [AppComponent], - }) - export class AppServerModule {} - " - `); - expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "import { NgModule } from '@angular/core'; - import { BrowserModule } from '@angular/platform-browser'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; + 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', + 'server.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 { appConfig } from './app.config'; - @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], - }) - export class AppModule {} - " - `); - const packageJson = readJson(tree, 'package.json'); - const dependencies = { - '@nguniversal/express-engine': ngUniversalVersion, - '@angular/platform-server': angularVersion, - }; - for (const [dep, version] of Object.entries(dependencies)) { - expect(packageJson.dependencies[dep]).toEqual(version); - } - const devDeps = { - '@nguniversal/builders': ngUniversalVersion, - }; - for (const [dep, version] of Object.entries(devDeps)) { - expect(packageJson.devDependencies[dep]).toEqual(version); - } - const nxJson = readJson(tree, 'nx.json'); - expect(nxJson.targetDefaults.server.cache).toBe(true); + const serverConfig: ApplicationConfig = { + providers: [provideServerRendering()], + }; + + export const config = mergeApplicationConfig(appConfig, serverConfig); + " + `); + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults.server).toBeUndefined(); + }); }); - it('should use fileReplacements if they already exist', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + describe('with browser builder', () => { + it('should create the files correctly for ssr', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { + name: 'app1', + standalone: false, + bundler: 'webpack', + }); - await generateTestApplication(tree, { - name: 'app1', + // ACT + await setupSsr(tree, { project: 'app1' }); + + // ASSERT + expect( + readProjectConfiguration(tree, 'app1').targets.server + ).toMatchSnapshot(); + expect(tree.read('app1/server.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('app1/src/main.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "export { AppServerModule } from './app/app.server.module'; + " + `); + expect(tree.read('app1/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)); + " + `); + expect(tree.read('app1/tsconfig.server.json', 'utf-8')) + .toMatchInlineSnapshot(` + "/* To learn more about this file see: https://angular.io/config/tsconfig. */ + { + "extends": "./tsconfig.app.json", + "compilerOptions": { + "outDir": "../../out-tsc/server", + "target": "es2019", + "types": ["node"] + }, + "files": ["src/main.server.ts", "server.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 { AppModule } from './app.module'; + import { AppComponent } from './app.component'; + + @NgModule({ + imports: [AppModule, ServerModule], + bootstrap: [AppComponent], + }) + export class AppServerModule {} + " + `); + expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { NgModule } from '@angular/core'; + import { + BrowserModule, + provideClientHydration, + } 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: [provideClientHydration()], + bootstrap: [AppComponent], + }) + export class AppModule {} + " + `); + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults.server.cache).toBe(true); }); - tree.write('app1/src/environments/environment.ts', ''); - tree.write('app1/src/environments/environment.prod.ts', ''); - const project = readProjectConfiguration(tree, 'app1'); - project.targets.build.configurations.production.fileReplacements = [ - { - replace: 'app1/src/environments/environment.ts', - with: 'app1/src/environments/environment.prod.ts', - }, - ]; - updateProjectConfiguration(tree, 'app1', project); + it('should create the files correctly for ssr when app is standalone', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { + name: 'app1', + bundler: 'webpack', + }); - // ACT - await setupSsr(tree, { project: 'app1' }); + // ACT + await setupSsr(tree, { project: 'app1' }); - // ASSERT - expect( - readProjectConfiguration(tree, 'app1').targets.server - ).toMatchSnapshot(); - }); + // ASSERT + expect( + readProjectConfiguration(tree, 'app1').targets.server + ).toMatchSnapshot(); + expect(tree.read('app1/server.ts', 'utf-8')).toMatchSnapshot(); + expect(tree.read('app1/src/main.server.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { bootstrapApplication } from '@angular/platform-browser'; + import { AppComponent } from './app/app.component'; + import { config } from './app/app.config.server'; - it('should create the files correctly for ssr when app is standalone', async () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const bootstrap = () => bootstrapApplication(AppComponent, config); - await generateTestApplication(tree, { - name: 'app1', - standalone: true, - }); + export default bootstrap; + " + `); + expect(tree.read('app1/tsconfig.server.json', 'utf-8')) + .toMatchInlineSnapshot(` + "/* To learn more about this file see: https://angular.io/config/tsconfig. */ + { + "extends": "./tsconfig.app.json", + "compilerOptions": { + "outDir": "../../out-tsc/server", + "target": "es2019", + "types": ["node"] + }, + "files": ["src/main.server.ts", "server.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 { appConfig } from './app.config'; - // ACT - await setupSsr(tree, { project: 'app1' }); + const serverConfig: ApplicationConfig = { + providers: [provideServerRendering()], + }; - // ASSERT - expect( - readProjectConfiguration(tree, 'app1').targets.server - ).toMatchSnapshot(); - expect(tree.read('app1/server.ts', 'utf-8')).toMatchSnapshot(); - expect(tree.read('app1/src/main.server.ts', 'utf-8')) - .toMatchInlineSnapshot(` - "import { bootstrapApplication } from '@angular/platform-browser'; - import { AppComponent } from './app/app.component'; - import { config } from './app/app.config.server'; + export const config = mergeApplicationConfig(appConfig, serverConfig); + " + `); + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults.server.cache).toEqual(true); + }); - const bootstrap = () => bootstrapApplication(AppComponent, config); + it('should update build target output path', async () => { + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { + name: 'app1', + standalone: false, + bundler: 'webpack', + }); + // verify default output path + expect( + readProjectConfiguration(tree, 'app1').targets.build.options.outputPath + ).toBe('dist/app1'); - export default bootstrap; - " - `); - expect(tree.read('app1/tsconfig.server.json', 'utf-8')) - .toMatchInlineSnapshot(` - "/* To learn more about this file see: https://angular.io/config/tsconfig. */ - { - "extends": "./tsconfig.app.json", - "compilerOptions": { - "outDir": "../../out-tsc/server", - "target": "es2019", - "types": ["node"] - }, - "files": ["src/main.server.ts", "server.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 { appConfig } from './app.config'; + await setupSsr(tree, { project: 'app1' }); - const serverConfig: ApplicationConfig = { - providers: [provideServerRendering()], - }; + expect( + readProjectConfiguration(tree, 'app1').targets.build.options.outputPath + ).toBe('dist/app1/browser'); + }); + }); - export const config = mergeApplicationConfig(appConfig, serverConfig); - " - `); + it('should install the correct dependencies', async () => { + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { name: 'app1' }); + + await setupSsr(tree, { project: 'app1' }); - const packageJson = readJson(tree, 'package.json'); - const dependencies = { - '@nguniversal/express-engine': ngUniversalVersion, - '@angular/platform-server': angularVersion, - }; - for (const [dep, version] of Object.entries(dependencies)) { - expect(packageJson.dependencies[dep]).toEqual(version); - } - const devDeps = { - '@nguniversal/builders': ngUniversalVersion, - }; - for (const [dep, version] of Object.entries(devDeps)) { - expect(packageJson.devDependencies[dep]).toEqual(version); - } - const nxJson = readJson(tree, 'nx.json'); - expect(nxJson.targetDefaults.server.cache).toEqual(true); + const { dependencies, devDependencies } = readJson( + tree, + 'package.json' + ); + expect(dependencies['@angular/platform-server']).toEqual(angularVersion); + expect(dependencies['@angular/ssr']).toEqual(angularDevkitVersion); + expect(dependencies['express']).toEqual(expressVersion); + expect(dependencies['@nguniversal/express-engine']).toBeUndefined(); + expect(devDependencies['@types/express']).toBe(typesExpressVersion); + expect(devDependencies['@nguniversal/builders']).toBeUndefined(); }); it('should add hydration correctly for NgModule apps', async () => { @@ -213,6 +330,7 @@ describe('setupSSR', () => { await generateTestApplication(tree, { name: 'app1', + standalone: false, }); // ACT @@ -226,12 +344,14 @@ describe('setupSSR', () => { BrowserModule, provideClientHydration, } 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], + imports: [BrowserModule, RouterModule.forRoot(appRoutes)], providers: [provideClientHydration()], bootstrap: [AppComponent], }) @@ -246,7 +366,6 @@ describe('setupSSR', () => { await generateTestApplication(tree, { name: 'app1', - standalone: true, }); // ACT @@ -256,10 +375,12 @@ describe('setupSSR', () => { expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) .toMatchInlineSnapshot(` "import { ApplicationConfig } 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()], + providers: [provideClientHydration(), provideRouter(appRoutes)], }; " `); @@ -279,6 +400,61 @@ describe('setupSSR', () => { `); }); + it('should set "initialNavigation: enabledBlocking" in "RouterModule.forRoot" options when hydration=false', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { + name: 'app1', + standalone: false, + }); + + await setupSsr(tree, { project: 'app1', hydration: false }); + + expect(tree.read('app1/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, { initialNavigation: 'enabledBlocking' }), + ], + providers: [], + bootstrap: [AppComponent], + }) + export class AppModule {} + " + `); + }); + + it('should set "withEnabledBlockingInitialNavigation()" in "provideRouter" features when hydration=false', async () => { + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { name: 'app1' }); + + await setupSsr(tree, { project: 'app1', hydration: false }); + + expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { ApplicationConfig } from '@angular/core'; + import { + provideRouter, + withEnabledBlockingInitialNavigation, + } from '@angular/router'; + import { appRoutes } from './app.routes'; + + export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + }; + " + `); + }); + describe('compat', () => { it('should install the correct versions when using older versions of Angular', async () => { // ARRANGE @@ -286,12 +462,13 @@ describe('setupSSR', () => { await generateTestApplication(tree, { name: 'app1', + standalone: false, }); updateJson(tree, 'package.json', (json) => ({ ...json, dependencies: { - '@angular/core': '14.2.0', + '@angular/core': '15.2.0', }, })); @@ -300,50 +477,59 @@ describe('setupSSR', () => { // ASSERT const pkgJson = readJson(tree, 'package.json'); + expect(pkgJson.dependencies['@angular/ssr']).toBeUndefined(); expect(pkgJson.dependencies['@angular/platform-server']).toEqual( - '~14.2.0' + backwardCompatibleVersions.angularV15.angularVersion ); expect(pkgJson.dependencies['@nguniversal/express-engine']).toEqual( - '~14.2.0' + backwardCompatibleVersions.angularV15.ngUniversalVersion ); expect(pkgJson.devDependencies['@nguniversal/builders']).toEqual( - '~14.2.0' + backwardCompatibleVersions.angularV15.ngUniversalVersion ); }); - it('should create the main.server.ts file correctly for Angular v14', async () => { + it('should add "withServerTransition" call to app module for angular versions lower than 16', async () => { // ARRANGE const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - await generateTestApplication(tree, { - name: 'app1', - }); updateJson(tree, 'package.json', (json) => ({ ...json, - dependencies: { '@angular/core': '14.2.0' }, + dependencies: { ...json.dependencies, '@angular/core': '^15.2.0' }, })); + await generateTestApplication(tree, { + name: 'app1', + standalone: false, + }); + // ACT await setupSsr(tree, { project: 'app1' }); // ASSERT - expect(tree.read('app1/src/main.server.ts', 'utf-8')) + expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) .toMatchInlineSnapshot(` - "/*************************************************************************************************** - * Initialize the server environment - for example, adding DOM built-in types to the global scope. - * - * NOTE: - * This import must come before any imports (direct or transitive) that rely on DOM built-ins being - * available, such as \`@angular/elements\`. - */ - import '@angular/platform-server/init'; - - export { AppServerModule } from './app/app.server.module'; - export { renderModule } from '@angular/platform-server'; + "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.withServerTransition({ appId: 'serverApp' }), + RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + ], + providers: [], + bootstrap: [AppComponent], + }) + export class AppModule {} " `); }); - it('should add "withServerTransition" call to app module for angular versions lower than 16', async () => { + it('should set "initialNavigation: enabledBlocking" in "RouterModule.forRoot" options', async () => { // ARRANGE const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); updateJson(tree, 'package.json', (json) => ({ @@ -353,6 +539,7 @@ describe('setupSSR', () => { await generateTestApplication(tree, { name: 'app1', + standalone: false, }); // ACT @@ -361,20 +548,55 @@ describe('setupSSR', () => { // ASSERT expect(tree.read('app1/src/app/app.module.ts', 'utf-8')) .toMatchInlineSnapshot(` - "import { NgModule } from '@angular/core'; - import { BrowserModule } from '@angular/platform-browser'; - import { AppComponent } from './app.component'; - import { NxWelcomeComponent } from './nx-welcome.component'; - - @NgModule({ - declarations: [AppComponent, NxWelcomeComponent], - imports: [BrowserModule.withServerTransition({ appId: 'serverApp' })], - providers: [], - bootstrap: [AppComponent], - }) - export class AppModule {} - " - `); + "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.withServerTransition({ appId: 'serverApp' }), + RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + ], + providers: [], + bootstrap: [AppComponent], + }) + export class AppModule {} + " + `); + }); + + it('should set "withEnabledBlockingInitialNavigation()" in "provideRouter" features', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { ...json.dependencies, '@angular/core': '^15.2.0' }, + })); + + await generateTestApplication(tree, { name: 'app1' }); + + // ACT + await setupSsr(tree, { project: 'app1' }); + + // ASSERT + expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { ApplicationConfig } from '@angular/platform-browser'; + import { + provideRouter, + withEnabledBlockingInitialNavigation, + } from '@angular/router'; + import { appRoutes } from './app.routes'; + + export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + }; + " + `); }); it('should wrap bootstrap call for Angular versions lower than 15.2', async () => { @@ -382,6 +604,7 @@ describe('setupSSR', () => { const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); await generateTestApplication(tree, { name: 'app1', + standalone: false, }); updateJson(tree, 'package.json', (json) => ({ ...json, @@ -410,5 +633,51 @@ describe('setupSSR', () => { " `); }); + + it('should generate a correct server.ts', async () => { + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + '@angular/core': '15.2.0', + }, + })); + await generateTestApplication(tree, { + name: 'app1', + standalone: false, + }); + + await setupSsr(tree, { project: 'app1' }); + + expect(tree.read('app1/server.ts', 'utf-8')).toMatchSnapshot(); + }); + + it('should not set up hydration by default', async () => { + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + updateJson(tree, 'package.json', (json) => ({ + ...json, + dependencies: { + '@angular/core': '15.2.0', + }, + })); + await generateTestApplication(tree, { name: 'app1' }); + + await setupSsr(tree, { project: 'app1' }); + + expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { ApplicationConfig } from '@angular/platform-browser'; + import { + provideRouter, + withEnabledBlockingInitialNavigation, + } from '@angular/router'; + import { appRoutes } from './app.routes'; + + export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())], + }; + " + `); + }); }); }); diff --git a/packages/angular/src/generators/setup-ssr/setup-ssr.ts b/packages/angular/src/generators/setup-ssr/setup-ssr.ts index 2d55c73b91946..2229346471af6 100644 --- a/packages/angular/src/generators/setup-ssr/setup-ssr.ts +++ b/packages/angular/src/generators/setup-ssr/setup-ssr.ts @@ -1,19 +1,21 @@ import type { Tree } from '@nx/devkit'; import { - addDependenciesToPackageJson, formatFiles, installPackagesTask, + readProjectConfiguration, } from '@nx/devkit'; +import { getInstalledAngularVersionInfo } from '../utils/version-utils'; import { - getInstalledPackageVersionInfo, - versions, -} from '../utils/version-utils'; -import { + addDependencies, addHydration, generateSSRFiles, + generateTsConfigServerJsonForBrowserBuilder, normalizeOptions, + setRouterInitialNavigation, + setServerTsConfigOptionsForApplicationBuilder, updateAppModule, - updateProjectConfig, + updateProjectConfigForApplicationBuilder, + updateProjectConfigForBrowserBuilder, validateOptions, } from './lib'; import type { Schema } from './schema'; @@ -22,35 +24,32 @@ export async function setupSsr(tree: Tree, schema: Schema) { validateOptions(tree, schema); const options = normalizeOptions(tree, schema); - updateProjectConfig(tree, options); - generateSSRFiles(tree, options); + const { targets } = readProjectConfiguration(tree, options.project); + const isUsingApplicationBuilder = + targets.build.executor === '@angular-devkit/build-angular:application'; + + addDependencies(tree); + generateSSRFiles(tree, options, isUsingApplicationBuilder); if (!options.standalone) { updateAppModule(tree, options); } - if (options.hydration) { addHydration(tree, options); } - const pkgVersions = versions(tree); + const { major: angularMajorVersion } = getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 17 || !options.hydration) { + setRouterInitialNavigation(tree, options); + } - addDependenciesToPackageJson( - tree, - { - '@nguniversal/express-engine': - getInstalledPackageVersionInfo(tree, '@nguniversal/express-engine') - ?.version ?? pkgVersions.ngUniversalVersion, - '@angular/platform-server': - getInstalledPackageVersionInfo(tree, '@angular/platform-server') - ?.version ?? pkgVersions.angularVersion, - }, - { - '@nguniversal/builders': - getInstalledPackageVersionInfo(tree, '@nguniversal/builders') - ?.version ?? pkgVersions.ngUniversalVersion, - } - ); + if (isUsingApplicationBuilder) { + updateProjectConfigForApplicationBuilder(tree, options); + setServerTsConfigOptionsForApplicationBuilder(tree, options); + } else { + updateProjectConfigForBrowserBuilder(tree, options); + generateTsConfigServerJsonForBrowserBuilder(tree, options); + } if (!options.skipFormat) { await formatFiles(tree); diff --git a/packages/angular/src/generators/setup-tailwind/__snapshots__/setup-tailwind.application.spec.ts.snap b/packages/angular/src/generators/setup-tailwind/__snapshots__/setup-tailwind.application.spec.ts.snap index 73d6639678152..7f8b05dada36f 100644 --- a/packages/angular/src/generators/setup-tailwind/__snapshots__/setup-tailwind.application.spec.ts.snap +++ b/packages/angular/src/generators/setup-tailwind/__snapshots__/setup-tailwind.application.spec.ts.snap @@ -40,44 +40,3 @@ p { } " `; - -exports[`setupTailwind generator support angular v14 application should add tailwind styles to "apps/app1/src/styles.css" when not provided 1`] = ` -"@tailwind base; -@tailwind components; -@tailwind utilities; - -p { - margin: 0; -} -" -`; - -exports[`setupTailwind generator support angular v14 application should add tailwind styles to "apps/app1/src/styles.less" when not provided 1`] = ` -"@tailwind base; -@tailwind components; -@tailwind utilities; - -p { - margin: 0; -} -" -`; - -exports[`setupTailwind generator support angular v14 application should add tailwind styles to "apps/app1/src/styles.sass" when not provided 1`] = ` -"@tailwind base; -@tailwind components; -@tailwind utilities; - -p { margin: 0; }" -`; - -exports[`setupTailwind generator support angular v14 application should add tailwind styles to "apps/app1/src/styles.scss" when not provided 1`] = ` -"@tailwind base; -@tailwind components; -@tailwind utilities; - -p { - margin: 0; -} -" -`; diff --git a/packages/angular/src/generators/setup-tailwind/setup-tailwind.application.spec.ts b/packages/angular/src/generators/setup-tailwind/setup-tailwind.application.spec.ts index 0c8fef7ffe173..3b3f100d85b1c 100644 --- a/packages/angular/src/generators/setup-tailwind/setup-tailwind.application.spec.ts +++ b/packages/angular/src/generators/setup-tailwind/setup-tailwind.application.spec.ts @@ -4,7 +4,6 @@ import { readJson, readProjectConfiguration, Tree, - updateJson, updateProjectConfiguration, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -441,429 +440,4 @@ describe('setupTailwind generator', () => { expect(devkit.formatFiles).not.toHaveBeenCalled(); }); }); - - describe('support angular v14', () => { - beforeEach(() => { - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - }, - })); - }); - - describe('application', () => { - const project = 'app1'; - - beforeEach(() => { - addProjectConfiguration(tree, project, { - name: project, - projectType: 'application', - root: `apps/${project}`, - sourceRoot: `apps/${project}/src`, - }); - }); - - it('should throw when tailwind is installed as a dependency with a version lower than 2.0.0', async () => { - tree.write( - 'package.json', - JSON.stringify({ dependencies: { tailwindcss: '^1.99.99' } }) - ); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - `Tailwind CSS version "^1.99.99" is not supported. Please upgrade to v2.0.0 or higher.` - ); - }); - - it('should throw when tailwind is installed as a devDependency with a version lower than 2.0.0', async () => { - tree.write( - 'package.json', - JSON.stringify({ devDependencies: { tailwindcss: '^1.99.99' } }) - ); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - `Tailwind CSS version "^1.99.99" is not supported. Please upgrade to v2.0.0 or higher.` - ); - }); - - it('should throw when there is a tailwind.config.js file in the project', async () => { - tree.write(`apps/${project}/tailwind.config.js`, ''); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `The "tailwind.config.js" file already exists in the project "${project}". Are you sure this is the right project to set up Tailwind?` - ), - }) - ); - }); - - it('should throw when the provided styles entry point is not found', async () => { - const stylesEntryPoint = `apps/${project}/src/foo.scss`; - - await expect( - setupTailwindGenerator(tree, { project, stylesEntryPoint }) - ).rejects.toThrow( - `The provided styles entry point "${stylesEntryPoint}" could not be found.` - ); - }); - - it('should throw when the styles entry point is not provided and it is not found', async () => { - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `Could not find a styles entry point for project "${project}"` - ), - }) - ); - }); - - it('should throw when styles is not configured in the build config', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:webpack-browser', - options: {}, - }, - }; - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `Could not find a styles entry point for project "${project}"` - ), - }) - ); - }); - - it('should throw when the styles configured in the build config do not exist', async () => { - const stylesEntryPoint = `apps/${project}/src/custom-styles-entry-point.scss`; - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:webpack-browser', - options: { - styles: ['node_modules/awesome-ds/styles.css', stylesEntryPoint], - }, - }, - }; - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `Could not find a styles entry point for project "${project}"` - ), - }) - ); - }); - - it('should throw when no styles within the project root are configured in the build config', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:webpack-browser', - options: { - styles: ['node_modules/awesome-ds/styles.css'], - }, - }, - }; - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `Could not find a styles entry point for project "${project}"` - ), - }) - ); - }); - - it('should throw when the style inside the project root specified in the build config as an object has "inject: false"', async () => { - const stylesEntryPoint = `apps/${project}/src/custom-styles-entry-point.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:webpack-browser', - options: { - styles: [ - 'node_modules/awesome-ds/styles.css', - { - bundleName: 'styles.css', - input: stylesEntryPoint, - inject: false, - }, - ], - }, - }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `Could not find a styles entry point for project "${project}"` - ), - }) - ); - }); - - it('should add tailwind styles to provided styles entry point', async () => { - const stylesEntryPoint = `apps/${project}/src/custom-styles-entry-point.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - - await setupTailwindGenerator(tree, { project, stylesEntryPoint }); - - expect(tree.read(stylesEntryPoint, 'utf-8')).toMatchInlineSnapshot(` - "@tailwind base; - @tailwind components; - @tailwind utilities; - - p { - margin: 0; - } - " - `); - }); - - it.each([ - `apps/${project}/src/styles.css`, - `apps/${project}/src/styles.scss`, - `apps/${project}/src/styles.sass`, - `apps/${project}/src/styles.less`, - ])( - 'should add tailwind styles to "%s" when not provided', - async (stylesEntryPoint) => { - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - - await setupTailwindGenerator(tree, { project }); - - expect(tree.read(stylesEntryPoint, 'utf-8')).toMatchSnapshot(); - } - ); - - it('should add tailwind styles to the first style inside the project root specified in the build config as a string', async () => { - const stylesEntryPoint = `apps/${project}/src/custom-styles-entry-point.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:webpack-browser', - options: { - styles: ['node_modules/awesome-ds/styles.css', stylesEntryPoint], - }, - }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project }); - - expect(tree.read(stylesEntryPoint, 'utf-8')).toMatchInlineSnapshot(` - "@tailwind base; - @tailwind components; - @tailwind utilities; - - p { - margin: 0; - } - " - `); - }); - - it('should add tailwind styles to the first style inside the project root specified in the build config as an object when inject is not specified', async () => { - const stylesEntryPoint = `apps/${project}/src/custom-styles-entry-point.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:webpack-browser', - options: { - styles: [ - 'node_modules/awesome-ds/styles.css', - { - bundleName: 'styles.css', - input: stylesEntryPoint, - }, - ], - }, - }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project }); - - expect(tree.read(stylesEntryPoint, 'utf-8')).toMatchInlineSnapshot(` - "@tailwind base; - @tailwind components; - @tailwind utilities; - - p { - margin: 0; - } - " - `); - }); - - it('should add tailwind styles to the first style inside the project root specified in the build config as an object when "inject: true"', async () => { - const stylesEntryPoint = `apps/${project}/src/custom-styles-entry-point.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:webpack-browser', - options: { - styles: [ - 'node_modules/awesome-ds/styles.css', - { - bundleName: 'styles.css', - input: stylesEntryPoint, - inject: true, - }, - ], - }, - }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project }); - - expect(tree.read(stylesEntryPoint, 'utf-8')).toMatchInlineSnapshot(` - "@tailwind base; - @tailwind components; - @tailwind utilities; - - p { - margin: 0; - } - " - `); - }); - - it('should add required packages', async () => { - const stylesEntryPoint = `apps/${project}/src/styles.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - - await setupTailwindGenerator(tree, { project, stylesEntryPoint }); - - const { devDependencies } = readJson(tree, 'package.json'); - expect(devDependencies.tailwindcss).toBe(tailwindVersion); - expect(devDependencies.autoprefixer).toBe(autoprefixerVersion); - expect(devDependencies.postcss).toBe(postcssVersion); - }); - - it('should generate the tailwind.config.js file in the project root with the config for v3 by default', async () => { - const stylesEntryPoint = `apps/${project}/src/styles.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - - await setupTailwindGenerator(tree, { project, stylesEntryPoint }); - - expect(tree.read(`apps/${project}/tailwind.config.js`, 'utf-8')) - .toMatchInlineSnapshot(` - "const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); - const { join } = require('path'); - - /** @type {import('tailwindcss').Config} */ - module.exports = { - content: [ - join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), - ...createGlobPatternsForDependencies(__dirname), - ], - theme: { - extend: {}, - }, - plugins: [], - }; - " - `); - }); - - it('should generate the tailwind.config.js file in the project root with the config for v3 when a version greater than 3 is installed', async () => { - const stylesEntryPoint = `apps/${project}/src/styles.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - tree.write( - 'package.json', - JSON.stringify({ devDependencies: { tailwindcss: '^3.0.1' } }) - ); - - await setupTailwindGenerator(tree, { project, stylesEntryPoint }); - - expect(tree.read(`apps/${project}/tailwind.config.js`, 'utf-8')) - .toMatchInlineSnapshot(` - "const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); - const { join } = require('path'); - - /** @type {import('tailwindcss').Config} */ - module.exports = { - content: [ - join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), - ...createGlobPatternsForDependencies(__dirname), - ], - theme: { - extend: {}, - }, - plugins: [], - }; - " - `); - }); - - it('should generate the tailwind.config.js file in the project root with the config for v2 when a version greater than 2 and lower than 3 is installed', async () => { - const stylesEntryPoint = `apps/${project}/src/styles.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - tree.write( - 'package.json', - JSON.stringify({ devDependencies: { tailwindcss: '~2.0.0' } }) - ); - - await setupTailwindGenerator(tree, { project, stylesEntryPoint }); - - expect(tree.read(`apps/${project}/tailwind.config.js`, 'utf-8')) - .toMatchInlineSnapshot(` - "const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); - const { join } = require('path'); - - module.exports = { - mode: 'jit', - purge: [ - join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), - ...createGlobPatternsForDependencies(__dirname), - ], - darkMode: false, // or 'media' or 'class' - theme: { - extend: {}, - }, - variants: { - extend: {}, - }, - plugins: [], - }; - " - `); - }); - - it('should format files', async () => { - const stylesEntryPoint = `apps/${project}/src/styles.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - jest.spyOn(devkit, 'formatFiles'); - - await setupTailwindGenerator(tree, { project, stylesEntryPoint }); - - expect(devkit.formatFiles).toHaveBeenCalled(); - }); - - it('should not format files when "skipFormat: true"', async () => { - const stylesEntryPoint = `apps/${project}/src/styles.scss`; - tree.write(stylesEntryPoint, 'p { margin: 0; }'); - jest.spyOn(devkit, 'formatFiles'); - - await setupTailwindGenerator(tree, { - project, - stylesEntryPoint, - skipFormat: true, - }); - - expect(devkit.formatFiles).not.toHaveBeenCalled(); - }); - }); - }); }); diff --git a/packages/angular/src/generators/setup-tailwind/setup-tailwind.library.spec.ts b/packages/angular/src/generators/setup-tailwind/setup-tailwind.library.spec.ts index 2cd30a6277085..08e746cf3835d 100644 --- a/packages/angular/src/generators/setup-tailwind/setup-tailwind.library.spec.ts +++ b/packages/angular/src/generators/setup-tailwind/setup-tailwind.library.spec.ts @@ -4,7 +4,6 @@ import { readJson, readProjectConfiguration, Tree, - updateJson, updateProjectConfiguration, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; @@ -312,300 +311,4 @@ describe('setupTailwind generator', () => { expect(devkit.formatFiles).not.toHaveBeenCalled(); }); }); - - describe('support angular v14', () => { - beforeEach(() => { - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - '@angular/core': '14.1.0', - }, - })); - }); - - describe('libraries', () => { - const project = 'lib1'; - - beforeEach(() => { - addProjectConfiguration(tree, project, { - name: project, - projectType: 'library', - root: `libs/${project}`, - sourceRoot: `libs/${project}/src`, - }); - }); - - it('should throw when tailwind is installed as a dependency with a version lower than 2.0.0', async () => { - tree.write( - 'package.json', - JSON.stringify({ dependencies: { tailwindcss: '^1.99.99' } }) - ); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - `Tailwind CSS version "^1.99.99" is not supported. Please upgrade to v2.0.0 or higher.` - ); - }); - - it('should throw when tailwind is installed as a devDependency with a version lower than 2.0.0', async () => { - tree.write( - 'package.json', - JSON.stringify({ devDependencies: { tailwindcss: '^1.99.99' } }) - ); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - `Tailwind CSS version "^1.99.99" is not supported. Please upgrade to v2.0.0 or higher.` - ); - }); - - it('should throw when the build target is not found', async () => { - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `The target "build" was not found for project "${project}".` - ), - }) - ); - }); - - it('should throw when the specified build target is not found', async () => { - await expect( - setupTailwindGenerator(tree, { project, buildTarget: 'custom-build' }) - ).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `The target "custom-build" was not found for project "${project}".` - ), - }) - ); - }); - - it('should throw when the build target is using an unsupported executor', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@angular/build-angular:browser', - options: {}, - }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `The build target for project "${project}" is using an unsupported executor "@angular/build-angular:browser".` - ), - }) - ); - }); - - it('should throw when the tailwind config is configured in the build target and the file it points to exists', async () => { - const tailwindConfig = `libs/${project}/my-tailwind.config.js`; - let projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { - executor: '@nx/angular:package', - options: { tailwindConfig }, - }, - }; - updateProjectConfiguration(tree, project, projectConfig); - tree.write(tailwindConfig, ''); - - await expect(setupTailwindGenerator(tree, { project })).rejects.toThrow( - expect.objectContaining({ - message: expect.stringContaining( - `The "${tailwindConfig}" file is already configured for the project "${project}". Are you sure this is the right project to set up Tailwind?` - ), - }) - ); - }); - - it('should add the tailwind config path to the "build" target by default when no build target is specified', async () => { - let projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project }); - - projectConfig = readProjectConfiguration(tree, project); - expect(projectConfig.targets.build.options.tailwindConfig).toBe( - `libs/${project}/tailwind.config.js` - ); - }); - - it('should add the tailwind config path to the specified buildTarget', async () => { - const buildTarget = 'custom-build'; - let projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - [buildTarget]: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project, buildTarget }); - - projectConfig = readProjectConfiguration(tree, project); - expect(projectConfig.targets[buildTarget].options.tailwindConfig).toBe( - `libs/${project}/tailwind.config.js` - ); - }); - - it.each(['@nx/angular:ng-packagr-lite', '@nx/angular:package'])( - 'should add the tailwind config path when using the "%s" executor', - async (executor) => { - let projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { build: { executor, options: {} } }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project }); - - projectConfig = readProjectConfiguration(tree, project); - expect(projectConfig.targets.build.options.tailwindConfig).toBe( - `libs/${project}/tailwind.config.js` - ); - } - ); - - it('should add required packages', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project }); - - const { devDependencies } = readJson(tree, 'package.json'); - expect(devDependencies.tailwindcss).toBe(tailwindVersion); - expect(devDependencies.autoprefixer).toBe(autoprefixerVersion); - expect(devDependencies.postcss).toBe(postcssVersion); - }); - - it('should generate the tailwind.config.js file in the project root for v3 by default', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - - await setupTailwindGenerator(tree, { project }); - - expect(tree.read(`libs/${project}/tailwind.config.js`, 'utf-8')) - .toMatchInlineSnapshot(` - "const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); - const { join } = require('path'); - - /** @type {import('tailwindcss').Config} */ - module.exports = { - content: [ - join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), - ...createGlobPatternsForDependencies(__dirname), - ], - theme: { - extend: {}, - }, - plugins: [], - }; - " - `); - }); - - it('should generate the tailwind.config.js file in the project root with the config for v3 when a version greater than 3 is installed', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - tree.write( - 'package.json', - JSON.stringify({ devDependencies: { tailwindcss: '^3.0.1' } }) - ); - - await setupTailwindGenerator(tree, { project }); - - expect(tree.read(`libs/${project}/tailwind.config.js`, 'utf-8')) - .toMatchInlineSnapshot(` - "const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); - const { join } = require('path'); - - /** @type {import('tailwindcss').Config} */ - module.exports = { - content: [ - join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), - ...createGlobPatternsForDependencies(__dirname), - ], - theme: { - extend: {}, - }, - plugins: [], - }; - " - `); - }); - - it('should generate the tailwind.config.js file in the project root with the config for v2 when a version greater than 2 and lower than 3 is installed', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - tree.write( - 'package.json', - JSON.stringify({ devDependencies: { tailwindcss: '~2.0.0' } }) - ); - - await setupTailwindGenerator(tree, { project }); - - expect(tree.read(`libs/${project}/tailwind.config.js`, 'utf-8')) - .toMatchInlineSnapshot(` - "const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); - const { join } = require('path'); - - module.exports = { - mode: 'jit', - purge: [ - join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), - ...createGlobPatternsForDependencies(__dirname), - ], - darkMode: false, // or 'media' or 'class' - theme: { - extend: {}, - }, - variants: { - extend: {}, - }, - plugins: [], - }; - " - `); - }); - - it('should format files', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - jest.spyOn(devkit, 'formatFiles'); - - await setupTailwindGenerator(tree, { project }); - - expect(devkit.formatFiles).toHaveBeenCalled(); - }); - - it('should not format files when "skipFormat: true"', async () => { - const projectConfig = readProjectConfiguration(tree, project); - projectConfig.targets = { - build: { executor: '@nx/angular:package', options: {} }, - }; - updateProjectConfiguration(tree, project, projectConfig); - jest.spyOn(devkit, 'formatFiles'); - - await setupTailwindGenerator(tree, { project, skipFormat: true }); - - expect(devkit.formatFiles).not.toHaveBeenCalled(); - }); - }); - }); }); diff --git a/packages/angular/src/generators/utils/create-ts-config.ts b/packages/angular/src/generators/utils/create-ts-config.ts index 9b4d62469f22b..1f94bbc4217e9 100644 --- a/packages/angular/src/generators/utils/create-ts-config.ts +++ b/packages/angular/src/generators/utils/create-ts-config.ts @@ -1,7 +1,6 @@ import type { Tree } from '@nx/devkit'; import { writeJson } from '@nx/devkit'; import { tsConfigBaseOptions } from '@nx/js'; -import { getInstalledAngularMajorVersion } from './version-utils'; export { extractTsConfigBase } from '@nx/js'; @@ -14,15 +13,15 @@ export function createTsConfig( style?: string; bundler?: string; rootProject?: boolean; + esModuleInterop?: boolean; }, relativePathToRootTsConfig: string ) { - const majorAngularVersion = getInstalledAngularMajorVersion(host); - const json = { compilerOptions: { - target: majorAngularVersion === 14 ? 'es2020' : 'es2022', + target: 'es2022', useDefineForClassFields: false, + esModuleInterop: options.esModuleInterop ? true : undefined, }, files: [], include: [], diff --git a/packages/angular/src/generators/utils/testing.ts b/packages/angular/src/generators/utils/testing.ts index 45cae6efd45da..0d98e2dae6dbd 100644 --- a/packages/angular/src/generators/utils/testing.ts +++ b/packages/angular/src/generators/utils/testing.ts @@ -72,11 +72,13 @@ export async function createStorybookTestWorkspaceForLib( skipFormat: false, unitTestRunner: UnitTestRunner.Jest, projectNameAndRootFormat: 'as-provided', + standalone: false, }); await componentGenerator(tree, { name: 'test-button', project: libName, + standalone: false, }); tree.write( @@ -121,6 +123,7 @@ export class TestButtonComponent { project: libName, path: `${libName}/src/lib/barrel`, module: 'barrel', + standalone: false, }); tree.write( @@ -152,6 +155,7 @@ export class BarrelModule {}` project: libName, path: `${libName}/src/lib/variable-declare`, module: 'variable-declare', + standalone: false, }); await componentGenerator(tree, { @@ -159,6 +163,7 @@ export class BarrelModule {}` project: libName, path: `${libName}/src/lib/variable-declare`, module: 'variable-declare', + standalone: false, }); tree.write( @@ -192,6 +197,7 @@ export class VariableDeclareModule {}` project: libName, path: `${libName}/src/lib/variable-spread-declare`, module: 'variable-spread-declare', + standalone: false, }); await componentGenerator(tree, { @@ -199,6 +205,7 @@ export class VariableDeclareModule {}` project: libName, path: `${libName}/src/lib/variable-spread-declare`, module: 'variable-spread-declare', + standalone: false, }); await componentGenerator(tree, { @@ -206,6 +213,7 @@ export class VariableDeclareModule {}` project: libName, path: `${libName}/src/lib/variable-spread-declare`, module: 'variable-spread-declare', + standalone: false, }); tree.write( @@ -239,6 +247,7 @@ export class VariableSpreadDeclareModule {}` project: libName, path: `${libName}/src/lib/static-member-declarations`, module: 'static-member-declarations', + standalone: false, }); await componentGenerator(tree, { @@ -246,6 +255,7 @@ export class VariableSpreadDeclareModule {}` project: libName, path: `${libName}/src/lib/static-member-declarations`, module: 'static-member-declarations', + standalone: false, }); tree.write( @@ -277,11 +287,13 @@ export class StaticMemberDeclarationsModule { project: libName, module: 'nested', path: `${libName}/src/lib/nested`, + standalone: false, }); await componentGenerator(tree, { name: 'test-other', project: libName, + standalone: false, }); return tree; diff --git a/packages/angular/src/generators/utils/validations.ts b/packages/angular/src/generators/utils/validations.ts index 2462e0681579a..0a0ee0766949f 100644 --- a/packages/angular/src/generators/utils/validations.ts +++ b/packages/angular/src/generators/utils/validations.ts @@ -1,7 +1,5 @@ import type { Tree } from '@nx/devkit'; -import { getProjects, stripIndents } from '@nx/devkit'; -import { lt } from 'semver'; -import { getInstalledAngularVersionInfo } from './version-utils'; +import { getProjects } from '@nx/devkit'; export function validateProject(tree: Tree, projectName: string): void { const projects = getProjects(tree); @@ -12,21 +10,3 @@ export function validateProject(tree: Tree, projectName: string): void { ); } } - -export function validateStandaloneOption( - tree: Tree, - standalone: boolean | undefined, - angularVersion?: string -): void { - if (!standalone) { - return; - } - - const installedAngularVersion = - angularVersion ?? getInstalledAngularVersionInfo(tree).version; - - if (lt(installedAngularVersion, '14.1.0')) { - throw new Error(stripIndents`The "standalone" option is only supported in Angular >= 14.1.0. You are currently using "${installedAngularVersion}". - You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`); - } -} diff --git a/packages/angular/src/generators/utils/version-utils.spec.ts b/packages/angular/src/generators/utils/version-utils.spec.ts index 4bfc240f9dce0..cc8df006c6122 100644 --- a/packages/angular/src/generators/utils/version-utils.spec.ts +++ b/packages/angular/src/generators/utils/version-utils.spec.ts @@ -6,7 +6,7 @@ import { } from './version-utils'; describe('angularVersionUtils', () => { - test.each(['14.0.0', '~14.1.0', '^14.2.0', '~14.3.0-beta.0'])( + test.each(['15.0.0', '~15.1.0', '^15.2.0', '~15.3.0-beta.0'])( 'should return correct major version', (ngVersion) => { // ARRANGE @@ -22,15 +22,15 @@ describe('angularVersionUtils', () => { const angularVersion = getInstalledAngularMajorVersion(tree); // ASSERT - expect(angularVersion).toBe(14); + expect(angularVersion).toBe(15); } ); test.each([ - ['14.0.0', '14.0.0'], - ['~14.1.0', '14.1.0'], - ['^14.2.0', '14.2.0'], - ['~14.3.0-beta.0', '14.3.0'], + ['15.0.0', '15.0.0'], + ['~15.1.0', '15.1.0'], + ['^15.2.0', '15.2.0'], + ['~15.3.0-beta.0', '15.3.0'], ])('should return correct major version', (ngVersion, expectedVersion) => { // ARRANGE const tree = createTreeWithEmptyWorkspace(); diff --git a/packages/angular/src/generators/utils/version-utils.ts b/packages/angular/src/generators/utils/version-utils.ts index ea5970883f7fc..8905bd240830a 100644 --- a/packages/angular/src/generators/utils/version-utils.ts +++ b/packages/angular/src/generators/utils/version-utils.ts @@ -85,10 +85,10 @@ export function addDependenciesToPackageJsonIfDontExist( export function versions(tree: Tree) { const majorAngularVersion = getInstalledAngularMajorVersion(tree); switch (majorAngularVersion) { - case 14: - return backwardCompatibleVersions.angularV14; case 15: return backwardCompatibleVersions.angularV15; + case 16: + return backwardCompatibleVersions.angularV16; default: return latestVersions; } diff --git a/packages/angular/src/migrations/update-14-8-0/rename-webpack-server.spec.ts b/packages/angular/src/migrations/update-14-8-0/rename-webpack-server.spec.ts index 5df09b65ceb31..42b653e4669a2 100644 --- a/packages/angular/src/migrations/update-14-8-0/rename-webpack-server.spec.ts +++ b/packages/angular/src/migrations/update-14-8-0/rename-webpack-server.spec.ts @@ -14,6 +14,11 @@ describe('renameWebpackServer', () => { updateJson(tree, 'apps/remote/project.json', (json) => { json.targets.serve.executor = '@nrwl/angular:webpack-server'; + // Nx 14.x.x generates apps with browserTarget + json.targets.serve.configurations = { + development: { browserTarget: 'remote:build:development' }, + production: { browserTarget: 'remote:build:production' }, + }; return json; }); diff --git a/packages/angular/src/migrations/update-15-2-0/update-typescript-target.spec.ts b/packages/angular/src/migrations/update-15-2-0/update-typescript-target.spec.ts index 63b18d5da0ef2..976cc769737c4 100644 --- a/packages/angular/src/migrations/update-15-2-0/update-typescript-target.spec.ts +++ b/packages/angular/src/migrations/update-15-2-0/update-typescript-target.spec.ts @@ -16,11 +16,13 @@ describe('Migration to update target and add useDefineForClassFields', () => { tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); await generateTestApplication(tree, { name: 'test', + bundler: 'webpack', projectNameAndRootFormat: 'derived', }); await generateTestApplication(tree, { name: 'karma', unitTestRunner: UnitTestRunner.None, + bundler: 'webpack', projectNameAndRootFormat: 'derived', }); diff --git a/packages/angular/src/migrations/update-17-1-0/browser-target-to-build-target.spec.ts b/packages/angular/src/migrations/update-17-1-0/browser-target-to-build-target.spec.ts new file mode 100644 index 0000000000000..c3f078018384c --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/browser-target-to-build-target.spec.ts @@ -0,0 +1,159 @@ +import { + addProjectConfiguration, + readJson, + readProjectConfiguration, + updateJson, + type NxJsonConfiguration, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration, { executors } from './browser-target-to-build-target'; + +describe('browser-target-to-build-target migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it.each(executors)( + 'should rename "browserTarget" option from target using the "%s" executor', + async (executor) => { + addProjectConfiguration(tree, 'app1', { + root: 'apps/app1', + targets: { + serve: { + executor, + options: { browserTarget: 'app1:serve' }, + configurations: { + development: { browserTarget: 'app1:serve:development' }, + production: { browserTarget: 'app1:serve:production' }, + }, + }, + }, + }); + + await migration(tree); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.serve.options.browserTarget).toBeUndefined(); + expect(project.targets.serve.options.buildTarget).toBe('app1:serve'); + expect( + project.targets.serve.configurations.development.browserTarget + ).toBeUndefined(); + expect(project.targets.serve.configurations.development.buildTarget).toBe( + 'app1:serve:development' + ); + expect( + project.targets.serve.configurations.production.browserTarget + ).toBeUndefined(); + expect(project.targets.serve.configurations.production.buildTarget).toBe( + 'app1:serve:production' + ); + } + ); + + it('should not rename "browserTarget" from target not using the relevant executors', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'apps/app1', + targets: { + serve: { + executor: '@org/awesome-plugin:executor', + options: { browserTarget: 'app1:serve' }, + configurations: { + development: { browserTarget: 'app1:serve:development' }, + production: { browserTarget: 'app1:serve:production' }, + }, + }, + }, + }); + + await migration(tree); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.serve.options.browserTarget).toBe('app1:serve'); + expect(project.targets.serve.configurations.development.browserTarget).toBe( + 'app1:serve:development' + ); + expect(project.targets.serve.configurations.production.browserTarget).toBe( + 'app1:serve:production' + ); + }); + + it.each(executors)( + 'should rename "browserTarget" option in nx.json target defaults for a target with the "%s" executor', + async (executor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults.serve = { + executor, + options: { browserTarget: '{projectName}:serve' }, + configurations: { + development: { browserTarget: '{projectName}:serve:development' }, + production: { browserTarget: '{projectName}:serve:production' }, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults.serve.options.browserTarget).toBeUndefined(); + expect(nxJson.targetDefaults.serve.options.buildTarget).toBe( + '{projectName}:serve' + ); + expect( + nxJson.targetDefaults.serve.configurations.development.browserTarget + ).toBeUndefined(); + expect( + nxJson.targetDefaults.serve.configurations.development.buildTarget + ).toBe('{projectName}:serve:development'); + expect( + nxJson.targetDefaults.serve.configurations.production.browserTarget + ).toBeUndefined(); + expect( + nxJson.targetDefaults.serve.configurations.production.buildTarget + ).toBe('{projectName}:serve:production'); + } + ); + + it.each(executors)( + 'should rename "browserTarget" option in nx.json target defaults for the "%s" executor', + async (executor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults[executor] = { + options: { browserTarget: '{projectName}:serve' }, + configurations: { + development: { browserTarget: '{projectName}:serve:development' }, + production: { browserTarget: '{projectName}:serve:production' }, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + expect( + nxJson.targetDefaults[executor].options.browserTarget + ).toBeUndefined(); + expect(nxJson.targetDefaults[executor].options.buildTarget).toBe( + '{projectName}:serve' + ); + expect( + nxJson.targetDefaults[executor].configurations.development.browserTarget + ).toBeUndefined(); + expect( + nxJson.targetDefaults[executor].configurations.development.buildTarget + ).toBe('{projectName}:serve:development'); + expect( + nxJson.targetDefaults[executor].configurations.production.browserTarget + ).toBeUndefined(); + expect( + nxJson.targetDefaults[executor].configurations.production.buildTarget + ).toBe('{projectName}:serve:production'); + } + ); +}); diff --git a/packages/angular/src/migrations/update-17-1-0/browser-target-to-build-target.ts b/packages/angular/src/migrations/update-17-1-0/browser-target-to-build-target.ts new file mode 100644 index 0000000000000..bee575ace121d --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/browser-target-to-build-target.ts @@ -0,0 +1,74 @@ +import { + formatFiles, + readNxJson, + readProjectConfiguration, + updateNxJson, + updateProjectConfiguration, + type Tree, +} from '@nx/devkit'; +import { forEachExecutorOptions } from '@nx/devkit/src/generators/executor-options-utils'; + +export const executors = [ + '@angular-devkit/build-angular:dev-server', + '@angular-devkit/build-angular:extract-i18n', + '@nx/angular:module-federation-dev-server', + '@nx/angular:webpack-dev-server', +]; + +export default async function (tree: Tree) { + // update options from project configs + executors.forEach((executor) => { + forEachExecutorOptions<{ + browserTarget?: string; + buildTarget?: string; + }>(tree, executor, (_, project, target, configuration) => { + const projectConfiguration = readProjectConfiguration(tree, project); + const config = configuration + ? projectConfiguration.targets[target].configurations[configuration] + : projectConfiguration.targets[target].options; + + updateConfig(config); + + updateProjectConfiguration(tree, project, projectConfiguration); + }); + }); + + // update options from nx.json target defaults + const nxJson = readNxJson(tree); + if (!nxJson.targetDefaults) { + return; + } + + for (const [targetOrExecutor, targetConfig] of Object.entries( + nxJson.targetDefaults + )) { + if ( + !executors.includes(targetOrExecutor) && + !executors.includes(targetConfig.executor) + ) { + continue; + } + + if (targetConfig.options) { + updateConfig(targetConfig.options); + } + + Object.values(targetConfig.configurations ?? {}).forEach((config) => { + updateConfig(config); + }); + } + + updateNxJson(tree, nxJson); + + await formatFiles(tree); +} + +function updateConfig(config: { + browserTarget?: string; + buildTarget?: string; +}): void { + if (config.browserTarget) { + config.buildTarget ??= config.browserTarget; + delete config.browserTarget; + } +} diff --git a/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-builders.spec.ts b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-builders.spec.ts new file mode 100644 index 0000000000000..294fb56a3e5e4 --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-builders.spec.ts @@ -0,0 +1,202 @@ +import { + addProjectConfiguration, + readJson, + readProjectConfiguration, + updateJson, + type NxJsonConfiguration, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './replace-nguniversal-builders'; + +describe('replace-nguniversal-builders migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it.each([ + [ + '@nguniversal/builders:ssr-dev-server', + 'serve-ssr', + '@angular-devkit/build-angular:ssr-dev-server', + ], + [ + '@nguniversal/builders:prerender', + 'prerender', + '@angular-devkit/build-angular:prerender', + ], + ])( + `should replace "%s" with "%s" from project configurations`, + async (fromExecutor, target, toExecutor) => { + addProjectConfiguration(tree, 'app1', { + root: 'apps/app1', + projectType: 'application', + targets: { + [target]: { + executor: fromExecutor, + options: {}, + configurations: {}, + }, + }, + }); + + await migration(tree); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets[target].executor).toBe(toExecutor); + } + ); + + it('should replace the old "@nguniversal/builders:prerender" options', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'apps/app1', + projectType: 'application', + targets: { + prerender: { + executor: '@nguniversal/builders:prerender', + options: { + browserTarget: 'appprerender:build:production', + serverTarget: 'appprerender:server:production', + numProcesses: 1, + guessRoutes: false, + }, + }, + }, + }); + + await migration(tree); + + const project = readProjectConfiguration(tree, 'app1'); + const { guessRoutes, numProcesses, discoverRoutes } = + project.targets.prerender.options; + expect(guessRoutes).toBeUndefined(); + expect(discoverRoutes).toBe(false); + expect(numProcesses).toBeUndefined(); + }); + + it.each([ + [ + '@nguniversal/builders:ssr-dev-server', + '@angular-devkit/build-angular:ssr-dev-server', + ], + [ + '@nguniversal/builders:prerender', + '@angular-devkit/build-angular:prerender', + ], + ])( + `should replace "%s" with "%s" from nx.json targetDefaults keys`, + async (fromExecutor, toExecutor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults[fromExecutor] = { + options: {}, + configurations: {}, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults[fromExecutor]).toBeUndefined(); + expect(nxJson.targetDefaults[toExecutor]).toBeDefined(); + } + ); + + it('should replace options from nx.json targetDefaults with executor "@nguniversal/builders:prerender" as the key', async () => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults['@nguniversal/builders:prerender'] = { + options: { + browserTarget: 'appprerender:build:production', + serverTarget: 'appprerender:server:production', + numProcesses: 1, + guessRoutes: false, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + const { guessRoutes, numProcesses, discoverRoutes } = + nxJson.targetDefaults['@angular-devkit/build-angular:prerender'].options; + expect(guessRoutes).toBeUndefined(); + expect(discoverRoutes).toBe(false); + expect(numProcesses).toBeUndefined(); + }); + + it.each([ + [ + '@nguniversal/builders:ssr-dev-server', + 'serve-ssr', + '@angular-devkit/build-angular:ssr-dev-server', + ], + [ + '@nguniversal/builders:prerender', + 'prerender', + '@angular-devkit/build-angular:prerender', + ], + ])( + `should replace "%s" with "%s" from nx.json targetDefaults value executors`, + async (fromExecutor, target, toExecutor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults[target] = { + executor: fromExecutor, + options: {}, + configurations: {}, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults[target].executor).toBe(toExecutor); + } + ); + + it('should replace options from nx.json targetDefaults with executor "@nguniversal/builders:prerender"', async () => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults.prerender = { + executor: '@nguniversal/builders:prerender', + options: { + browserTarget: 'appprerender:build:production', + serverTarget: 'appprerender:server:production', + numProcesses: 1, + guessRoutes: false, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + const { guessRoutes, numProcesses, discoverRoutes } = + nxJson.targetDefaults.prerender.options; + expect(guessRoutes).toBeUndefined(); + expect(discoverRoutes).toBe(false); + expect(numProcesses).toBeUndefined(); + }); + + it('should remove the "@nguniversal/builders" package', async () => { + updateJson(tree, 'package.json', (json) => { + json.devDependencies = { + ...json.devDependencies, + '@nguniversal/builders': '16.0.0', + }; + return json; + }); + + await migration(tree); + + const { devDependencies } = readJson(tree, 'package.json'); + expect(devDependencies['@nguniversal/builders']).toBeUndefined(); + }); +}); diff --git a/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-builders.ts b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-builders.ts new file mode 100644 index 0000000000000..ccfb66cc3d696 --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-builders.ts @@ -0,0 +1,106 @@ +import { + formatFiles, + getProjects, + readNxJson, + updateNxJson, + updateProjectConfiguration, + type TargetConfiguration, + type Tree, + removeDependenciesFromPackageJson, +} from '@nx/devkit'; + +export default async function (tree: Tree) { + const projects = getProjects(tree); + for (const [, project] of projects) { + if (project.projectType !== 'application') { + continue; + } + + for (const target of Object.values(project.targets ?? {})) { + if (target.executor === '@nguniversal/builders:ssr-dev-server') { + target.executor = '@angular-devkit/build-angular:ssr-dev-server'; + } else if (target.executor === '@nguniversal/builders:prerender') { + target.executor = '@angular-devkit/build-angular:prerender'; + updatePrerenderOptions(target); + } + } + + updateProjectConfiguration(tree, project.name, project); + } + + // update options from nx.json target defaults + const nxJson = readNxJson(tree); + if (!nxJson.targetDefaults) { + return; + } + + for (const [targetOrExecutor, targetConfig] of Object.entries( + nxJson.targetDefaults + )) { + if (targetOrExecutor === '@nguniversal/builders:ssr-dev-server') { + nxJson.targetDefaults['@angular-devkit/build-angular:ssr-dev-server'] = + targetConfig; + delete nxJson.targetDefaults['@nguniversal/builders:ssr-dev-server']; + } else if (targetOrExecutor === '@nguniversal/builders:prerender') { + nxJson.targetDefaults['@angular-devkit/build-angular:prerender'] = + targetConfig; + delete nxJson.targetDefaults['@nguniversal/builders:prerender']; + updatePrerenderOptions(targetConfig); + } else if ( + targetConfig.executor === '@nguniversal/builders:ssr-dev-server' + ) { + targetConfig.executor = '@angular-devkit/build-angular:ssr-dev-server'; + } else if (targetConfig.executor === '@nguniversal/builders:prerender') { + targetConfig.executor = '@angular-devkit/build-angular:prerender'; + updatePrerenderOptions(targetConfig); + } + } + + updateNxJson(tree, nxJson); + + // remove @nguniversal/builders from package.json + removeDependenciesFromPackageJson( + tree, + ['@nguniversal/builders'], + ['@nguniversal/builders'] + ); + + await formatFiles(tree); +} + +function* allTargetOptions( + target: TargetConfiguration +): Iterable<[string | undefined, T]> { + if (target.options) { + yield [undefined, target.options]; + } + + if (!target.configurations) { + return; + } + + for (const [name, options] of Object.entries(target.configurations)) { + if (options !== undefined) { + yield [name, options]; + } + } +} + +function updatePrerenderOptions( + config: TargetConfiguration<{ + discoverRoutes?: any; + guessRoutes?: any; + numProcesses?: any; + }> +) { + for (const [, options] of allTargetOptions(config)) { + if (options.guessRoutes !== undefined) { + options.discoverRoutes = options.guessRoutes; + delete options.guessRoutes; + } + + if (options.numProcesses !== undefined) { + delete options.numProcesses; + } + } +} diff --git a/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-engines.spec.ts b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-engines.spec.ts new file mode 100644 index 0000000000000..64c323ca2a627 --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-engines.spec.ts @@ -0,0 +1,227 @@ +import { + addProjectConfiguration, + readJson, + updateJson, + writeJson, + type ProjectConfiguration, + type ProjectGraph, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './replace-nguniversal-engines'; + +let projectGraph: ProjectGraph; +jest.mock('@nx/devkit', () => ({ + ...jest.requireActual('@nx/devkit'), + createProjectGraphAsync: () => Promise.resolve(projectGraph), +})); + +describe('replace-nguniversal-engines migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.dependencies = { + '@nguniversal/common': '16.0.0', + '@nguniversal/express-engine': '16.0.0', + }; + return json; + }); + + const project: ProjectConfiguration = { + root: '', + sourceRoot: 'src', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + outputPath: 'dist/app1/browser', + main: 'main.ts', + tsConfig: 'tsconfig.json', + polyfills: '', + }, + }, + server: { + executor: '@angular-devkit/build-angular:server', + options: { + outputPath: 'dist/app1/server', + tsConfig: 'tsconfig.json', + main: 'server.ts', + }, + configurations: { + production: { + main: 'server.ts', + }, + }, + }, + }, + }; + projectGraph = { + dependencies: { + app1: [{ source: 'app1', target: 'npm:@angular/core', type: 'static' }], + }, + nodes: { app1: { data: project, name: 'app1', type: 'app' } }, + }; + addProjectConfiguration(tree, 'app1', project); + + tree.write( + 'server.ts', + ` + import 'zone.js/node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { ngExpressEngine } from '@nguniversal/express-engine'; +import * as express from 'express'; +import { existsSync } from 'fs'; +import { join } from 'path'; + +import { AppServerModule } from './src/main.server'; + +// 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(), 'dist/browser'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? 'index.original.html' + : 'index'; + + // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine) + server.engine( + 'html', + ngExpressEngine({ + bootstrap: AppServerModule, + inlineCriticalCss: true, + }), + ); + + 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 Universal engine + server.get('*', (req, res) => { + res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] }); + }); + + return server; +} + +function run() { + const port = process.env.PORT || 4000; + + // Start up the Node server + const server = app(); + server.listen(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(); +} ` + ); + }); + + it('should remove all "@nguniversal/" from dependencies', async () => { + await migration(tree); + + const { dependencies } = readJson(tree, 'package.json'); + expect(dependencies['@nguniversal/common']).toBeUndefined(); + expect(dependencies['@nguniversal/express-engine']).toBeUndefined(); + }); + + it('should add "@angular/ssr" as a dependencies', async () => { + await migration(tree); + + const { dependencies } = readJson(tree, 'package.json'); + expect(dependencies['@angular/ssr']).toBeDefined(); + }); + + it('should not add "@angular/ssr" when there is no dependency on "@nguniversal"', async () => { + writeJson(tree, 'package.json', { + dependencies: { '@angular/common': '16.0.0' }, + }); + + await migration(tree); + + const { dependencies } = readJson(tree, 'package.json'); + expect(dependencies['@angular/ssr']).toBeUndefined(); + }); + + it('should replace imports from "@nguniversal/common" to "@angular/ssr"', async () => { + tree.write( + 'src/file.ts', + ` + import { CommonEngine } from '@nguniversal/common'; + import { Component } from '@angular/core'; + ` + ); + + await migration(tree); + + expect(tree.read('src/file.ts', 'utf-8')).toContain( + `import { CommonEngine } from '@angular/ssr';` + ); + }); + + it('should replace and backup "server.ts" file', async () => { + await migration(tree); + + expect(tree.read('server.ts.bak', 'utf-8')).toContain( + `import { ngExpressEngine } from '@nguniversal/express-engine';` + ); + const newServerFile = tree.read('server.ts', 'utf-8'); + expect(newServerFile).toContain( + `import { CommonEngine } from '@angular/ssr';` + ); + expect(newServerFile).toContain( + `const distFolder = join(process.cwd(), 'dist/app1/browser');` + ); + }); + + it('should create tokens file and replace usages of "@nguniversal/express-engine/tokens"', async () => { + const filePath = 'src/tokens-usage.ts'; + tree.write( + filePath, + `import { RESPONSE } from '@nguniversal/express-engine/tokens';` + ); + + await migration(tree); + + expect(tree.read(filePath, 'utf-8')).toContain( + `import { RESPONSE } from './express.tokens';` + ); + const newServerFile = tree.read('server.ts', 'utf-8'); + expect(newServerFile).toContain(`{ provide: RESPONSE, useValue: res }`); + expect(newServerFile).toContain( + `import { REQUEST, RESPONSE } from './src/express.tokens';` + ); + expect(tree.exists('src/express.tokens.ts')).toBe(true); + }); + + it('should not create tokens file when "@nguniversal/express-engine/tokens" is not used', async () => { + await migration(tree); + + const newServerFile = tree.read('server.ts', 'utf-8'); + expect(newServerFile).not.toContain(`{ provide: RESPONSE, useValue: res }`); + expect(newServerFile).not.toContain( + `import { REQUEST, RESPONSE } from './src/express.tokens';` + ); + expect(tree.exists('src/express.tokens.ts')).toBe(false); + }); +}); diff --git a/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-engines.ts b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-engines.ts new file mode 100644 index 0000000000000..76c3a3b760b6e --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/replace-nguniversal-engines.ts @@ -0,0 +1,248 @@ +import { + addDependenciesToPackageJson, + formatFiles, + normalizePath, + readJson, + removeDependenciesFromPackageJson, + visitNotIgnoredFiles, + type TargetConfiguration, + type Tree, +} from '@nx/devkit'; +import { dirname, relative } from 'path'; +import { + getInstalledPackageVersionInfo, + versions, +} from '../../generators/utils/version-utils'; +import { getProjectsFilteredByDependencies } from '../utils/projects'; + +const UNIVERSAL_PACKAGES = [ + '@nguniversal/common', + '@nguniversal/express-engine', +]; +/** + * Regexp to match Universal packages. + * @nguniversal/common/engine + * @nguniversal/common + * @nguniversal/express-engine + **/ +const NGUNIVERSAL_PACKAGE_REGEXP = + /@nguniversal\/(common(\/engine)?|express-engine)/g; + +export default async function (tree: Tree) { + const packageJson = readJson(tree, 'package.json'); + if ( + !UNIVERSAL_PACKAGES.some( + (pkg) => + packageJson.dependencies?.[pkg] || packageJson.devDependencies?.[pkg] + ) + ) { + return; + } + + const projects = await getProjectsFilteredByDependencies(tree, [ + 'npm:@angular/core', + ]); + for (const { project } of projects) { + if (project.projectType !== 'application') { + continue; + } + + const serverMainFiles = new Map< + string /** Main Path */, + string /** Output Path */ + >(); + for (const target of Object.values(project.targets ?? {})) { + if (target.executor !== '@angular-devkit/build-angular:server') { + continue; + } + + const outputPath = project.targets.build?.options?.outputPath; + for (const [, { main }] of allTargetOptions(target)) { + if ( + typeof main === 'string' && + typeof outputPath === 'string' && + tree.read(main, 'utf-8').includes('ngExpressEngine') + ) { + serverMainFiles.set(main, outputPath); + } + } + } + + // Replace all import specifiers in all files. + let hasExpressTokens = false; + const root = project.sourceRoot ?? `${project.root}/src`; + const tokensFilePath = `${root}/express.tokens.ts`; + + visitNotIgnoredFiles(tree, root, (path) => { + const content = tree.read(path, 'utf8'); + let updatedContent = content; + + // Check if file is importing tokens + if (content.includes('@nguniversal/express-engine/tokens')) { + hasExpressTokens ||= true; + + let tokensFileRelativePath: string = relative( + dirname(normalizePath(path)), + normalizePath(tokensFilePath) + ); + + if (tokensFileRelativePath.charAt(0) !== '.') { + tokensFileRelativePath = './' + tokensFileRelativePath; + } + + updatedContent = updatedContent.replaceAll( + '@nguniversal/express-engine/tokens', + tokensFileRelativePath.slice(0, -3) + ); + } + + updatedContent = updatedContent.replaceAll( + NGUNIVERSAL_PACKAGE_REGEXP, + '@angular/ssr' + ); + tree.write(path, updatedContent); + }); + + // Replace server file and add tokens file if needed + for (const [path, outputPath] of serverMainFiles.entries()) { + tree.rename(path, path + '.bak'); + tree.write(path, getServerFileContents(outputPath, hasExpressTokens)); + + if (hasExpressTokens) { + tree.write(tokensFilePath, TOKENS_FILE_CONTENT); + } + } + } + + // Remove universal packages from deps + for (const name of UNIVERSAL_PACKAGES) { + removeDependenciesFromPackageJson(tree, [name], [name]); + } + + const pkgVersions = versions(tree); + addDependenciesToPackageJson( + tree, + { + '@angular/ssr': + getInstalledPackageVersionInfo(tree, '@angular-devkit/build-angular') + ?.version ?? pkgVersions.angularDevkitVersion, + }, + {} + ); + + await formatFiles(tree); +} + +function* allTargetOptions( + target: TargetConfiguration +): Iterable<[string | undefined, T]> { + if (target.options) { + yield [undefined, target.options]; + } + + if (!target.configurations) { + return; + } + + for (const [name, options] of Object.entries(target.configurations)) { + if (options !== undefined) { + yield [name, options]; + } + } +} + +const TOKENS_FILE_CONTENT = ` +import { InjectionToken } from '@angular/core'; +import { Request, Response } from 'express'; + +export const REQUEST = new InjectionToken('REQUEST'); +export const RESPONSE = new InjectionToken('RESPONSE'); +`; + +function getServerFileContents( + outputPath: string, + hasExpressTokens: boolean +): string { + return ( + ` +import 'zone.js/node'; + +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; +import * as express from 'express'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import bootstrap from './src/main.server';` + + (hasExpressTokens + ? `\nimport { REQUEST, RESPONSE } from './src/express.tokens';` + : '') + + ` + +// 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(), '${outputPath}'); + 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, + documentFilePath: indexHtml, + url: \`\${protocol}://\${headers.host}\${originalUrl}\`, + publicPath: distFolder, + providers: [ + { provide: APP_BASE_HREF, useValue: baseUrl },` + + (hasExpressTokens + ? '\n { provide: RESPONSE, useValue: res },\n { provide: REQUEST, useValue: req }\n' + : '') + + `], + }) + .then((html) => res.send(html)) + .catch((err) => next(err)); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || 4000; + + // 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 bootstrap; +` + ); +} diff --git a/packages/angular/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.spec.ts b/packages/angular/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.spec.ts new file mode 100644 index 0000000000000..8d74d7dc8f607 --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.spec.ts @@ -0,0 +1,255 @@ +import { + addProjectConfiguration, + type ProjectConfiguration, + type ProjectGraph, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './stub-performance-mark-in-jest-test-setup'; + +let projectGraph: ProjectGraph; +jest.mock('@nx/devkit', () => ({ + ...jest.requireActual('@nx/devkit'), + createProjectGraphAsync: () => Promise.resolve(projectGraph), +})); + +describe('stub-performance-mark-in-jest-test-setup migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should add a stub for "performance.mark" for angular projects', async () => { + addProject( + tree, + 'app1', + { + name: 'app1', + root: 'apps/app1', + targets: { + test: { + executor: '@nx/jest:jest', + options: { jestConfig: 'apps/app1/jest.config.ts' }, + }, + }, + }, + ['npm:@angular/core'] + ); + tree.write('apps/app1/jest.config.ts', jestConfigContents); + tree.write('apps/app1/src/test-setup.ts', setupFileContents); + + await migration(tree); + + expect(tree.read('apps/app1/src/test-setup.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment + globalThis.ngJest = { + testEnvironmentOptions: { + errorOnUnknownElements: true, + errorOnUnknownProperties: true, + }, + }; + import 'jest-preset-angular/setup-jest'; + + /** + * Angular uses performance.mark() which is not supported by jsdom. Stub it out + * to avoid errors. + */ + global.performance.mark = jest.fn(); + " + `); + }); + + it('should add a stub for "performance.mark" when using a custom setup file', async () => { + addProject( + tree, + 'app1', + { + name: 'app1', + root: 'apps/app1', + targets: { + test: { + executor: '@nx/jest:jest', + options: { jestConfig: 'apps/app1/jest.config.ts' }, + }, + }, + }, + ['npm:@angular/core'] + ); + tree.write( + 'apps/app1/jest.config.ts', + jestConfigContents.replace( + `['/src/test-setup.ts']`, + `['/src/custom-test-setup-file.ts']` + ) + ); + tree.write('apps/app1/src/custom-test-setup-file.ts', setupFileContents); + + await migration(tree); + + expect(tree.exists('apps/app1/src/test-setup.ts')).toBe(false); + expect(tree.read('apps/app1/src/custom-test-setup-file.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment + globalThis.ngJest = { + testEnvironmentOptions: { + errorOnUnknownElements: true, + errorOnUnknownProperties: true, + }, + }; + import 'jest-preset-angular/setup-jest'; + + /** + * Angular uses performance.mark() which is not supported by jsdom. Stub it out + * to avoid errors. + */ + global.performance.mark = jest.fn(); + " + `); + }); + + it('should handle when there is no setup file and not throw', async () => { + addProject( + tree, + 'app1', + { + name: 'app1', + root: 'apps/app1', + targets: { + test: { + executor: '@nx/jest:jest', + options: { jestConfig: 'apps/app1/jest.config.ts' }, + }, + }, + }, + ['npm:@angular/core'] + ); + tree.write( + 'apps/app1/jest.config.ts', + jestConfigContents.replace( + `setupFilesAfterEnv: ['/src/test-setup.ts'],`, + '' + ) + ); + + await expect(migration(tree)).resolves.not.toThrow(); + }); + + it('should not add a stub for "performance.mark" for non-angular projects', async () => { + addProject( + tree, + 'app1', + { + name: 'app1', + root: 'apps/app1', + targets: { + test: { + executor: '@nx/jest:jest', + options: { jestConfig: 'apps/app1/jest.config.ts' }, + }, + }, + }, + [] + ); + tree.write('apps/app1/jest.config.ts', jestConfigContents); + tree.write('apps/app1/src/test-setup.ts', setupFileContents); + + await migration(tree); + + expect(tree.read('apps/app1/src/test-setup.ts', 'utf-8')).not.toContain( + 'global.performance.mark = jest.fn();' + ); + }); + + it('should not add a stub for "performance.mark" when it is already being accessed', async () => { + addProject( + tree, + 'app1', + { + name: 'app1', + root: 'apps/app1', + targets: { + test: { + executor: '@nx/jest:jest', + options: { jestConfig: 'apps/app1/jest.config.ts' }, + }, + }, + }, + [] + ); + tree.write('apps/app1/jest.config.ts', jestConfigContents); + tree.write( + 'apps/app1/src/test-setup.ts', + `${setupFileContents} +global.performance.mark = require('perf_hooks').performance.mark;` + ); + + await migration(tree); + + expect(tree.read('apps/app1/src/test-setup.ts', 'utf-8')).not.toContain( + 'global.performance.mark = jest.fn();' + ); + }); +}); + +function addProject( + tree: Tree, + projectName: string, + config: ProjectConfiguration, + dependencies: string[] +): 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); +} + +const jestConfigContents = ` +/* eslint-disable */ +export default { + displayName: 'foo', + preset: './jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: './coverage/foo', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], + testMatch: [ + '/src/**/__tests__/**/*.[jt]s?(x)', + '/src/**/*(*.)@(spec|test).[jt]s?(x)', + ], +}; +`; + +const setupFileContents = ` +// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment +globalThis.ngJest = { + testEnvironmentOptions: { + errorOnUnknownElements: true, + errorOnUnknownProperties: true, + }, +}; +import 'jest-preset-angular/setup-jest'; +`; diff --git a/packages/angular/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.ts b/packages/angular/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.ts new file mode 100644 index 0000000000000..97cad6a1a48eb --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.ts @@ -0,0 +1,103 @@ +import { createProjectGraphAsync, formatFiles, type Tree } from '@nx/devkit'; +import { forEachExecutorOptionsInGraph } from '@nx/devkit/src/generators/executor-options-utils'; +import type { JestExecutorOptions } from '@nx/jest/src/executors/jest/schema'; +import { tsquery } from '@phenomnomnominal/tsquery'; +import { dirname } from 'path'; +import * as ts from 'typescript'; +import { getProjectsFilteredByDependencies } from '../utils/projects'; + +export default async function (tree: Tree): Promise { + const angularProjects = await getProjectsFilteredByDependencies(tree, [ + 'npm:@angular/core', + ]); + const jestConfigFiles = new Set(); + + const projectGraph = await createProjectGraphAsync(); + forEachExecutorOptionsInGraph( + projectGraph, + '@nx/jest:jest', + (options, projectName) => { + const projectConfig = angularProjects.find( + ({ project }) => projectName === project.name + ); + if (!projectConfig) { + return; + } + + if (options.jestConfig && tree.exists(options.jestConfig)) { + jestConfigFiles.add(options.jestConfig); + } + } + ); + + const setupFilePaths: string[] = []; + for (const jestConfigFile of jestConfigFiles) { + const projectSetupFilePaths = getSetupFilePaths(tree, jestConfigFile); + setupFilePaths.push(...projectSetupFilePaths); + } + + for (const setupFilePath of setupFilePaths) { + if (!tree.exists(setupFilePath)) { + continue; + } + + updateSetupFileWithPerformanceMarkStub(tree, setupFilePath); + } + + await formatFiles(tree); +} + +function getSetupFilePaths(tree: Tree, jestConfigFile: string): string[] { + const config = tree.read(jestConfigFile, 'utf-8'); + const TS_QUERY_JEST_CONFIG_PREFIX = + ':matches(ExportAssignment, BinaryExpression:has(Identifier[name="module"]):has(Identifier[name="exports"]))'; + const setupFilePathNodes = tsquery.query( + config, + `${TS_QUERY_JEST_CONFIG_PREFIX} > ObjectLiteralExpression PropertyAssignment:has(Identifier[name="setupFilesAfterEnv"]) > ArrayLiteralExpression StringLiteral` + ); + + const rootDir = dirname(jestConfigFile); + const setupFilePaths = setupFilePathNodes.map((node) => + node.text.replace('', rootDir) + ); + + return setupFilePaths; +} + +function updateSetupFileWithPerformanceMarkStub( + tree: Tree, + setupFilePath: string +) { + const setupFile = tree.read(setupFilePath, 'utf-8'); + const setupFileSource = ts.createSourceFile( + setupFilePath, + setupFile, + ts.ScriptTarget.Latest + ); + + const TS_QUERY_PERFORMANCE_MARK_ACCESS = + 'PropertyAccessExpression:has(Identifier[name=performance]):has(Identifier[name=mark])'; + const TS_QUERY_PERFORMANCE_MARK_ASSIGNMENT = + 'PropertyAccessExpression:has(Identifier[name=performance]) + EqualsToken + ObjectLiteralExpression:has(PropertyAssignment Identifier[name=mark])'; + + const performanceMarkNodes = tsquery.query( + setupFileSource, + `:matches(${TS_QUERY_PERFORMANCE_MARK_ACCESS}, ${TS_QUERY_PERFORMANCE_MARK_ASSIGNMENT})` + ); + + // there is already some access to performance.mark, so we assume it was handled already + if (performanceMarkNodes.length) { + return; + } + + tree.write( + setupFilePath, + `${setupFile} +/** + * Angular uses performance.mark() which is not supported by jsdom. Stub it out + * to avoid errors. + */ +global.performance.mark = jest.fn(); +` + ); +} diff --git a/packages/angular/src/migrations/update-17-1-0/update-angular-cli.spec.ts b/packages/angular/src/migrations/update-17-1-0/update-angular-cli.spec.ts new file mode 100644 index 0000000000000..d62b620f6e9c3 --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-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-17-1-0/update-angular-cli.ts b/packages/angular/src/migrations/update-17-1-0/update-angular-cli.ts new file mode 100644 index 0000000000000..a4c259af2b571 --- /dev/null +++ b/packages/angular/src/migrations/update-17-1-0/update-angular-cli.ts @@ -0,0 +1,23 @@ +import { formatFiles, Tree, updateJson } from '@nx/devkit'; + +export const angularCliVersion = '~17.0.0-rc.4'; + +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/utils/backward-compatible-versions.ts b/packages/angular/src/utils/backward-compatible-versions.ts index 7fb73173d520d..ff0e2bf8bd5c6 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 = 'angularV14' | 'angularV15'; +type SupportedVersions = 'angularV15' | 'angularV16'; export type PackageVersionNames = Exclude< keyof typeof latestVersions, 'nxVersion' @@ -11,22 +11,22 @@ export const backwardCompatibleVersions: Record< SupportedVersions, PackageVersions > = { - angularV14: { - angularVersion: '~14.2.0', - angularDevkitVersion: '~14.2.0', - ngPackagrVersion: '~14.2.0', - ngrxVersion: '~14.0.0', + angularV15: { + angularVersion: '~15.2.0', + angularDevkitVersion: '~15.2.0', + ngPackagrVersion: '~15.2.2', + ngrxVersion: '~15.3.0', rxjsVersion: '~7.8.0', - zoneJsVersion: '~0.11.4', + zoneJsVersion: '~0.12.0', angularJsVersion: '1.7.9', tsLibVersion: '^2.3.0', - ngUniversalVersion: '~14.2.0', + ngUniversalVersion: '~15.1.0', corsVersion: '~2.8.5', typesCorsVersion: '~2.8.5', expressVersion: '~4.18.2', typesExpressVersion: '4.17.14', moduleFederationNodeVersion: '~1.0.5', - angularEslintVersion: '~14.0.4', + angularEslintVersion: '~15.0.0', tailwindVersion: '^3.0.2', postcssVersion: '^8.4.5', postcssImportVersion: '~14.1.0', @@ -34,27 +34,27 @@ export const backwardCompatibleVersions: Record< postcssUrlVersion: '~10.1.3', autoprefixerVersion: '^10.4.0', tsNodeVersion: '10.9.1', - jestPresetAngularVersion: '~12.2.3', + jestPresetAngularVersion: '~13.0.0', typesNodeVersion: '16.11.7', jasmineMarblesVersion: '^0.9.2', jsoncEslintParserVersion: '^2.1.0', }, - angularV15: { - angularVersion: '~15.2.0', - angularDevkitVersion: '~15.2.0', - ngPackagrVersion: '~15.2.2', - ngrxVersion: '~15.3.0', + angularV16: { + angularVersion: '~16.2.0', + angularDevkitVersion: '~16.2.0', + ngPackagrVersion: '~16.2.0', + ngrxVersion: '~16.0.0', rxjsVersion: '~7.8.0', - zoneJsVersion: '~0.12.0', + zoneJsVersion: '~0.13.0', angularJsVersion: '1.7.9', tsLibVersion: '^2.3.0', - ngUniversalVersion: '~15.1.0', + ngUniversalVersion: '~16.2.0', corsVersion: '~2.8.5', typesCorsVersion: '~2.8.5', expressVersion: '~4.18.2', typesExpressVersion: '4.17.14', moduleFederationNodeVersion: '~1.0.5', - angularEslintVersion: '~15.0.0', + angularEslintVersion: '~16.0.0', tailwindVersion: '^3.0.2', postcssVersion: '^8.4.5', postcssImportVersion: '~14.1.0', @@ -62,7 +62,7 @@ export const backwardCompatibleVersions: Record< postcssUrlVersion: '~10.1.3', autoprefixerVersion: '^10.4.0', tsNodeVersion: '10.9.1', - jestPresetAngularVersion: '~13.0.0', + jestPresetAngularVersion: '~13.1.0', typesNodeVersion: '16.11.7', jasmineMarblesVersion: '^0.9.2', jsoncEslintParserVersion: '^2.1.0', diff --git a/packages/angular/src/utils/nx-devkit/ast-utils.ts b/packages/angular/src/utils/nx-devkit/ast-utils.ts index b48b407a93ca3..3d41523f4ec66 100644 --- a/packages/angular/src/utils/nx-devkit/ast-utils.ts +++ b/packages/angular/src/utils/nx-devkit/ast-utils.ts @@ -678,7 +678,9 @@ function getListOfRoutes( export function isNgStandaloneApp(tree: Tree, projectName: string) { const project = readProjectConfiguration(tree, projectName); - const mainFile = project.targets?.build?.options?.main; + const mainFile = + project.targets?.build?.options?.main ?? + project.targets?.build?.options?.browser; if (project.projectType !== 'application' || !mainFile) { return false; @@ -873,7 +875,8 @@ export function readBootstrapInfo( let mainPath; try { - mainPath = config.targets.build.options.main; + mainPath = + config.targets.build.options.main ?? config.targets.build.options.browser; } catch (e) { throw new Error('Main file cannot be located'); } diff --git a/packages/angular/src/utils/versions.ts b/packages/angular/src/utils/versions.ts index 031a77d58f7bc..e419679c68dbb 100644 --- a/packages/angular/src/utils/versions.ts +++ b/packages/angular/src/utils/versions.ts @@ -1,11 +1,11 @@ export const nxVersion = require('../../package.json').version; -export const angularVersion = '~16.2.0'; -export const angularDevkitVersion = '~16.2.0'; -export const ngPackagrVersion = '~16.2.0'; +export const angularVersion = '~17.0.0-rc.3'; +export const angularDevkitVersion = '~17.0.0-rc.4'; +export const ngPackagrVersion = '~17.0.0-rc.1'; export const ngrxVersion = '~16.0.0'; export const rxjsVersion = '~7.8.0'; -export const zoneJsVersion = '~0.13.0'; +export const zoneJsVersion = '~0.14.0'; export const angularJsVersion = '1.7.9'; export const tsLibVersion = '^2.3.0'; @@ -16,7 +16,7 @@ export const expressVersion = '~4.18.2'; export const typesExpressVersion = '4.17.14'; export const moduleFederationNodeVersion = '~1.0.5'; -export const angularEslintVersion = '~16.0.0'; +export const angularEslintVersion = '~17.0.0-alpha.0'; export const tailwindVersion = '^3.0.2'; export const postcssVersion = '^8.4.5'; export const postcssImportVersion = '~14.1.0'; @@ -25,7 +25,7 @@ export const postcssUrlVersion = '~10.1.3'; export const autoprefixerVersion = '^10.4.0'; export const tsNodeVersion = '10.9.1'; -export const jestPresetAngularVersion = '~13.1.0'; +export const jestPresetAngularVersion = '~13.1.3'; export const typesNodeVersion = '16.11.7'; export const jasmineMarblesVersion = '^0.9.2'; diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index 2f5546f9cdb8d..d0640170245e4 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -60,6 +60,8 @@ interface AngularArguments extends BaseArguments { routing: boolean; standaloneApi: boolean; e2eTestRunner: 'none' | 'cypress' | 'playwright'; + bundler: 'webpack' | 'esbuild'; + ssr: boolean; } interface VueArguments extends BaseArguments { @@ -149,10 +151,12 @@ export const commandsObject: yargs.Argv = yargs .option('standaloneApi', { describe: chalk.dim`Use Standalone Components if generating an Angular app`, type: 'boolean', + default: true, }) .option('routing', { describe: chalk.dim`Add a routing setup for an Angular app`, type: 'boolean', + default: true, }) .option('bundler', { describe: chalk.dim`Bundler to be used to build the app`, @@ -174,6 +178,10 @@ export const commandsObject: yargs.Argv = yargs describe: chalk.dim`Test runner to use for end to end (E2E) tests.`, choices: ['cypress', 'playwright', 'none'], type: 'string', + }) + .option('ssr', { + describe: chalk.dim`Enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) for the Angular application`, + type: 'boolean', }), withNxCloud, withCI, @@ -754,9 +762,12 @@ async function determineAngularOptions( let preset: Preset; let style: string; let appName: string; - let standaloneApi: boolean; let e2eTestRunner: undefined | 'none' | 'cypress' | 'playwright' = undefined; - let routing: boolean; + let bundler: undefined | 'webpack' | 'esbuild' = undefined; + let ssr: undefined | boolean = undefined; + + const standaloneApi = parsedArgs.standaloneApi; + const routing = parsedArgs.routing; if (parsedArgs.preset && parsedArgs.preset !== Preset.Angular) { preset = parsedArgs.preset; @@ -778,6 +789,30 @@ async function determineAngularOptions( } } + if (parsedArgs.bundler) { + bundler = parsedArgs.bundler; + } else { + const reply = await enquirer.prompt<{ bundler: 'esbuild' | 'webpack' }>([ + { + name: 'bundler', + message: `Which bundler would you like to use?`, + type: 'autocomplete', + choices: [ + { + name: 'esbuild', + message: 'esbuild [ https://esbuild.github.io/ ]', + }, + { + name: 'webpack', + message: 'Webpack [ https://webpack.js.org/ ]', + }, + ], + initial: 'esbuild' as any, + }, + ]); + bundler = reply.bundler; + } + if (parsedArgs.style) { style = parsedArgs.style; } else { @@ -806,55 +841,34 @@ async function determineAngularOptions( style = reply.style; } - e2eTestRunner = await determineE2eTestRunner(parsedArgs); - - if (parsedArgs.standaloneApi !== undefined) { - standaloneApi = parsedArgs.standaloneApi; + if (parsedArgs.ssr !== undefined) { + ssr = parsedArgs.ssr; } else { - const reply = await enquirer.prompt<{ standaloneApi: 'Yes' | 'No' }>([ + const reply = await enquirer.prompt<{ ssr: 'Yes' | 'No' }>([ { - name: 'standaloneApi', + name: 'ssr', message: - 'Would you like to use Standalone Components in your application?', + 'Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)?', type: 'autocomplete', - choices: [ - { - name: 'No', - }, - { - name: 'Yes', - }, - ], + choices: [{ name: 'Yes' }, { name: 'No' }], initial: 'No' as any, }, ]); - standaloneApi = reply.standaloneApi === 'Yes'; + ssr = reply.ssr === 'Yes'; } - if (parsedArgs.routing !== undefined) { - routing = parsedArgs.routing; - } else { - const reply = await enquirer.prompt<{ routing: 'Yes' | 'No' }>([ - { - name: 'routing', - message: 'Would you like to add routing?', - type: 'autocomplete', - choices: [ - { - name: 'Yes', - }, - - { - name: 'No', - }, - ], - initial: 'Yes' as any, - }, - ]); - routing = reply.routing === 'Yes'; - } + e2eTestRunner = await determineE2eTestRunner(parsedArgs); - return { preset, style, appName, standaloneApi, routing, e2eTestRunner }; + return { + preset, + style, + appName, + standaloneApi, + routing, + e2eTestRunner, + bundler, + ssr, + }; } async function determineNodeOptions( diff --git a/packages/cypress/src/executors/cypress/cypress.impl.ts b/packages/cypress/src/executors/cypress/cypress.impl.ts index 01a7fd2c65d77..07f4c3ce271d2 100644 --- a/packages/cypress/src/executors/cypress/cypress.impl.ts +++ b/packages/cypress/src/executors/cypress/cypress.impl.ts @@ -204,7 +204,8 @@ If the port is in use, try using a different port value or passing --port='cypre for await (const output of await runExecutor<{ success: boolean; baseUrl?: string; - info?: { port: number; baseUrl?: string }; + port?: string; + info?: { port?: number; baseUrl?: string }; }>(parsedDevServerTarget, overrides, context)) { if (!output.success && !opts.watch) throw new Error('Could not compile application files'); @@ -212,9 +213,9 @@ If the port is in use, try using a different port value or passing --port='cypre !opts.baseUrl && !output.baseUrl && !output.info?.baseUrl && - output.info?.port + (output.port || output.info?.port) ) { - output.baseUrl = `http://localhost:${output.info.port}`; + output.baseUrl = `http://localhost:${output.port ?? output.info?.port}`; } yield { baseUrl: opts.baseUrl || output.baseUrl || output.info?.baseUrl, diff --git a/packages/devkit/src/utils/versions.ts b/packages/devkit/src/utils/versions.ts index 26115dc8114db..a6661c65a2327 100644 --- a/packages/devkit/src/utils/versions.ts +++ b/packages/devkit/src/utils/versions.ts @@ -1 +1 @@ -export const typescriptVersion = '~5.1.3'; +export const typescriptVersion = '~5.2.2'; diff --git a/packages/eslint/package.json b/packages/eslint/package.json index 1d592af1d982d..1931df18ab93b 100644 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -36,7 +36,7 @@ "tslib": "^2.3.0", "@nx/devkit": "file:../devkit", "@nx/js": "file:../js", - "typescript": "~5.1.3" + "typescript": "~5.2.2" }, "peerDependenciesMeta": { "eslint": { diff --git a/packages/js/src/utils/versions.ts b/packages/js/src/utils/versions.ts index 0f16e5e7153c3..fcd220c05f4ce 100644 --- a/packages/js/src/utils/versions.ts +++ b/packages/js/src/utils/versions.ts @@ -11,7 +11,7 @@ export const typesNodeVersion = '18.7.1'; export const verdaccioVersion = '^5.0.4'; // Typescript -export const typescriptVersion = '~5.1.3'; +export const typescriptVersion = '~5.2.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/nuxt/src/generators/init/__snapshots__/init.spec.ts.snap b/packages/nuxt/src/generators/init/__snapshots__/init.spec.ts.snap index c0b882c92ba43..9cd2b8b8fe666 100644 --- a/packages/nuxt/src/generators/init/__snapshots__/init.spec.ts.snap +++ b/packages/nuxt/src/generators/init/__snapshots__/init.spec.ts.snap @@ -14,7 +14,7 @@ exports[`init should add nuxt dependencies 1`] = ` "h3": "^1.8.2", "nuxt": "^3.8.0", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "vue": "^3.3.4", "vue-router": "^4.2.4", "vue-tsc": "^1.8.8", diff --git a/packages/nx/src/command-line/init/implementation/angular/legacy-angular-versions.ts b/packages/nx/src/command-line/init/implementation/angular/legacy-angular-versions.ts index e5888f27d99fa..4d40d96478aac 100644 --- a/packages/nx/src/command-line/init/implementation/angular/legacy-angular-versions.ts +++ b/packages/nx/src/command-line/init/implementation/angular/legacy-angular-versions.ts @@ -16,9 +16,11 @@ import type { Options } from './types'; // map of Angular major versions to Nx versions to use for legacy `nx init` migrations, // key is major Angular version and value is Nx version to use -const nxAngularLegacyVersionMap: Record = {}; +const nxAngularLegacyVersionMap: Record = { + 14: '~17.0.0', +}; // min major angular version supported in latest Nx -const minMajorAngularVersionSupported = 14; +const minMajorAngularVersionSupported = 15; // version when the Nx CLI changed from @nrwl/tao & @nrwl/cli to nx const versionWithConsolidatedPackages = '13.9.0'; // version when packages were rescoped from @nrwl/* to @nx/* 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 443c69c3a5755..4fb909600de14 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 @@ -138,7 +138,7 @@ function createNxJson( inputs: ['default', '^production'], }; } - // Angular 14 workspaces support defaultProject, keep it until we drop support + // Angular 15 workspaces still support defaultProject. Support was removed in Angular 16. nxJson.defaultProject = angularJson.defaultProject; writeJsonFile(join(repoRoot, 'nx.json'), nxJson); } diff --git a/packages/nx/src/plugins/js/versions.ts b/packages/nx/src/plugins/js/versions.ts index 26115dc8114db..a6661c65a2327 100644 --- a/packages/nx/src/plugins/js/versions.ts +++ b/packages/nx/src/plugins/js/versions.ts @@ -1 +1 @@ -export const typescriptVersion = '~5.1.3'; +export const typescriptVersion = '~5.2.2'; diff --git a/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap b/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap index f2a4c23267d6e..acee29d6f8eca 100644 --- a/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap +++ b/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap @@ -18,7 +18,7 @@ exports[`@nx/storybook:init dependencies for package.json should add angular rel "@swc/core": "~1.3.85", "existing": "1.0.0", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", }, "name": "@proj/source", } diff --git a/packages/vite/src/generators/init/__snapshots__/init.spec.ts.snap b/packages/vite/src/generators/init/__snapshots__/init.spec.ts.snap index 71e71aead066d..dc806af033f1f 100644 --- a/packages/vite/src/generators/init/__snapshots__/init.spec.ts.snap +++ b/packages/vite/src/generators/init/__snapshots__/init.spec.ts.snap @@ -14,7 +14,7 @@ exports[`@nx/vite:init dependencies for package.json should add vite packages an "@vitest/ui": "~0.32.0", "existing": "1.0.0", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "vite": "~4.3.9", "vitest": "~0.32.0", }, @@ -33,7 +33,7 @@ exports[`@nx/vite:init dependencies for package.json should support --testEnviro "@swc/core": "~1.3.85", "@vitest/ui": "~0.32.0", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "vite": "~4.3.9", "vitest": "~0.32.0", }, @@ -52,7 +52,7 @@ exports[`@nx/vite:init dependencies for package.json should support --testEnviro "@vitest/ui": "~0.32.0", "happy-dom": "~9.20.3", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "vite": "~4.3.9", "vitest": "~0.32.0", }, @@ -71,7 +71,7 @@ exports[`@nx/vite:init dependencies for package.json should support --testEnviro "@vitest/ui": "~0.32.0", "jsdom": "~22.1.0", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "vite": "~4.3.9", "vitest": "~0.32.0", }, diff --git a/packages/vue/src/generators/init/__snapshots__/init.spec.ts.snap b/packages/vue/src/generators/init/__snapshots__/init.spec.ts.snap index ad677c244e8f5..2d15fb78baf58 100644 --- a/packages/vue/src/generators/init/__snapshots__/init.spec.ts.snap +++ b/packages/vue/src/generators/init/__snapshots__/init.spec.ts.snap @@ -15,7 +15,7 @@ exports[`init should add vue dependencies 1`] = ` "@vue/test-utils": "^2.4.1", "@vue/tsconfig": "^0.4.0", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "vue-tsc": "^1.8.8", }, "name": "@proj/source", 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 1a60225062507..0a1fb80a1a794 100644 --- a/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap +++ b/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap @@ -112,7 +112,7 @@ exports[`lib should add vue, vite and vitest to package.json 1`] = ` "eslint-plugin-vue": "^9.16.1", "jsdom": "~22.1.0", "prettier": "^2.6.2", - "typescript": "~5.1.3", + "typescript": "~5.2.2", "vite": "~4.3.9", "vitest": "~0.32.0", "vue-tsc": "^1.8.8", diff --git a/packages/workspace/src/generators/new/generate-preset.ts b/packages/workspace/src/generators/new/generate-preset.ts index 3f15271b8d032..51681b0db4e49 100644 --- a/packages/workspace/src/generators/new/generate-preset.ts +++ b/packages/workspace/src/generators/new/generate-preset.ts @@ -79,6 +79,7 @@ export function generatePreset(host: Tree, opts: NormalizedSchema) { opts.e2eTestRunner !== undefined ? `--e2eTestRunner=${opts.e2eTestRunner}` : null, + opts.ssr ? `--ssr` : null, ].filter((e) => !!e); } } diff --git a/packages/workspace/src/generators/new/new.ts b/packages/workspace/src/generators/new/new.ts index 4fd3a77831d45..fb45215e7a44f 100644 --- a/packages/workspace/src/generators/new/new.ts +++ b/packages/workspace/src/generators/new/new.ts @@ -32,6 +32,7 @@ interface Schema { routing?: boolean; packageManager?: PackageManager; e2eTestRunner?: 'cypress' | 'playwright' | 'detox' | 'jest' | 'none'; + ssr?: boolean; } export interface NormalizedSchema extends Schema { diff --git a/packages/workspace/src/generators/new/schema.json b/packages/workspace/src/generators/new/schema.json index 8be3cf05a6cd2..3794e31911c50 100644 --- a/packages/workspace/src/generators/new/schema.json +++ b/packages/workspace/src/generators/new/schema.json @@ -72,6 +72,11 @@ "description": "The tool to use for running e2e tests.", "type": "string", "enum": ["cypress", "playwright", "jest", "detox", "none"] + }, + "ssr": { + "description": "Enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) for the Angular application.", + "type": "boolean", + "default": false } }, "additionalProperties": true diff --git a/packages/workspace/src/generators/preset/preset.ts b/packages/workspace/src/generators/preset/preset.ts index fc564215002d4..196d6357db933 100644 --- a/packages/workspace/src/generators/preset/preset.ts +++ b/packages/workspace/src/generators/preset/preset.ts @@ -31,6 +31,8 @@ async function createPreset(tree: Tree, options: Schema) { standalone: options.standaloneApi, routing: options.routing, e2eTestRunner: options.e2eTestRunner ?? 'cypress', + bundler: options.bundler, + ssr: options.ssr, }); } else if (options.preset === Preset.AngularStandalone) { const { @@ -47,6 +49,8 @@ async function createPreset(tree: Tree, options: Schema) { rootProject: true, standalone: options.standaloneApi, e2eTestRunner: options.e2eTestRunner ?? 'cypress', + bundler: options.bundler, + ssr: options.ssr, }); } else if (options.preset === Preset.ReactMonorepo) { const { applicationGenerator: reactApplicationGenerator } = require('@nx' + diff --git a/packages/workspace/src/generators/preset/schema.d.ts b/packages/workspace/src/generators/preset/schema.d.ts index 0f72d1030131c..e609314a4da79 100644 --- a/packages/workspace/src/generators/preset/schema.d.ts +++ b/packages/workspace/src/generators/preset/schema.d.ts @@ -16,4 +16,5 @@ export interface Schema { standaloneApi?: boolean; e2eTestRunner?: 'cypress' | 'playwright' | 'jest' | 'detox' | 'none'; js?: boolean; + ssr?: boolean; } diff --git a/packages/workspace/src/generators/preset/schema.json b/packages/workspace/src/generators/preset/schema.json index 57a8f5a81ca46..2fa4d19605268 100644 --- a/packages/workspace/src/generators/preset/schema.json +++ b/packages/workspace/src/generators/preset/schema.json @@ -89,6 +89,11 @@ "description": "The tool to use for running e2e tests.", "type": "string", "enum": ["cypress", "playwright", "jest", "detox", "none"] + }, + "ssr": { + "description": "Enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) for the Angular application.", + "type": "boolean", + "default": false } }, "required": ["preset", "name"] diff --git a/packages/workspace/src/utils/versions.ts b/packages/workspace/src/utils/versions.ts index 8cd2567d87f42..0d5d957233ae9 100644 --- a/packages/workspace/src/utils/versions.ts +++ b/packages/workspace/src/utils/versions.ts @@ -1,7 +1,7 @@ export const nxVersion = require('../../package.json').version; -export const typescriptVersion = '~5.1.3'; +export const typescriptVersion = '~5.2.2'; // TODO: remove when preset generation is reworked and // deps are not installed from workspace -export const angularCliVersion = '~16.2.0'; +export const angularCliVersion = '~17.0.0-rc.4'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7ecd1bf7ba76..8bb6e3ab310b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + overrides: minimist: ^1.2.6 underscore: ^1.12.1 @@ -152,44 +156,44 @@ devDependencies: specifier: ^1.10.0 version: 1.10.0 '@angular-devkit/architect': - specifier: ~0.1602.0 - version: 0.1602.0(chokidar@3.5.3) + specifier: ~0.1700.0-rc.4 + version: 0.1700.0-rc.4(chokidar@3.5.3) '@angular-devkit/build-angular': - specifier: ~16.2.0 - version: 16.2.0(@angular/compiler-cli@16.2.0)(@swc/core@1.3.86)(@types/node@18.16.9)(html-webpack-plugin@5.5.0)(jest-environment-jsdom@29.4.3)(jest@29.4.3)(ng-packagr@16.2.0)(tailwindcss@3.2.4)(typescript@5.1.3) + specifier: ~17.0.0-rc.4 + version: 17.0.0-rc.4(@angular/compiler-cli@17.0.0-rc.3)(@swc/core@1.3.86)(@types/express@4.17.14)(@types/node@18.16.9)(html-webpack-plugin@5.5.0)(jest-environment-jsdom@29.4.3)(jest@29.4.3)(ng-packagr@17.0.0-rc.1)(tailwindcss@3.2.4)(typescript@5.2.2) '@angular-devkit/core': - specifier: ~16.2.0 - version: 16.2.0(chokidar@3.5.3) + specifier: ~17.0.0-rc.4 + version: 17.0.0-rc.4(chokidar@3.5.3) '@angular-devkit/schematics': - specifier: ~16.2.0 - version: 16.2.0 + specifier: ~17.0.0-rc.4 + version: 17.0.0-rc.4 '@angular-eslint/eslint-plugin': - specifier: ~16.0.0 - version: 16.0.0(eslint@8.46.0)(typescript@5.1.3) + specifier: ~17.0.0-alpha.0 + version: 17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2) '@angular-eslint/eslint-plugin-template': - specifier: ~16.0.0 - version: 16.0.0(eslint@8.46.0)(typescript@5.1.3) + specifier: ~17.0.0-alpha.0 + version: 17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2) '@angular-eslint/template-parser': - specifier: ~16.0.0 - version: 16.0.0(eslint@8.46.0)(typescript@5.1.3) + specifier: ~17.0.0-alpha.0 + version: 17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2) '@angular/cli': - specifier: ~16.2.0 - version: 16.2.0 + specifier: ~17.0.0-rc.4 + version: 17.0.0-rc.4 '@angular/common': - specifier: ~16.2.0 - version: 16.2.0(@angular/core@16.2.0)(rxjs@7.8.1) + specifier: ~17.0.0-rc.3 + version: 17.0.0-rc.3(@angular/core@17.0.0-rc.3)(rxjs@7.8.1) '@angular/compiler': - specifier: ~16.2.0 - version: 16.2.0(@angular/core@16.2.0) + specifier: ~17.0.0-rc.3 + version: 17.0.0-rc.3(@angular/core@17.0.0-rc.3) '@angular/compiler-cli': - specifier: ~16.2.0 - version: 16.2.0(@angular/compiler@16.2.0)(typescript@5.1.3) + specifier: ~17.0.0-rc.3 + version: 17.0.0-rc.3(@angular/compiler@17.0.0-rc.3)(typescript@5.2.2) '@angular/core': - specifier: ~16.2.0 - version: 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) + specifier: ~17.0.0-rc.3 + version: 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) '@angular/router': - specifier: ~16.2.0 - version: 16.2.0(@angular/common@16.2.0)(@angular/core@16.2.0)(@angular/platform-browser@16.2.0)(rxjs@7.8.1) + specifier: ~17.0.0-rc.3 + version: 17.0.0-rc.3(@angular/common@17.0.0-rc.3)(@angular/core@17.0.0-rc.3)(@angular/platform-browser@17.0.0-rc.3)(rxjs@7.8.1) '@babel/core': specifier: ^7.22.9 version: 7.22.9 @@ -228,7 +232,7 @@ devDependencies: version: 29.5.0 '@monodon/rust': specifier: 1.1.2 - version: 1.1.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.1.3) + version: 1.1.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.2.2) '@napi-rs/cli': specifier: 2.14.0 version: 2.14.0 @@ -246,7 +250,7 @@ devDependencies: version: 9.1.6(@nestjs/common@9.1.6)(@nestjs/core@9.1.6) '@nestjs/schematics': specifier: ^9.1.0 - version: 9.1.0(chokidar@3.5.3)(typescript@4.9.4) + version: 9.1.0(typescript@5.2.2) '@nestjs/swagger': specifier: ^6.0.0 version: 6.1.3(@nestjs/common@9.1.6)(@nestjs/core@9.1.6)(reflect-metadata@0.1.13) @@ -255,64 +259,61 @@ devDependencies: version: 9.1.6(@nestjs/common@9.1.6)(@nestjs/core@9.1.6)(@nestjs/platform-express@9.1.6) '@ngrx/effects': specifier: ~16.0.0 - version: 16.0.0(@angular/core@16.2.0)(@ngrx/store@16.0.0)(rxjs@7.8.1) + version: 16.0.0(@angular/core@17.0.0-rc.3)(@ngrx/store@16.0.0)(rxjs@7.8.1) '@ngrx/router-store': specifier: ~16.0.0 - version: 16.0.0(@angular/common@16.2.0)(@angular/core@16.2.0)(@angular/router@16.2.0)(@ngrx/store@16.0.0)(rxjs@7.8.1) + version: 16.0.0(@angular/common@17.0.0-rc.3)(@angular/core@17.0.0-rc.3)(@angular/router@17.0.0-rc.3)(@ngrx/store@16.0.0)(rxjs@7.8.1) '@ngrx/store': specifier: ~16.0.0 - version: 16.0.0(@angular/core@16.2.0)(rxjs@7.8.1) - '@nguniversal/builders': - specifier: ~16.2.0 - version: 16.2.0(@angular-devkit/build-angular@16.2.0)(@angular/common@16.2.0)(@angular/core@16.2.0)(@types/express@4.17.14)(typescript@5.1.3) + version: 16.0.0(@angular/core@17.0.0-rc.3)(rxjs@7.8.1) '@nx/angular': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@angular-devkit/build-angular@16.2.0)(@angular-devkit/core@16.2.0)(@angular-devkit/schematics@16.2.0)(@nguniversal/builders@16.2.0)(@schematics/angular@16.2.0)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@angular-devkit/build-angular@17.0.0-rc.4)(@angular-devkit/core@17.0.0-rc.4)(@angular-devkit/schematics@17.0.0-rc.4)(@schematics/angular@17.0.0-rc.4)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/cypress': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': specifier: 17.0.0-rc.2 version: 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/esbuild': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/eslint': specifier: 17.0.0-rc.2 version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) '@nx/eslint-plugin': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/jest': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/js': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/next': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) + version: 17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0) '@nx/playwright': specifier: 17.0.0-rc.2 version: 17.0.0-rc.2(@playwright/test@1.36.1)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) '@nx/react': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0) '@nx/storybook': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/web': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/webpack': specifier: 17.0.0-rc.2 - version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + version: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@parcel/watcher': specifier: 2.0.4 version: 2.0.4 '@phenomnomnominal/tsquery': specifier: ~5.0.1 - version: 5.0.1(typescript@5.1.3) + version: 5.0.1(typescript@5.2.2) '@playwright/test': specifier: ^1.36.1 version: 1.36.1 @@ -344,8 +345,8 @@ devDependencies: specifier: ^7.0.0 version: 7.0.0(rollup@2.79.0) '@schematics/angular': - specifier: ~16.2.0 - version: 16.2.0 + specifier: ~17.0.0-rc.4 + version: 17.0.0-rc.4 '@side/jest-runtime': specifier: ^1.1.0 version: 1.1.0(@jest/transform@29.5.0)(jest-runtime@29.5.0)(jest@29.4.3) @@ -357,10 +358,10 @@ devDependencies: version: 7.2.2 '@storybook/react': specifier: 7.2.2 - version: 7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) + version: 7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@storybook/react-webpack5': specifier: 7.2.2 - version: 7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1) + version: 7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(webpack-dev-server@4.11.1) '@storybook/types': specifier: ^7.1.1 version: 7.1.1 @@ -375,7 +376,7 @@ devDependencies: version: 8.0.1 '@swc-node/register': specifier: 1.6.8 - version: 1.6.8(@swc/core@1.3.86)(typescript@5.1.3) + version: 1.6.8(@swc/core@1.3.86)(typescript@5.2.2) '@swc/cli': specifier: 0.1.62 version: 0.1.62(@swc/core@1.3.86) @@ -459,16 +460,16 @@ devDependencies: version: 1.1.5 '@typescript-eslint/eslint-plugin': specifier: ^6.9.1 - version: 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.46.0)(typescript@5.1.3) + version: 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.46.0)(typescript@5.2.2) '@typescript-eslint/parser': specifier: ^6.9.1 - version: 6.9.1(eslint@8.46.0)(typescript@5.1.3) + version: 6.9.1(eslint@8.46.0)(typescript@5.2.2) '@typescript-eslint/type-utils': specifier: ^6.9.1 - version: 6.9.1(eslint@8.46.0)(typescript@5.1.3) + version: 6.9.1(eslint@8.46.0)(typescript@5.2.2) '@typescript-eslint/utils': specifier: ^6.9.1 - version: 6.9.1(eslint@8.46.0)(typescript@5.1.3) + version: 6.9.1(eslint@8.46.0)(typescript@5.2.2) '@xstate/immer': specifier: 0.3.1 version: 0.3.1(immer@9.0.16)(xstate@4.34.0) @@ -567,7 +568,7 @@ devDependencies: version: 8.46.0 eslint-config-next: specifier: 13.1.1 - version: 13.1.1(eslint@8.46.0)(typescript@5.1.3) + version: 13.1.1(eslint@8.46.0)(typescript@5.2.2) eslint-config-prettier: specifier: 9.0.0 version: 9.0.0(eslint@8.46.0) @@ -576,7 +577,7 @@ devDependencies: version: 2.14.0(eslint@8.46.0) eslint-plugin-import: specifier: 2.26.0 - version: 2.26.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.46.0) + version: 2.26.0(@typescript-eslint/parser@6.9.1)(eslint@8.46.0) eslint-plugin-jsx-a11y: specifier: 6.6.1 version: 6.6.1(eslint@8.46.0) @@ -591,7 +592,7 @@ devDependencies: version: 4.6.0(eslint@8.46.0) eslint-plugin-storybook: specifier: ^0.6.12 - version: 0.6.12(eslint@8.46.0)(typescript@5.1.3) + version: 0.6.12(eslint@8.46.0)(typescript@5.2.2) express: specifier: ^4.18.1 version: 4.18.1 @@ -615,7 +616,7 @@ devDependencies: version: 5.0.2 fork-ts-checker-webpack-plugin: specifier: 7.2.13 - version: 7.2.13(typescript@5.1.3)(webpack@5.88.0) + version: 7.2.13(typescript@5.2.2)(webpack@5.88.0) fs-extra: specifier: ^11.1.0 version: 11.1.0 @@ -749,8 +750,8 @@ devDependencies: specifier: ^3.1.10 version: 3.1.29(@next/env@13.4.5)(next@13.3.4) ng-packagr: - specifier: ~16.2.0 - version: 16.2.0(@angular/compiler-cli@16.2.0)(tailwindcss@3.2.4)(tslib@2.4.0)(typescript@5.1.3) + specifier: ~17.0.0-rc.1 + version: 17.0.0-rc.1(@angular/compiler-cli@17.0.0-rc.3)(tailwindcss@3.2.4)(tslib@2.4.0)(typescript@5.2.2) node-fetch: specifier: ^2.6.7 version: 2.6.7 @@ -837,7 +838,7 @@ devDependencies: version: 4.0.2(postcss@8.4.19)(ts-node@10.9.1) rollup-plugin-typescript2: specifier: 0.34.1 - version: 0.34.1(rollup@2.79.0)(typescript@5.1.3) + version: 0.34.1(rollup@2.79.0)(typescript@5.2.2) rxjs: specifier: ^7.8.0 version: 7.8.1 @@ -888,13 +889,13 @@ devDependencies: version: 1.2.2 ts-jest: specifier: 29.1.0 - version: 29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.19.5)(jest@29.4.3)(typescript@5.1.3) + version: 29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.19.5)(jest@29.4.3)(typescript@5.2.2) ts-loader: specifier: ^9.3.1 - version: 9.4.1(typescript@5.1.3)(webpack@5.88.0) + version: 9.4.1(typescript@5.2.2)(webpack@5.88.0) ts-node: specifier: 10.9.1 - version: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.1.3) + version: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.2.2) tsconfig-paths: specifier: ^4.1.2 version: 4.1.2 @@ -903,13 +904,13 @@ devDependencies: version: 4.0.0 typedoc: specifier: 0.25.1 - version: 0.25.1(typescript@5.1.3) + version: 0.25.1(typescript@5.2.2) typedoc-plugin-markdown: specifier: 3.16.0 version: 3.16.0(typedoc@0.25.1) typescript: - specifier: ~5.1.3 - version: 5.1.3 + specifier: ~5.2.2 + version: 5.2.2 unist-builder: specifier: ^4.0.0 version: 4.0.0 @@ -1129,31 +1130,31 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 - /@angular-devkit/architect@0.1602.0(chokidar@3.5.3): - resolution: {integrity: sha512-ZRmUTBeD+uGr605eOHnsovEn6f1mOBI+kxP64DRvagNweX5TN04s3iyQ8jmLSAHQD9ush31LFxv3dVNxv3ceXQ==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@angular-devkit/architect@0.1700.0-rc.4(chokidar@3.5.3): + resolution: {integrity: sha512-jciusWICU3CKBBxoYZ+hlKfoAOB+rvvpyj5qBCIcSPXkslWQ8yG4Zu4K3sTwqpkinOhjdcyKhF6lvqHoi1q7Fg==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) + '@angular-devkit/core': 17.0.0-rc.4(chokidar@3.5.3) rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: true - /@angular-devkit/build-angular@16.2.0(@angular/compiler-cli@16.2.0)(@swc/core@1.3.86)(@types/node@18.16.9)(html-webpack-plugin@5.5.0)(jest-environment-jsdom@29.4.3)(jest@29.4.3)(ng-packagr@16.2.0)(tailwindcss@3.2.4)(typescript@5.1.3): - resolution: {integrity: sha512-miylwjOqvlKmYrzS84bjRaJrecZxOXH9xsPVvQE8VBe8UKePJjRAL6yyOqXUOGtzlch2YmT98RAnuni7y0FEAw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@angular-devkit/build-angular@17.0.0-rc.4(@angular/compiler-cli@17.0.0-rc.3)(@swc/core@1.3.86)(@types/express@4.17.14)(@types/node@18.16.9)(html-webpack-plugin@5.5.0)(jest-environment-jsdom@29.4.3)(jest@29.4.3)(ng-packagr@17.0.0-rc.1)(tailwindcss@3.2.4)(typescript@5.2.2): + resolution: {integrity: sha512-n1ekKJYPV+sTiTg3GOpYynOKjypMxNjiwvt2gCBlBWG8q01IdoYJHuUWGen++exsJ9g5OBrTPazf9SR1pVOKSA==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^16.0.0 - '@angular/localize': ^16.0.0 - '@angular/platform-server': ^16.0.0 - '@angular/service-worker': ^16.0.0 + '@angular/compiler-cli': ^17.0.0 || ^17.0.0-next.0 + '@angular/localize': ^17.0.0 || ^17.0.0-next.0 + '@angular/platform-server': ^17.0.0 || ^17.0.0-next.0 + '@angular/service-worker': ^17.0.0 || ^17.0.0-next.0 jest: ^29.5.0 jest-environment-jsdom: ^29.5.0 karma: ^6.3.0 - ng-packagr: ^16.0.0 + ng-packagr: ^17.0.0 || ^17.0.0-next.1 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 - typescript: '>=4.9.3 <5.2' + typescript: '>=5.2 <5.3' peerDependenciesMeta: '@angular/localize': optional: true @@ -1175,82 +1176,83 @@ packages: optional: true dependencies: '@ampproject/remapping': 2.2.1 - '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) - '@angular-devkit/build-webpack': 0.1602.0(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2) - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@angular/compiler-cli': 16.2.0(@angular/compiler@16.2.0)(typescript@5.1.3) - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 + '@angular-devkit/architect': 0.1700.0-rc.4(chokidar@3.5.3) + '@angular-devkit/build-webpack': 0.1700.0-rc.4(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.89.0) + '@angular-devkit/core': 17.0.0-rc.4(chokidar@3.5.3) + '@angular/compiler-cli': 17.0.0-rc.3(@angular/compiler@17.0.0-rc.3)(typescript@5.2.2) + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) - '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/runtime': 7.22.6 - '@babel/template': 7.22.5 + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/runtime': 7.23.2 '@discoveryjs/json-ext': 0.5.7 - '@ngtools/webpack': 16.2.0(@angular/compiler-cli@16.2.0)(typescript@5.1.3)(webpack@5.88.2) - '@vitejs/plugin-basic-ssl': 1.0.1(vite@4.4.7) + '@ngtools/webpack': 17.0.0-rc.4(@angular/compiler-cli@17.0.0-rc.3)(typescript@5.2.2)(webpack@5.89.0) + '@vitejs/plugin-basic-ssl': 1.0.1(vite@4.5.0) ansi-colors: 4.1.3 - autoprefixer: 10.4.14(postcss@8.4.27) - babel-loader: 9.1.3(@babel/core@7.22.9)(webpack@5.88.2) + autoprefixer: 10.4.16(postcss@8.4.31) + babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.89.0) babel-plugin-istanbul: 6.1.1 - browserslist: 4.21.9 + browser-sync: 2.29.3 + browserslist: 4.22.1 chokidar: 3.5.3 - copy-webpack-plugin: 11.0.0(webpack@5.88.2) + copy-webpack-plugin: 11.0.0(webpack@5.89.0) critters: 0.0.20 - css-loader: 6.8.1(webpack@5.88.2) - esbuild-wasm: 0.18.17 + css-loader: 6.8.1(webpack@5.89.0) + esbuild-wasm: 0.19.5 fast-glob: 3.3.1 - guess-parser: 0.4.22(typescript@5.1.3) - https-proxy-agent: 5.0.1 - inquirer: 8.2.4 + http-proxy-middleware: 2.0.6(@types/express@4.17.14) + https-proxy-agent: 7.0.2 + inquirer: 9.2.11 jest: 29.4.3(@types/node@18.16.9)(ts-node@10.9.1) jest-environment-jsdom: 29.4.3 jsonc-parser: 3.2.0 karma-source-map-support: 1.4.0 - less: 4.1.3 - less-loader: 11.1.0(less@4.1.3)(webpack@5.88.2) - license-webpack-plugin: 4.0.2(webpack@5.88.2) + less: 4.2.0 + less-loader: 11.1.0(less@4.2.0)(webpack@5.89.0) + license-webpack-plugin: 4.0.2(webpack@5.89.0) loader-utils: 3.2.1 - magic-string: 0.30.1 - mini-css-extract-plugin: 2.7.6(webpack@5.88.2) + magic-string: 0.30.5 + mini-css-extract-plugin: 2.7.6(webpack@5.89.0) mrmime: 1.0.1 - ng-packagr: 16.2.0(@angular/compiler-cli@16.2.0)(tailwindcss@3.2.4)(tslib@2.4.0)(typescript@5.1.3) + ng-packagr: 17.0.0-rc.1(@angular/compiler-cli@17.0.0-rc.3)(tailwindcss@3.2.4)(tslib@2.4.0)(typescript@5.2.2) open: 8.4.2 ora: 5.4.1 parse5-html-rewriting-stream: 7.0.0 - picomatch: 2.3.1 - piscina: 4.0.0 - postcss: 8.4.27 - postcss-loader: 7.3.3(postcss@8.4.27)(webpack@5.88.2) + picomatch: 3.0.1 + piscina: 4.1.0 + postcss: 8.4.31 + postcss-loader: 7.3.3(postcss@8.4.31)(webpack@5.89.0) resolve-url-loader: 5.0.0 rxjs: 7.8.1 - sass: 1.64.1 - sass-loader: 13.3.2(sass@1.64.1)(webpack@5.88.2) + sass: 1.69.5 + sass-loader: 13.3.2(sass@1.69.5)(webpack@5.89.0) semver: 7.5.4 - source-map-loader: 4.0.1(webpack@5.88.2) + source-map-loader: 4.0.1(webpack@5.89.0) source-map-support: 0.5.21 tailwindcss: 3.2.4(postcss@8.4.19)(ts-node@10.9.1) - terser: 5.19.2 + terser: 5.24.0 text-table: 0.2.0 tree-kill: 1.2.2 - tslib: 2.6.1 - typescript: 5.1.3 - vite: 4.4.7(@types/node@18.16.9)(less@4.1.3)(sass@1.64.1)(terser@5.19.2) - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) - webpack-dev-middleware: 6.1.1(webpack@5.88.2) - webpack-dev-server: 4.15.1(webpack@5.88.2) - webpack-merge: 5.9.0 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0)(webpack@5.88.2) + tslib: 2.6.2 + typescript: 5.2.2 + undici: 5.27.2 + vite: 4.5.0(@types/node@18.16.9)(less@4.2.0)(sass@1.69.5)(terser@5.24.0) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) + webpack-dev-middleware: 6.1.1(webpack@5.89.0) + webpack-dev-server: 4.15.1(webpack@5.89.0) + webpack-merge: 5.10.0 + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0)(webpack@5.89.0) optionalDependencies: - esbuild: 0.18.17 + esbuild: 0.19.5 transitivePeerDependencies: - '@swc/core' + - '@types/express' - '@types/node' - bufferutil - - canvas - debug - fibers - html-webpack-plugin @@ -1265,17 +1267,17 @@ packages: - webpack-cli dev: true - /@angular-devkit/build-webpack@0.1602.0(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2): - resolution: {integrity: sha512-KdSr6iAcO30i/LIGL8mYi+d1buVXuDCp2dptzEJ4vxReOMFJca90KLwb+tVHEqqnDb0WkNfWm8Ii2QYh2FrNyA==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@angular-devkit/build-webpack@0.1700.0-rc.4(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.89.0): + resolution: {integrity: sha512-CSJa1u38Bp4gJAzDdQome9mPfrq8BXBJXd7z5AkjqJ4QJ8yzuyRZk/5MFfHkjQ1tGv+sFANpQzlBFIX5j2jO8A==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^4.0.0 dependencies: - '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) + '@angular-devkit/architect': 0.1700.0-rc.4(chokidar@3.5.3) rxjs: 7.8.1 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) - webpack-dev-server: 4.15.1(webpack@5.88.2) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) + webpack-dev-server: 4.15.1(webpack@5.89.0) transitivePeerDependencies: - chokidar dev: true @@ -1314,9 +1316,9 @@ packages: source-map: 0.7.4 dev: true - /@angular-devkit/core@16.2.0(chokidar@3.5.3): - resolution: {integrity: sha512-l1k6Rqm3YM16BEn3CWyQKrk9xfu+2ux7Bw3oS+h1TO4/RoxO2PgHj8LLRh/WNrYVarhaqO7QZ5ePBkXNMkzJ1g==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@angular-devkit/core@17.0.0-rc.4(chokidar@3.5.3): + resolution: {integrity: sha512-APokMStYvRW55LU4+0uHzsa+X0o4/JqX0D6Vj6ryBmXz7LSwHOMq2lbuvs1zyMLSWRFESBvhV2GfNQx96SZNoQ==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 peerDependenciesMeta: @@ -1327,6 +1329,7 @@ packages: ajv-formats: 2.1.1(ajv@8.12.0) chokidar: 3.5.3 jsonc-parser: 3.2.0 + picomatch: 3.0.1 rxjs: 7.8.1 source-map: 0.7.4 dev: true @@ -1372,101 +1375,101 @@ packages: - chokidar dev: true - /@angular-devkit/schematics@16.2.0: - resolution: {integrity: sha512-QMDJXPE0+YQJ9Ap3MMzb0v7rx6ZbBEokmHgpdIjN3eILYmbAdsSGE8HTV8NjS9nKmcyE9OGzFCMb7PFrDTlTAw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@angular-devkit/schematics@17.0.0-rc.4: + resolution: {integrity: sha512-xQN906533P4D1ifF4Q3cEgFko8FpnPMw7CmDH5GstwN0wBTiCGp9121Oc4FQ6AwNYoG5ilF7LpEG8VfaWSEk+w==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) + '@angular-devkit/core': 17.0.0-rc.4(chokidar@3.5.3) jsonc-parser: 3.2.0 - magic-string: 0.30.1 + magic-string: 0.30.5 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: true - /@angular-eslint/bundled-angular-compiler@16.0.0: - resolution: {integrity: sha512-ZCU+bzcCiR3tSegFgEh+TzVr2JDTyBrGg6HoCL+RlLqv6V2OEmrkgzKmgEZ0XJ9X6QVr/yu9pl9seEdMTnwthg==} + /@angular-eslint/bundled-angular-compiler@17.0.0-alpha.0: + resolution: {integrity: sha512-ery0TcgjVDlj4m8lZ1oSbnTsvknbhCd0zrEgF6gWusbCMwHc2JuOSHVFXTeLMer1tKMNA76B0WlDEwFFM44eeQ==} dev: true - /@angular-eslint/eslint-plugin-template@16.0.0(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-2m2NsB+WHO61eR1qvRvAidL5NBY89U/7bSPivA0o0lYuYZMuAczkDfsOBn4ejlaNdk+/vzXsmchza0B1ujrecA==} + /@angular-eslint/eslint-plugin-template@17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2): + resolution: {integrity: sha512-r9gg8bsd4ybGllvPGMGbQQ+v/O4ly64hKPucyT7bRDix4TGwL8rBvrRWVbvVsaaTW2sFdpS77453AoxgdX4ClA==} peerDependencies: eslint: ^7.20.0 || ^8.0.0 typescript: '*' dependencies: - '@angular-eslint/bundled-angular-compiler': 16.0.0 - '@angular-eslint/utils': 16.0.0(eslint@8.46.0)(typescript@5.1.3) - '@typescript-eslint/type-utils': 5.59.2(eslint@8.46.0)(typescript@5.1.3) - '@typescript-eslint/utils': 5.59.2(eslint@8.46.0)(typescript@5.1.3) - aria-query: 5.1.3 - axobject-query: 3.1.1 + '@angular-eslint/bundled-angular-compiler': 17.0.0-alpha.0 + '@angular-eslint/utils': 17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.10.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.46.0)(typescript@5.2.2) + aria-query: 5.3.0 + axobject-query: 3.2.1 eslint: 8.46.0 - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@angular-eslint/eslint-plugin@16.0.0(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-ObUvQOWRI1p5RlEjhEPC3fGe53XB4F2jYxGZm8Ry6rWRltpL/r7O2vRDpH44TJH0cbb68MPqQM001dIYpg0Yhg==} + /@angular-eslint/eslint-plugin@17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2): + resolution: {integrity: sha512-uHQ0A9u5A1Cx8poIZm08ahmHXajnmoNYWgGIw/LVFmGcu3aI/f1J6Kv1W7XR40R98rC07iU9Vcf+2PdD33ruvA==} peerDependencies: eslint: ^7.20.0 || ^8.0.0 typescript: '*' dependencies: - '@angular-eslint/utils': 16.0.0(eslint@8.46.0)(typescript@5.1.3) - '@typescript-eslint/utils': 5.59.2(eslint@8.46.0)(typescript@5.1.3) + '@angular-eslint/utils': 17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.46.0)(typescript@5.2.2) eslint: 8.46.0 - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@angular-eslint/template-parser@16.0.0(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-EEP9pQ9jXhcmQ1o4x4xR1Lx4cKo2EPrcNG/qT4XI5PAH1kjQPn0UlB2avRokyv9GFnMpleA5vkKmPMWlZ43kyw==} + /@angular-eslint/template-parser@17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2): + resolution: {integrity: sha512-H3AfApIkV9uLGVsu/nnMZLek4xnwN4KBQvPt44/f45SoqVzhbGFe0YpYWrivnOKz44TJrSMC/+d+SG0rQ2V6yg==} peerDependencies: eslint: ^7.20.0 || ^8.0.0 typescript: '*' dependencies: - '@angular-eslint/bundled-angular-compiler': 16.0.0 + '@angular-eslint/bundled-angular-compiler': 17.0.0-alpha.0 eslint: 8.46.0 - eslint-scope: 7.1.1 - typescript: 5.1.3 + eslint-scope: 7.2.2 + typescript: 5.2.2 dev: true - /@angular-eslint/utils@16.0.0(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-4+g3yqdYR1IFPQkZtvRe/pmEZ2b31sV1A6CCGZb1Vx512xTuGZwRIja/tqwVgAIW3ZmRlgJO0zqjxLfAgvoZxg==} + /@angular-eslint/utils@17.0.0-alpha.0(eslint@8.46.0)(typescript@5.2.2): + resolution: {integrity: sha512-h2D578536gmFNcQXBx2W9hO0kM1lz90kGcWdwcVIQetK1RRF+jUqAM86rMRJuWM/mPumZkCaPyPqxnOVG28lfg==} peerDependencies: eslint: ^7.20.0 || ^8.0.0 typescript: '*' dependencies: - '@angular-eslint/bundled-angular-compiler': 16.0.0 - '@typescript-eslint/utils': 5.59.2(eslint@8.46.0)(typescript@5.1.3) + '@angular-eslint/bundled-angular-compiler': 17.0.0-alpha.0 + '@typescript-eslint/utils': 6.10.0(eslint@8.46.0)(typescript@5.2.2) eslint: 8.46.0 - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@angular/cli@16.2.0: - resolution: {integrity: sha512-xT8vJOyw6Rc2364XDW2jHagLgKu7342ktd/lt+c0u6R+AB2XVFMePR7VceLohX9N/vRUsbQ0nVSZr+ru/hA+HA==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@angular/cli@17.0.0-rc.4: + resolution: {integrity: sha512-noK/n1vn0rWaRj5NrtMWnanxyTAajFmDCDjgrMA3N73DWemu0hXubi5fe5ONVrNYKJObqPv/P4C/Nluz4Sollw==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.2.0 - '@schematics/angular': 16.2.0 + '@angular-devkit/architect': 0.1700.0-rc.4(chokidar@3.5.3) + '@angular-devkit/core': 17.0.0-rc.4(chokidar@3.5.3) + '@angular-devkit/schematics': 17.0.0-rc.4 + '@schematics/angular': 17.0.0-rc.4 '@yarnpkg/lockfile': 1.1.0 ansi-colors: 4.1.3 ini: 4.1.1 - inquirer: 8.2.4 + inquirer: 9.2.11 jsonc-parser: 3.2.0 - npm-package-arg: 10.1.0 - npm-pick-manifest: 8.0.1 + npm-package-arg: 11.0.1 + npm-pick-manifest: 9.0.0 open: 8.4.2 ora: 5.4.1 - pacote: 15.2.0 - resolve: 1.22.2 + pacote: 17.0.4 + resolve: 1.22.8 semver: 7.5.4 symbol-observable: 4.0.0 yargs: 17.7.2 @@ -1476,95 +1479,95 @@ packages: - supports-color dev: true - /@angular/common@16.2.0(@angular/core@16.2.0)(rxjs@7.8.1): - resolution: {integrity: sha512-ByrDLsTBarzqRmq4GS841Ku0lvB4L2wfOCfGEIw2ZuiNbZlDA5O/qohQgJnHR5d9meVJnu9NgdbeyMzk90xZNg==} - engines: {node: ^16.14.0 || >=18.10.0} + /@angular/common@17.0.0-rc.3(@angular/core@17.0.0-rc.3)(rxjs@7.8.1): + resolution: {integrity: sha512-ZWykfQCDNR6qEsI219j/F5cZzig7EaarYxk7qdXMESEzD1RYcsxWuBEcv3I0zbmej1otZzS2FE+Z8kOMW/3aMg==} + engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/core': 16.2.0 + '@angular/core': 17.0.0-rc.3 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) + '@angular/core': 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) rxjs: 7.8.1 - tslib: 2.5.3 + tslib: 2.6.2 dev: true - /@angular/compiler-cli@16.2.0(@angular/compiler@16.2.0)(typescript@5.1.3): - resolution: {integrity: sha512-IGRpEJwbzOLFsLj2qgTHpZ6nNcRjKDYaaAnVx+B1CfK4DP31PIsZLgsWcEcYt7KbF/FUlrCNwdBxrqE7rDxZaw==} - engines: {node: ^16.14.0 || >=18.10.0} + /@angular/compiler-cli@17.0.0-rc.3(@angular/compiler@17.0.0-rc.3)(typescript@5.2.2): + resolution: {integrity: sha512-FSis4qfPj7dcwXArfT0/bfK7sevgITEte7dCqS8CeFz0Depfg6v/aRQv8eDkzu0BgNy1Ivt8l76XuS+XW0fbLw==} + engines: {node: ^18.13.0 || >=20.9.0} hasBin: true peerDependencies: - '@angular/compiler': 16.2.0 - typescript: '>=4.9.3 <5.2' + '@angular/compiler': 17.0.0-rc.3 + typescript: '>=5.2 <5.3' dependencies: - '@angular/compiler': 16.2.0(@angular/core@16.2.0) - '@babel/core': 7.22.5 + '@angular/compiler': 17.0.0-rc.3(@angular/core@17.0.0-rc.3) + '@babel/core': 7.23.2 '@jridgewell/sourcemap-codec': 1.4.15 chokidar: 3.5.3 convert-source-map: 1.9.0 reflect-metadata: 0.1.13 semver: 7.5.3 - tslib: 2.5.3 - typescript: 5.1.3 + tslib: 2.6.2 + typescript: 5.2.2 yargs: 17.7.2 transitivePeerDependencies: - supports-color dev: true - /@angular/compiler@16.2.0(@angular/core@16.2.0): - resolution: {integrity: sha512-Ai0CKRUDlMY6iFCeoRsC+soVFTU7eyMDmNzeakdmNvGYMdLdjH8WvgaNukesi6WX7YBIQIKTPJVral8fXBQroQ==} - engines: {node: ^16.14.0 || >=18.10.0} + /@angular/compiler@17.0.0-rc.3(@angular/core@17.0.0-rc.3): + resolution: {integrity: sha512-D2+kuKQvis+fEzmfsjP9dHnVgk3RosXn+q/b8Bo8yb7fZ7JutwA11eIpn6YopRwCvVi/eeZPut7nmmVuLJc9vw==} + engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/core': 16.2.0 + '@angular/core': 17.0.0-rc.3 peerDependenciesMeta: '@angular/core': optional: true dependencies: - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.5.3 + '@angular/core': 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) + tslib: 2.6.2 dev: true - /@angular/core@16.2.0(rxjs@7.8.1)(zone.js@0.13.1): - resolution: {integrity: sha512-iwUWFw+JmRxw0chcNoqhXVR8XUTE+Rszhy22iSCkK0Jo8IJqEad1d2dQoFu1QfqOVdPMZtpJDmC/ppQ/f5c5aA==} - engines: {node: ^16.14.0 || >=18.10.0} + /@angular/core@17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0): + resolution: {integrity: sha512-v0X80CV611NuMZ1H/dbufEg1UTw2f4aGPhOtU2JRpAFfdYQ2PQRYseE77ts5zkdERgq1dW00DPTp7rBZS2st9Q==} + engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: rxjs: ^6.5.3 || ^7.4.0 - zone.js: ~0.13.0 + zone.js: ~0.14.0 dependencies: rxjs: 7.8.1 - tslib: 2.5.3 - zone.js: 0.13.1 + tslib: 2.6.2 + zone.js: 0.14.0 dev: true - /@angular/platform-browser@16.2.0(@angular/common@16.2.0)(@angular/core@16.2.0): - resolution: {integrity: sha512-6xjZFnSD0C8ylDbzKpsxCJ4pLJDRvippr9Wj9RCeDQvAzMibsqIjpbesyOccw3hO+jheJQRhM/rZeO1ubZU94w==} - engines: {node: ^16.14.0 || >=18.10.0} + /@angular/platform-browser@17.0.0-rc.3(@angular/common@17.0.0-rc.3)(@angular/core@17.0.0-rc.3): + resolution: {integrity: sha512-F8HkhdtZMA9KM8RbgiB/rDzgJRYei/6N6bP95UDs7xOkhTAz+fbmmTLKTwAQ1YkRY0T7S7Z1OxgEtAeFh6pEFQ==} + engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/animations': 16.2.0 - '@angular/common': 16.2.0 - '@angular/core': 16.2.0 + '@angular/animations': 17.0.0-rc.3 + '@angular/common': 17.0.0-rc.3 + '@angular/core': 17.0.0-rc.3 peerDependenciesMeta: '@angular/animations': optional: true dependencies: - '@angular/common': 16.2.0(@angular/core@16.2.0)(rxjs@7.8.1) - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.6.1 + '@angular/common': 17.0.0-rc.3(@angular/core@17.0.0-rc.3)(rxjs@7.8.1) + '@angular/core': 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) + tslib: 2.6.2 dev: true - /@angular/router@16.2.0(@angular/common@16.2.0)(@angular/core@16.2.0)(@angular/platform-browser@16.2.0)(rxjs@7.8.1): - resolution: {integrity: sha512-bFOaE7PNF0UHgVhl8BvyHiZHizTRZO7w3V29VqsdXUMMugBR4kr1/FXGzXTaz+9/eK7LokUwN9pjKKENNmhdyg==} - engines: {node: ^16.14.0 || >=18.10.0} + /@angular/router@17.0.0-rc.3(@angular/common@17.0.0-rc.3)(@angular/core@17.0.0-rc.3)(@angular/platform-browser@17.0.0-rc.3)(rxjs@7.8.1): + resolution: {integrity: sha512-zdGSQoKkCeLulx1y6Cl0tKjd29r0t6NhoypFgRvuVToigTuXv5FbdafTnbfCnIoM9lkMusboWzat3KlvWjfqQw==} + engines: {node: ^18.13.0 || >=20.9.0} peerDependencies: - '@angular/common': 16.2.0 - '@angular/core': 16.2.0 - '@angular/platform-browser': 16.2.0 + '@angular/common': 17.0.0-rc.3 + '@angular/core': 17.0.0-rc.3 + '@angular/platform-browser': 17.0.0-rc.3 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 16.2.0(@angular/core@16.2.0)(rxjs@7.8.1) - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/platform-browser': 16.2.0(@angular/common@16.2.0)(@angular/core@16.2.0) + '@angular/common': 17.0.0-rc.3(@angular/core@17.0.0-rc.3)(rxjs@7.8.1) + '@angular/core': 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) + '@angular/platform-browser': 17.0.0-rc.3(@angular/common@17.0.0-rc.3)(@angular/core@17.0.0-rc.3) rxjs: 7.8.1 - tslib: 2.5.3 + tslib: 2.6.2 dev: true /@apidevtools/json-schema-ref-parser@9.0.9: @@ -1594,6 +1597,14 @@ packages: '@babel/highlight': 7.18.6 dev: true + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} @@ -1609,20 +1620,25 @@ packages: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.22.5: - resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.22.19: + resolution: {integrity: sha512-Q8Yj5X4LHVYTbLCKVz0//2D2aDmHF4xzCdEttYvKOnWvErGsa6geHXD6w46x64n5tP69VfeH+IfSrdyH3MLhwA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.5) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) - '@babel/helpers': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.19) + '@babel/helpers': 7.23.1 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 @@ -1654,15 +1670,37 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.22.5: - resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.15: + resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 - dev: true /@babel/generator@7.22.9: resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} @@ -1673,18 +1711,39 @@ packages: '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.22.5: resolution: {integrity: sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 dev: true /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.9): @@ -1693,40 +1752,62 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.22.5 + '@babel/compat-data': 7.22.9 '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.5): + /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-validator-option': 7.22.5 browserslist: 4.21.9 lru-cache: 5.1.1 semver: 6.3.1 - dev: true - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.9): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.22.9 '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 - lru-cache: 5.1.1 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 + dev: true /@babel/helper-create-class-features-plugin@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==} @@ -1746,6 +1827,24 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-class-features-plugin@7.22.9(@babel/core@7.23.2): + resolution: {integrity: sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} engines: {node: '>=6.9.0'} @@ -1758,17 +1857,29 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.23.2): + resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.22.9): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 - resolve: 1.22.2 + resolve: 1.22.8 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -1780,11 +1891,11 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 - resolve: 1.22.2 + resolve: 1.22.8 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -1800,11 +1911,31 @@ packages: '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 - resolve: 1.22.2 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -1816,24 +1947,32 @@ packages: '@babel/template': 7.22.5 '@babel/types': 7.22.5 - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 dev: true /@babel/helper-module-imports@7.21.4: @@ -1843,6 +1982,13 @@ packages: '@babel/types': 7.22.5 dev: true + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} @@ -1865,38 +2011,66 @@ packages: - supports-color dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.5): + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-module-imports': 7.22.5 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.22.19): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.19 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + /@babel/helper-module-transforms@7.23.0(@babel/core@7.22.9): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -1904,19 +2078,28 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==} + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.22.9): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 dev: true /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.9): @@ -1926,7 +2109,19 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-replace-supers@7.22.9(@babel/core@7.23.2): + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 dev: true @@ -1941,37 +2136,43 @@ packages: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function@7.22.5: - resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==} + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: true /@babel/helpers@7.22.6: @@ -1984,6 +2185,28 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.23.1: + resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} @@ -1993,6 +2216,15 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} @@ -2001,28 +2233,30 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.22.5 - dev: true - /@babel/parser@7.22.5: - resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} - engines: {node: '>=6.0.0'} - hasBin: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.22.5 + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} @@ -2034,6 +2268,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} engines: {node: '>=6.9.0'} @@ -2043,7 +2289,7 @@ packages: '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.6(@babel/core@7.22.9) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.22.9) dev: true /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.9): @@ -2053,12 +2299,23 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.9) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.2): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.9): @@ -2069,7 +2326,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2080,7 +2349,7 @@ packages: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) dev: true @@ -2106,13 +2375,27 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) '@babel/helper-split-export-declaration': 7.22.6 '@babel/plugin-syntax-decorators': 7.22.5(@babel/core@7.22.9) dev: true + /@babel/plugin-proposal-decorators@7.22.7(@babel/core@7.23.2): + resolution: {integrity: sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/plugin-syntax-decorators': 7.22.5(@babel/core@7.23.2) + dev: true + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.22.9): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -2124,15 +2407,15 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-export-default-from@7.22.5(@babel/core@7.22.9): + /@babel/plugin-proposal-export-default-from@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.9): @@ -2179,6 +2462,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) dev: true + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.9): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -2190,18 +2484,43 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: true + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.9): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.5 + '@babel/compat-data': 7.22.9 '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.9) + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.9) + dev: true + + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.2): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.9): @@ -2215,6 +2534,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) dev: true + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.9): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} @@ -2227,6 +2557,18 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) dev: true + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.9): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -2234,7 +2576,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2246,7 +2588,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) dev: true @@ -2260,6 +2602,15 @@ packages: '@babel/core': 7.22.9 dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: true + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.9): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} @@ -2280,6 +2631,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -2289,6 +2649,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -2298,6 +2667,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -2308,6 +2686,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-decorators@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==} engines: {node: '>=6.9.0'} @@ -2318,6 +2706,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-decorators@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -2327,13 +2725,22 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.22.9): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2346,6 +2753,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} @@ -2356,6 +2772,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} @@ -2366,6 +2792,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} @@ -2376,6 +2812,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.9): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -2385,6 +2831,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -2394,13 +2849,22 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.9): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.23.2): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2414,6 +2878,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -2423,6 +2897,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -2432,6 +2915,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -2441,6 +2933,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -2450,6 +2951,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -2459,18 +2969,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -2478,18 +2987,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.9): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2498,19 +3006,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2519,34 +3026,102 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==} + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-async-generator-functions@7.22.7(@babel/core@7.22.9): - resolution: {integrity: sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==} + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.9): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.22.9): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.9) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) dev: true /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.9): @@ -2556,11 +3131,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) dev: true /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.9): @@ -2573,6 +3158,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} engines: {node: '>=6.9.0'} @@ -2583,6 +3178,26 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} @@ -2590,10 +3205,33 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} engines: {node: '>=6.9.0'} @@ -2601,40 +3239,40 @@ packages: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-classes@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.9) - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.9): - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + /@babel/plugin-transform-classes@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) @@ -2653,6 +3291,17 @@ packages: '@babel/template': 7.22.5 dev: true + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.5 + dev: true + /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} engines: {node: '>=6.9.0'} @@ -2663,6 +3312,26 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} @@ -2674,6 +3343,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} @@ -2684,6 +3364,27 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} engines: {node: '>=6.9.0'} @@ -2706,6 +3407,28 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} engines: {node: '>=6.9.0'} @@ -2728,6 +3451,27 @@ packages: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.9) dev: true + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} engines: {node: '>=6.9.0'} @@ -2745,9 +3489,32 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) - '@babel/helper-function-name': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) dev: true /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.9): @@ -2771,6 +3538,27 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} engines: {node: '>=6.9.0'} @@ -2792,26 +3580,59 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 @@ -2819,6 +3640,18 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} engines: {node: '>=6.9.0'} @@ -2827,11 +3660,22 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 dev: true /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.9): @@ -2841,10 +3685,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.9): @@ -2858,6 +3711,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} @@ -2868,6 +3732,27 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} engines: {node: '>=6.9.0'} @@ -2879,6 +3764,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) dev: true + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} engines: {node: '>=6.9.0'} @@ -2890,85 +3786,187 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) dev: true + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + dev: true + /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-optional-chaining@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.22.9): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.22.9): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-optional-chaining@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==} + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-optional-chaining@7.22.6(@babel/core@7.22.9): - resolution: {integrity: sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==} + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) dev: true /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.9): @@ -2979,7 +3977,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) dev: true @@ -2994,6 +3992,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.22.9): resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} engines: {node: '>=6.9.0'} @@ -3014,6 +4022,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} @@ -3024,23 +4042,23 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3058,6 +4076,20 @@ packages: '@babel/types': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/types': 7.22.5 + dev: true + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} @@ -3069,6 +4101,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} engines: {node: '>=6.9.0'} @@ -3077,7 +4120,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.1 + regenerator-transform: 0.15.2 dev: true /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.9): @@ -3090,6 +4133,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-runtime@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==} engines: {node: '>=6.9.0'} @@ -3107,6 +4160,23 @@ packages: - supports-color dev: true + /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} @@ -3117,6 +4187,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} @@ -3128,6 +4208,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} @@ -3138,6 +4229,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} @@ -3148,6 +4249,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} @@ -3158,6 +4269,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-typescript@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==} engines: {node: '>=6.9.0'} @@ -3171,6 +4292,29 @@ packages: '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) dev: true + /@babel/plugin-transform-typescript@7.22.9(@babel/core@7.23.2): + resolution: {integrity: sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} engines: {node: '>=6.9.0'} @@ -3192,6 +4336,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} @@ -3203,6 +4358,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} @@ -3214,6 +4380,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/preset-env@7.21.4(@babel/core@7.22.9): resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} @@ -3278,96 +4455,7 @@ packages: '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) - '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.22.9) - core-js-compat: 3.30.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/preset-env@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-async-generator-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-dynamic-import': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-export-namespace-from': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-json-strings': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-logical-assignment-operators': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-numeric-separator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-optional-chaining': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.9) @@ -3377,29 +4465,27 @@ packages: '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.9) '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.3(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.8.1(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.5.0(@babel/core@7.22.9) + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.22.9) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.22.9) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.22.9) core-js-compat: 3.30.2 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-env@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==} + /@babel/preset-env@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.22.5 '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.9) @@ -3424,13 +4510,13 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.9) '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-async-generator-functions': 7.22.7(@babel/core@7.22.9) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.22.9) '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.9) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) @@ -3455,7 +4541,7 @@ packages: '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-optional-chaining': 7.22.6(@babel/core@7.22.9) + '@babel/plugin-transform-optional-chaining': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.9) @@ -3472,11 +4558,102 @@ packages: '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.9) '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.9) - core-js-compat: 3.31.1 + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.3(@babel/core@7.22.9) + babel-plugin-polyfill-corejs3: 0.8.1(@babel/core@7.22.9) + babel-plugin-polyfill-regenerator: 0.5.0(@babel/core@7.22.9) + core-js-compat: 3.30.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-env@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + core-js-compat: 3.33.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3490,7 +4667,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 + '@babel/helper-validator-option': 7.22.15 '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.9) dev: true @@ -3503,7 +4680,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 esutils: 2.0.3 dev: true @@ -3538,6 +4726,22 @@ packages: - supports-color dev: true + /@babel/preset-typescript@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.22.9(@babel/core@7.23.2) + transitivePeerDependencies: + - supports-color + dev: true + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true @@ -3550,12 +4754,35 @@ packages: regenerator-runtime: 0.13.11 dev: true + /@babel/runtime@7.22.15: + resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + /@babel/runtime@7.22.6: resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: true + /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} @@ -3568,14 +4795,14 @@ packages: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.18.6 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: @@ -3587,7 +4814,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 + '@babel/generator': 7.22.15 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 @@ -3599,6 +4826,42 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.23.0: + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} @@ -3607,6 +4870,14 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + /@base2/pretty-print-object@1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true @@ -3867,7 +5138,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm64@0.19.5: @@ -3893,7 +5163,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.19.5: @@ -3919,7 +5188,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.19.5: @@ -3945,7 +5213,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.19.5: @@ -3971,7 +5238,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.19.5: @@ -3997,7 +5263,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.19.5: @@ -4023,7 +5288,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.19.5: @@ -4049,7 +5313,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.19.5: @@ -4075,7 +5338,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.19.5: @@ -4101,7 +5363,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.19.5: @@ -4127,7 +5388,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.19.5: @@ -4153,7 +5413,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.19.5: @@ -4179,7 +5438,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.19.5: @@ -4205,7 +5463,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.19.5: @@ -4231,7 +5488,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.19.5: @@ -4257,7 +5513,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.19.5: @@ -4283,7 +5538,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.19.5: @@ -4309,7 +5563,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.19.5: @@ -4335,7 +5588,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.19.5: @@ -4361,7 +5613,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.19.5: @@ -4387,7 +5638,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.19.5: @@ -4413,7 +5663,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.19.5: @@ -4466,6 +5715,11 @@ packages: resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} dev: true + /@fastify/busboy@2.0.0: + resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} + engines: {node: '>=14'} + dev: true + /@floating-ui/core@1.2.1: resolution: {integrity: sha512-LSqwPZkK3rYfD7GKoIeExXOyYx6Q1O4iqZWwIehDNuv3Dv425FIAE8PRwtAx1imEolFTHgBEcoFHm9MDnYgPCg==} dev: true @@ -4795,7 +6049,7 @@ packages: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.22.19 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 @@ -4894,6 +6148,13 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: true + /@ljharb/through@2.3.11: + resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + dev: true + /@ltd/j-toml@1.38.0: resolution: {integrity: sha512-lYtBcmvHustHQtg4X7TXUu1Xa/tbLC3p2wLvgQI+fWVySguVZJF60Snxijw5EiohumxZbR10kWYFFebh1zotiw==} dev: true @@ -4963,12 +6224,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@monodon/rust@1.1.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.1.3): + /@monodon/rust@1.1.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.2.2): resolution: {integrity: sha512-lb667coCcsWmkHuSKfGHgEeaWK24VGrW3AgA7Wq2M8wVVhuVQeKAV2UDt5vgvQj+xPlXPyKs6iPqNFXi3c2nLA==} dependencies: '@ltd/j-toml': 1.38.0 - '@nrwl/devkit': 15.8.0(nx@17.0.0-rc.2)(typescript@5.1.3) - '@nrwl/js': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.1.3) + '@nrwl/devkit': 15.8.0(nx@17.0.0-rc.2)(typescript@5.2.2) + '@nrwl/js': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.2.2) chalk: 4.1.2 transitivePeerDependencies: - '@babel/traverse' @@ -5223,6 +6484,20 @@ packages: - chokidar dev: true + /@nestjs/schematics@9.1.0(typescript@5.2.2): + resolution: {integrity: sha512-/7CyMTnPJSK9/xD9CkCqwuHPOlHVlLC2RDnbdCJ7mIO07SdbBbY14msTqtYW9VRQtsjZPLh1GTChf7ryJUImwA==} + peerDependencies: + typescript: '>=4.3.5' + dependencies: + '@angular-devkit/core': 15.2.4(chokidar@3.5.3) + '@angular-devkit/schematics': 15.2.4(chokidar@3.5.3) + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + typescript: 5.2.2 + transitivePeerDependencies: + - chokidar + dev: true + /@nestjs/swagger@6.1.3(@nestjs/common@9.1.6)(@nestjs/core@9.1.6)(reflect-metadata@0.1.13): resolution: {integrity: sha512-H9C/yRgLFb5QrAt6iGrYmIX9X7Q0zXkgZaTNUATljUBra+RCWrEUbLHBcGjTAOtcIyGV/vmyCLv68YSVcZoE0Q==} peerDependencies: @@ -5351,20 +6626,20 @@ packages: requiresBuild: true optional: true - /@ngrx/effects@16.0.0(@angular/core@16.2.0)(@ngrx/store@16.0.0)(rxjs@7.8.1): + /@ngrx/effects@16.0.0(@angular/core@17.0.0-rc.3)(@ngrx/store@16.0.0)(rxjs@7.8.1): resolution: {integrity: sha512-l3H/yCwVl8DPmUasOEDthdv9lZMhCSJwBxfSXjUW7gKJVEamP3PSuvExp0ZpW9RULPblgcfTM1TH8VcPAHelQw==} peerDependencies: '@angular/core': ^16.0.0 '@ngrx/store': 16.0.0 rxjs: ^6.5.3 || ^7.5.0 dependencies: - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) - '@ngrx/store': 16.0.0(@angular/core@16.2.0)(rxjs@7.8.1) + '@angular/core': 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) + '@ngrx/store': 16.0.0(@angular/core@17.0.0-rc.3)(rxjs@7.8.1) rxjs: 7.8.1 tslib: 2.5.0 dev: true - /@ngrx/router-store@16.0.0(@angular/common@16.2.0)(@angular/core@16.2.0)(@angular/router@16.2.0)(@ngrx/store@16.0.0)(rxjs@7.8.1): + /@ngrx/router-store@16.0.0(@angular/common@17.0.0-rc.3)(@angular/core@17.0.0-rc.3)(@angular/router@17.0.0-rc.3)(@ngrx/store@16.0.0)(rxjs@7.8.1): resolution: {integrity: sha512-i36reUxFSkpnEr01yZufe8H5J6Na0q/5Ul3HmT1HSG5cw0y2xIHWk2MpvCLIJjr3WeGSLvVpkQUYEdkkgmJOdw==} peerDependencies: '@angular/common': ^16.0.0 @@ -5373,86 +6648,36 @@ packages: '@ngrx/store': 16.0.0 rxjs: ^6.5.3 || ^7.5.0 dependencies: - '@angular/common': 16.2.0(@angular/core@16.2.0)(rxjs@7.8.1) - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/router': 16.2.0(@angular/common@16.2.0)(@angular/core@16.2.0)(@angular/platform-browser@16.2.0)(rxjs@7.8.1) - '@ngrx/store': 16.0.0(@angular/core@16.2.0)(rxjs@7.8.1) + '@angular/common': 17.0.0-rc.3(@angular/core@17.0.0-rc.3)(rxjs@7.8.1) + '@angular/core': 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) + '@angular/router': 17.0.0-rc.3(@angular/common@17.0.0-rc.3)(@angular/core@17.0.0-rc.3)(@angular/platform-browser@17.0.0-rc.3)(rxjs@7.8.1) + '@ngrx/store': 16.0.0(@angular/core@17.0.0-rc.3)(rxjs@7.8.1) rxjs: 7.8.1 tslib: 2.5.0 dev: true - /@ngrx/store@16.0.0(@angular/core@16.2.0)(rxjs@7.8.1): + /@ngrx/store@16.0.0(@angular/core@17.0.0-rc.3)(rxjs@7.8.1): resolution: {integrity: sha512-bmr0KLITh9u1DJO51USTc4OAKX+su06efhTdNiQV/wagifpbC4kA8zr2hdstKMNG3Z5EKTX3XLFanIiREkd6JQ==} peerDependencies: '@angular/core': ^16.0.0 rxjs: ^6.5.3 || ^7.5.0 dependencies: - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) + '@angular/core': 17.0.0-rc.3(rxjs@7.8.1)(zone.js@0.14.0) rxjs: 7.8.1 - tslib: 2.5.0 + tslib: 2.6.2 dev: true - /@ngtools/webpack@16.2.0(@angular/compiler-cli@16.2.0)(typescript@5.1.3)(webpack@5.88.2): - resolution: {integrity: sha512-c9jv4r7GnLTpnPOeF+a9yAm/3/2wwl9lMBU32i9hlY+q/Hqde4PiL95bUOLnRRL1I64DV7BFTlSZqSPgDpFXZQ==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@ngtools/webpack@17.0.0-rc.4(@angular/compiler-cli@17.0.0-rc.3)(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-yfBdY4TULJKuhDN68AYDo3jKUBxzBuiAMvDQp9E+Bt0ZWsMUZ8qgVeXOwoEk/MebM8WSIl5jdOFYe59LSDBKrA==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^16.0.0 - typescript: '>=4.9.3 <5.2' + '@angular/compiler-cli': ^17.0.0 || ^17.0.0-next.0 + typescript: '>=5.2 <5.3' webpack: ^5.54.0 dependencies: - '@angular/compiler-cli': 16.2.0(@angular/compiler@16.2.0)(typescript@5.1.3) - typescript: 5.1.3 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) - dev: true - - /@nguniversal/builders@16.2.0(@angular-devkit/build-angular@16.2.0)(@angular/common@16.2.0)(@angular/core@16.2.0)(@types/express@4.17.14)(typescript@5.1.3): - resolution: {integrity: sha512-RCthtWvPy2u3DYM6T+z06VzMKbNkucXX/hPHMPpaY5oMgTe/5k7vtOSNogldNMantgMrKV70GYmtWb2QbD4Zbg==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular-devkit/build-angular': ^16.0.0 || ^16.1.0-next.0 - dependencies: - '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) - '@angular-devkit/build-angular': 16.2.0(@angular/compiler-cli@16.2.0)(@swc/core@1.3.86)(@types/node@18.16.9)(html-webpack-plugin@5.5.0)(jest-environment-jsdom@29.4.3)(jest@29.4.3)(ng-packagr@16.2.0)(tailwindcss@3.2.4)(typescript@5.1.3) - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@nguniversal/common': 16.2.0(@angular/common@16.2.0)(@angular/core@16.2.0) - browser-sync: 2.27.11 - express: 4.18.2 - guess-parser: 0.4.22(typescript@5.1.3) - http-proxy-middleware: 2.0.6(@types/express@4.17.14) - ora: 5.3.0 - piscina: 4.0.0 - rxjs: 7.8.1 - tree-kill: 1.2.2 - transitivePeerDependencies: - - '@angular/common' - - '@angular/core' - - '@types/express' - - bufferutil - - canvas - - chokidar - - debug - - supports-color - - typescript - - utf-8-validate - dev: true - - /@nguniversal/common@16.2.0(@angular/common@16.2.0)(@angular/core@16.2.0): - resolution: {integrity: sha512-b3dQAwD2iI2kzF3O1mhwh6bhDg1SlT46K9lOSzNZNXy0bvV4WrSpVmfN7YKINZLFal5uwHn4j1LNdrDR4Qohlw==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/common': ^16.0.0 || ^16.1.0-next.0 - '@angular/core': ^16.0.0 || ^16.1.0-next.0 - dependencies: - '@angular/common': 16.2.0(@angular/core@16.2.0)(rxjs@7.8.1) - '@angular/core': 16.2.0(rxjs@7.8.1)(zone.js@0.13.1) - critters: 0.0.20 - jsdom: 22.1.0 - tslib: 2.6.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate + '@angular/compiler-cli': 17.0.0-rc.3(@angular/compiler@17.0.0-rc.3)(typescript@5.2.2) + typescript: 5.2.2 + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /@nodelib/fs.scandir@2.1.5: @@ -5473,6 +6698,18 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 + /@npmcli/agent@2.1.1: + resolution: {integrity: sha512-6RlbiOAi6L6uUYF4/CDEkDZQnKw0XDsFJVrEpnib8rAx2WRMOsUyAdgnvDpX/fdkDWxtqE+NHwF465llI2wR0g==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 10.0.1 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /@npmcli/fs@2.1.2: resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -5488,19 +6725,18 @@ packages: semver: 7.5.3 dev: true - /@npmcli/git@4.0.3: - resolution: {integrity: sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@npmcli/git@5.0.3: + resolution: {integrity: sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - '@npmcli/promise-spawn': 6.0.1 - lru-cache: 7.14.0 - mkdirp: 1.0.4 - npm-pick-manifest: 8.0.1 + '@npmcli/promise-spawn': 7.0.0 + lru-cache: 10.0.1 + npm-pick-manifest: 9.0.0 proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 semver: 7.5.3 - which: 3.0.0 + which: 4.0.0 transitivePeerDependencies: - bluebird dev: true @@ -5528,32 +6764,32 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /@npmcli/promise-spawn@6.0.1: - resolution: {integrity: sha512-+hcUpxgx0vEpDJI9Cn+lkTdKLoqKBXFCVps5H7FujEU2vLOp6KwqjLlxbnz8Wzgm8oEqW/u5FeNAXSFjLdCD0A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@npmcli/promise-spawn@7.0.0: + resolution: {integrity: sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - which: 3.0.0 + which: 4.0.0 dev: true - /@npmcli/run-script@6.0.0: - resolution: {integrity: sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@npmcli/run-script@7.0.1: + resolution: {integrity: sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.1 + '@npmcli/promise-spawn': 7.0.0 node-gyp: 9.3.0 read-package-json-fast: 3.0.2 - which: 3.0.0 + which: 4.0.0 transitivePeerDependencies: - bluebird - supports-color dev: true - /@nrwl/angular@17.0.0-rc.2(@angular-devkit/build-angular@16.2.0)(@angular-devkit/core@16.2.0)(@angular-devkit/schematics@16.2.0)(@nguniversal/builders@16.2.0)(@schematics/angular@16.2.0)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/angular@17.0.0-rc.2(@angular-devkit/build-angular@17.0.0-rc.4)(@angular-devkit/core@17.0.0-rc.4)(@angular-devkit/schematics@17.0.0-rc.4)(@schematics/angular@17.0.0-rc.4)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-wJiV7VjditmPXM9bvKCaM2UvATF3o1p/3gfPjYCDRbxeKc0xAbCe12z1w2Xn38ULuqy6wDKjwlwqvQewSKKhcw==} dependencies: - '@nx/angular': 17.0.0-rc.2(@angular-devkit/build-angular@16.2.0)(@angular-devkit/core@16.2.0)(@angular-devkit/schematics@16.2.0)(@nguniversal/builders@16.2.0)(@schematics/angular@16.2.0)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4) - tslib: 2.6.1 + '@nx/angular': 17.0.0-rc.2(@angular-devkit/build-angular@17.0.0-rc.4)(@angular-devkit/core@17.0.0-rc.4)(@angular-devkit/schematics@17.0.0-rc.4)(@schematics/angular@17.0.0-rc.4)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4) + tslib: 2.6.2 transitivePeerDependencies: - '@angular-devkit/build-angular' - '@angular-devkit/core' @@ -5602,10 +6838,10 @@ packages: - debug dev: true - /@nrwl/cypress@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/cypress@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-b37qz+rn/FmFCaUsFqZFmv5ScPqICq4eaLNfntXtJ+xhwQOydxHj3pJmZpHRfpUGjmHyY6nr0fwBgrtbdOU81Q==} dependencies: - '@nx/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5621,34 +6857,34 @@ packages: - verdaccio dev: true - /@nrwl/devkit@15.8.0(nx@15.8.0)(typescript@5.1.3): + /@nrwl/devkit@15.8.0(nx@15.8.0)(typescript@5.2.2): resolution: {integrity: sha512-qD+asvhTXIibXPXr3r1IDP7ap3Bw5H7tSd+C5mXFhIMMinTqRnQVXe6Odfs34VFP/dpWBIBZdkkwCM/+BsCLNw==} peerDependencies: nx: '>= 14.1 <= 16' dependencies: - '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) + '@phenomnomnominal/tsquery': 4.1.1(typescript@5.2.2) ejs: 3.1.8 ignore: 5.2.4 nx: 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86) semver: 7.3.4 tmp: 0.2.1 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - typescript dev: true - /@nrwl/devkit@15.8.0(nx@17.0.0-rc.2)(typescript@5.1.3): + /@nrwl/devkit@15.8.0(nx@17.0.0-rc.2)(typescript@5.2.2): resolution: {integrity: sha512-qD+asvhTXIibXPXr3r1IDP7ap3Bw5H7tSd+C5mXFhIMMinTqRnQVXe6Odfs34VFP/dpWBIBZdkkwCM/+BsCLNw==} peerDependencies: nx: '>= 14.1 <= 16' dependencies: - '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) + '@phenomnomnominal/tsquery': 4.1.1(typescript@5.2.2) ejs: 3.1.8 ignore: 5.2.4 nx: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) semver: 7.3.4 tmp: 0.2.1 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - typescript dev: true @@ -5661,10 +6897,10 @@ packages: - nx dev: true - /@nrwl/esbuild@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/esbuild@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-9fs/Uy14MeISC5rZlM97UmfWbo9q4jIlc50bh3uiNx6UAAJsyntHx0EEWeLEHG+brKa9PyLppW2NLtd5fnTp7g==} dependencies: - '@nx/esbuild': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/esbuild': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5679,10 +6915,10 @@ packages: - verdaccio dev: true - /@nrwl/eslint-plugin-nx@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/eslint-plugin-nx@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-qASP7I8CEuJWe0vJP7xde6uI/1kKIWOSsSnFcjlPSbwI+LxXBSSDRoGMm2MU/f2mt0qkxZX8WSNRBpxsbNbG+A==} dependencies: - '@nx/eslint-plugin': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/eslint-plugin': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5699,10 +6935,10 @@ packages: - verdaccio dev: true - /@nrwl/jest@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/jest@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-/iTFXq/bNqSLNeheFP+nCek5g1NQywemaQ8Owqj71SByc8gKAmbD0j55Pm/2035glyUB6Jzhyb5IaCjK9fbPIA==} dependencies: - '@nx/jest': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/jest': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5718,7 +6954,7 @@ packages: - verdaccio dev: true - /@nrwl/js@15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.1.3): + /@nrwl/js@15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.2.2): resolution: {integrity: sha512-l2Q7oFpzx6ul7G0nKpMkrvnIEaOY+X8fc2g2Db5WqpnnBdfkrtWXZPg/O4DQ1p9O6BXrZ+Q2AK9bfgnliiwyEg==} dependencies: '@babel/core': 7.22.9 @@ -5728,9 +6964,9 @@ packages: '@babel/preset-env': 7.22.5(@babel/core@7.22.9) '@babel/preset-typescript': 7.22.5(@babel/core@7.22.9) '@babel/runtime': 7.22.6 - '@nrwl/devkit': 15.8.0(nx@17.0.0-rc.2)(typescript@5.1.3) - '@nrwl/workspace': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(prettier@2.7.1)(typescript@5.1.3) - '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) + '@nrwl/devkit': 15.8.0(nx@17.0.0-rc.2)(typescript@5.2.2) + '@nrwl/workspace': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(prettier@2.7.1)(typescript@5.2.2) + '@phenomnomnominal/tsquery': 4.1.1(typescript@5.2.2) babel-plugin-const-enum: 1.2.0(@babel/core@7.22.9) babel-plugin-macros: 2.8.0 babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.22.9) @@ -5742,7 +6978,7 @@ packages: minimatch: 3.0.5 source-map-support: 0.5.19 tree-kill: 1.2.2 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5755,6 +6991,42 @@ packages: - typescript dev: true + /@nrwl/js@15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(nx@15.8.0)(prettier@2.7.1)(typescript@5.2.2): + resolution: {integrity: sha512-l2Q7oFpzx6ul7G0nKpMkrvnIEaOY+X8fc2g2Db5WqpnnBdfkrtWXZPg/O4DQ1p9O6BXrZ+Q2AK9bfgnliiwyEg==} + dependencies: + '@babel/core': 7.22.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.9) + '@babel/plugin-proposal-decorators': 7.21.0(@babel/core@7.22.9) + '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) + '@babel/preset-env': 7.22.5(@babel/core@7.22.9) + '@babel/preset-typescript': 7.22.5(@babel/core@7.22.9) + '@babel/runtime': 7.22.6 + '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.2.2) + '@nrwl/workspace': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(prettier@2.7.1)(typescript@5.2.2) + '@phenomnomnominal/tsquery': 4.1.1(typescript@5.2.2) + babel-plugin-const-enum: 1.2.0(@babel/core@7.22.9) + babel-plugin-macros: 2.8.0 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.22.9) + chalk: 4.1.2 + fast-glob: 3.2.7 + fs-extra: 11.1.1 + ignore: 5.2.4 + js-tokens: 4.0.0 + minimatch: 3.0.5 + source-map-support: 0.5.19 + tree-kill: 1.2.2 + tslib: 2.6.2 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - debug + - nx + - prettier + - supports-color + - typescript + dev: true + /@nrwl/js@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): resolution: {integrity: sha512-2SZu4KiiXmyjezB8j3+GrgQj2LopzYxp6hO9hIe+DE6N1eo1Dxq7cmOsX+q/w14eRurVNcvDoZxHJB63UjDSUQ==} dependencies: @@ -5772,7 +7044,24 @@ packages: - verdaccio dev: true - /@nrwl/linter@15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@15.8.0)(prettier@2.7.1)(typescript@5.1.3): + /@nrwl/js@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): + resolution: {integrity: sha512-2SZu4KiiXmyjezB8j3+GrgQj2LopzYxp6hO9hIe+DE6N1eo1Dxq7cmOsX+q/w14eRurVNcvDoZxHJB63UjDSUQ==} + dependencies: + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - debug + - nx + - supports-color + - typescript + - verdaccio + dev: true + + /@nrwl/linter@15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@15.8.0)(prettier@2.7.1)(typescript@5.2.2): resolution: {integrity: sha512-2LeqUOR4C33OsX4t0N/7aAfDaX0LRQNIeDE1rCFvRJVMp58z/d3+UJ3sK7RDHsYeadLy/7/kHjTVz8NI80MugA==} peerDependencies: eslint: ^8.0.0 @@ -5780,12 +7069,12 @@ packages: eslint: optional: true dependencies: - '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.1.3) - '@nrwl/js': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@17.0.0-rc.2)(prettier@2.7.1)(typescript@5.1.3) - '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) + '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.2.2) + '@nrwl/js': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(nx@15.8.0)(prettier@2.7.1)(typescript@5.2.2) + '@phenomnomnominal/tsquery': 4.1.1(typescript@5.2.2) eslint: 8.46.0 tmp: 0.2.1 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5797,10 +7086,10 @@ packages: - typescript dev: true - /@nrwl/next@17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0): + /@nrwl/next@17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0): resolution: {integrity: sha512-tPPym7hJdiDvlW6KTXF8g4TXpnaM89HyaA3mji6qbY3tjJgs919oADQfNCP7xHI4hQwtoNGlzhki/pkqiVxTLA==} dependencies: - '@nx/next': 17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) + '@nx/next': 17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0) transitivePeerDependencies: - '@babel/core' - '@babel/traverse' @@ -5900,10 +7189,10 @@ packages: dev: true optional: true - /@nrwl/react@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0): + /@nrwl/react@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0): resolution: {integrity: sha512-6oPSxyTCIpuGfDsIB7i/MZtg0Gbz/07hGzRG33RjpJuzMWEy0Xw3kjHruOaY6ah/AAzpP017tnlY4lHjvKJpJg==} dependencies: - '@nx/react': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) + '@nx/react': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5919,10 +7208,10 @@ packages: - webpack dev: true - /@nrwl/storybook@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/storybook@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-R6qHv6Khbr76PFydMorbJHHyAAwXWFPscRF+ai3dO2ds2o6Caae0jF8jqjqToSfJAKpS5Uv5ql4tdWy/P28uLw==} dependencies: - '@nx/storybook': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/storybook': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5954,17 +7243,17 @@ packages: hasBin: true dependencies: nx: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug dev: true - /@nrwl/web@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/web@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-1wHAvrJIJ8ICMVgrVwO2p8ivS2X5NwctVjswEww7Q2ERa8bGvwojrntZRLB6qjrxX/N/qizSH3XKheaif5c8Zg==} dependencies: - '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -5978,10 +7267,10 @@ packages: - verdaccio dev: true - /@nrwl/webpack@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/webpack@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-axsMf14jD8wl64UU4Qg66puahfgzh1weTSbCT4GruQDlOwspEmg9Hl04BrGO6CWBH5zdzOBkR+H9XrF57xEkvg==} dependencies: - '@nx/webpack': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/webpack': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@parcel/css' @@ -6010,7 +7299,7 @@ packages: - webpack-cli dev: true - /@nrwl/workspace@15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(prettier@2.7.1)(typescript@5.1.3): + /@nrwl/workspace@15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(prettier@2.7.1)(typescript@5.2.2): resolution: {integrity: sha512-viewJqah2BtVu+VnC/iHFq2hkDj8hCJMpVjotwdHlZ3BU2Nguww0b0MkJ1V2h0Jd1+pEZglj8i1LrD7qqacjcA==} peerDependencies: prettier: ^2.6.2 @@ -6018,8 +7307,8 @@ packages: prettier: optional: true dependencies: - '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.1.3) - '@nrwl/linter': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@15.8.0)(prettier@2.7.1)(typescript@5.1.3) + '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.2.2) + '@nrwl/linter': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86)(eslint@8.46.0)(nx@15.8.0)(prettier@2.7.1)(typescript@5.2.2) '@parcel/watcher': 2.0.4 chalk: 4.1.2 chokidar: 3.5.3 @@ -6038,7 +7327,7 @@ packages: rxjs: 6.6.7 semver: 7.3.4 tmp: 0.2.1 - tslib: 2.6.1 + tslib: 2.6.2 yargs: 17.7.2 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -6073,7 +7362,7 @@ packages: - encoding dev: true - /@nx/angular@17.0.0-rc.2(@angular-devkit/build-angular@16.2.0)(@angular-devkit/core@16.2.0)(@angular-devkit/schematics@16.2.0)(@nguniversal/builders@16.2.0)(@schematics/angular@16.2.0)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/angular@17.0.0-rc.2(@angular-devkit/build-angular@17.0.0-rc.4)(@angular-devkit/core@17.0.0-rc.4)(@angular-devkit/schematics@17.0.0-rc.4)(@schematics/angular@17.0.0-rc.4)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-WSJEVVREdF9aojn5X37MppYCP4JrL4R60MU0zOeO0jwL+AGnu+P+CFULBvAI7IhRet0S8oXw76FKmaNJuSH+hg==} peerDependencies: '@angular-devkit/build-angular': '>= 14.0.0 < 17.0.0' @@ -6089,34 +7378,33 @@ packages: esbuild: optional: true dependencies: - '@angular-devkit/build-angular': 16.2.0(@angular/compiler-cli@16.2.0)(@swc/core@1.3.86)(@types/node@18.16.9)(html-webpack-plugin@5.5.0)(jest-environment-jsdom@29.4.3)(jest@29.4.3)(ng-packagr@16.2.0)(tailwindcss@3.2.4)(typescript@5.1.3) - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.2.0 - '@nguniversal/builders': 16.2.0(@angular-devkit/build-angular@16.2.0)(@angular/common@16.2.0)(@angular/core@16.2.0)(@types/express@4.17.14)(typescript@5.1.3) - '@nrwl/angular': 17.0.0-rc.2(@angular-devkit/build-angular@16.2.0)(@angular-devkit/core@16.2.0)(@angular-devkit/schematics@16.2.0)(@nguniversal/builders@16.2.0)(@schematics/angular@16.2.0)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4) - '@nx/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@angular-devkit/build-angular': 17.0.0-rc.4(@angular/compiler-cli@17.0.0-rc.3)(@swc/core@1.3.86)(@types/express@4.17.14)(@types/node@18.16.9)(html-webpack-plugin@5.5.0)(jest-environment-jsdom@29.4.3)(jest@29.4.3)(ng-packagr@17.0.0-rc.1)(tailwindcss@3.2.4)(typescript@5.2.2) + '@angular-devkit/core': 17.0.0-rc.4(chokidar@3.5.3) + '@angular-devkit/schematics': 17.0.0-rc.4 + '@nrwl/angular': 17.0.0-rc.2(@angular-devkit/build-angular@17.0.0-rc.4)(@angular-devkit/core@17.0.0-rc.4)(@angular-devkit/schematics@17.0.0-rc.4)(@schematics/angular@17.0.0-rc.4)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(esbuild@0.19.5)(eslint@8.46.0)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(rxjs@7.8.1)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/eslint': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) - '@nx/jest': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@nx/webpack': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/jest': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/webpack': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/workspace': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.1.3) - '@schematics/angular': 16.2.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.1.3) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) + '@schematics/angular': 17.0.0-rc.4 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) chalk: 4.1.2 enquirer: 2.3.6 esbuild: 0.19.5 find-cache-dir: 3.3.2 ignore: 5.2.4 - magic-string: 0.30.4 + magic-string: 0.30.5 minimatch: 3.0.5 rxjs: 7.8.1 semver: 7.5.3 - tslib: 2.6.1 + tslib: 2.6.2 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) - webpack-merge: 5.9.0 + webpack-merge: 5.10.0 transitivePeerDependencies: - '@babel/traverse' - '@parcel/css' @@ -6148,7 +7436,7 @@ packages: - webpack-cli dev: true - /@nx/cypress@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/cypress@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-3FLOTHKWJynLVvifJPlW5S+0OUsJc+KhR0QlSgws/eVyfOokKu9B1RFU3O31eMz5OjFllbVIAjklei+/DS7LvQ==} peerDependencies: cypress: '>= 3 < 14' @@ -6156,15 +7444,15 @@ packages: cypress: optional: true dependencies: - '@nrwl/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nrwl/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/eslint': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.1.3) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) cypress: 13.0.0 detect-port: 1.5.1 semver: 7.5.3 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6191,10 +7479,10 @@ packages: nx: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) semver: 7.5.3 tmp: 0.2.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: true - /@nx/esbuild@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/esbuild@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-TAnPQeVeOa5kj71R2t3bQb9oZvtRuU5KhcPLJ8Zz9dAIyCjCYISoeofVIgEABbfRCygwL21oScTUtn11nVkTug==} peerDependencies: esbuild: ~0.19.2 @@ -6202,15 +7490,15 @@ packages: esbuild: optional: true dependencies: - '@nrwl/esbuild': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nrwl/esbuild': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) chalk: 4.1.2 esbuild: 0.19.5 fast-glob: 3.2.7 fs-extra: 11.1.1 tsconfig-paths: 4.1.2 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6224,7 +7512,7 @@ packages: - verdaccio dev: true - /@nx/eslint-plugin@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/eslint-plugin@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-FJvgyzbZguURGQREGPG+3nWhZTjCKKxCPw6uVONSusWsZ3JypQ9QsY0u8I8p4eybIWNkl2/zQbMfh30mv+JZWQ==} peerDependencies: '@typescript-eslint/parser': ^5.60.1 @@ -6233,18 +7521,18 @@ packages: eslint-config-prettier: optional: true dependencies: - '@nrwl/eslint-plugin-nx': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nrwl/eslint-plugin-nx': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@typescript-eslint/parser': 6.9.1(eslint@8.46.0)(typescript@5.1.3) - '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.1.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.3) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@typescript-eslint/parser': 6.9.1(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) chalk: 4.1.2 confusing-browser-globals: 1.0.11 eslint-config-prettier: 9.0.0(eslint@8.46.0) jsonc-eslint-parser: 2.1.0 semver: 7.5.3 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6271,7 +7559,7 @@ packages: '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) '@nx/linter': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) eslint: 8.46.0 - tslib: 2.6.1 + tslib: 2.6.2 typescript: 5.1.3 transitivePeerDependencies: - '@babel/traverse' @@ -6285,22 +7573,22 @@ packages: - verdaccio dev: true - /@nx/jest@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/jest@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-EumcC7Js43+xLHlsHYYWqmTiNpqhV+BMA5VsLqYS96vkbLSJAuQpcAkYbHcvygTw3zxNvSdaUYvf/zMbis53RQ==} dependencies: '@jest/reporters': 29.5.0 '@jest/test-result': 29.5.0 - '@nrwl/jest': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.1.3)(verdaccio@5.15.4) + '@nrwl/jest': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(ts-node@10.9.1)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.1.3) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) chalk: 4.1.2 identity-obj-proxy: 3.0.0 jest-config: 29.5.0(@types/node@18.16.9)(ts-node@10.9.1) jest-resolve: 29.5.0 jest-util: 29.5.0 resolve.exports: 1.1.0 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6324,19 +7612,19 @@ packages: verdaccio: optional: true dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.22.9) - '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) - '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/preset-typescript': 7.22.5(@babel/core@7.22.9) - '@babel/runtime': 7.22.6 + '@babel/core': 7.23.2 + '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/runtime': 7.22.15 '@nrwl/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/workspace': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.1.3) - babel-plugin-const-enum: 1.2.0(@babel/core@7.22.9) + babel-plugin-const-enum: 1.2.0(@babel/core@7.23.2) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.22.9) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.2) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.5.1 @@ -6352,7 +7640,57 @@ packages: source-map-support: 0.5.19 ts-node: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.1.3) tsconfig-paths: 4.1.2 - tslib: 2.6.1 + tslib: 2.6.2 + verdaccio: 5.15.4(typanion@3.12.1) + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - debug + - nx + - supports-color + - typescript + dev: true + + /@nx/js@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): + resolution: {integrity: sha512-QZ6ErX53BWnRfKNwd8WkRjR5ihlujn9Kg8Ijj8zVrQ9TIT1/89TNIlmua/clbyoxPfHj4ohEes1QSk9tNc6lRA==} + peerDependencies: + verdaccio: ^5.0.4 + peerDependenciesMeta: + verdaccio: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/runtime': 7.22.15 + '@nrwl/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) + '@nx/workspace': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) + babel-plugin-const-enum: 1.2.0(@babel/core@7.23.2) + babel-plugin-macros: 2.8.0 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.2) + chalk: 4.1.2 + columnify: 1.6.0 + detect-port: 1.5.1 + fast-glob: 3.2.7 + fs-extra: 11.1.1 + ignore: 5.2.4 + js-tokens: 4.0.0 + minimatch: 3.0.5 + npm-package-arg: 11.0.1 + npm-run-path: 4.0.1 + ora: 5.3.0 + semver: 7.5.3 + source-map-support: 0.5.19 + ts-node: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.2.2) + tsconfig-paths: 4.1.2 + tslib: 2.6.2 verdaccio: 5.15.4(typanion@3.12.1) transitivePeerDependencies: - '@babel/traverse' @@ -6383,18 +7721,18 @@ packages: - verdaccio dev: true - /@nx/next@17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0): + /@nx/next@17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0): resolution: {integrity: sha512-lkwB6c687xEZ1XJf7jd32Hk77eCKODeeTNouFBqAXaws6G/pf9B7utEcGR6eIQRjsujIM8PHS11N17oqj9b9hQ==} peerDependencies: next: '>=13.0.0' dependencies: '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.22.9) - '@nrwl/next': 17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) + '@nrwl/next': 17.0.0-rc.2(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/eslint': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@nx/react': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) - '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/react': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0) + '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/workspace': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) '@svgr/webpack': 8.0.1 chalk: 4.1.2 @@ -6403,9 +7741,9 @@ packages: ignore: 5.2.4 next: 13.3.4(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) semver: 7.5.3 - tslib: 2.6.1 + tslib: 2.6.2 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.0) - webpack-merge: 5.9.0 + webpack-merge: 5.10.0 transitivePeerDependencies: - '@babel/core' - '@babel/traverse' @@ -6524,7 +7862,7 @@ packages: '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/eslint': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) '@playwright/test': 1.36.1 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6538,20 +7876,20 @@ packages: - verdaccio dev: true - /@nx/react@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0): + /@nx/react@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0): resolution: {integrity: sha512-w8LDd7GN1poB4atyjz9uEdOysf0cUha49R2JPH1ll0lJwDdsOGBJOBJmvGsAO8W9qPiuRyWOfeYUNLtktlcatQ==} dependencies: - '@nrwl/react': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) + '@nrwl/react': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4)(webpack@5.88.0) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/eslint': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.1.3) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) '@svgr/webpack': 8.0.1 chalk: 4.1.2 file-loader: 6.2.0(webpack@5.88.0) minimatch: 3.0.5 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6567,17 +7905,17 @@ packages: - webpack dev: true - /@nx/storybook@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/storybook@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-3gub7kR3tub5spRyuZt4LZ9aIsrnBdDRngAx90vbVv1a+vhKlQGTS8XPGOM7tyguzz02x+x86wh81iraKqlCmg==} dependencies: - '@nrwl/storybook': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@nx/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nrwl/storybook': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@nx/cypress': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(cypress@13.0.0)(eslint@8.46.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) '@nx/eslint': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(eslint@8.46.0)(nx@17.0.0-rc.2)(verdaccio@5.15.4) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.1.3) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) + '@phenomnomnominal/tsquery': 5.0.1(typescript@5.2.2) semver: 7.5.3 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6593,16 +7931,16 @@ packages: - verdaccio dev: true - /@nx/web@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/web@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-ta/jFeH3IL+I9UqzOXPYAHUhnCJkeDBU+csMmQJC8qr0w2AXN1lrmZ7faSRRcPN4HchxdDWVBMw54TUPzMEArA==} dependencies: - '@nrwl/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nrwl/web': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) chalk: 4.1.2 detect-port: 1.5.1 http-server: 14.1.0 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -6616,21 +7954,21 @@ packages: - verdaccio dev: true - /@nx/webpack@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/webpack@17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4): resolution: {integrity: sha512-wUFCca4GuqNh6vBAZP9FMmQkPyYcmcGtmR5AMxmZYh1ZeK6z+hfkGu2xDHAqnjmnEClWb2Amz9JBlhVO1o05iA==} dependencies: - '@babel/core': 7.22.9 - '@nrwl/webpack': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@babel/core': 7.23.2 + '@nrwl/webpack': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(esbuild@0.19.5)(html-webpack-plugin@5.5.0)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) '@nx/devkit': 17.0.0-rc.2(nx@17.0.0-rc.2) - '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/js': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.16.9)(nx@17.0.0-rc.2)(typescript@5.2.2)(verdaccio@5.15.4) autoprefixer: 10.4.13(postcss@8.4.19) - babel-loader: 9.1.3(@babel/core@7.22.9)(webpack@5.88.0) - browserslist: 4.21.9 + babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.88.0) + browserslist: 4.22.1 chalk: 4.1.2 copy-webpack-plugin: 10.2.4(webpack@5.88.0) css-loader: 6.8.1(webpack@5.88.0) css-minimizer-webpack-plugin: 5.0.0(esbuild@0.19.5)(webpack@5.88.0) - fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.1.3)(webpack@5.88.0) + fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.2.2)(webpack@5.88.0) less: 4.1.3 less-loader: 11.1.0(less@4.1.3)(webpack@5.88.0) license-webpack-plugin: 4.0.2(webpack@5.88.0) @@ -6646,9 +7984,9 @@ packages: source-map-loader: 3.0.2(webpack@5.88.0) style-loader: 3.3.1(webpack@5.88.0) terser-webpack-plugin: 5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.88.0) - ts-loader: 9.4.1(typescript@5.1.3)(webpack@5.88.0) + ts-loader: 9.4.1(typescript@5.2.2)(webpack@5.88.0) tsconfig-paths-webpack-plugin: 4.0.0 - tslib: 2.6.1 + tslib: 2.6.2 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) webpack-dev-server: 4.15.1(webpack@5.88.0) webpack-node-externals: 3.0.0 @@ -6689,7 +8027,7 @@ packages: chalk: 4.1.2 enquirer: 2.3.6 nx: 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) - tslib: 2.6.1 + tslib: 2.6.2 yargs-parser: 21.1.1 transitivePeerDependencies: - '@swc-node/register' @@ -6970,13 +8308,13 @@ packages: node-gyp-build: 4.5.0 dev: true - /@phenomnomnominal/tsquery@4.1.1(typescript@5.1.3): + /@phenomnomnominal/tsquery@4.1.1(typescript@5.2.2): resolution: {integrity: sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==} peerDependencies: typescript: ^3 || ^4 dependencies: - esquery: 1.4.0 - typescript: 5.1.3 + esquery: 1.5.0 + typescript: 5.2.2 dev: true /@phenomnomnominal/tsquery@5.0.1(typescript@5.1.3): @@ -6988,6 +8326,15 @@ packages: typescript: 5.1.3 dev: true + /@phenomnomnominal/tsquery@5.0.1(typescript@5.2.2): + resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} + peerDependencies: + typescript: ^3 || ^4 || ^5 + dependencies: + esquery: 1.4.0 + typescript: 5.2.2 + dev: true + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -7004,7 +8351,7 @@ packages: open: 8.4.2 picocolors: 1.0.0 tiny-glob: 0.2.9 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /@playwright/test@1.36.1: @@ -7117,13 +8464,13 @@ packages: /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 dev: true /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 dev: true /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0): @@ -7139,7 +8486,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.24 '@types/react-dom': 18.2.9 @@ -7160,7 +8507,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) @@ -7180,7 +8527,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/react': 18.2.24 react: 18.2.0 dev: true @@ -7194,7 +8541,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/react': 18.2.24 react: 18.2.0 dev: true @@ -7208,7 +8555,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/react': 18.2.24 react: 18.2.0 dev: true @@ -7226,7 +8573,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) @@ -7247,7 +8594,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/react': 18.2.24 react: 18.2.0 dev: true @@ -7265,7 +8612,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.24)(react@18.2.0) @@ -7284,7 +8631,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@types/react': 18.2.24 react: 18.2.0 @@ -7303,7 +8650,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.24)(react@18.2.0) @@ -7333,7 +8680,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.24 '@types/react-dom': 18.2.9 @@ -7354,7 +8701,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.24)(react@18.2.0) '@types/react': 18.2.24 '@types/react-dom': 18.2.9 @@ -7375,7 +8722,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) @@ -7412,7 +8759,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@types/react': 18.2.24 react: 18.2.0 @@ -7427,7 +8774,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/react': 18.2.24 react: 18.2.0 dev: true @@ -7441,7 +8788,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@types/react': 18.2.24 react: 18.2.0 @@ -7456,7 +8803,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@types/react': 18.2.24 react: 18.2.0 @@ -7471,7 +8818,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/react': 18.2.24 react: 18.2.0 dev: true @@ -7485,7 +8832,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/react': 18.2.24 react: 18.2.0 dev: true @@ -7499,7 +8846,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/rect': 1.0.1 '@types/react': 18.2.24 react: 18.2.0 @@ -7514,7 +8861,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.24)(react@18.2.0) '@types/react': 18.2.24 react: 18.2.0 @@ -7533,7 +8880,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.9)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.24 '@types/react-dom': 18.2.9 @@ -7544,7 +8891,7 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 dev: true /@reduxjs/toolkit@1.9.0(react-redux@8.0.5)(react@18.2.0): @@ -7624,17 +8971,17 @@ packages: rollup: 2.79.0 dev: true - /@rollup/plugin-json@6.0.0(rollup@3.21.0): - resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + /@rollup/plugin-json@6.0.1(rollup@4.3.0): + resolution: {integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@3.21.0) - rollup: 3.21.0 + '@rollup/pluginutils': 5.0.5(rollup@4.3.0) + rollup: 4.3.0 dev: true /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.0): @@ -7652,22 +8999,22 @@ packages: rollup: 2.79.0 dev: true - /@rollup/plugin-node-resolve@15.0.0(rollup@3.21.0): - resolution: {integrity: sha512-iwJbzfTzlzDDQcGmkS7EkCKwe2kSkdBrjX87Fy/KrNjr6UNnLpod0t6X66e502LRe5JJCA4FFqrEscWPnZAkig==} + /@rollup/plugin-node-resolve@15.2.3(rollup@4.3.0): + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.78.0||^3.0.0 + rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 4.2.1 + '@rollup/pluginutils': 5.0.5(rollup@4.3.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 - is-builtin-module: 3.2.0 + is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.2 - rollup: 3.21.0 + resolve: 1.22.8 + rollup: 4.3.0 dev: true /@rollup/plugin-url@7.0.0(rollup@2.79.0): @@ -7717,7 +9064,7 @@ packages: rollup: 2.79.0 dev: true - /@rollup/pluginutils@5.0.5(rollup@3.21.0): + /@rollup/pluginutils@5.0.5(rollup@4.3.0): resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} engines: {node: '>=14.0.0'} peerDependencies: @@ -7729,19 +9076,115 @@ packages: '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.21.0 + rollup: 4.3.0 + dev: true + + /@rollup/rollup-android-arm-eabi@4.3.0: + resolution: {integrity: sha512-/4pns6BYi8MXdwnXM44yoGAcFYVHL/BYlB2q1HXZ6AzH++LaiEVWFpBWQ/glXhbMbv3E3o09igrHFbP/snhAvA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.3.0: + resolution: {integrity: sha512-nLO/JsL9idr416vzi3lHm3Xm+QZh4qHij8k3Er13kZr5YhL7/+kBAx84kDmPc7HMexLmwisjDCeDIKNFp8mDlQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.3.0: + resolution: {integrity: sha512-dGhVBlllt4iHwTGy21IEoMOTN5wZoid19zEIxsdY29xcEiOEHqzDa7Sqrkh5OE7LKCowL61eFJXxYe/+pYa7ZQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.3.0: + resolution: {integrity: sha512-h8wRfHeLEbU3NzaP1Oku7BYXCJQiTRr+8U0lklyOQXxXiEpHLL8tk1hFl+tezoRKLcPJD7joKaK74ASsqt3Ekg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.3.0: + resolution: {integrity: sha512-wP4VgR/gfV18sylTuym3sxRTkAgUR2vh6YLeX/GEznk5jCYcYSlx585XlcUcl0c8UffIZlRJ09raWSX3JDb4GA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.3.0: + resolution: {integrity: sha512-v/14JCYVkqRSJeQbxFx4oUkwVQQw6lFMN7bd4vuARBc3X2lmomkxBsc+BFiIDL/BK+CTx5AOh/k9XmqDnKWRVg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.3.0: + resolution: {integrity: sha512-tNhfYqFH5OxtRzfkTOKdgFYlPSZnlDLNW4+leNEvQZhwTJxoTwsZAAhR97l3qVry/kkLyJPBK+Q8EAJLPinDIg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.3.0: + resolution: {integrity: sha512-pw77m8QywdsoFdFOgmc8roF1inBI0rciqzO8ffRUgLoq7+ee9o5eFqtEcS6hHOOplgifAUUisP8cAnwl9nUYPw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.3.0: + resolution: {integrity: sha512-tJs7v2MnV2F8w6X1UpPHl/43OfxjUy9SuJ2ZPoxn79v9vYteChVYO/ueLHCpRMmyTUIVML3N9z4azl9ENH8Xxg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.3.0: + resolution: {integrity: sha512-OKGxp6kATQdTyI2DF+e9s+hB3/QZB45b6e+dzcfW1SUqiF6CviWyevhmT4USsMEdP3mlpC9zxLz3Oh+WaTMOSw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.3.0: + resolution: {integrity: sha512-DDZ5AH68JJ2ClQFEA1aNnfA7Ybqyeh0644rGbrLOdNehTmzfICHiWSn0OprzYi9HAshTPQvlwrM+bi2kuaIOjQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.3.0: + resolution: {integrity: sha512-dMvGV8p92GQ8jhNlGIKpyhVZPzJlT258pPrM5q2F8lKcc9Iv9BbfdnhX1OfinYWnb9ms5zLw6MlaMnqLfUkKnQ==} + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true /@rushstack/eslint-patch@1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true - /@schematics/angular@16.2.0: - resolution: {integrity: sha512-Ib0/ZCkjWt7a5p3209JVwEWwf41v03K3ylvlxLIEo1ZGijAZAlrBj4GrA5YQ+TmPm2hRyt+owss7x91/x+i0Gw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + /@schematics/angular@17.0.0-rc.4: + resolution: {integrity: sha512-PRZJRaebPxgMQtBYYZDH1j6eJRSjjNfbaa3Uca6/U5pLGIaILUGdsHHwlSC3F6ItV6b4Mj9C8fL5zylHerN0EQ==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.2.0 + '@angular-devkit/core': 17.0.0-rc.4(chokidar@3.5.3) + '@angular-devkit/schematics': 17.0.0-rc.4 jsonc-parser: 3.2.0 transitivePeerDependencies: - chokidar @@ -7760,11 +9203,39 @@ packages: jest-runtime: 29.5.0 dev: true - /@sigstore/protobuf-specs@0.1.0: - resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} + /@sigstore/bundle@2.1.0: + resolution: {integrity: sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sigstore/protobuf-specs@0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /@sigstore/sign@2.1.0: + resolution: {integrity: sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@2.2.0: + resolution: {integrity: sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true @@ -8162,7 +9633,7 @@ packages: - supports-color dev: true - /@storybook/builder-webpack5@7.2.2(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3): + /@storybook/builder-webpack5@7.2.2(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): resolution: {integrity: sha512-+f2H3tXPZfn3q/eruXCmWPVAopd1MMEAAvneZ4iqlSHPC5HK2dcX/zj3yPar6rjfHHvZBXNm5sSi4WuD5Pw9MA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -8172,7 +9643,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@storybook/addons': 7.2.2(react-dom@18.2.0)(react@18.2.0) '@storybook/channels': 7.2.2 '@storybook/client-api': 7.2.2 @@ -8192,14 +9663,14 @@ packages: '@swc/core': 1.3.86(@swc/helpers@0.5.3) '@types/node': 16.18.36 '@types/semver': 7.5.2 - babel-loader: 9.1.2(@babel/core@7.22.9)(webpack@5.88.0) + babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.88.0) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 css-loader: 6.8.1(webpack@5.88.0) express: 4.18.2 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.3)(webpack@5.88.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.2.2)(webpack@5.88.0) fs-extra: 11.1.1 html-webpack-plugin: 5.5.0(webpack@5.88.0) path-browserify: 1.0.1 @@ -8211,7 +9682,7 @@ packages: swc-loader: 0.2.3(@swc/core@1.3.86)(webpack@5.88.0) terser-webpack-plugin: 5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.88.0) ts-dedent: 2.2.0 - typescript: 5.1.3 + typescript: 5.2.2 url: 0.11.1 util: 0.12.5 util-deprecate: 1.0.2 @@ -8463,10 +9934,10 @@ packages: /@storybook/csf-tools@7.2.2: resolution: {integrity: sha512-uO9AXtc64tpEpnoqHk5eYCUUL6nMwo1xHTXgIst9NKOdNSBL1/wvRgaT+rW+AzyXGsBjMwvDNjX/HIptqsoNgw==} dependencies: - '@babel/generator': 7.22.9 - '@babel/parser': 7.22.7 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/generator': 7.23.0 + '@babel/parser': 7.23.0 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 '@storybook/csf': 0.1.0 '@storybook/types': 7.2.2 fs-extra: 11.1.1 @@ -8587,7 +10058,7 @@ packages: resolution: {integrity: sha512-tGFZAFu5QFnuzhmzGMpasETVpzD1CVskok4+Dns/3iBWb8fZsFWaC0ZKazO+vHBtWZYO4uvrUbFSDTX2yPhtTQ==} dev: true - /@storybook/preset-react-webpack@7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1): + /@storybook/preset-react-webpack@7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-com92dj2rAvGG5xrx35kXZDawQr0GwfNJD8xoyZwzd+XjaguBU/DJNdjYwmJLscHx0wg+Vt5oK+hS1ICq82Ujg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -8608,9 +10079,9 @@ packages: '@storybook/core-webpack': 7.2.2 '@storybook/docs-tools': 7.2.2 '@storybook/node-logger': 7.2.2 - '@storybook/react': 7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.1.3)(webpack@5.88.0) - '@types/node': 16.18.36 + '@storybook/react': 7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.2.2)(webpack@5.88.0) + '@types/node': 16.18.48 '@types/semver': 7.5.2 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 @@ -8619,7 +10090,7 @@ packages: react-dom: 18.2.0(react@18.2.0) react-refresh: 0.11.0 semver: 7.5.3 - typescript: 5.1.3 + typescript: 5.2.2 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) transitivePeerDependencies: - '@swc/core' @@ -8679,7 +10150,7 @@ packages: resolution: {integrity: sha512-F3S3yK+RmpriADWnfVZsRN36WRT6LaFjD0sNrUkX8duxdnxNDaLFfJ3Cbxwyv/2lZ48uByIQbX2LC5HieVI0KA==} dev: true - /@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.1.3)(webpack@5.88.0): + /@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.2.2)(webpack@5.88.0): resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==} peerDependencies: typescript: '>= 4.x' @@ -8690,9 +10161,9 @@ packages: find-cache-dir: 3.3.2 flat-cache: 3.0.4 micromatch: 4.0.5 - react-docgen-typescript: 2.2.2(typescript@5.1.3) - tslib: 2.6.1 - typescript: 5.1.3 + react-docgen-typescript: 2.2.2(typescript@5.2.2) + tslib: 2.6.2 + typescript: 5.2.2 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) transitivePeerDependencies: - supports-color @@ -8708,7 +10179,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-webpack5@7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1): + /@storybook/react-webpack5@7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-VBFOO4LUuX/DVqaVBHpSTNT1NcIUlt1RpHX371NM0IcPSAj4EjHu3fLK4GjPMNJSqjnT7i6cthwPPe4hATTldg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -8723,13 +10194,13 @@ packages: optional: true dependencies: '@babel/core': 7.22.9 - '@storybook/builder-webpack5': 7.2.2(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) - '@storybook/preset-react-webpack': 7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1) - '@storybook/react': 7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) + '@storybook/builder-webpack5': 7.2.2(@swc/helpers@0.5.3)(@types/react-dom@18.2.9)(@types/react@18.2.24)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@storybook/preset-react-webpack': 7.2.2(@babel/core@7.22.9)(@swc/core@1.3.86)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(webpack-dev-server@4.11.1) + '@storybook/react': 7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@types/node': 16.18.36 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - '@swc/core' - '@swc/helpers' @@ -8748,7 +10219,7 @@ packages: - webpack-plugin-serve dev: true - /@storybook/react@7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3): + /@storybook/react@7.2.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): resolution: {integrity: sha512-41vOR9mCPGeO4YBVfej+X+Fge+igelqSFCJF/koZDdYxOVehsz3bK++TNrKo2utF69evhwSmIU1iEMEjesmbNg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -8781,7 +10252,7 @@ packages: react-element-to-jsx-string: 15.0.0(react-dom@18.2.0)(react@18.2.0) ts-dedent: 2.2.0 type-fest: 2.19.0 - typescript: 5.1.3 + typescript: 5.2.2 util-deprecate: 1.0.2 transitivePeerDependencies: - encoding @@ -9054,7 +10525,7 @@ packages: resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} engines: {node: '>=14'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 entities: 4.4.0 dev: true @@ -9128,7 +10599,7 @@ packages: '@swc/core': 1.3.86(@swc/helpers@0.5.3) dev: true - /@swc-node/register@1.6.8(@swc/core@1.3.86)(typescript@5.1.3): + /@swc-node/register@1.6.8(@swc/core@1.3.86)(typescript@5.2.2): resolution: {integrity: sha512-74ijy7J9CWr1Z88yO+ykXphV29giCrSpANQPQRooE0bObpkTO1g4RzQovIfbIaniBiGDDVsYwDoQ3FIrCE8HcQ==} peerDependencies: '@swc/core': '>= 1.3' @@ -9141,7 +10612,7 @@ packages: debug: 4.3.4(supports-color@5.5.0) pirates: 4.0.5 tslib: 2.6.1 - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true @@ -9150,7 +10621,7 @@ packages: resolution: {integrity: sha512-gqBJSmJMWomZFxlppaKea7NeAqFrDrrS0RMt24No92M3nJWcyI9YKGEQKl+EyJqZ5gh6w1s0cTklMHMzRwA1NA==} dependencies: source-map-support: 0.5.21 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /@swc/cli@0.1.62(@swc/core@1.3.86): @@ -9280,7 +10751,7 @@ packages: /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 /@swc/helpers@0.5.3: resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} @@ -9350,7 +10821,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/code-frame': 7.22.5 - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@types/aria-query': 4.2.2 aria-query: 5.1.3 chalk: 4.1.2 @@ -9404,17 +10875,17 @@ packages: /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@tufjs/canonical-json@2.0.0: + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} dev: true - /@tufjs/models@1.0.3: - resolution: {integrity: sha512-mkFEqqRisi13DmR5pX4x+Zk97EiU8djTtpNW1GeuX410y/raAsq/T3ZCjwoRIZ8/cIBfW0olK/sywlAiWevDVw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@tufjs/models@2.0.0: + resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 7.4.6 + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.3 dev: true /@types/aria-query@4.2.2: @@ -9428,8 +10899,8 @@ packages: /@types/babel__core@7.1.20: resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} dependencies: - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.2 @@ -9438,8 +10909,8 @@ packages: /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.2 @@ -9448,20 +10919,20 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@types/babel__traverse@7.18.2: resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@types/body-parser@1.19.2: @@ -10023,7 +11494,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.46.0)(typescript@5.1.3): + /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.46.0)(typescript@5.2.2): resolution: {integrity: sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10035,10 +11506,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.9.1(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/parser': 6.9.1(eslint@8.46.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.9.1 - '@typescript-eslint/type-utils': 6.9.1(eslint@8.46.0)(typescript@5.1.3) - '@typescript-eslint/utils': 6.9.1(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/type-utils': 6.9.1(eslint@8.46.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.46.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@5.5.0) eslint: 8.46.0 @@ -10046,13 +11517,13 @@ packages: ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.1.3) - typescript: 5.1.3 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@5.1.3): + /@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@5.2.2): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -10064,15 +11535,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.46.0 - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.9.1(eslint@8.46.0)(typescript@5.1.3): + /@typescript-eslint/parser@6.9.1(eslint@8.46.0)(typescript@5.2.2): resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10084,23 +11555,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.9.1 '@typescript-eslint/types': 6.9.1 - '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@5.5.0) eslint: 8.46.0 - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.59.2: - resolution: {integrity: sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.59.2 - '@typescript-eslint/visitor-keys': 5.59.2 - dev: true - /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10109,6 +11572,14 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true + /@typescript-eslint/scope-manager@6.10.0: + resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 + dev: true + /@typescript-eslint/scope-manager@6.9.1: resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10117,8 +11588,8 @@ packages: '@typescript-eslint/visitor-keys': 6.9.1 dev: true - /@typescript-eslint/type-utils@5.59.2(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==} + /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@5.2.2): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -10127,37 +11598,37 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.59.2(typescript@5.1.3) - '@typescript-eslint/utils': 5.59.2(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.46.0 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.10.0(eslint@8.46.0)(typescript@5.2.2): + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.46.0)(typescript@5.2.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.46.0 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@6.9.1(eslint@8.46.0)(typescript@5.1.3): + /@typescript-eslint/type-utils@6.9.1(eslint@8.46.0)(typescript@5.2.2): resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10167,33 +11638,33 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.1.3) - '@typescript-eslint/utils': 6.9.1(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.46.0)(typescript@5.2.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.46.0 - ts-api-utils: 1.0.3(typescript@5.1.3) - typescript: 5.1.3 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.59.2: - resolution: {integrity: sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@6.10.0: + resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/types@6.9.1: resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.59.2(typescript@5.1.3): - resolution: {integrity: sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==} + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -10201,40 +11672,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.59.2 - '@typescript-eslint/visitor-keys': 5.59.2 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.3): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.9.1(typescript@5.1.3): + /@typescript-eslint/typescript-estree@6.9.1(typescript@5.2.2): resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10249,14 +11720,14 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.1.3) - typescript: 5.1.3 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.59.2(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==} + /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@5.2.2): + 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 @@ -10264,9 +11735,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.2 - '@typescript-eslint/scope-manager': 5.59.2 - '@typescript-eslint/types': 5.59.2 - '@typescript-eslint/typescript-estree': 5.59.2(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) eslint: 8.46.0 eslint-scope: 5.1.1 semver: 7.5.3 @@ -10275,27 +11746,26 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@5.1.3): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@6.10.0(eslint@8.46.0)(typescript@5.2.2): + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.2 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.3) + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) eslint: 8.46.0 - eslint-scope: 5.1.1 - semver: 7.5.3 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@6.9.1(eslint@8.46.0)(typescript@5.1.3): + /@typescript-eslint/utils@6.9.1(eslint@8.46.0)(typescript@5.2.2): resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10306,7 +11776,7 @@ packages: '@types/semver': 7.5.2 '@typescript-eslint/scope-manager': 6.9.1 '@typescript-eslint/types': 6.9.1 - '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) eslint: 8.46.0 semver: 7.5.4 transitivePeerDependencies: @@ -10314,19 +11784,19 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@5.59.2: - resolution: {integrity: sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==} + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.59.2 + '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/visitor-keys@6.10.0: + resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/types': 6.10.0 eslint-visitor-keys: 3.4.3 dev: true @@ -10391,13 +11861,13 @@ packages: resolution: {integrity: sha512-1jls+cpfEXqXc1ZzqLGGNs6YCyG6B6QwDCezEkSvgKm+9A49FnSJ2n2dNIGcQYOszwHmd8EvwN98OEIx3Bbtrw==} dev: true - /@vitejs/plugin-basic-ssl@1.0.1(vite@4.4.7): + /@vitejs/plugin-basic-ssl@1.0.1(vite@4.5.0): resolution: {integrity: sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==} engines: {node: '>=14.6.0'} peerDependencies: vite: ^3.0.0 || ^4.0.0 dependencies: - vite: 4.4.7(@types/node@18.16.9)(less@4.1.3)(sass@1.64.1)(terser@5.19.2) + vite: 4.5.0(@types/node@18.16.9)(less@4.2.0)(sass@1.69.5)(terser@5.24.0) dev: true /@vitest/expect@0.32.0: @@ -10420,7 +11890,7 @@ packages: /@vitest/snapshot@0.32.0: resolution: {integrity: sha512-yCKorPWjEnzpUxQpGlxulujTcSPgkblwGzAUEL+z01FTUg/YuCDZ8dxr9sHA08oO2EwxzHXNLjQKWJ2zc2a19Q==} dependencies: - magic-string: 0.30.4 + magic-string: 0.30.5 pathe: 1.1.1 pretty-format: 27.5.1 dev: false @@ -10442,7 +11912,7 @@ packages: /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.23.0 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -10458,14 +11928,14 @@ packages: /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.3.4 '@vue/compiler-dom': 3.3.4 '@vue/compiler-ssr': 3.3.4 '@vue/reactivity-transform': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.4 + magic-string: 0.30.5 postcss: 8.4.19 source-map-js: 1.0.2 dev: true @@ -10480,11 +11950,11 @@ packages: /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.4 + magic-string: 0.30.5 dev: true /@vue/reactivity@3.3.4: @@ -10734,25 +12204,6 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@wessberg/ts-evaluator@0.0.27(typescript@5.1.3): - resolution: {integrity: sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==} - engines: {node: '>=10.1.0'} - deprecated: this package has been renamed to ts-evaluator. Please install ts-evaluator instead - peerDependencies: - typescript: '>=3.2.x || >= 4.x' - dependencies: - chalk: 4.1.2 - jsdom: 16.7.0 - object-path: 0.11.8 - tslib: 2.6.1 - typescript: 5.1.3 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - /@xstate/immer@0.3.1(immer@9.0.16)(xstate@4.34.0): resolution: {integrity: sha512-YE+KY08IjEEmXo6XKKpeSGW4j9LfcXw+5JVixLLUO3fWQ3M95joWJ40VtGzx0w0zQSzoCNk8NgfvwWBGSbIaTA==} peerDependencies: @@ -10813,7 +12264,7 @@ packages: esbuild: '>=0.10.0' dependencies: esbuild: 0.18.17 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /@yarnpkg/lockfile@1.1.0: @@ -10969,6 +12420,15 @@ packages: - supports-color dev: true + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + /agentkeepalive@4.2.1: resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} engines: {node: '>= 8.0.0'} @@ -11125,11 +12585,6 @@ packages: hasBin: true dev: true - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -11143,11 +12598,6 @@ packages: resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} dev: true - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true - /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -11242,14 +12692,14 @@ packages: dependencies: '@types/react': 18.2.24 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /aria-query@4.2.2: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 '@babel/runtime-corejs3': 7.20.0 dev: true @@ -11388,14 +12838,14 @@ packages: resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} engines: {node: '>=4'} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true /ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true /astral-regex@2.0.0: @@ -11451,19 +12901,19 @@ packages: postcss-value-parser: 4.2.0 dev: true - /autoprefixer@10.4.14(postcss@8.4.27): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.9 - caniuse-lite: 1.0.30001517 - fraction.js: 4.2.0 + browserslist: 4.22.1 + caniuse-lite: 1.0.30001550 + fraction.js: 4.3.6 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.27 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: true @@ -11506,12 +12956,6 @@ packages: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} - dependencies: - deep-equal: 2.0.5 - dev: true - /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: @@ -11567,30 +13011,30 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /babel-loader@9.1.3(@babel/core@7.22.9)(webpack@5.88.0): + /babel-loader@9.1.3(@babel/core@7.23.2)(webpack@5.88.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 find-cache-dir: 4.0.0 schema-utils: 4.1.0 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /babel-loader@9.1.3(@babel/core@7.22.9)(webpack@5.88.2): + /babel-loader@9.1.3(@babel/core@7.23.2)(webpack@5.89.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 find-cache-dir: 4.0.0 schema-utils: 4.1.0 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /babel-plugin-add-react-displayname@0.0.5: @@ -11605,7 +13049,20 @@ packages: '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-const-enum@1.2.0(@babel/core@7.23.2): + resolution: {integrity: sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/traverse': 7.23.2 transitivePeerDependencies: - supports-color dev: true @@ -11628,7 +13085,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@types/babel__core': 7.20.1 '@types/babel__traverse': 7.18.2 dev: true @@ -11636,9 +13093,9 @@ packages: /babel-plugin-macros@2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 cosmiconfig: 6.0.0 - resolve: 1.22.2 + resolve: 1.22.8 dev: true /babel-plugin-named-exports-order@0.0.2: @@ -11650,7 +13107,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.5 + '@babel/compat-data': 7.22.9 '@babel/core': 7.22.9 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.9) semver: 6.3.1 @@ -11663,7 +13120,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 '@babel/core': 7.22.9 '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.9) semver: 6.3.1 @@ -11684,6 +13141,19 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.22.9): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: @@ -11691,7 +13161,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.9) - core-js-compat: 3.30.2 + core-js-compat: 3.31.1 transitivePeerDependencies: - supports-color dev: true @@ -11703,7 +13173,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.9) - core-js-compat: 3.31.1 + core-js-compat: 3.33.0 transitivePeerDependencies: - supports-color dev: true @@ -11720,6 +13190,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.2): + resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + core-js-compat: 3.33.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.22.9): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: @@ -11753,6 +13235,17 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-react-docgen@4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} dependencies: @@ -11769,7 +13262,7 @@ packages: styled-components: '>= 2' dependencies: '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 babel-plugin-syntax-jsx: 6.18.0 lodash: 4.17.21 picomatch: 2.3.1 @@ -11788,10 +13281,10 @@ packages: resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} dev: true - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.22.9): + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.2): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} dependencies: - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) transitivePeerDependencies: - '@babel/core' dev: true @@ -11809,6 +13302,19 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.23.2): + resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} + peerDependencies: + '@babel/core': ^7 + '@babel/traverse': ^7 + peerDependenciesMeta: + '@babel/traverse': + optional: true + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.9): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -11829,41 +13335,59 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) dev: true - /babel-preset-fbjs@3.4.0(@babel/core@7.22.9): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + dev: true + + /babel-preset-fbjs@3.4.0(@babel/core@7.23.2): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.9) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 - transitivePeerDependencies: - - supports-color dev: true /babel-preset-jest@29.5.0(@babel/core@7.22.9): @@ -12088,21 +13612,20 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true - /browser-sync-client@2.27.11: - resolution: {integrity: sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==} + /browser-sync-client@2.29.3: + resolution: {integrity: sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==} engines: {node: '>=8.0.0'} dependencies: etag: 1.8.1 fresh: 0.5.2 mitt: 1.2.0 - rxjs: 5.5.12 - typescript: 4.9.5 dev: true - /browser-sync-ui@2.27.11: - resolution: {integrity: sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==} + /browser-sync-ui@2.29.3: + resolution: {integrity: sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==} dependencies: async-each-series: 0.1.1 + chalk: 4.1.2 connect-history-api-fallback: 1.6.0 immutable: 3.8.2 server-destroy: 1.0.1 @@ -12114,21 +13637,21 @@ packages: - utf-8-validate dev: true - /browser-sync@2.27.11: - resolution: {integrity: sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==} + /browser-sync@2.29.3: + resolution: {integrity: sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==} engines: {node: '>= 8.0.0'} hasBin: true dependencies: - browser-sync-client: 2.27.11 - browser-sync-ui: 2.27.11 + browser-sync-client: 2.29.3 + browser-sync-ui: 2.29.3 bs-recipes: 1.3.4 - bs-snippet-injector: 2.0.1 + chalk: 4.1.2 chokidar: 3.5.3 connect: 3.6.6 connect-history-api-fallback: 1.6.0 dev-ip: 1.0.1 easy-extender: 2.3.4 - eazy-logger: 3.1.0 + eazy-logger: 4.0.1 etag: 1.8.1 fresh: 0.5.2 fs-extra: 3.0.1 @@ -12138,7 +13661,6 @@ packages: micromatch: 4.0.5 opn: 5.3.0 portscanner: 2.2.0 - qs: 6.11.0 raw-body: 2.5.1 resp-modifier: 6.0.2 rx: 4.1.0 @@ -12147,7 +13669,7 @@ packages: serve-static: 1.13.2 server-destroy: 1.0.1 socket.io: 4.5.4 - ua-parser-js: 1.0.2 + ua-parser-js: 1.0.36 yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -12172,8 +13694,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001492 - electron-to-chromium: 1.4.417 + caniuse-lite: 1.0.30001517 + electron-to-chromium: 1.4.470 node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.5) dev: true @@ -12199,6 +13721,17 @@ packages: node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.9) + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001550 + electron-to-chromium: 1.4.557 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} @@ -12210,10 +13743,6 @@ packages: resolution: {integrity: sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==} dev: true - /bs-snippet-injector@2.0.1: - resolution: {integrity: sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==} - dev: true - /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -12338,15 +13867,15 @@ packages: - bluebird dev: true - /cacache@17.1.3: - resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /cacache@18.0.0: + resolution: {integrity: sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.0 glob: 10.2.2 - lru-cache: 7.14.0 - minipass: 5.0.0 + lru-cache: 10.0.1 + minipass: 7.0.3 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -12418,7 +13947,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /camelcase-css@2.0.1: @@ -12451,8 +13980,8 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.21.9 - caniuse-lite: 1.0.30001517 + browserslist: 4.22.1 + caniuse-lite: 1.0.30001550 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true @@ -12467,6 +13996,10 @@ packages: /caniuse-lite@1.0.30001517: resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} + /caniuse-lite@1.0.30001550: + resolution: {integrity: sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ==} + dev: true + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -12495,17 +14028,6 @@ packages: traverse: 0.3.9 dev: true - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -12538,6 +14060,11 @@ packages: supports-color: 7.2.0 dev: true + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -12687,6 +14214,11 @@ packages: engines: {node: '>= 10'} dev: true + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: true + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -12814,8 +14346,8 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: true - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} dev: true @@ -13185,7 +14717,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /copy-webpack-plugin@11.0.0(webpack@5.88.2): + /copy-webpack-plugin@11.0.0(webpack@5.89.0): resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -13197,19 +14729,25 @@ packages: normalize-path: 3.0.0 schema-utils: 4.1.0 serialize-javascript: 6.0.1 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /core-js-compat@3.30.2: resolution: {integrity: sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==} dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 dev: true /core-js-compat@3.31.1: resolution: {integrity: sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==} dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 + dev: true + + /core-js-compat@3.33.0: + resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} + dependencies: + browserslist: 4.22.1 dev: true /core-js-pure@3.26.0: @@ -13306,7 +14844,7 @@ packages: dom-serializer: 2.0.0 domhandler: 5.0.3 htmlparser2: 8.0.2 - postcss: 8.4.27 + postcss: 8.4.31 pretty-bytes: 5.6.0 dev: true @@ -13390,32 +14928,32 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.27) - postcss-modules-scope: 3.0.0(postcss@8.4.27) - postcss-modules-values: 4.0.0(postcss@8.4.27) + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) + postcss-modules-scope: 3.0.0(postcss@8.4.31) + postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.5.3 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /css-loader@6.8.1(webpack@5.88.2): + /css-loader@6.8.1(webpack@5.89.0): resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.27) - postcss-modules-scope: 3.0.0(postcss@8.4.27) - postcss-modules-values: 4.0.0(postcss@8.4.27) + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) + postcss-modules-scope: 3.0.0(postcss@8.4.31) + postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.5.3 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /css-minimizer-webpack-plugin@5.0.0(esbuild@0.19.5)(webpack@5.88.0): @@ -13679,13 +15217,6 @@ packages: cssom: 0.3.8 dev: true - /cssstyle@3.0.0: - resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} - engines: {node: '>=14'} - dependencies: - rrweb-cssom: 0.6.0 - dev: true - /csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} @@ -13731,7 +15262,7 @@ packages: listr2: 3.14.0(enquirer@2.3.6) lodash: 4.17.21 log-symbols: 4.1.0 - minimist: 1.2.7 + minimist: 1.2.8 ospath: 1.2.2 pretty-bytes: 5.6.0 process: 0.11.10 @@ -13826,15 +15357,6 @@ packages: whatwg-url: 11.0.0 dev: true - /data-urls@4.0.0: - resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} - engines: {node: '>=14'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - dev: true - /date-time@3.1.0: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} @@ -14280,7 +15802,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /dot-prop@5.3.0: @@ -14325,11 +15847,11 @@ packages: lodash: 4.17.21 dev: true - /eazy-logger@3.1.0: - resolution: {integrity: sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==} + /eazy-logger@4.0.1: + resolution: {integrity: sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==} engines: {node: '>= 0.8.0'} dependencies: - tfunk: 4.0.0 + chalk: 4.1.2 dev: true /ecc-jsbn@0.1.2: @@ -14367,6 +15889,10 @@ packages: /electron-to-chromium@1.4.470: resolution: {integrity: sha512-zZM48Lmy2FKWgqyvsX9XK+J6FfP7aCDUFLmgooLJzA7v1agCs/sxSoBpTIwDLhmbhpx9yJIxj2INig/ncjJRqg==} + /electron-to-chromium@1.4.557: + resolution: {integrity: sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw==} + dev: true + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -14639,14 +16165,8 @@ packages: - supports-color dev: true - /esbuild-wasm@0.18.17: - resolution: {integrity: sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==} - engines: {node: '>=12'} - hasBin: true - dev: true - - /esbuild-wasm@0.19.2: - resolution: {integrity: sha512-ak2XIIJKby+Uo3Iqh8wtw4pn2uZcnfLgtcmBHIgkShpun5ZIJsFigWXp7uLt7gXk3QAOCMmv0TSsIxD5qdn+Vw==} + /esbuild-wasm@0.19.5: + resolution: {integrity: sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==} engines: {node: '>=12'} hasBin: true dev: true @@ -14708,7 +16228,6 @@ packages: '@esbuild/win32-arm64': 0.18.17 '@esbuild/win32-ia32': 0.18.17 '@esbuild/win32-x64': 0.18.17 - dev: true /esbuild@0.19.5: resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} @@ -14779,7 +16298,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-next@13.1.1(eslint@8.46.0)(typescript@5.1.3): + /eslint-config-next@13.1.1(eslint@8.46.0)(typescript@5.2.2): resolution: {integrity: sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -14790,7 +16309,7 @@ packages: dependencies: '@next/eslint-plugin-next': 13.1.1 '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) eslint: 8.46.0 eslint-import-resolver-node: 0.3.6 eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.26.0)(eslint@8.46.0) @@ -14798,7 +16317,7 @@ packages: eslint-plugin-jsx-a11y: 6.6.1(eslint@8.46.0) eslint-plugin-react: 7.31.11(eslint@8.46.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.46.0) - typescript: 5.1.3 + typescript: 5.2.2 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color @@ -14817,32 +16336,62 @@ packages: resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} dependencies: debug: 3.2.7(supports-color@8.1.1) - resolve: 1.22.2 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-import-resolver-typescript@3.5.2(eslint-plugin-import@2.26.0)(eslint@8.46.0): - resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.4(supports-color@5.5.0) - enhanced-resolve: 5.15.0 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.5.2(eslint-plugin-import@2.26.0)(eslint@8.46.0): + resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4(supports-color@5.5.0) + enhanced-resolve: 5.15.0 + eslint: 8.46.0 + eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.46.0) + get-tsconfig: 4.3.0 + globby: 13.2.2 + is-core-module: 2.11.0 + is-glob: 4.0.3 + synckit: 0.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.5.2)(eslint@8.46.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) + debug: 3.2.7(supports-color@8.1.1) eslint: 8.46.0 - eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.46.0) - get-tsconfig: 4.3.0 - globby: 13.2.2 - is-core-module: 2.11.0 - is-glob: 4.0.3 - synckit: 0.8.4 + eslint-import-resolver-node: 0.3.6 + eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.26.0)(eslint@8.46.0) transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.5.2)(eslint@8.46.0): + /eslint-module-utils@2.7.4(@typescript-eslint/parser@6.9.1)(eslint-import-resolver-node@0.3.6)(eslint@8.46.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -14863,11 +16412,10 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/parser': 6.9.1(eslint@8.46.0)(typescript@5.2.2) debug: 3.2.7(supports-color@8.1.1) eslint: 8.46.0 eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.26.0)(eslint@8.46.0) transitivePeerDependencies: - supports-color dev: true @@ -14891,7 +16439,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.flat: 1.3.1 debug: 2.6.9 @@ -14912,6 +16460,37 @@ packages: - supports-color dev: true + /eslint-plugin-import@2.26.0(@typescript-eslint/parser@6.9.1)(eslint@8.46.0): + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.9.1(eslint@8.46.0)(typescript@5.2.2) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.46.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@6.9.1)(eslint-import-resolver-node@0.3.6)(eslint@8.46.0) + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-jsx-a11y@6.6.1(eslint@8.46.0): resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==} engines: {node: '>=4.0'} @@ -14979,14 +16558,14 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-storybook@0.6.12(eslint@8.46.0)(typescript@5.1.3): + /eslint-plugin-storybook@0.6.12(eslint@8.46.0)(typescript@5.2.2): resolution: {integrity: sha512-XbIvrq6hNVG6rpdBr+eBw63QhOMLpZneQVSooEDow8aQCWGCk/5vqtap1yxpVydNfSxi3S/3mBBRLQqKUqQRww==} engines: {node: 12.x || 14.x || >= 16} peerDependencies: eslint: '>=6' dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2) eslint: 8.46.0 requireindex: 1.2.0 ts-dedent: 2.2.0 @@ -15003,14 +16582,6 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -15133,8 +16704,8 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 c8: 7.13.0 transitivePeerDependencies: - supports-color @@ -15512,6 +17083,14 @@ packages: escape-string-regexp: 1.0.5 dev: true + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: true + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -15724,7 +17303,7 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin@7.2.13(typescript@5.1.3)(webpack@5.88.0): + /fork-ts-checker-webpack-plugin@7.2.13(typescript@5.2.2)(webpack@5.88.0): resolution: {integrity: sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: @@ -15747,7 +17326,7 @@ packages: schema-utils: 3.1.2 semver: 7.5.3 tapable: 2.2.1 - typescript: 5.1.3 + typescript: 5.2.2 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true @@ -15762,7 +17341,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.13 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 7.0.1 @@ -15778,14 +17357,14 @@ packages: webpack: 5.75.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.88.0): + /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.2.2)(webpack@5.88.0): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.13 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 7.0.1 @@ -15797,7 +17376,7 @@ packages: schema-utils: 3.2.0 semver: 7.5.3 tapable: 2.2.1 - typescript: 5.1.3 + typescript: 5.2.2 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true @@ -15853,6 +17432,10 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true + /fraction.js@4.3.6: + resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} + dev: true + /framer-motion@4.1.17(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-thx1wvKzblzbs0XaK2X0G1JuwIdARcoNOW7VVwjO8BUltzXPyONGAElLu6CiCScsOQRI7FIk/45YTFtJw5Yozw==} peerDependencies: @@ -15873,7 +17456,7 @@ packages: /framesync@5.3.0: resolution: {integrity: sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /fresh@0.5.2: @@ -16376,20 +17959,6 @@ packages: lodash: 4.17.21 dev: true - /guess-parser@0.4.22(typescript@5.1.3): - resolution: {integrity: sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==} - peerDependencies: - typescript: '>=3.7.5' - dependencies: - '@wessberg/ts-evaluator': 0.0.27(typescript@5.1.3) - typescript: 5.1.3 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} dev: true @@ -16430,13 +17999,6 @@ packages: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} dev: true - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -16556,13 +18118,6 @@ packages: lru-cache: 6.0.0 dev: true - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - lru-cache: 7.14.0 - dev: true - /hosted-git-info@7.0.0: resolution: {integrity: sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -16612,7 +18167,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.18.0 + terser: 5.21.0 dev: true /html-tags@3.2.0: @@ -16718,6 +18273,16 @@ packages: - supports-color dev: true + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + /http-proxy-middleware@2.0.6(@types/express@4.17.14): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} @@ -16830,6 +18395,16 @@ packages: - supports-color dev: true + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + /human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -16878,13 +18453,13 @@ packages: postcss: 8.4.19 dev: true - /icss-utils@5.1.0(postcss@8.4.27): + /icss-utils@5.1.0(postcss@8.4.31): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.31 dev: true /identity-obj-proxy@3.0.0: @@ -16898,11 +18473,11 @@ packages: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true - /ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /ignore-walk@6.0.3: + resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minimatch: 5.1.6 + minimatch: 9.0.3 dev: true /ignore@5.2.0: @@ -17072,6 +18647,27 @@ packages: wrap-ansi: 7.0.0 dev: true + /inquirer@9.2.11: + resolution: {integrity: sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==} + engines: {node: '>=14.18.0'} + dependencies: + '@ljharb/through': 2.3.11 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -17175,6 +18771,13 @@ packages: builtin-modules: 3.3.0 dev: true + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -17192,6 +18795,11 @@ packages: dependencies: has: 1.0.3 + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -17429,6 +19037,11 @@ packages: engines: {node: '>=10'} dev: true + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: true + /is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} dev: true @@ -17491,6 +19104,11 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} @@ -17509,8 +19127,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.9 - '@babel/parser': 7.21.4 + '@babel/core': 7.22.19 + '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -17680,7 +19298,7 @@ packages: pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.1.3) + ts-node: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.2.2) transitivePeerDependencies: - supports-color dev: true @@ -17794,7 +19412,7 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 '@jest/types': 29.5.0 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -17924,18 +19542,18 @@ packages: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.9) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.23.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@jest/expect-utils': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.2 '@types/prettier': 2.7.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.9) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) chalk: 4.1.2 expect: 29.5.0 graceful-fs: 4.2.11 @@ -18157,44 +19775,6 @@ packages: - utf-8-validate dev: true - /jsdom@22.1.0: - resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} - engines: {node: '>=16'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - cssstyle: 3.0.0 - data-urls: 4.0.0 - decimal.js: 10.4.3 - domexception: 4.0.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.4 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.2 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - ws: 8.13.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -18489,7 +20069,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /less-loader@11.1.0(less@4.1.3)(webpack@5.88.2): + /less-loader@11.1.0(less@4.2.0)(webpack@5.89.0): resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -18497,8 +20077,8 @@ packages: webpack: ^5.0.0 dependencies: klona: 2.0.5 - less: 4.1.3 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + less: 4.2.0 + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /less@4.1.3: @@ -18520,6 +20100,26 @@ packages: transitivePeerDependencies: - supports-color + /less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -18573,7 +20173,7 @@ packages: webpack-sources: 3.2.3 dev: true - /license-webpack-plugin@4.0.2(webpack@5.88.2): + /license-webpack-plugin@4.0.2(webpack@5.89.0): resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} peerDependencies: webpack: '*' @@ -18583,7 +20183,7 @@ packages: webpack-sources: optional: true dependencies: - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) webpack-sources: 3.2.3 dev: true @@ -18840,7 +20440,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true /lowercase-keys@2.0.0: @@ -18933,21 +20533,14 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /magic-string@0.30.1: - resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.2: resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - /magic-string@0.30.4: - resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==} + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -18996,24 +20589,20 @@ packages: - supports-color dev: true - /make-fetch-happen@11.0.3: - resolution: {integrity: sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /make-fetch-happen@13.0.0: + resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - agentkeepalive: 4.2.1 - cacache: 17.1.3 + '@npmcli/agent': 2.1.1 + cacache: 18.0.0 http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 is-lambda: 1.0.1 - lru-cache: 7.14.0 - minipass: 4.2.8 + minipass: 7.0.3 minipass-fetch: 3.0.0 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 0.6.3 promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 ssri: 10.0.4 transitivePeerDependencies: - supports-color @@ -19248,7 +20837,7 @@ packages: resolution: {integrity: sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA==} engines: {node: '>=16'} dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 hermes-parser: 0.12.0 nullthrows: 1.1.1 transitivePeerDependencies: @@ -19337,7 +20926,7 @@ packages: resolution: {integrity: sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==} engines: {node: '>=16'} dependencies: - terser: 5.19.2 + terser: 5.24.0 dev: true /metro-minify-uglify@0.76.8: @@ -19347,50 +20936,50 @@ packages: uglify-es: 3.3.9 dev: true - /metro-react-native-babel-preset@0.76.8(@babel/core@7.22.9): + /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.2): resolution: {integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==} engines: {node: '>=16'} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-export-default-from': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.9) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-typescript': 7.22.9(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.2) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-export-default-from': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.2) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.22.9(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) '@babel/template': 7.22.5 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.22.9) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.2) react-refresh: 0.4.3 transitivePeerDependencies: - supports-color @@ -19405,7 +20994,7 @@ packages: resolution: {integrity: sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==} engines: {node: '>=16'} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 react-refresh: 0.4.3 dev: true @@ -19413,8 +21002,8 @@ packages: resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} engines: {node: '>=16'} dependencies: - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 invariant: 2.2.4 metro-symbolicate: 0.76.8 nullthrows: 1.1.1 @@ -19444,10 +21033,10 @@ packages: resolution: {integrity: sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==} engines: {node: '>=16'} dependencies: - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -19457,11 +21046,11 @@ packages: resolution: {integrity: sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==} engines: {node: '>=16'} dependencies: - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 '@babel/parser': 7.22.7 '@babel/types': 7.22.5 - babel-preset-fbjs: 3.4.0(@babel/core@7.22.9) + babel-preset-fbjs: 3.4.0(@babel/core@7.23.2) metro: 0.76.8 metro-babel-transformer: 0.76.8 metro-cache: 0.76.8 @@ -19482,7 +21071,7 @@ packages: hasBin: true dependencies: '@babel/code-frame': 7.22.5 - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/generator': 7.22.9 '@babel/parser': 7.22.7 '@babel/template': 7.22.5 @@ -19512,7 +21101,7 @@ packages: metro-inspector-proxy: 0.76.8 metro-minify-terser: 0.76.8 metro-minify-uglify: 0.76.8 - metro-react-native-babel-preset: 0.76.8(@babel/core@7.22.9) + metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.2) metro-resolver: 0.76.8 metro-runtime: 0.76.8 metro-source-map: 0.76.8 @@ -19786,14 +21375,14 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /mini-css-extract-plugin@2.7.6(webpack@5.88.2): + /mini-css-extract-plugin@2.7.6(webpack@5.89.0): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.1.0 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /mini-svg-data-uri@1.4.4: @@ -19835,13 +21424,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -19861,6 +21443,10 @@ packages: /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} @@ -19935,6 +21521,11 @@ packages: engines: {node: '>=8'} dev: true + /minipass@7.0.3: + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -20038,6 +21629,11 @@ packages: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /mv@2.1.1: resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} engines: {node: '>=0.8.0'} @@ -20164,47 +21760,47 @@ packages: - '@babel/core' - babel-plugin-macros - /ng-packagr@16.2.0(@angular/compiler-cli@16.2.0)(tailwindcss@3.2.4)(tslib@2.4.0)(typescript@5.1.3): - resolution: {integrity: sha512-3u2FVSpKDa0EJRSGOAhYIZwjtnG7SVFBnUf5fk/VfDOxVV4kFRea6DEK7f/mb1D4WV/yqSZB9JmvBZp0uuIGeA==} - engines: {node: ^16.14.0 || >=18.10.0} + /ng-packagr@17.0.0-rc.1(@angular/compiler-cli@17.0.0-rc.3)(tailwindcss@3.2.4)(tslib@2.4.0)(typescript@5.2.2): + resolution: {integrity: sha512-d/1UujHf0VCSC3/9xsB1ImPefUxNHOAfXxITZ+uXqwLyVxRjyz9eVkPxVuaSpzZyh3QyABfbFxZFuSE5HvKxGQ==} + engines: {node: ^18.13.0 || >=20.9.0} hasBin: true peerDependencies: - '@angular/compiler-cli': ^16.0.0 || ^16.2.0-next.0 + '@angular/compiler-cli': ^17.0.0 || ^17.0.0-next.0 tailwindcss: ^2.0.0 || ^3.0.0 tslib: ^2.3.0 - typescript: '>=4.9.3 <5.2' + typescript: '>=5.2 <5.3' peerDependenciesMeta: tailwindcss: optional: true dependencies: - '@angular/compiler-cli': 16.2.0(@angular/compiler@16.2.0)(typescript@5.1.3) - '@rollup/plugin-json': 6.0.0(rollup@3.21.0) - '@rollup/plugin-node-resolve': 15.0.0(rollup@3.21.0) + '@angular/compiler-cli': 17.0.0-rc.3(@angular/compiler@17.0.0-rc.3)(typescript@5.2.2) + '@rollup/plugin-json': 6.0.1(rollup@4.3.0) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.3.0) ajv: 8.12.0 ansi-colors: 4.1.3 - autoprefixer: 10.4.13(postcss@8.4.19) - browserslist: 4.21.9 - cacache: 17.1.3 + autoprefixer: 10.4.16(postcss@8.4.31) + browserslist: 4.22.1 + cacache: 18.0.0 chokidar: 3.5.3 - commander: 11.0.0 + commander: 11.1.0 convert-source-map: 2.0.0 dependency-graph: 0.11.0 - esbuild-wasm: 0.19.2 - fast-glob: 3.2.12 + esbuild-wasm: 0.19.5 + fast-glob: 3.3.1 find-cache-dir: 3.3.2 injection-js: 2.4.0 jsonc-parser: 3.2.0 - less: 4.1.3 + less: 4.2.0 ora: 5.3.0 piscina: 4.1.0 - postcss: 8.4.19 - postcss-url: 10.1.3(postcss@8.4.19) - rollup: 3.21.0 + postcss: 8.4.31 + postcss-url: 10.1.3(postcss@8.4.31) + rollup: 4.3.0 rxjs: 7.8.1 - sass: 1.55.0 + sass: 1.69.5 tailwindcss: 3.2.4(postcss@8.4.19)(ts-node@10.9.1) tslib: 2.4.0 - typescript: 5.1.3 + typescript: 5.2.2 optionalDependencies: esbuild: 0.19.5 transitivePeerDependencies: @@ -20225,7 +21821,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /node-abort-controller@3.0.1: @@ -20324,6 +21920,10 @@ packages: /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + /nopt@4.0.3: resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==} hasBin: true @@ -20344,7 +21944,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.2 + resolve: 1.22.8 semver: 5.7.1 validate-npm-package-license: 3.0.4 @@ -20353,17 +21953,17 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.11.0 + is-core-module: 2.13.0 semver: 7.5.3 validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.11.0 + hosted-git-info: 7.0.0 + is-core-module: 2.13.0 semver: 7.5.3 validate-npm-package-license: 3.0.4 dev: true @@ -20405,16 +22005,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.5.3 - validate-npm-package-name: 5.0.0 - dev: true - /npm-package-arg@11.0.1: resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -20425,33 +22015,33 @@ packages: validate-npm-package-name: 5.0.0 dev: true - /npm-packlist@7.0.0: - resolution: {integrity: sha512-8GRMzWQmFdUrRmc6tPPCd9Umm9g2qDR6X6Rik+9nYvoDQTLs/0IcCKv6iUdAmgr9sgJCm24QovwozCHWMDriOg==} + /npm-packlist@8.0.0: + resolution: {integrity: sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - ignore-walk: 5.0.1 + ignore-walk: 6.0.3 dev: true - /npm-pick-manifest@8.0.1: - resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /npm-pick-manifest@9.0.0: + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: npm-install-checks: 6.0.0 npm-normalize-package-bin: 3.0.0 - npm-package-arg: 10.1.0 + npm-package-arg: 11.0.1 semver: 7.5.3 dev: true - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /npm-registry-fetch@16.0.0: + resolution: {integrity: sha512-JFCpAPUpvpwfSydv99u85yhP68rNIxSFmDpNbNnRWKSe3gpjHnWL8v320gATwRzjtgmZ9Jfe37+ZPOLZPwz6BQ==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - make-fetch-happen: 11.0.3 - minipass: 5.0.0 + make-fetch-happen: 13.0.0 + minipass: 7.0.3 minipass-fetch: 3.0.0 minipass-json-stream: 1.0.1 minizlib: 2.1.2 - npm-package-arg: 10.1.0 + npm-package-arg: 11.0.1 proc-log: 3.0.0 transitivePeerDependencies: - supports-color @@ -20522,7 +22112,7 @@ packages: '@nrwl/cli': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86) '@nrwl/tao': 15.8.0(@swc-node/register@1.6.8)(@swc/core@1.3.86) '@parcel/watcher': 2.0.4 - '@swc-node/register': 1.6.8(@swc/core@1.3.86)(typescript@5.1.3) + '@swc-node/register': 1.6.8(@swc/core@1.3.86)(typescript@5.2.2) '@swc/core': 1.3.86(@swc/helpers@0.5.3) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 @@ -20552,7 +22142,7 @@ packages: tar-stream: 2.2.0 tmp: 0.2.1 tsconfig-paths: 4.1.2 - tslib: 2.6.1 + tslib: 2.6.2 v8-compile-cache: 2.3.0 yargs: 17.7.2 yargs-parser: 21.1.1 @@ -20585,7 +22175,7 @@ packages: dependencies: '@nrwl/tao': 17.0.0-rc.2(@swc-node/register@1.6.8)(@swc/core@1.3.86) '@parcel/watcher': 2.0.4 - '@swc-node/register': 1.6.8(@swc/core@1.3.86)(typescript@5.1.3) + '@swc-node/register': 1.6.8(@swc/core@1.3.86)(typescript@5.2.2) '@swc/core': 1.3.86(@swc/helpers@0.5.3) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 @@ -20617,7 +22207,7 @@ packages: tar-stream: 2.2.0 tmp: 0.2.1 tsconfig-paths: 4.1.2 - tslib: 2.6.1 + tslib: 2.6.2 v8-compile-cache: 2.3.0 yargs: 17.7.2 yargs-parser: 21.1.1 @@ -20670,11 +22260,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /object-path@0.11.8: - resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} - engines: {node: '>= 10.12.0'} - dev: true - /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} @@ -21043,27 +22628,27 @@ packages: engines: {node: '>=6'} dev: true - /pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /pacote@17.0.4: + resolution: {integrity: sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: - '@npmcli/git': 4.0.3 + '@npmcli/git': 5.0.3 '@npmcli/installed-package-contents': 2.0.1 - '@npmcli/promise-spawn': 6.0.1 - '@npmcli/run-script': 6.0.0 - cacache: 17.1.3 + '@npmcli/promise-spawn': 7.0.0 + '@npmcli/run-script': 7.0.1 + cacache: 18.0.0 fs-minipass: 3.0.0 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.0 - npm-pick-manifest: 8.0.1 - npm-registry-fetch: 14.0.5 + minipass: 7.0.3 + npm-package-arg: 11.0.1 + npm-packlist: 8.0.0 + npm-pick-manifest: 9.0.0 + npm-registry-fetch: 16.0.0 proc-log: 3.0.0 promise-retry: 2.0.1 - read-package-json: 6.0.0 + read-package-json: 7.0.0 read-package-json-fast: 3.0.2 - sigstore: 1.4.0 + sigstore: 2.1.0 ssri: 10.0.4 tar: 6.2.0 transitivePeerDependencies: @@ -21079,7 +22664,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /parent-module@1.0.1: @@ -21112,7 +22697,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -21171,7 +22756,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /path-browserify@1.0.1: @@ -21282,6 +22867,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + dev: true + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -21324,16 +22914,6 @@ packages: engines: {node: '>= 6'} dev: true - /piscina@4.0.0: - resolution: {integrity: sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==} - dependencies: - eventemitter-asyncresource: 1.0.0 - hdr-histogram-js: 2.0.3 - hdr-histogram-percentiles-obj: 3.0.0 - optionalDependencies: - nice-napi: 1.0.2 - dev: true - /piscina@4.1.0: resolution: {integrity: sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==} dependencies: @@ -21393,7 +22973,7 @@ packages: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.15 dev: true /popmotion@9.3.6: @@ -21402,7 +22982,7 @@ packages: framesync: 5.3.0 hey-listen: 1.0.8 style-value-types: 4.1.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /portfinder@1.0.32: @@ -21501,7 +23081,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.19 @@ -21514,7 +23094,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.23 @@ -21527,7 +23107,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 postcss: 8.4.19 postcss-value-parser: 4.2.0 dev: true @@ -21538,7 +23118,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 postcss: 8.4.23 postcss-value-parser: 4.2.0 dev: true @@ -21776,7 +23356,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.19 - ts-node: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.1.3) + ts-node: 10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.2.2) yaml: 1.10.2 /postcss-loader@6.2.1(postcss@8.4.19)(webpack@5.88.0): @@ -21793,7 +23373,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /postcss-loader@7.3.3(postcss@8.4.27)(webpack@5.88.2): + /postcss-loader@7.3.3(postcss@8.4.31)(webpack@5.89.0): resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -21802,9 +23382,9 @@ packages: dependencies: cosmiconfig: 8.2.0 jiti: 1.20.0 - postcss: 8.4.27 + postcss: 8.4.31 semver: 7.5.3 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /postcss-logical@5.0.4(postcss@8.4.19): @@ -21853,7 +23433,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.19) postcss: 8.4.19 @@ -21866,7 +23446,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 caniuse-api: 3.0.0 cssnano-utils: 4.0.0(postcss@8.4.23) postcss: 8.4.23 @@ -21923,7 +23503,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 cssnano-utils: 3.1.0(postcss@8.4.19) postcss: 8.4.19 postcss-value-parser: 4.2.0 @@ -21935,7 +23515,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 cssnano-utils: 4.0.0(postcss@8.4.23) postcss: 8.4.23 postcss-value-parser: 4.2.0 @@ -21970,13 +23550,13 @@ packages: postcss: 8.4.19 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.27): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.31 dev: true /postcss-modules-local-by-default@4.0.3(postcss@8.4.19): @@ -21991,14 +23571,14 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-modules-local-by-default@4.0.3(postcss@8.4.27): + /postcss-modules-local-by-default@4.0.3(postcss@8.4.31): resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true @@ -22013,13 +23593,13 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.27): + /postcss-modules-scope@3.0.0(postcss@8.4.31): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.31 postcss-selector-parser: 6.0.11 dev: true @@ -22033,14 +23613,14 @@ packages: postcss: 8.4.19 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.27): + /postcss-modules-values@4.0.0(postcss@8.4.31): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 dev: true /postcss-modules@4.3.1(postcss@8.4.19): @@ -22203,7 +23783,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 postcss: 8.4.19 postcss-value-parser: 4.2.0 dev: true @@ -22214,7 +23794,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 postcss: 8.4.23 postcss-value-parser: 4.2.0 dev: true @@ -22385,7 +23965,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 caniuse-api: 3.0.0 postcss: 8.4.19 dev: true @@ -22396,7 +23976,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 caniuse-api: 3.0.0 postcss: 8.4.23 dev: true @@ -22508,6 +24088,19 @@ packages: xxhashjs: 0.2.2 dev: true + /postcss-url@10.1.3(postcss@8.4.31): + resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + make-dir: 3.1.0 + mime: 2.5.2 + minimatch: 3.0.8 + postcss: 8.4.31 + xxhashjs: 0.2.2 + dev: true + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -22535,8 +24128,8 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /postcss@8.4.27: - resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -22876,12 +24469,12 @@ packages: react: 18.2.0 dev: false - /react-docgen-typescript@2.2.2(typescript@5.1.3): + /react-docgen-typescript@2.2.2(typescript@5.2.2): resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: typescript: '>= 4.3.x' dependencies: - typescript: 5.1.3 + typescript: 5.2.2 dev: true /react-docgen@5.4.3: @@ -22889,9 +24482,9 @@ packages: engines: {node: '>=8.10.0'} hasBin: true dependencies: - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 - '@babel/runtime': 7.22.6 + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/runtime': 7.22.15 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -23044,7 +24637,7 @@ packages: '@types/react': 18.2.24 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.2.24)(react@18.2.0) - tslib: 2.6.1 + tslib: 2.6.2 dev: true /react-remove-scroll@2.5.5(@types/react@18.2.24)(react@18.2.0): @@ -23061,7 +24654,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.2.24)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.24)(react@18.2.0) - tslib: 2.6.1 + tslib: 2.6.2 use-callback-ref: 1.3.0(@types/react@18.2.24)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.24)(react@18.2.0) dev: true @@ -23103,7 +24696,7 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /react-syntax-highlighter@15.5.0(react@18.2.0): @@ -23174,13 +24767,13 @@ packages: npm-normalize-package-bin: 1.0.1 dev: false - /read-package-json@6.0.0: - resolution: {integrity: sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /read-package-json@7.0.0: + resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - glob: 8.1.0 + glob: 10.2.2 json-parse-even-better-errors: 3.0.0 - normalize-package-data: 5.0.0 + normalize-package-data: 6.0.0 npm-normalize-package-bin: 3.0.0 dev: true @@ -23272,14 +24865,14 @@ packages: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.2 + resolve: 1.22.8 dev: true /redent@3.0.0: @@ -23334,10 +24927,14 @@ packages: resolution: {integrity: sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==} dev: false - /regenerator-transform@0.15.1: - resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.23.2 dev: true /regex-parser@2.2.11: @@ -23544,11 +25141,11 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -23667,7 +25264,7 @@ packages: - ts-node dev: true - /rollup-plugin-typescript2@0.34.1(rollup@2.79.0)(typescript@5.1.3): + /rollup-plugin-typescript2@0.34.1(rollup@2.79.0)(typescript@5.2.2): resolution: {integrity: sha512-P4cHLtGikESmqi1CA+tdMDUv8WbQV48mzPYt77TSTOPJpERyZ9TXdDgjSDix8Fkqce6soYz3+fa4lrC93IEkcw==} peerDependencies: rollup: '>=1.26.3' @@ -23679,7 +25276,7 @@ packages: rollup: 2.79.0 semver: 7.5.3 tslib: 2.5.0 - typescript: 5.1.3 + typescript: 5.2.2 dev: true /rollup-pluginutils@2.8.2: @@ -23709,10 +25306,25 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.3 - dev: true - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + /rollup@4.3.0: + resolution: {integrity: sha512-scIi1NrKLDIYSPK66jjECtII7vIgdAMFmFo8h6qm++I6nN9qDSV35Ku6erzGVqYjx+lj+j5wkusRMr++8SyDZg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.3.0 + '@rollup/rollup-android-arm64': 4.3.0 + '@rollup/rollup-darwin-arm64': 4.3.0 + '@rollup/rollup-darwin-x64': 4.3.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.3.0 + '@rollup/rollup-linux-arm64-gnu': 4.3.0 + '@rollup/rollup-linux-arm64-musl': 4.3.0 + '@rollup/rollup-linux-x64-gnu': 4.3.0 + '@rollup/rollup-linux-x64-musl': 4.3.0 + '@rollup/rollup-win32-arm64-msvc': 4.3.0 + '@rollup/rollup-win32-ia32-msvc': 4.3.0 + '@rollup/rollup-win32-x64-msvc': 4.3.0 + fsevents: 2.3.3 dev: true /run-async@2.4.1: @@ -23720,6 +25332,11 @@ packages: engines: {node: '>=0.12.0'} dev: true + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -23729,13 +25346,6 @@ packages: resolution: {integrity: sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==} dev: true - /rxjs@5.5.12: - resolution: {integrity: sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==} - engines: {npm: '>=2.0.0'} - dependencies: - symbol-observable: 1.0.1 - dev: true - /rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} @@ -23808,7 +25418,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /sass-loader@13.3.2(sass@1.64.1)(webpack@5.88.2): + /sass-loader@13.3.2(sass@1.69.5)(webpack@5.89.0): resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -23828,8 +25438,8 @@ packages: optional: true dependencies: neo-async: 2.6.2 - sass: 1.64.1 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + sass: 1.69.5 + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /sass@1.55.0: @@ -23841,8 +25451,8 @@ packages: immutable: 4.1.0 source-map-js: 1.0.2 - /sass@1.64.1: - resolution: {integrity: sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==} + /sass@1.69.5: + resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -24237,14 +25847,14 @@ packages: engines: {node: '>=14'} dev: true - /sigstore@1.4.0: - resolution: {integrity: sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + /sigstore@2.1.0: + resolution: {integrity: sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - '@sigstore/protobuf-specs': 0.1.0 - make-fetch-happen: 11.0.3 - tuf-js: 1.1.4 + '@sigstore/bundle': 2.1.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 2.1.0 + '@sigstore/tuf': 2.2.0 transitivePeerDependencies: - supports-color dev: true @@ -24294,7 +25904,7 @@ packages: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /socket.io-adapter@2.4.0: @@ -24360,6 +25970,17 @@ packages: - supports-color dev: true + /socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} @@ -24423,7 +26044,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /source-map-loader@4.0.1(webpack@5.88.2): + /source-map-loader@4.0.1(webpack@5.89.0): resolution: {integrity: sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -24432,7 +26053,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /source-map-support@0.5.13: @@ -24775,13 +26396,6 @@ packages: safe-buffer: 5.2.1 dev: true - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -24890,7 +26504,7 @@ packages: resolution: {integrity: sha512-LCJL6tB+vPSUoxgUBt9juXIlNJHtBMy8jkXzUJSBzeHWdBu6lhzHqCvLVkXFGsFIlNa2ln1sQHya/gzaFmB2Lg==} dependencies: hey-listen: 1.0.8 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /styled-components@5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): @@ -24940,7 +26554,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 postcss: 8.4.19 postcss-selector-parser: 6.0.11 dev: true @@ -24951,16 +26565,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 postcss: 8.4.23 postcss-selector-parser: 6.0.11 dev: true - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -24999,7 +26608,7 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.1 locate-character: 3.0.0 - magic-string: 0.30.4 + magic-string: 0.30.5 periscopic: 3.1.0 dev: true @@ -25076,11 +26685,6 @@ packages: vue: 3.3.4 dev: true - /symbol-observable@1.0.1: - resolution: {integrity: sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==} - engines: {node: '>=0.10.0'} - dev: true - /symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} @@ -25099,7 +26703,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/utils': 2.3.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /tabbable@6.0.1: @@ -25234,7 +26838,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.86)(esbuild@0.18.17)(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.75.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25252,15 +26856,15 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.18 '@swc/core': 1.3.86(@swc/helpers@0.5.3) - esbuild: 0.18.17 + esbuild: 0.19.5 jest-worker: 27.5.1 schema-utils: 3.2.0 serialize-javascript: 6.0.1 terser: 5.18.0 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.75.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.75.0): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.88.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25283,10 +26887,10 @@ packages: schema-utils: 3.2.0 serialize-javascript: 6.0.1 terser: 5.18.0 - webpack: 5.75.0(@swc/core@1.3.86)(esbuild@0.19.5) + webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.88.0): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25309,7 +26913,7 @@ packages: schema-utils: 3.2.0 serialize-javascript: 6.0.1 terser: 5.18.0 - webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /terser@5.17.1: @@ -25334,8 +26938,19 @@ packages: source-map-support: 0.5.21 dev: true - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + /terser@5.21.0: + resolution: {integrity: sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.3 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /terser@5.24.0: + resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -25363,13 +26978,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /tfunk@4.0.0: - resolution: {integrity: sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==} - dependencies: - chalk: 1.1.3 - dlv: 1.1.3 - dev: true - /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -25555,13 +27163,6 @@ packages: punycode: 2.3.0 dev: true - /tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} - dependencies: - punycode: 2.3.0 - dev: true - /traverse@0.3.9: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: true @@ -25596,13 +27197,13 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: true - /ts-api-utils@1.0.3(typescript@5.1.3): + /ts-api-utils@1.0.3(typescript@5.2.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.1.3 + typescript: 5.2.2 dev: true /ts-dedent@2.2.0: @@ -25610,7 +27211,7 @@ packages: engines: {node: '>=6.10'} dev: true - /ts-jest@29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.19.5)(jest@29.4.3)(typescript@5.1.3): + /ts-jest@29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.19.5)(jest@29.4.3)(typescript@5.2.2): resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -25643,11 +27244,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.3 - typescript: 5.1.3 + typescript: 5.2.2 yargs-parser: 21.1.1 dev: true - /ts-loader@9.4.1(typescript@5.1.3)(webpack@5.88.0): + /ts-loader@9.4.1(typescript@5.2.2)(webpack@5.88.0): resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -25658,7 +27259,7 @@ packages: enhanced-resolve: 5.13.0 micromatch: 4.0.5 semver: 7.5.3 - typescript: 5.1.3 + typescript: 5.2.2 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true @@ -25692,6 +27293,38 @@ packages: typescript: 5.1.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: true + + /ts-node@10.9.1(@swc/core@1.3.86)(@types/node@18.16.9)(typescript@5.2.2): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.3.86(@swc/helpers@0.5.3) + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.16.9 + acorn: 8.8.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 /tsconfig-paths-webpack-plugin@4.0.0: resolution: {integrity: sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==} @@ -25745,27 +27378,31 @@ packages: /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: true - /tsutils@3.21.0(typescript@5.1.3): + /tsutils@3.21.0(typescript@5.2.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.1.3 + typescript: 5.2.2 dev: true - /tuf-js@1.1.4: - resolution: {integrity: sha512-Lw2JRM3HTYhEtQJM2Th3aNCPbnXirtWMl065BawwmM2pX6XStH/ZO9e8T2hh0zk/HUa+1i6j+Lv6eDitKTau6A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /tuf-js@2.1.0: + resolution: {integrity: sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - '@tufjs/models': 1.0.3 - make-fetch-happen: 11.0.3 + '@tufjs/models': 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + make-fetch-happen: 13.0.0 transitivePeerDependencies: - supports-color dev: true @@ -25871,10 +27508,10 @@ packages: typedoc: '>=0.24.0' dependencies: handlebars: 4.7.7 - typedoc: 0.25.1(typescript@5.1.3) + typedoc: 0.25.1(typescript@5.2.2) dev: true - /typedoc@0.25.1(typescript@5.1.3): + /typedoc@0.25.1(typescript@5.2.2): resolution: {integrity: sha512-c2ye3YUtGIadxN2O6YwPEXgrZcvhlZ6HlhWZ8jQRNzwLPn2ylhdGqdR8HbyDRyALP8J6lmSANILCkkIdNPFxqA==} engines: {node: '>= 16'} hasBin: true @@ -25885,7 +27522,7 @@ packages: marked: 4.3.0 minimatch: 9.0.3 shiki: 0.14.1 - typescript: 5.1.3 + typescript: 5.2.2 dev: true /typescript@4.9.4: @@ -25894,19 +27531,19 @@ packages: hasBin: true dev: true - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + /typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} hasBin: true dev: true - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true - /ua-parser-js@1.0.2: - resolution: {integrity: sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==} + /ua-parser-js@1.0.36: + resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} dev: true /ufo@1.3.1: @@ -25948,6 +27585,13 @@ packages: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true + /undici@5.27.2: + resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.0.0 + dev: true + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -26187,6 +27831,17 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -26240,7 +27895,7 @@ packages: dependencies: '@types/react': 18.2.24 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /use-composed-ref@1.3.0(react@18.2.0): @@ -26302,7 +27957,7 @@ packages: '@types/react': 18.2.24 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /use-sync-external-store@1.2.0(react@18.2.0): @@ -26528,10 +28183,11 @@ packages: mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.3.9(@types/node@18.16.9)(less@4.1.3)(sass@1.55.0) + vite: 4.5.0(@types/node@18.16.9)(less@4.1.3)(sass@1.55.0) transitivePeerDependencies: - '@types/node' - less + - lightningcss - sass - stylus - sugarss @@ -26573,13 +28229,14 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vite@4.3.9(@types/node@18.16.9)(less@4.1.3)(sass@1.55.0): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + /vite@4.5.0(@types/node@18.16.9)(less@4.1.3)(sass@1.55.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: '@types/node': '>= 14' less: '*' + lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' @@ -26589,6 +28246,8 @@ packages: optional: true less: optional: true + lightningcss: + optional: true sass: optional: true stylus: @@ -26599,17 +28258,17 @@ packages: optional: true dependencies: '@types/node': 18.16.9 - esbuild: 0.17.19 + esbuild: 0.18.17 less: 4.1.3 - postcss: 8.4.27 - rollup: 3.21.0 + postcss: 8.4.31 + rollup: 3.28.0 sass: 1.55.0 optionalDependencies: fsevents: 2.3.3 dev: false - /vite@4.4.7(@types/node@18.16.9)(less@4.1.3)(sass@1.64.1)(terser@5.19.2): - resolution: {integrity: sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==} + /vite@4.5.0(@types/node@18.16.9)(less@4.2.0)(sass@1.69.5)(terser@5.24.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -26638,11 +28297,11 @@ packages: dependencies: '@types/node': 18.16.9 esbuild: 0.18.17 - less: 4.1.3 - postcss: 8.4.27 + less: 4.2.0 + postcss: 8.4.31 rollup: 3.28.0 - sass: 1.64.1 - terser: 5.19.2 + sass: 1.69.5 + terser: 5.24.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -26705,6 +28364,7 @@ packages: why-is-node-running: 2.2.2 transitivePeerDependencies: - less + - lightningcss - sass - stylus - sugarss @@ -26828,7 +28488,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /webpack-dev-middleware@5.3.3(webpack@5.88.2): + /webpack-dev-middleware@5.3.3(webpack@5.89.0): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -26839,7 +28499,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.1.0 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /webpack-dev-middleware@6.1.1(webpack@5.88.0): @@ -26859,7 +28519,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /webpack-dev-middleware@6.1.1(webpack@5.88.2): + /webpack-dev-middleware@6.1.1(webpack@5.89.0): resolution: {integrity: sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -26873,7 +28533,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.1.0 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /webpack-dev-server@4.11.1(webpack@5.88.0): @@ -26975,7 +28635,7 @@ packages: - utf-8-validate dev: true - /webpack-dev-server@4.15.1(webpack@5.88.2): + /webpack-dev-server@4.15.1(webpack@5.89.0): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true @@ -27016,8 +28676,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) - webpack-dev-middleware: 5.3.3(webpack@5.88.2) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) + webpack-dev-middleware: 5.3.3(webpack@5.89.0) ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -27034,16 +28694,17 @@ packages: strip-ansi: 6.0.1 dev: true - /webpack-merge@5.8.0: - resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} + /webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} engines: {node: '>=10.0.0'} dependencies: clone-deep: 4.0.1 + flat: 5.0.2 wildcard: 2.0.0 dev: true - /webpack-merge@5.9.0: - resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + /webpack-merge@5.8.0: + resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} engines: {node: '>=10.0.0'} dependencies: clone-deep: 4.0.1 @@ -27075,7 +28736,7 @@ packages: webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.5.0)(webpack@5.88.2): + /webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.5.0)(webpack@5.89.0): resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} engines: {node: '>= 12'} peerDependencies: @@ -27087,7 +28748,7 @@ packages: dependencies: html-webpack-plugin: 5.5.0(webpack@5.88.0) typed-assert: 1.0.9 - webpack: 5.88.2(@swc/core@1.3.86)(esbuild@0.18.17) + webpack: 5.89.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true /webpack-virtual-modules@0.5.0: @@ -27111,7 +28772,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.10.0 acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.9 + browserslist: 4.22.1 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 0.9.3 @@ -27174,8 +28835,8 @@ packages: - uglify-js dev: true - /webpack@5.88.2(@swc/core@1.3.86)(esbuild@0.18.17): - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + /webpack@5.89.0(@swc/core@1.3.86)(esbuild@0.19.5): + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -27191,7 +28852,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.10.0 acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.9 + browserslist: 4.22.1 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.3.0 @@ -27205,7 +28866,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.2.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.86)(esbuild@0.18.17)(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.86)(esbuild@0.19.5)(webpack@5.89.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -27277,14 +28938,6 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url@12.0.1: - resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} - engines: {node: '>=14'} - dependencies: - tr46: 4.1.1 - webidl-conversions: 7.0.0 - dev: true - /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -27347,12 +29000,12 @@ packages: isexe: 2.0.0 dev: true - /which@3.0.0: - resolution: {integrity: sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} hasBin: true dependencies: - isexe: 2.0.0 + isexe: 3.1.1 dev: true /why-is-node-running@2.2.2: @@ -27617,16 +29270,12 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - /zone.js@0.13.1: - resolution: {integrity: sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==} + /zone.js@0.14.0: + resolution: {integrity: sha512-Sz0G0TjMuyApIcuTJeK742+xLLKEPjYtkdBEazBlYePHkICVp9DPKqI/4dJt3LCtQBd52sCxz23uAFJ2OJa6Ow==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false diff --git a/tools/documentation/create-embeddings/tsconfig.app.json b/tools/documentation/create-embeddings/tsconfig.app.json index 3c71a636b1574..18a9a7119ee2c 100644 --- a/tools/documentation/create-embeddings/tsconfig.app.json +++ b/tools/documentation/create-embeddings/tsconfig.app.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../../../dist/out-tsc", - "module": "ESNext", + "module": "nodenext", "moduleResolution": "nodenext", "types": ["node"], "esModuleInterop": true,