diff --git a/docs/generated/cli/create-nx-workspace.md b/docs/generated/cli/create-nx-workspace.md index 2d26849dfb..6b8696a24d 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 242977c7b3..03f1e40231 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 c2e62d1cda..ac812527eb 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 549d90b3b2..3b49517589 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 a67ca82d47..4dff6e90b9 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 6dd917c2cd..9dc0d2f70b 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 fa7a163df6..0f786b6610 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 8af01710c8..f2b737df15 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 d2a60d2339..f28658b10b 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 2656515cbf..dde3b3cdd8 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 18eef25606..840972322e 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 77e8e9998e..f7fe88c1e2 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 b153f50db1..18fba35179 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 d34284e9b7..e26d2706b9 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 2b34ae403b..87f0aa9d86 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 e022ed06fc..09566384fb 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 457fb29289..ee4e9d1637 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 1c64ecc99a..3d98861b10 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 d9c47472c1..196986cf8a 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 a891887dd3..84c632b414 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 2d26849dfb..6b8696a24d 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 c4bb61ebfa..ead20a6283 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 2e1376287c..4c8e09ab65 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 152e4f6c77..e00bdd4262 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 1b1ed145e0..c2d5e6f1cc 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 31db4f3789..5c65714750 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 f57bdd5461..9f800070df 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 179dd210c3..beca757a45 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 b4dd87c004..dbe8a5b5be 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 b880f5a7b2..ebc49a8551 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 de275e8c33..d0cecf18fd 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`, - `` + const readAppStylesBundle = (outputPath: string) => { + const stylesBundlePath = listFiles(outputPath).find((file) => + /^styles[\.-]/.test(file) ); - - updateFile( - `${app}/src/app/app.component.css`, - `.custom-btn { - @apply m-md p-sm; - }` - ); - }; - - 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}`); - assertAppComponentStyles(appWithTailwind, spacing.projectVariant1); - let stylesBundle = readAppStylesBundle(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}`); + + 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 8d32046113..5a9f532f03 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 fa21c9304a..8270aecf11 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 ab94b99f62..3f7a748983 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 efcec24270..ba434e9fbd 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 6099be22a2..c2f2043677 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 a4f5060e3d..81ba8e5e0a 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 bd08576934..4e8a9ae472 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 5bf3991d96..6a2088a222 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 4c37556c81..b5d599edf4 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 efac5a1172..422da7f4be 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 edf746fb8c..03b00ba648 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 6539314749..fe023c9592 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 2521952378..d480a5efb8 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 fc23f6e8f6..91f28aa177 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 4628a90112..df3e7556e0 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 614cd5783f..5671a244c4 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 c2fb2ed8c3..932562c8a7 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 797f27b446..0000000000 --- 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 8192345ab3..5e2dee464c 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 b8cc2b3fd2..7cc9cb1f1e 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 f534977441..88e50eda31 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 f2f293096b..2060a6d2df 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 ed890083fe..e981bacf7f 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 cf3001486b..343d77de79 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 4bb2054adb..df9cfe7a1b 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 778660ee3c..9de47194cf 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 273e21ecbc..f9cae7d560 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 2694cbd230..c9f9a5bae5 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 f68ed5c05a..0000000000 --- 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 fa36ccba93..481318ccd8 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 e3d98beb71..475f8a8ada 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' - ); + } 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) - ); + 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 fcc6db9acb..331095105e 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 42bfa872b8..69923851eb 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 7b79f56328..7303ed6475 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 2cb05da94c..e3a10b87e7 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 0000000000..2577b960ef --- /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 4a116b4918..deedf6d74c 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 f298773d34..459e64c600 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 d7c8e0b891..72cc77007c 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 ad7c53dbbe..6093701302 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 049bbaba11..3d7e189966 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 2d91132ac8..61dcf0ec39 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 574499b52e..404a81173f 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 c44aa7f8f4..745b195cc4 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 7089208c7e..a00978de17 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 8640123932..16de2365d2 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 0be643ee35..37ff93aee7 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 a5ca96c878..385effefd2 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 57caccc2ab..0000000000 --- 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 4f9ac26980..0000000000 --- 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 3612073bc3..0000000000 --- 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 8c29253acc..0000000000 --- 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 429bb9ef2d..0000000000 --- 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 a836bd8f67..9719db5b6d 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 165082806e..9fa38b3064 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 88c4601dad..0379dad1ca 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 76f29504fb..8b750757b7 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 d3e481b744..e8d989d216 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 dbfd8f83fa..b1a5dd3675 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 cdb84fd5f5..2ab398d60b 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 1cc21df7cb..6de1e0bf3b 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 c425e77f72..d1968c4402 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 5f9c3a3835..a6ff38ce1b 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 46e96e2292..33dc5c4e3a 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 66485636ba..180044ebe2 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 d51a443cd8..0000000000 --- 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 d66db2fcdc..a67189761c 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 8ab0c77dc3..c13466ced2 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 d17661c43c..372a6cfdfd 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,7 +108,7 @@ describe('TestDirective', () => { " `; -exports[`directive generator should import the directive correctly when flat=false and path is nested deeper 3`] = ` +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({ @@ -144,66 +120,7 @@ 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`] = ` -"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 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 b6717d28c3..196a1e8780 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,107 +27,19 @@ 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 }); + await generateDirectiveWithDefaultOptions(tree); // 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 }); - - // 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(); - }); - - 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', - }); - - // 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 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, - }); - - // 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, - }); - - // 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(); + expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + 'TestDirective' + ); }); it('should not generate test file when skipTests=true', async () => { @@ -154,16 +53,129 @@ describe('directive generator', () => { }); // 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(); + }); + + describe('--no-standalone', () => { + beforeEach(() => { + addModule(tree); + }); + + 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(); + }); + + 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 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(); + }); + + 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(); + }); + + 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 f26419c308..dfc3625a0c 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 da94c6f89c..f9451963f5 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 eb81eeb99f..ac797d3118 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 d51a443cd8..0000000000 --- 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 9ac21fb8dc..d09ad646fe 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 b03f567c3b..88f83a1909 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 13c061fa72..7132a1ec22 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 49caf7c66f..e2ae3cf356 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 8a5311a660..30e904136e 100644 --- a/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap +++ b/packages/angular/src/generators/host/__snapshots__/host.spec.ts.snap @@ -1,42 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Host App Generator --ssr should generate the correct files 1`] = ` -"import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; -import { 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 {} -" -`; - -exports[`Host App Generator --ssr should generate the correct files 2`] = ` -"import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); -" -`; - -exports[`Host App Generator --ssr should generate the correct files 3`] = ` -"export { AppServerModule } from './app/app.server.module'; -" -`; - -exports[`Host App Generator --ssr should generate the correct files 4`] = ` +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'; @@ -46,7 +10,7 @@ import * as cors from 'cors'; import { existsSync } from 'fs'; import { join } from 'path'; -import { AppServerModule } from './bootstrap.server'; +import bootstrap from './bootstrap.server'; // The Express app is exported so that it can be used by serverless Functions. export function app(): express.Express { @@ -62,7 +26,7 @@ export function app(): express.Express { server.engine( 'html', ngExpressEngine({ - bootstrap: AppServerModule, + bootstrap, }) ); @@ -102,7 +66,114 @@ function run(): void { run(); -export * from './bootstrap.server'; +export default bootstrap; +" +`; + +exports[`Host App Generator --ssr should generate the correct files 1`] = ` +"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 {} +" +`; + +exports[`Host App Generator --ssr should generate the correct files 2`] = ` +"import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { AppModule } from './app/app.module'; + +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch((err) => console.error(err)); +" +`; + +exports[`Host App Generator --ssr should generate the correct files 3`] = ` +"export { AppServerModule } from './app/app.server.module'; +" +`; + +exports[`Host App Generator --ssr should generate the correct files 4`] = ` +"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 { 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(), 'dist/test/browser'); + 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: 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 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 + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; - res.render(indexHtml, { - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - 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 + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; - res.render(indexHtml, { - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - 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 + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; - res.render(indexHtml, { - providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }], - 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 0000000000..3242070ad5 --- /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 c6dc2b6fe6..46f5836e42 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', - }, - })); + 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', + }, + })); - // 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.`); + 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 7cff6f5780..2884d5792f 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 b0b15a6bb4..3e6fefd341 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 b162c36a67..68635e822d 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 890a298c29..6fdb48fff6 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 47babcef7a..5082444b1a 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 cac7e9d2e8..f5d052c4c9 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 583438f99a..e52c98622c 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 1b080293f7..0f0c4bd90f 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 3d96504c33..6ba1528547 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 ca2858fae5..da68e2fcd7 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 ec73ac120e..19efdffcbf 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 8e58b23884..6fb91bf392 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 ceac9a222c..34cae6c5d1 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 c4c787a91c..0000000000 --- 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 61e66dcd8c..0000000000 --- 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 caee51b914..a2de9ee60d 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 a13e9dddc4..be93fe817c 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 70915740f7..c0f1adb56e 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 1a43f6f3c2..56d8c76445 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 b70ba1d26a..48a2b86b06 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 48f8ab6fc5..ab23ba9396 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 4c637524c3..532aab92c1 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 7a4129d543..b174042247 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 508c619520..0000000000 --- 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 b5bd3607ba..0000000000 --- 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 d0e478de02..dcf91e12e4 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 5ead456ca4..f70302fae4 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 71b80ac7e6..046f781fbe 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 dbf17be454..3ce79b1af6 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 96318a7c34..c0b304c069 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,7 +114,7 @@ describe('TestPipe', () => { " `; -exports[`pipe generator should import the pipe correctly when flat=false and path is nested deeper 3`] = ` +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({ @@ -152,70 +126,7 @@ 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`] = ` -"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 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 da94c6f89c..f9451963f5 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 6cbb2ef182..ad2a71ec9e 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 d51a443cd8..0000000000 --- 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 673fd2ddb9..d9b881cc93 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,101 +25,22 @@ 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(); - }); - - 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', - }); - - // 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 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, - }); - - // 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 not import the pipe when skipImport=true', async () => { - // ARRANGE - - // ACT - await generatePipeWithDefaultOptions(tree, { - flat: false, - path: 'test/src/app/my-pipes', - skipImport: 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(); + expect(tree.read('test/src/app/test.module.ts', 'utf-8')).not.toContain( + 'TestPipe' + ); }); it('should not generate test file when skipTests=true', async () => { - // ARRANGE - // ACT await generatePipeWithDefaultOptions(tree, { flat: false, @@ -141,16 +49,124 @@ describe('pipe generator', () => { }); // 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(); + }); + + describe('--no-standalone', () => { + beforeEach(() => { + addModule(tree); + }); + + it('should generate a pipe with test files and attach to the NgModule automatically', async () => { + // ARRANGE + + // ACT + await generatePipeWithDefaultOptions(tree, { standalone: false }); + + // 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(); + }); + + 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 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(); + }); + + 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(); + }); + + 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 74ad126c98..9b67117f59 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 0be12fae31..bdee60e7d2 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 abe333132c..39e6f94858 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 0000000000..feb768fdea --- /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 ec1360ed68..89a196c620 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 1604f1f5bc..fa21f80d6d 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 f96a97af65..d892ca9787 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', - }, - })); + 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', + }, + })); - // 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.`); + 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 0393e14db8..13d0a9e248 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 b819e8c7d4..f9c106130a 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 80b8c9845d..71bf40cc7b 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 44cd3d46fc..11c893551e 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 d2739e01e5..2b318d1d0b 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 315b9a6e68..20d6d80701 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 230013ad45..3987dcb68d 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 f77ca8e689..f2c9966b14 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 727e73b54d..71f7a92b4e 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 f0ebee88b0..59478b3b45 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 a05cc639b7..5e50483093 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 04ec9ae4e9..3338e3b69d 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 96401331f9..0000000000 --- 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 0000000000..4591bf8087 --- /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 69ab1639c4..d51c0f38aa 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 f707e2831d..20c4779eb3 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 c2628d6126..c4ad3cd12f 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 b6b403981c..794f16662c 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,123 @@ 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; +} + +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 AppServerModule; +" +`; + +exports[`setupSSR with browser builder should create the files correctly for ssr when app is standalone 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 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; @@ -203,36 +509,3 @@ if (moduleFilename === __filename || moduleFilename.includes('iisnode')) { export default bootstrap; " `; - -exports[`setupSSR should use fileReplacements if they already exist 1`] = ` -{ - "configurations": { - "development": { - "buildOptimizer": false, - "extractLicenses": false, - "optimization": false, - "sourceMap": true, - "vendorChunk": true, - }, - "production": { - "fileReplacements": [ - { - "replace": "app1/src/environments/environment.ts", - "with": "app1/src/environments/environment.prod.ts", - }, - ], - "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", - }, -} -`; 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 ccb72c72f9..0000000000 --- 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 0000000000..37391c4cf3 --- /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 c57814dc6c..4302143d9a 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 5373ef943b..c3e215b7c3 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 0000000000..1a08e2fb65 --- /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 9aada2b97f..0a87fdb981 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 0000000000..1a6cdc19cd --- /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 f1cb83e8e5..b6cdbe33ac 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 958b16d88e..c10ed1b57e 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 0000000000..2866b7d1f0 --- /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 0000000000..2e517bc2b7 --- /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 8c1dbe88dd..02d56adee6 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 6f8128d2c2..3f0e648925 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 a13fb1ec9a..4a569f33d5 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 9695086801..ece4ee2a2f 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'; + + const bootstrap = () => bootstrapApplication(AppComponent, config); + + 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'; + + const serverConfig: ApplicationConfig = { + providers: [provideServerRendering()], + }; + + export const config = mergeApplicationConfig(appConfig, serverConfig); + " + `); + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults.server.cache).toEqual(true); + }); + + 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'); + + await setupSsr(tree, { project: 'app1' }); + + expect( + readProjectConfiguration(tree, 'app1').targets.build.options.outputPath + ).toBe('dist/app1/browser'); + }); }); - it('should create the files correctly for ssr when app is standalone', async () => { - // ARRANGE + it('should install the correct dependencies', async () => { const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + await generateTestApplication(tree, { name: 'app1' }); - await generateTestApplication(tree, { - name: 'app1', - standalone: true, - }); - - // 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(` - "import { bootstrapApplication } from '@angular/platform-browser'; - import { AppComponent } from './app/app.component'; - import { config } from './app/app.config.server'; - - const bootstrap = () => bootstrapApplication(AppComponent, config); - - 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'; - - const serverConfig: ApplicationConfig = { - providers: [provideServerRendering()], - }; - - export const config = mergeApplicationConfig(appConfig, serverConfig); - " - `); - - 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,49 +477,18 @@ 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 () => { - // ARRANGE - const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - await generateTestApplication(tree, { - name: 'app1', - }); - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { '@angular/core': '14.2.0' }, - })); - - // ACT - await setupSsr(tree, { project: 'app1' }); - - // ASSERT - expect(tree.read('app1/src/main.server.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'; - " - `); - }); - it('should add "withServerTransition" call to app module for angular versions lower than 16', async () => { // ARRANGE const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); @@ -353,6 +499,7 @@ describe('setupSSR', () => { await generateTestApplication(tree, { name: 'app1', + standalone: false, }); // ACT @@ -361,20 +508,95 @@ 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'; + "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' })], - providers: [], - bootstrap: [AppComponent], - }) - export class AppModule {} - " - `); + @NgModule({ + declarations: [AppComponent, NxWelcomeComponent], + imports: [ + BrowserModule.withServerTransition({ appId: 'serverApp' }), + RouterModule.forRoot(appRoutes, { initialNavigation: 'enabledBlocking' }), + ], + providers: [], + bootstrap: [AppComponent], + }) + export class AppModule {} + " + `); + }); + + it('should set "initialNavigation: enabledBlocking" in "RouterModule.forRoot" options', 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', + standalone: false, + }); + + // ACT + await setupSsr(tree, { project: 'app1' }); + + // 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 { 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 2d55c73b91..2229346471 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 73d6639678..7f8b05dada 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 0c8fef7ffe..3b3f100d85 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 2cd30a6277..08e746cf38 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 9b4d62469f..1f94bbc421 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 45cae6efd4..0d98e2dae6 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 2462e06815..0a0ee07669 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 4bfc240f9d..cc8df006c6 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 ea5970883f..8905bd2408 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 5df09b65ce..42b653e466 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 63b18d5da0..976cc76973 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 0000000000..c3f0780183 --- /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 0000000000..bee575ace1 --- /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 0000000000..294fb56a3e --- /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 0000000000..ccfb66cc3d --- /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 0000000000..64c323ca2a --- /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 0000000000..76c3a3b760 --- /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 0000000000..8d74d7dc8f --- /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 0000000000..97cad6a1a4 --- /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 0000000000..d62b620f6e --- /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 0000000000..a4c259af2b --- /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 7fb73173d5..ff0e2bf8bd 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,34 +11,6 @@ export const backwardCompatibleVersions: Record< SupportedVersions, PackageVersions > = { - angularV14: { - angularVersion: '~14.2.0', - angularDevkitVersion: '~14.2.0', - ngPackagrVersion: '~14.2.0', - ngrxVersion: '~14.0.0', - rxjsVersion: '~7.8.0', - zoneJsVersion: '~0.11.4', - angularJsVersion: '1.7.9', - tsLibVersion: '^2.3.0', - ngUniversalVersion: '~14.2.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', - tailwindVersion: '^3.0.2', - postcssVersion: '^8.4.5', - postcssImportVersion: '~14.1.0', - postcssPresetEnvVersion: '~7.5.0', - postcssUrlVersion: '~10.1.3', - autoprefixerVersion: '^10.4.0', - tsNodeVersion: '10.9.1', - jestPresetAngularVersion: '~12.2.3', - typesNodeVersion: '16.11.7', - jasmineMarblesVersion: '^0.9.2', - jsoncEslintParserVersion: '^2.1.0', - }, angularV15: { angularVersion: '~15.2.0', angularDevkitVersion: '~15.2.0', @@ -67,4 +39,32 @@ export const backwardCompatibleVersions: Record< jasmineMarblesVersion: '^0.9.2', jsoncEslintParserVersion: '^2.1.0', }, + angularV16: { + angularVersion: '~16.2.0', + angularDevkitVersion: '~16.2.0', + ngPackagrVersion: '~16.2.0', + ngrxVersion: '~16.0.0', + rxjsVersion: '~7.8.0', + zoneJsVersion: '~0.13.0', + angularJsVersion: '1.7.9', + tsLibVersion: '^2.3.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: '~16.0.0', + tailwindVersion: '^3.0.2', + postcssVersion: '^8.4.5', + postcssImportVersion: '~14.1.0', + postcssPresetEnvVersion: '~7.5.0', + postcssUrlVersion: '~10.1.3', + autoprefixerVersion: '^10.4.0', + tsNodeVersion: '10.9.1', + 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 b48b407a93..3d41523f4e 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 031a77d58f..e419679c68 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 2f5546f9cd..d064017024 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', - }, + e2eTestRunner = await determineE2eTestRunner(parsedArgs); - { - name: 'No', - }, - ], - initial: 'Yes' as any, - }, - ]); - routing = reply.routing === 'Yes'; - } - - 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 01a7fd2c65..07f4c3ce27 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 26115dc811..a6661c65a2 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 1d592af1d9..1931df18ab 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 0f16e5e715..fcd220c05f 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 c0b882c92b..9cd2b8b8fe 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 e5888f27d9..4d40d96478 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 443c69c3a5..4fb909600d 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 26115dc811..a6661c65a2 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 f2a4c23267..acee29d6f8 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 71e71aead0..dc806af033 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 ad677c244e..2d15fb78ba 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 1a60225062..0a1fb80a1a 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 3f15271b8d..51681b0db4 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 4fd3a77831..fb45215e7a 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 8be3cf05a6..3794e31911 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 fc56421500..196d6357db 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 0f72d10301..e609314a4d 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 57a8f5a81c..2fa4d19605 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 8cd2567d87..0d5d957233 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 e7ecd1bf7b..8bb6e3ab31 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,44 +1711,51 @@ 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): resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 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.5): - 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/helper-validator-option': 7.22.5 - browserslist: 4.21.9 + '@babel/core': 7.22.9 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true @@ -1728,6 +1773,42 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@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/core': 7.22.9 + '@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==} engines: {node: '>=6.9.0'} @@ -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,20 +2011,6 @@ packages: - supports-color dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.5): - 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/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 - dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} @@ -1892,11 +2024,53 @@ packages: '@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.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.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.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,22 +2233,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} - 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==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/parser@7.22.7: resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} engines: {node: '>=6.0.0'} @@ -2024,6 +2240,24 @@ packages: dependencies: '@babel/types': 7.22.5 + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: 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/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==} engines: {node: '>=6.9.0'} @@ -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,6 +2969,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@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.23.2 + '@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==} peerDependencies: @@ -2468,6 +2987,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@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.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'} @@ -2478,6 +3006,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@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-0 + dependencies: + '@babel/core': 7.23.2 + '@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'} @@ -2488,6 +3026,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@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'} @@ -2498,6 +3046,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@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'} @@ -2509,6 +3067,17 @@ packages: '@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'} @@ -2519,34 +3088,40 @@ 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-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.22.9 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.23.2 '@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-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.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-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,11 +3239,29 @@ 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.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.23.2 + '@babel/helper-annotate-as-pure': 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.23.2) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + /@babel/plugin-transform-classes@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} engines: {node: '>=6.9.0'} @@ -2614,27 +3270,9 @@ packages: dependencies: '@babel/core': 7.22.9 '@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-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-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==} - 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,11 +3489,34 @@ 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): resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} engines: {node: '>=6.9.0'} @@ -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,6 +3580,16 @@ 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'} @@ -2799,10 +3597,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-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 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.9): @@ -2819,6 +3626,32 @@ packages: - supports-color dev: true + /@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.23.2 + '@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.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,18 +3786,32 @@ 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.9(@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-transform-object-super@7.22.5(@babel/core@7.22.9): @@ -2915,6 +3825,28 @@ packages: '@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'} @@ -2938,8 +3870,8 @@ packages: '@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-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 @@ -2950,6 +3882,38 @@ packages: '@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-plugin-utils': 7.22.5 + dev: true + + /@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.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} engines: {node: '>=6.9.0'} @@ -2960,6 +3924,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@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.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==} engines: {node: '>=6.9.0'} @@ -2967,10 +3941,34 @@ 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-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.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-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.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): resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} engines: {node: '>=6.9.0'} @@ -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'} @@ -3333,7 +4510,7 @@ 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.5(@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) @@ -3381,7 +4558,7 @@ 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/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) @@ -3391,92 +4568,92 @@ packages: - 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.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.22.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@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.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.7(@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-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.6(@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-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-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.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/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,27 +11588,7 @@ 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==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - 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) - 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 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@5.1.3): + /@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: @@ -10147,17 +11598,37 @@ packages: 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': 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@6.9.1(eslint@8.46.0)(typescript@5.1.3): + /@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: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@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 + 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.2.2): resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10167,53 +11638,32 @@ 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==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.59.2 - '@typescript-eslint/visitor-keys': 5.59.2 - 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 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.3): + /@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: @@ -10228,13 +11678,34 @@ packages: 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@6.9.1(typescript@5.1.3): + /@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': 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.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.2.2): resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -10249,33 +11720,13 @@ 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==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^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.59.2 - '@typescript-eslint/types': 5.59.2 - '@typescript-eslint/typescript-estree': 5.59.2(typescript@5.1.3) - eslint: 8.46.0 - eslint-scope: 5.1.1 - semver: 7.5.3 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@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): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -10286,7 +11737,7 @@ packages: '@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/typescript-estree': 5.62.0(typescript@5.2.2) eslint: 8.46.0 eslint-scope: 5.1.1 semver: 7.5.3 @@ -10295,7 +11746,26 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.9.1(eslint@8.46.0)(typescript@5.1.3): + /@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: ^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': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + eslint: 8.46.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@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,14 +11784,6 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@5.59.2: - resolution: {integrity: sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.59.2 - 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} @@ -10330,6 +11792,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@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': 6.10.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@typescript-eslint/visitor-keys@6.9.1: resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -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,7 +16336,7 @@ packages: resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} dependencies: debug: 3.2.7(supports-color@8.1.1) - resolve: 1.22.2 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true @@ -14863,7 +16382,7 @@ 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': 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-import-resolver-node: 0.3.6 @@ -14872,6 +16391,35 @@ packages: - supports-color dev: true + /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: + '@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': 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 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-cypress@2.14.0(eslint@8.46.0): resolution: {integrity: sha512-eW6tv7iIg7xujleAJX4Ujm649Bf5jweqa4ObPEIuueYRyLZt7qXGWhCY/n4bfeFW/j6nQZwbIBHKZt6EKcL/cg==} peerDependencies: @@ -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,32 +26838,6 @@ 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): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@swc/core': 1.3.86(@swc/helpers@0.5.3) - esbuild: 0.18.17 - 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) - dev: true - /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'} @@ -25312,6 +26890,32 @@ 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.19.5)(webpack@5.89.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@swc/core': 1.3.86(@swc/helpers@0.5.3) + 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.89.0(@swc/core@1.3.86)(esbuild@0.19.5) + dev: true + /terser@5.17.1: resolution: {integrity: sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==} engines: {node: '>=10'} @@ -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'} - hasBin: true - dev: true - /typescript@5.1.3: resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} engines: {node: '>=14.17'} hasBin: true + dev: true - /ua-parser-js@1.0.2: - resolution: {integrity: sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /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,43 +28229,8 @@ 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==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.16.9 - esbuild: 0.17.19 - less: 4.1.3 - postcss: 8.4.27 - rollup: 3.21.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.1.3)(sass@1.55.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -26639,10 +28260,48 @@ packages: '@types/node': 18.16.9 esbuild: 0.18.17 less: 4.1.3 - postcss: 8.4.27 + postcss: 8.4.31 rollup: 3.28.0 - sass: 1.64.1 - terser: 5.19.2 + sass: 1.55.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /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: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.16.9 + esbuild: 0.18.17 + less: 4.2.0 + postcss: 8.4.31 + rollup: 3.28.0 + 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 3c71a636b1..18a9a7119e 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,