diff --git a/.circleci/config.yml b/.circleci/config.yml index 02d3d37627c52b..97fa97248d9121 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -87,6 +87,8 @@ jobs: NX_CI_EXECUTION_ENV: 'linux' steps: - checkout + - nx/set-shas: + main-branch-name: 'master' - run: npx nx-cloud@next start-ci-run --distribute-on=".nx/workflows/dynamic-changesets.yaml" --stop-agents-after="e2e" - run: command: | @@ -96,8 +98,6 @@ jobs: - browser-tools/install-chromedriver - run-pnpm-install: os: linux - - nx/set-shas: - main-branch-name: 'master' - run: name: Check Documentation command: pnpm nx documentation --no-dte diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8c6eb64fd47ec1..f7c7dbe3d5d4cf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -157,7 +157,7 @@ jobs: if-no-files-found: error build-freebsd: - runs-on: macos-12 + runs-on: macos-13-large name: Build FreeBSD timeout-minutes: 45 steps: @@ -166,7 +166,7 @@ jobs: - name: Build id: build if: ${{ github.event_name != 'schedule' }} - uses: cross-platform-actions/action@v0.21.1 + uses: cross-platform-actions/action@v0.22.0 env: DEBUG: napi:* RUSTUP_IO_THREADS: 1 @@ -223,6 +223,10 @@ jobs: needs: - build-freebsd - build + env: + GH_TOKEN: ${{ github.token }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_CONFIG_PROVENANCE: true steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v2 @@ -235,6 +239,8 @@ jobs: registry-url: 'https://registry.npmjs.org' check-latest: true cache: 'pnpm' + - name: Check NPM Credentials + run: npm whoami && echo "NPM credentials are valid" || (echo "NPM credentials are invalid or have expired." && exit 1) - name: Install dependencies run: pnpm install --frozen-lockfile - name: Download all artifacts @@ -271,7 +277,3 @@ jobs: git branch -f website git push -f origin website fi - env: - GH_TOKEN: ${{ github.token }} - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_CONFIG_PROVENANCE: true diff --git a/docs/generated/cli/affected-graph.md b/docs/generated/cli/affected-graph.md index d2990a0d66da5a..2a2dd1afc64a84 100644 --- a/docs/generated/cli/affected-graph.md +++ b/docs/generated/cli/affected-graph.md @@ -5,7 +5,7 @@ description: 'Graph dependencies affected by changes' # affected:graph -**Deprecated:** Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18. +**Deprecated:** Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19. Graph dependencies affected by changes diff --git a/docs/generated/cli/print-affected.md b/docs/generated/cli/print-affected.md index d92c41ec16d306..934bcea45fe5be 100644 --- a/docs/generated/cli/print-affected.md +++ b/docs/generated/cli/print-affected.md @@ -5,7 +5,7 @@ description: 'Prints information about the projects and targets affected by chan # print-affected -**Deprecated:** Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18. +**Deprecated:** Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19. Prints information about the projects and targets affected by changes diff --git a/docs/generated/devkit/NxPluginV1.md b/docs/generated/devkit/NxPluginV1.md index 4f516270121368..f760023c45bc76 100644 --- a/docs/generated/devkit/NxPluginV1.md +++ b/docs/generated/devkit/NxPluginV1.md @@ -4,13 +4,13 @@ **`Deprecated`** -Use [NxPluginV2](../../devkit/documents/NxPluginV2) instead. This will be removed in Nx 18 +Use [NxPluginV2](../../devkit/documents/NxPluginV2) instead. This will be removed in Nx 19 #### Type declaration | Name | Type | Description | | :------------------------ | :------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | `string` | - | -| `processProjectGraph?` | `ProjectGraphProcessor` | **`Deprecated`** Use [CreateNodes](../../devkit/documents/CreateNodes) and [CreateDependencies](../../devkit/documents/CreateDependencies) instead. This will be removed in Nx 18 | -| `projectFilePatterns?` | `string`[] | A glob pattern to search for non-standard project files. @example: ["*.csproj", "pom.xml"] **`Deprecated`** Use [CreateNodes](../../devkit/documents/CreateNodes) instead. This will be removed in Nx 18 | -| `registerProjectTargets?` | [`ProjectTargetConfigurator`](../../devkit/documents/ProjectTargetConfigurator) | **`Deprecated`** Add targets to the projects inside of [CreateNodes](../../devkit/documents/CreateNodes) instead. This will be removed in Nx 18 | +| `processProjectGraph?` | `ProjectGraphProcessor` | **`Deprecated`** Use [CreateNodes](../../devkit/documents/CreateNodes) and [CreateDependencies](../../devkit/documents/CreateDependencies) instead. This will be removed in Nx 19 | +| `projectFilePatterns?` | `string`[] | A glob pattern to search for non-standard project files. @example: ["*.csproj", "pom.xml"] **`Deprecated`** Use [CreateNodes](../../devkit/documents/CreateNodes) instead. This will be removed in Nx 19 | +| `registerProjectTargets?` | [`ProjectTargetConfigurator`](../../devkit/documents/ProjectTargetConfigurator) | **`Deprecated`** Add targets to the projects inside of [CreateNodes](../../devkit/documents/CreateNodes) instead. This will be removed in Nx 19 | diff --git a/docs/generated/devkit/ProjectGraphBuilder.md b/docs/generated/devkit/ProjectGraphBuilder.md index 057ec256de2aee..617952c4fbe818 100644 --- a/docs/generated/devkit/ProjectGraphBuilder.md +++ b/docs/generated/devkit/ProjectGraphBuilder.md @@ -4,7 +4,7 @@ A class which builds up a project graph **`Deprecated`** -The ProjectGraphProcessor has been deprecated. Use a [CreateNodes](../../devkit/documents/CreateNodes) and/or a [CreateDependencies](../../devkit/documents/CreateDependencies) instead. This will be removed in Nx 18. +The ProjectGraphProcessor has been deprecated. Use a [CreateNodes](../../devkit/documents/CreateNodes) and/or a [CreateDependencies](../../devkit/documents/CreateDependencies) instead. This will be removed in Nx 19. ## Table of contents diff --git a/docs/generated/devkit/ProjectGraphProcessorContext.md b/docs/generated/devkit/ProjectGraphProcessorContext.md index e4473720eb1c5f..243963c48ad674 100644 --- a/docs/generated/devkit/ProjectGraphProcessorContext.md +++ b/docs/generated/devkit/ProjectGraphProcessorContext.md @@ -4,7 +4,7 @@ Additional information to be used to process a project graph **`Deprecated`** -The ProjectGraphProcessor is deprecated. This will be removed in Nx 18. +The ProjectGraphProcessor is deprecated. This will be removed in Nx 19. ## Table of contents diff --git a/docs/generated/devkit/ProjectTargetConfigurator.md b/docs/generated/devkit/ProjectTargetConfigurator.md index 93e94c14b00b53..434422163b3798 100644 --- a/docs/generated/devkit/ProjectTargetConfigurator.md +++ b/docs/generated/devkit/ProjectTargetConfigurator.md @@ -18,4 +18,4 @@ **`Deprecated`** -Add targets to the projects in a [CreateNodes](../../devkit/documents/CreateNodes) function instead. This will be removed in Nx 18 +Add targets to the projects in a [CreateNodes](../../devkit/documents/CreateNodes) function instead. This will be removed in Nx 19 diff --git a/docs/generated/devkit/TaskHasher.md b/docs/generated/devkit/TaskHasher.md index fe4d494152f930..3d928bc1b29a8f 100644 --- a/docs/generated/devkit/TaskHasher.md +++ b/docs/generated/devkit/TaskHasher.md @@ -25,7 +25,7 @@ **`Deprecated`** -use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 +use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 ▸ **hashTask**(`task`, `taskGraph`): `Promise`\<[`Hash`](../../devkit/documents/Hash)\> @@ -42,7 +42,7 @@ use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. T **`Deprecated`** -use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 +use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 ▸ **hashTask**(`task`, `taskGraph`, `env`): `Promise`\<[`Hash`](../../devkit/documents/Hash)\> @@ -76,7 +76,7 @@ use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. T **`Deprecated`** -use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 +use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 ▸ **hashTasks**(`tasks`, `taskGraph`): `Promise`\<[`Hash`](../../devkit/documents/Hash)[]\> @@ -93,7 +93,7 @@ use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instea **`Deprecated`** -use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 +use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 ▸ **hashTasks**(`tasks`, `taskGraph`, `env`): `Promise`\<[`Hash`](../../devkit/documents/Hash)[]\> diff --git a/docs/generated/devkit/Workspaces.md b/docs/generated/devkit/Workspaces.md index 2a439ef03bbccd..949d923514db99 100644 --- a/docs/generated/devkit/Workspaces.md +++ b/docs/generated/devkit/Workspaces.md @@ -2,7 +2,7 @@ **`Deprecated`** -This will be removed in v18. Use [readProjectsConfigurationFromProjectGraph](../../devkit/documents/readProjectsConfigurationFromProjectGraph) instead. +This will be removed in v19. Use [readProjectsConfigurationFromProjectGraph](../../devkit/documents/readProjectsConfigurationFromProjectGraph) instead. ## Table of contents diff --git a/docs/generated/devkit/getOutputsForTargetAndConfiguration.md b/docs/generated/devkit/getOutputsForTargetAndConfiguration.md index efcd11b9ac02f5..61ff511c26fee8 100644 --- a/docs/generated/devkit/getOutputsForTargetAndConfiguration.md +++ b/docs/generated/devkit/getOutputsForTargetAndConfiguration.md @@ -15,7 +15,7 @@ **`Deprecated`** -Pass the target and overrides instead. This will be removed in v18. +Pass the target and overrides instead. This will be removed in v19. ▸ **getOutputsForTargetAndConfiguration**(`target`, `overrides`, `node`): `string`[] diff --git a/docs/generated/manifests/menus.json b/docs/generated/manifests/menus.json index 2293da8e55ddac..6c1c21751597fb 100644 --- a/docs/generated/manifests/menus.json +++ b/docs/generated/manifests/menus.json @@ -6789,6 +6789,14 @@ "isExternal": false, "disableCollapsible": false }, + { + "id": "convert-to-application-executor", + "path": "/nx-api/angular/generators/convert-to-application-executor", + "name": "convert-to-application-executor", + "children": [], + "isExternal": false, + "disableCollapsible": false + }, { "id": "directive", "path": "/nx-api/angular/generators/directive", @@ -7523,6 +7531,14 @@ "children": [], "isExternal": false, "disableCollapsible": false + }, + { + "id": "serve", + "path": "/nx-api/expo/executors/serve", + "name": "serve", + "children": [], + "isExternal": false, + "disableCollapsible": false } ], "isExternal": false, @@ -8999,6 +9015,14 @@ "children": [], "isExternal": false, "disableCollapsible": false + }, + { + "id": "upgrade", + "path": "/nx-api/react-native/executors/upgrade", + "name": "upgrade", + "children": [], + "isExternal": false, + "disableCollapsible": false } ], "isExternal": false, @@ -9072,6 +9096,14 @@ "children": [], "isExternal": false, "disableCollapsible": false + }, + { + "id": "web-configuration", + "path": "/nx-api/react-native/generators/web-configuration", + "name": "web-configuration", + "children": [], + "isExternal": false, + "disableCollapsible": false } ], "isExternal": false, diff --git a/docs/generated/manifests/nx-api.json b/docs/generated/manifests/nx-api.json index 334dd6d42c7bb1..db5d044cb95e7f 100644 --- a/docs/generated/manifests/nx-api.json +++ b/docs/generated/manifests/nx-api.json @@ -177,6 +177,15 @@ "path": "/nx-api/angular/generators/component-test", "type": "generator" }, + "/nx-api/angular/generators/convert-to-application-executor": { + "description": "Converts projects to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. _Note: this is only supported in Angular versions >= 17.0.0_.", + "file": "generated/packages/angular/generators/convert-to-application-executor.json", + "hidden": false, + "name": "convert-to-application-executor", + "originalFilePath": "/packages/angular/src/generators/convert-to-application-executor/schema.json", + "path": "/nx-api/angular/generators/convert-to-application-executor", + "type": "generator" + }, "/nx-api/angular/generators/directive": { "description": "Generate an Angular directive.", "file": "generated/packages/angular/generators/directive.json", @@ -895,6 +904,15 @@ "originalFilePath": "/packages/expo/src/executors/submit/schema.json", "path": "/nx-api/expo/executors/submit", "type": "executor" + }, + "/nx-api/expo/executors/serve": { + "description": "Serve up the Expo web app locally", + "file": "generated/packages/expo/executors/serve.json", + "hidden": false, + "name": "serve", + "originalFilePath": "/packages/expo/src/executors/serve/schema.json", + "path": "/nx-api/expo/executors/serve", + "type": "executor" } }, "generators": { @@ -2356,11 +2374,20 @@ "originalFilePath": "/packages/react-native/src/executors/pod-install/schema.json", "path": "/nx-api/react-native/executors/pod-install", "type": "executor" + }, + "/nx-api/react-native/executors/upgrade": { + "description": "upgrade executor", + "file": "generated/packages/react-native/executors/upgrade.json", + "hidden": false, + "name": "upgrade", + "originalFilePath": "/packages/react-native/src/executors/upgrade/schema.json", + "path": "/nx-api/react-native/executors/upgrade", + "type": "executor" } }, "generators": { "/nx-api/react-native/generators/init": { - "description": "Initialize the `@nrwl/react-native` plugin.", + "description": "Initialize the `@nx/react-native` plugin.", "file": "generated/packages/react-native/generators/init.json", "hidden": true, "name": "init", @@ -2396,7 +2423,7 @@ "type": "generator" }, "/nx-api/react-native/generators/storybook-configuration": { - "description": "Set up Storybook for a React-native application or library.", + "description": "Set up Storybook for a React Native application or library.", "file": "generated/packages/react-native/generators/storybook-configuration.json", "hidden": false, "name": "storybook-configuration", @@ -2405,7 +2432,7 @@ "type": "generator" }, "/nx-api/react-native/generators/component-story": { - "description": "Generate Storybook story for a React-native component.", + "description": "Generate Storybook story for a React Native component.", "file": "generated/packages/react-native/generators/component-story.json", "hidden": false, "name": "component-story", @@ -2414,7 +2441,7 @@ "type": "generator" }, "/nx-api/react-native/generators/stories": { - "description": "Create stories/specs for all components declared in an application or library.", + "description": "Create stories for all components declared in an application or library.", "file": "generated/packages/react-native/generators/stories.json", "hidden": false, "name": "stories", @@ -2430,6 +2457,15 @@ "originalFilePath": "/packages/react-native/src/generators/upgrade-native/schema.json", "path": "/nx-api/react-native/generators/upgrade-native", "type": "generator" + }, + "/nx-api/react-native/generators/web-configuration": { + "description": "Set up web configuration for a React Native app", + "file": "generated/packages/react-native/generators/web-configuration.json", + "hidden": false, + "name": "web-configuration", + "originalFilePath": "/packages/react-native/src/generators/web-configuration/schema.json", + "path": "/nx-api/react-native/generators/web-configuration", + "type": "generator" } }, "path": "/nx-api/react-native" diff --git a/docs/generated/packages-metadata.json b/docs/generated/packages-metadata.json index 7e506bbcfce95c..68908e46d908f3 100644 --- a/docs/generated/packages-metadata.json +++ b/docs/generated/packages-metadata.json @@ -172,6 +172,15 @@ "path": "angular/generators/component-test", "type": "generator" }, + { + "description": "Converts projects to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. _Note: this is only supported in Angular versions >= 17.0.0_.", + "file": "generated/packages/angular/generators/convert-to-application-executor.json", + "hidden": false, + "name": "convert-to-application-executor", + "originalFilePath": "/packages/angular/src/generators/convert-to-application-executor/schema.json", + "path": "angular/generators/convert-to-application-executor", + "type": "generator" + }, { "description": "Generate an Angular directive.", "file": "generated/packages/angular/generators/directive.json", @@ -881,6 +890,15 @@ "originalFilePath": "/packages/expo/src/executors/submit/schema.json", "path": "expo/executors/submit", "type": "executor" + }, + { + "description": "Serve up the Expo web app locally", + "file": "generated/packages/expo/executors/serve.json", + "hidden": false, + "name": "serve", + "originalFilePath": "/packages/expo/src/executors/serve/schema.json", + "path": "expo/executors/serve", + "type": "executor" } ], "generators": [ @@ -2330,11 +2348,20 @@ "originalFilePath": "/packages/react-native/src/executors/pod-install/schema.json", "path": "react-native/executors/pod-install", "type": "executor" + }, + { + "description": "upgrade executor", + "file": "generated/packages/react-native/executors/upgrade.json", + "hidden": false, + "name": "upgrade", + "originalFilePath": "/packages/react-native/src/executors/upgrade/schema.json", + "path": "react-native/executors/upgrade", + "type": "executor" } ], "generators": [ { - "description": "Initialize the `@nrwl/react-native` plugin.", + "description": "Initialize the `@nx/react-native` plugin.", "file": "generated/packages/react-native/generators/init.json", "hidden": true, "name": "init", @@ -2370,7 +2397,7 @@ "type": "generator" }, { - "description": "Set up Storybook for a React-native application or library.", + "description": "Set up Storybook for a React Native application or library.", "file": "generated/packages/react-native/generators/storybook-configuration.json", "hidden": false, "name": "storybook-configuration", @@ -2379,7 +2406,7 @@ "type": "generator" }, { - "description": "Generate Storybook story for a React-native component.", + "description": "Generate Storybook story for a React Native component.", "file": "generated/packages/react-native/generators/component-story.json", "hidden": false, "name": "component-story", @@ -2388,7 +2415,7 @@ "type": "generator" }, { - "description": "Create stories/specs for all components declared in an application or library.", + "description": "Create stories for all components declared in an application or library.", "file": "generated/packages/react-native/generators/stories.json", "hidden": false, "name": "stories", @@ -2404,6 +2431,15 @@ "originalFilePath": "/packages/react-native/src/generators/upgrade-native/schema.json", "path": "react-native/generators/upgrade-native", "type": "generator" + }, + { + "description": "Set up web configuration for a React Native app", + "file": "generated/packages/react-native/generators/web-configuration.json", + "hidden": false, + "name": "web-configuration", + "originalFilePath": "/packages/react-native/src/generators/web-configuration/schema.json", + "path": "react-native/generators/web-configuration", + "type": "generator" } ], "githubRoot": "https://github.com/nrwl/nx/blob/master", diff --git a/docs/generated/packages/angular/executors/dev-server.json b/docs/generated/packages/angular/executors/dev-server.json index f3178390d9767a..416037746a2045 100644 --- a/docs/generated/packages/angular/executors/dev-server.json +++ b/docs/generated/packages/angular/executors/dev-server.json @@ -17,7 +17,7 @@ "type": "string", "description": "A browser builder target to serve in the format of `project:target[:configuration]`. Ignored if `buildTarget` is set.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v18." + "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v19." }, "buildTarget": { "type": "string", 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 fd9fabfe5c3a03..14cb2e3ea9f579 100644 --- a/docs/generated/packages/angular/executors/module-federation-dev-server.json +++ b/docs/generated/packages/angular/executors/module-federation-dev-server.json @@ -15,7 +15,7 @@ "type": "string", "description": "A browser builder target to serve in the format of `project:target[:configuration]`.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v18." + "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v19." }, "buildTarget": { "type": "string", diff --git a/docs/generated/packages/angular/executors/ng-packagr-lite.json b/docs/generated/packages/angular/executors/ng-packagr-lite.json index 43f512df8683c9..c449cab34914e1 100644 --- a/docs/generated/packages/angular/executors/ng-packagr-lite.json +++ b/docs/generated/packages/angular/executors/ng-packagr-lite.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "ng-packagr Target", "description": "Builds a library with support for incremental builds.\n\nThis executor is meant to be used with buildable libraries in an incremental build scenario. It is similar to the `@nx/angular:package` executor but with some key differences:\n- For supported Angular versions lower than v16, it doesn't run `ngcc` automatically (`ngcc` is no longer available from Angular v16 onwards, for lower versions, it needs to be run separately beforehand if needed, this can be done in a `postinstall` hook on `package.json`).\n- It only produces ESM2022 bundles (ESM2020 for supported Angular versions lower than v16).", "cli": "nx", diff --git a/docs/generated/packages/angular/executors/package.json b/docs/generated/packages/angular/executors/package.json index ea37437dea5578..ec1861b1f4ac2b 100644 --- a/docs/generated/packages/angular/executors/package.json +++ b/docs/generated/packages/angular/executors/package.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "ng-packagr Target", "description": "Builds and packages an Angular library producing an output following the Angular Package Format (APF) to be distributed as an NPM package.\n\nThis executor is similar to the `@angular-devkit/build-angular:ng-packagr` with additional support for incremental builds.", "cli": "nx", diff --git a/docs/generated/packages/angular/generators/add-linting.json b/docs/generated/packages/angular/generators/add-linting.json index 88f01478dfb627..23e2fa808dec07 100644 --- a/docs/generated/packages/angular/generators/add-linting.json +++ b/docs/generated/packages/angular/generators/add-linting.json @@ -2,7 +2,7 @@ "name": "add-linting", "factory": "./src/generators/add-linting/add-linting", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularAddLintingGenerator", "title": "Add linting to an Angular project.", "description": "Adds linting configuration to an Angular project.", diff --git a/docs/generated/packages/angular/generators/application.json b/docs/generated/packages/angular/generators/application.json index e7e990831bf2e2..2cfad4c3b36c2e 100644 --- a/docs/generated/packages/angular/generators/application.json +++ b/docs/generated/packages/angular/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#applicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorNxApp", "title": "Creates an Angular application.", "description": "Creates an Angular application.", @@ -38,15 +38,15 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "sass", - "label": "SASS(.sass) [ http://sass-lang.com ]" + "label": "SASS(.sass) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/docs/generated/packages/angular/generators/component-cypress-spec.json b/docs/generated/packages/angular/generators/component-cypress-spec.json index 0e77b25dcbfa6d..dadc9cd563742d 100644 --- a/docs/generated/packages/angular/generators/component-cypress-spec.json +++ b/docs/generated/packages/angular/generators/component-cypress-spec.json @@ -2,7 +2,7 @@ "name": "component-cypress-spec", "factory": "./src/generators/component-cypress-spec/component-cypress-spec", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularComponentCypressSpecGenerator", "type": "object", "cli": "nx", diff --git a/docs/generated/packages/angular/generators/component-test.json b/docs/generated/packages/angular/generators/component-test.json index f9734067b1eacb..7a3a016ed9c0e0 100644 --- a/docs/generated/packages/angular/generators/component-test.json +++ b/docs/generated/packages/angular/generators/component-test.json @@ -2,7 +2,7 @@ "name": "component-test", "factory": "./src/generators/component-test/component-test", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularComponentTestGenerator", "type": "object", "cli": "nx", diff --git a/docs/generated/packages/angular/generators/component.json b/docs/generated/packages/angular/generators/component.json index 5f492d1644bd99..fd3f9f376d9518 100644 --- a/docs/generated/packages/angular/generators/component.json +++ b/docs/generated/packages/angular/generators/component.json @@ -32,7 +32,7 @@ "description": "The name of the project.", "$default": { "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "prefix": { "type": "string", @@ -96,7 +96,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "skipImport": { "type": "boolean", diff --git a/docs/generated/packages/angular/generators/convert-to-application-executor.json b/docs/generated/packages/angular/generators/convert-to-application-executor.json new file mode 100644 index 00000000000000..f394734b7eb98c --- /dev/null +++ b/docs/generated/packages/angular/generators/convert-to-application-executor.json @@ -0,0 +1,34 @@ +{ + "name": "convert-to-application-executor", + "factory": "./src/generators/convert-to-application-executor/convert-to-application-executor", + "schema": { + "$schema": "http://json-schema.org/schema", + "$id": "NxAngularConvertToApplicationExecutorGenerator", + "cli": "nx", + "title": "Converts projects to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. _Note: this is only supported in Angular versions >= 17.0.0_.", + "description": "Converts a project or all projects using one of the `@angular-devkit/build-angular:browser`, `@angular-devkit/build-angular:browser-esbuild`, `@nx/angular:browser` and `@nx/angular:browser-esbuild` executors to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. If the converted target is using one of the `@nx/angular` executors, the `@nx/angular:application` executor will be used. Otherwise, the `@angular-devkit/build-angular:application` builder will be used.", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "Name of the Angular application project to convert. It has to contain a target using one of the `@angular-devkit/build-angular:browser`, `@angular-devkit/build-angular:browser-esbuild`, `@nx/angular:browser` and `@nx/angular:browser-esbuild` executors. If not specified, all projects with such targets will be converted.", + "$default": { "$source": "argv", "index": 0 }, + "x-priority": "important" + }, + "skipFormat": { + "description": "Skip formatting files.", + "type": "boolean", + "default": false, + "x-priority": "internal" + } + }, + "additionalProperties": false, + "presets": [] + }, + "description": "Converts projects to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. _Note: this is only supported in Angular versions >= 17.0.0_.", + "implementation": "/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts", + "aliases": [], + "hidden": false, + "path": "/packages/angular/src/generators/convert-to-application-executor/schema.json", + "type": "generator" +} diff --git a/docs/generated/packages/angular/generators/directive.json b/docs/generated/packages/angular/generators/directive.json index f28658b10bf321..234d9330de356d 100644 --- a/docs/generated/packages/angular/generators/directive.json +++ b/docs/generated/packages/angular/generators/directive.json @@ -32,7 +32,7 @@ "description": "The name of the project.", "$default": { "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "prefix": { "type": "string", @@ -67,7 +67,7 @@ "type": "boolean", "description": "When true (the default), creates the new files at the top level of the current project.", "default": true, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "module": { "type": "string", diff --git a/docs/generated/packages/angular/generators/federate-module.json b/docs/generated/packages/angular/generators/federate-module.json index dde3b3cdd89a73..73e1c917dc77ac 100644 --- a/docs/generated/packages/angular/generators/federate-module.json +++ b/docs/generated/packages/angular/generators/federate-module.json @@ -2,7 +2,7 @@ "name": "federate-module", "factory": "./src/generators/federate-module/federate-module", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", diff --git a/docs/generated/packages/angular/generators/host.json b/docs/generated/packages/angular/generators/host.json index 840972322e92c5..d08cd5d8894ece 100644 --- a/docs/generated/packages/angular/generators/host.json +++ b/docs/generated/packages/angular/generators/host.json @@ -2,7 +2,7 @@ "name": "host", "factory": "./src/generators/host/host#hostInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxMFHost", "cli": "nx", "title": "Nx Module Federation Host Application", @@ -52,15 +52,15 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "sass", - "label": "SASS(.sass) [ http://sass-lang.com ]" + "label": "SASS(.sass) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/docs/generated/packages/angular/generators/init.json b/docs/generated/packages/angular/generators/init.json index 31227db2b162d0..907b02eae182bc 100644 --- a/docs/generated/packages/angular/generators/init.json +++ b/docs/generated/packages/angular/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SchematicsAngularModuleInit", "cli": "nx", "title": "Init Angular Plugin", diff --git a/docs/generated/packages/angular/generators/library-secondary-entry-point.json b/docs/generated/packages/angular/generators/library-secondary-entry-point.json index 40529620cd3220..7160908feb00ef 100644 --- a/docs/generated/packages/angular/generators/library-secondary-entry-point.json +++ b/docs/generated/packages/angular/generators/library-secondary-entry-point.json @@ -2,7 +2,7 @@ "name": "library-secondary-entry-point", "factory": "./src/generators/library-secondary-entry-point/library-secondary-entry-point", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularLibrarySecondaryEntryPoint", "title": "Creates a secondary entry point for a library", "description": "Creates a secondary entry point for an Angular publishable library.", diff --git a/docs/generated/packages/angular/generators/library.json b/docs/generated/packages/angular/generators/library.json index 34f49bc2a222ff..5a138291d4a84b 100644 --- a/docs/generated/packages/angular/generators/library.json +++ b/docs/generated/packages/angular/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "factory": "./src/generators/library/library#libraryGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularLibrary", "title": "Create a library", "description": "Creates an Angular library.", diff --git a/docs/generated/packages/angular/generators/move.json b/docs/generated/packages/angular/generators/move.json index b9d9dc4321f118..73c57a3b8566ec 100644 --- a/docs/generated/packages/angular/generators/move.json +++ b/docs/generated/packages/angular/generators/move.json @@ -2,7 +2,7 @@ "name": "move", "factory": "./src/generators/move/move#angularMoveGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularMove", "cli": "nx", "title": "Nx Angular Move", @@ -62,7 +62,7 @@ }, "aliases": ["mv"], "description": "Moves an Angular application or library to another folder within the workspace and updates the project configuration.", - "x-deprecated": "Use the `@nx/workspace:move` generator instead. This generator will be removed in Nx v18.", + "x-deprecated": "Use the `@nx/workspace:move` generator instead. This generator will be removed in Nx v19.", "implementation": "/packages/angular/src/generators/move/move#angularMoveGeneratorInternal.ts", "hidden": false, "path": "/packages/angular/src/generators/move/schema.json", diff --git a/docs/generated/packages/angular/generators/ng-add.json b/docs/generated/packages/angular/generators/ng-add.json index dde983e2b1e1c2..51763939ddb6f5 100644 --- a/docs/generated/packages/angular/generators/ng-add.json +++ b/docs/generated/packages/angular/generators/ng-add.json @@ -2,7 +2,7 @@ "name": "ng-add", "factory": "./src/generators/ng-add/ng-add", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularNgAddGenerator", "title": "Angular plugin initialization", "cli": "nx", diff --git a/docs/generated/packages/angular/generators/ngrx-feature-store.json b/docs/generated/packages/angular/generators/ngrx-feature-store.json index 18fba351799397..20d05813ef0d10 100644 --- a/docs/generated/packages/angular/generators/ngrx-feature-store.json +++ b/docs/generated/packages/angular/generators/ngrx-feature-store.json @@ -2,7 +2,7 @@ "name": "ngrx-feature-store", "factory": "./src/generators/ngrx-feature-store/ngrx-feature-store", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNgrxFeatureStoreGenerator", "title": "NgRx Feature Store Generator", "description": "Add an NgRx Feature Store to an application or library.", diff --git a/docs/generated/packages/angular/generators/ngrx-root-store.json b/docs/generated/packages/angular/generators/ngrx-root-store.json index e26d2706b98da6..cdfc26ebd2cee8 100644 --- a/docs/generated/packages/angular/generators/ngrx-root-store.json +++ b/docs/generated/packages/angular/generators/ngrx-root-store.json @@ -2,7 +2,7 @@ "name": "ngrx-root-store", "factory": "./src/generators/ngrx-root-store/ngrx-root-store", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNgrxRootStoreGenerator", "title": "Add NgRx support to an application.", "description": "Adds NgRx support to an application.", diff --git a/docs/generated/packages/angular/generators/ngrx.json b/docs/generated/packages/angular/generators/ngrx.json index 87f0aa9d86135a..a53e8e5ebde540 100644 --- a/docs/generated/packages/angular/generators/ngrx.json +++ b/docs/generated/packages/angular/generators/ngrx.json @@ -2,7 +2,7 @@ "name": "ngrx", "factory": "./src/generators/ngrx/ngrx", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNgrxGenerator", "title": "Add NgRx support to an application or library.", "description": "Adds NgRx support to an application or library.", diff --git a/docs/generated/packages/angular/generators/pipe.json b/docs/generated/packages/angular/generators/pipe.json index 09566384fb2639..2fe55e13a3df7f 100644 --- a/docs/generated/packages/angular/generators/pipe.json +++ b/docs/generated/packages/angular/generators/pipe.json @@ -32,13 +32,13 @@ "description": "The name of the project.", "$default": { "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "flat": { "type": "boolean", "default": true, "description": "When true (the default) creates files at the top level of the project.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "skipTests": { "type": "boolean", diff --git a/docs/generated/packages/angular/generators/remote.json b/docs/generated/packages/angular/generators/remote.json index ee4e9d16373c67..2b044acf2418da 100644 --- a/docs/generated/packages/angular/generators/remote.json +++ b/docs/generated/packages/angular/generators/remote.json @@ -2,7 +2,7 @@ "name": "remote", "factory": "./src/generators/remote/remote#remoteInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxMFRemote", "cli": "nx", "title": "Nx Module Federation Remote App", @@ -52,15 +52,15 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "sass", - "label": "SASS(.sass) [ http://sass-lang.com ]" + "label": "SASS(.sass) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/docs/generated/packages/angular/generators/scam-directive.json b/docs/generated/packages/angular/generators/scam-directive.json index 727844c8961f4f..2e29de5b397ee6 100644 --- a/docs/generated/packages/angular/generators/scam-directive.json +++ b/docs/generated/packages/angular/generators/scam-directive.json @@ -39,7 +39,7 @@ "description": "The name of the project.", "$default": { "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipTests": { "type": "boolean", @@ -56,7 +56,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": true, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "selector": { "type": "string", diff --git a/docs/generated/packages/angular/generators/scam-pipe.json b/docs/generated/packages/angular/generators/scam-pipe.json index 73697564f7924e..eb01bddbefcc78 100644 --- a/docs/generated/packages/angular/generators/scam-pipe.json +++ b/docs/generated/packages/angular/generators/scam-pipe.json @@ -39,7 +39,7 @@ "description": "The name of the project.", "$default": { "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipTests": { "type": "boolean", @@ -56,7 +56,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": true, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "export": { "type": "boolean", diff --git a/docs/generated/packages/angular/generators/scam-to-standalone.json b/docs/generated/packages/angular/generators/scam-to-standalone.json index 3d98861b101982..b0dff90b7aa7b9 100644 --- a/docs/generated/packages/angular/generators/scam-to-standalone.json +++ b/docs/generated/packages/angular/generators/scam-to-standalone.json @@ -2,7 +2,7 @@ "name": "scam-to-standalone", "factory": "./src/generators/scam-to-standalone/scam-to-standalone", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularScamToStandalone", "cli": "nx", "title": "Convert an Inline SCAM to Standalone Component", diff --git a/docs/generated/packages/angular/generators/scam.json b/docs/generated/packages/angular/generators/scam.json index addc48143357ea..5e810c9c326dc5 100644 --- a/docs/generated/packages/angular/generators/scam.json +++ b/docs/generated/packages/angular/generators/scam.json @@ -38,7 +38,7 @@ "description": "The name of the project.", "$default": { "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "displayBlock": { "description": "Specifies if the style will contain `:host { display: block; }`.", @@ -92,7 +92,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "selector": { "type": "string", diff --git a/docs/generated/packages/angular/generators/setup-mf.json b/docs/generated/packages/angular/generators/setup-mf.json index 9d43cafe2692c8..2df78438f737bf 100644 --- a/docs/generated/packages/angular/generators/setup-mf.json +++ b/docs/generated/packages/angular/generators/setup-mf.json @@ -2,7 +2,7 @@ "name": "setup-mf", "factory": "./src/generators/setup-mf/setup-mf", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularMFSetup", "cli": "nx", "title": "Generate Module Federation Setup for Angular App", diff --git a/docs/generated/packages/angular/generators/setup-ssr.json b/docs/generated/packages/angular/generators/setup-ssr.json index 84c632b4147dc6..d4a94b5a1225be 100644 --- a/docs/generated/packages/angular/generators/setup-ssr.json +++ b/docs/generated/packages/angular/generators/setup-ssr.json @@ -2,7 +2,7 @@ "name": "setup-ssr", "factory": "./src/generators/setup-ssr/setup-ssr", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularUniversalSetup", "cli": "nx", "title": "Generate Angular Universal (SSR) setup for an Angular App", diff --git a/docs/generated/packages/angular/generators/setup-tailwind.json b/docs/generated/packages/angular/generators/setup-tailwind.json index 0db295b6d9050a..134bbd75359c39 100644 --- a/docs/generated/packages/angular/generators/setup-tailwind.json +++ b/docs/generated/packages/angular/generators/setup-tailwind.json @@ -2,7 +2,7 @@ "name": "setup-tailwind", "factory": "./src/generators/setup-tailwind/setup-tailwind", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularTailwindSetupGenerator", "cli": "nx", "title": "Configures Tailwind CSS for an application or a buildable/publishable library.", diff --git a/docs/generated/packages/angular/generators/stories.json b/docs/generated/packages/angular/generators/stories.json index bc7d27825871a0..2c550cfdd9282b 100644 --- a/docs/generated/packages/angular/generators/stories.json +++ b/docs/generated/packages/angular/generators/stories.json @@ -2,7 +2,7 @@ "name": "stories", "factory": "./src/generators/stories/stories", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularStorybookStoriesGenerator", "title": "Create Storybook stories/specs", "description": "Creates Storybook stories/specs for all Angular components declared in a project.", diff --git a/docs/generated/packages/angular/generators/storybook-configuration.json b/docs/generated/packages/angular/generators/storybook-configuration.json index d58131936cbadf..46b3b0c423b1ac 100644 --- a/docs/generated/packages/angular/generators/storybook-configuration.json +++ b/docs/generated/packages/angular/generators/storybook-configuration.json @@ -2,7 +2,7 @@ "name": "storybook-configuration", "factory": "./src/generators/storybook-configuration/storybook-configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularStorybookConfigurationGenerator", "title": "Adds Storybook configuration to a project.", "description": "Adds Storybook configuration to a project to be able to use and create stories.", @@ -29,7 +29,7 @@ "configureCypress": { "type": "boolean", "description": "Specifies whether to configure Cypress or not.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "generateStories": { "type": "boolean", @@ -41,7 +41,7 @@ "generateCypressSpecs": { "type": "boolean", "description": "Specifies whether to automatically generate test files in the generated Cypress e2e app.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "configureStaticServe": { "type": "boolean", @@ -53,7 +53,7 @@ "cypressDirectory": { "type": "string", "description": "A directory where the Cypress project will be placed. Placed at the root by default.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "linter": { "description": "The tool to use for running lint checks.", diff --git a/docs/generated/packages/cypress/generators/component-configuration.json b/docs/generated/packages/cypress/generators/component-configuration.json index 2beddcaacbc1f3..db99da216e5795 100644 --- a/docs/generated/packages/cypress/generators/component-configuration.json +++ b/docs/generated/packages/cypress/generators/component-configuration.json @@ -3,7 +3,7 @@ "aliases": ["cypress-component-configuration"], "factory": "./src/generators/component-configuration/component-configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressComponentConfiguration", "cli": "nx", "title": "Set up Cypress component testing for a project", diff --git a/docs/generated/packages/cypress/generators/configuration.json b/docs/generated/packages/cypress/generators/configuration.json index b9ae6fbe475ba9..f2d1a5fc486997 100644 --- a/docs/generated/packages/cypress/generators/configuration.json +++ b/docs/generated/packages/cypress/generators/configuration.json @@ -3,7 +3,7 @@ "aliases": ["cypress-e2e-configuration", "e2e", "e2e-config"], "factory": "./src/generators/configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressE2EConfigGenerator", "cli": "nx", "title": "Add a Cypress Configuration.", diff --git a/docs/generated/packages/cypress/generators/cypress-project.json b/docs/generated/packages/cypress/generators/cypress-project.json index e5ae6e71b97245..edccdfc56cd1a4 100644 --- a/docs/generated/packages/cypress/generators/cypress-project.json +++ b/docs/generated/packages/cypress/generators/cypress-project.json @@ -2,7 +2,7 @@ "name": "cypress-project", "factory": "./src/generators/cypress-project/cypress-project#cypressProjectGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressProjectGeneratorSchema", "cli": "nx", "title": "Create Cypress Configuration for the workspace", diff --git a/docs/generated/packages/cypress/generators/init.json b/docs/generated/packages/cypress/generators/init.json index 7cf5184a2e68ce..1059b58cb4594b 100644 --- a/docs/generated/packages/cypress/generators/init.json +++ b/docs/generated/packages/cypress/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#cypressInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressInit", "cli": "nx", "title": "Add Cypress Configuration to the workspace", diff --git a/docs/generated/packages/cypress/generators/migrate-to-cypress-11.json b/docs/generated/packages/cypress/generators/migrate-to-cypress-11.json index 28feee6b5e0948..79704fcfe0d0dc 100644 --- a/docs/generated/packages/cypress/generators/migrate-to-cypress-11.json +++ b/docs/generated/packages/cypress/generators/migrate-to-cypress-11.json @@ -2,7 +2,7 @@ "name": "migrate-to-cypress-11", "factory": "./src/generators/migrate-to-cypress-11/migrate-to-cypress-11#migrateCypressProject", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressMigrateTo11", "cli": "nx", "title": "Migrate e2e project to Cypress 11", diff --git a/docs/generated/packages/detox/generators/application.json b/docs/generated/packages/detox/generators/application.json index 5b21bfd93c15e1..5b7611478117b7 100644 --- a/docs/generated/packages/detox/generators/application.json +++ b/docs/generated/packages/detox/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#detoxApplicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create Detox Configuration for the workspace", "description": "Create Detox Configuration for the workspace.", "type": "object", diff --git a/docs/generated/packages/detox/generators/init.json b/docs/generated/packages/detox/generators/init.json index cddd1643b5d701..805edb186d3bf9 100644 --- a/docs/generated/packages/detox/generators/init.json +++ b/docs/generated/packages/detox/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#detoxInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Add Detox Schematics", "description": "Add Detox Schematics.", "type": "object", diff --git a/docs/generated/packages/esbuild/generators/configuration.json b/docs/generated/packages/esbuild/generators/configuration.json index 9cf9da59d3e847..6df248a749c240 100644 --- a/docs/generated/packages/esbuild/generators/configuration.json +++ b/docs/generated/packages/esbuild/generators/configuration.json @@ -3,7 +3,7 @@ "aliases": ["esbuild-project"], "factory": "./src/generators/configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxEsBuildProject", "cli": "nx", "title": "Add esbuild configuration to a project", diff --git a/docs/generated/packages/esbuild/generators/init.json b/docs/generated/packages/esbuild/generators/init.json index e419bf6715fa5d..e272a800b360dc 100644 --- a/docs/generated/packages/esbuild/generators/init.json +++ b/docs/generated/packages/esbuild/generators/init.json @@ -2,11 +2,11 @@ "name": "init", "factory": "./src/generators/init/init#esbuildInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", - "$id": "NxWebpackInit", + "$schema": "https://json-schema.org/schema", + "$id": "NxEsbuildInit", "cli": "nx", - "title": "Init Webpack Plugin", - "description": "Init Webpack Plugin.", + "title": "Init Esbuild Plugin", + "description": "Init Esbuild Plugin.", "type": "object", "properties": { "skipFormat": { diff --git a/docs/generated/packages/eslint-plugin/documents/enforce-module-boundaries.md b/docs/generated/packages/eslint-plugin/documents/enforce-module-boundaries.md index 3601b6a11b30a7..0bffdba0437514 100644 --- a/docs/generated/packages/eslint-plugin/documents/enforce-module-boundaries.md +++ b/docs/generated/packages/eslint-plugin/documents/enforce-module-boundaries.md @@ -45,7 +45,7 @@ The `depConstraints` is an array of objects representing the constraints defined | Property | Type | Description | | ------------------------ | --------------- | ---------------------------------------------------------------------------------- | | sourceTag | _string_ | Tag that source project must contain to match the constraint | -| allSourceTags | _Array_ | List of targs the source project must contain to match the constraint | +| allSourceTags | _Array_ | List of tags the source project must contain to match the constraint | | onlyDependOnLibsWithTags | _Array_ | The source **can depend only** on projects that contain at least one of these tags | | notDependOnLibsWithTags | _Array_ | The source **can not depend** on projects that contain at least one of these tags | | allowedExternalImports | _Array_ | Exclusive list of external (npm) packages that are allowed to be imported | diff --git a/docs/generated/packages/eslint/executors/lint.json b/docs/generated/packages/eslint/executors/lint.json index 5dcc10ad9bba35..f07d5e02f618fb 100644 --- a/docs/generated/packages/eslint/executors/lint.json +++ b/docs/generated/packages/eslint/executors/lint.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "ESLint Lint Target", "description": "ESLint Lint Target.", "cli": "nx", diff --git a/docs/generated/packages/eslint/generators/convert-to-flat-config.json b/docs/generated/packages/eslint/generators/convert-to-flat-config.json index 0658338d098619..03ad486e88255a 100644 --- a/docs/generated/packages/eslint/generators/convert-to-flat-config.json +++ b/docs/generated/packages/eslint/generators/convert-to-flat-config.json @@ -2,7 +2,7 @@ "name": "convert-to-flat-config", "factory": "./src/generators/convert-to-flat-config/generator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "ConvertToFlatConfig", "cli": "nx", "description": "Convert an Nx workspace's ESLint configs to use Flat Config.", diff --git a/docs/generated/packages/eslint/generators/init.json b/docs/generated/packages/eslint/generators/init.json index 717ab167223c41..994ed4650209d2 100644 --- a/docs/generated/packages/eslint/generators/init.json +++ b/docs/generated/packages/eslint/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#lintInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxESLintInit", "title": "Initialize ESLint Plugin", diff --git a/docs/generated/packages/eslint/generators/workspace-rule.json b/docs/generated/packages/eslint/generators/workspace-rule.json index c063d51be5170e..3ad8134f13d37b 100644 --- a/docs/generated/packages/eslint/generators/workspace-rule.json +++ b/docs/generated/packages/eslint/generators/workspace-rule.json @@ -2,7 +2,7 @@ "name": "workspace-rule", "factory": "./src/generators/workspace-rule/workspace-rule#lintWorkspaceRuleGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceRule", "cli": "nx", "title": "Create a new Workspace Lint Rule", diff --git a/docs/generated/packages/eslint/generators/workspace-rules-project.json b/docs/generated/packages/eslint/generators/workspace-rules-project.json index ae89e0913ce944..5d9d133e6a9d25 100644 --- a/docs/generated/packages/eslint/generators/workspace-rules-project.json +++ b/docs/generated/packages/eslint/generators/workspace-rules-project.json @@ -2,7 +2,7 @@ "name": "workspace-rules-project", "factory": "./src/generators/workspace-rules-project/workspace-rules-project#lintWorkspaceRulesProjectGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceRulesProject", "cli": "nx", "title": "Create the Workspace Lint Rules Project", diff --git a/docs/generated/packages/expo/executors/build-list.json b/docs/generated/packages/expo/executors/build-list.json index 87e3874d6251ea..e7978f3eff4514 100644 --- a/docs/generated/packages/expo/executors/build-list.json +++ b/docs/generated/packages/expo/executors/build-list.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxExpoEasBuildList", "cli": "nx", "title": "Expo EAS Build List executor", diff --git a/docs/generated/packages/expo/executors/build.json b/docs/generated/packages/expo/executors/build.json index 7d5fc37afc68f8..c6083f36c73b6f 100644 --- a/docs/generated/packages/expo/executors/build.json +++ b/docs/generated/packages/expo/executors/build.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxExpoEasBuild", "cli": "nx", "title": "Expo EAS Build executor", diff --git a/docs/generated/packages/expo/executors/ensure-symlink.json b/docs/generated/packages/expo/executors/ensure-symlink.json index 8beee824792763..7046b2a0a6cb5e 100644 --- a/docs/generated/packages/expo/executors/ensure-symlink.json +++ b/docs/generated/packages/expo/executors/ensure-symlink.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoEnsureSymlink", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Ensure Symlink for Expo", "description": "Ensure workspace node_modules is symlink under app's node_modules folder.", "type": "object", diff --git a/docs/generated/packages/expo/executors/export.json b/docs/generated/packages/expo/executors/export.json index 0c751fa7f57d2c..4faa4f3f7423e8 100644 --- a/docs/generated/packages/expo/executors/export.json +++ b/docs/generated/packages/expo/executors/export.json @@ -6,7 +6,7 @@ "version": 2, "outputCapture": "direct-nodejs", "$id": "NxExpoExport", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Expo Export", "description": "Export the JavaScript and assets for your app using Metro/webpack bundler.", "type": "object", @@ -14,40 +14,38 @@ "platform": { "description": "Choose the platform to compile for", "enum": ["ios", "android", "all", "web"], + "default": "all", "alias": "p", "x-priority": "important" }, "dev": { "type": "boolean", - "description": "Bundle for development environments without minifying code or stripping the __DEV__ boolean. Configure static files for developing locally using a non-https server." + "description": "Configure static files for developing locally using a non-https server" }, "clear": { "type": "boolean", "description": "Clear the bundler cache before exporting" }, + "minify": { "type": "boolean", "description": "Minify source" }, "outputDir": { "type": "string", - "description": "The directory to export the static files to. Default: dist" + "description": "Relative to workspace root, the directory to export the static files to. Default: dist" }, "maxWorkers": { "type": "number", - "description": "Maximum number of tasks to allow Metro to spawn" + "description": "When bundler is metro, the maximum number of tasks to allow the bundler to spawn" }, "dumpAssetmap": { "type": "boolean", - "description": "Dump the asset map for further processing" + "description": "When bundler is metro, whether to dump the asset map for further processing" }, - "dumpSourcemap": { + "sourceMaps": { "type": "boolean", - "description": "Dump the source map for debugging the JS bundle" - }, - "bundler": { - "enum": ["metro", "webpack"], - "description": "Choose the bundler to compile for", - "default": "metro" + "description": "When bundler is metro, whether to emit JavaScript source maps" } }, - "required": [], + "required": ["platform"], + "examplesFile": "`project.json`:\n\n```json\n{\n \"name\": \"mobile\",\n //...\n \"targets\": {\n //...\n \"export\": {\n \"executor\": \"@nx/expo:export\",\n \"options\": {\n \"outputs\": [\"{options.outputDir}\"],\n \"platform\": \"all\",\n \"outputDir\": \"dist/apps/mobile\"\n },\n \"dependsOn\": [\"sync-deps\"]\n }\n //...\n }\n}\n```\n\n```shell\nnx run mobile:export\n```\n\n## Examples\n\n{% tabs %}\n{% tab label=\"Specify outputDir\" %}\nThe `outputDir` option allows you to specify the output directory of your bundle:\n\n```json\n \"export\": {\n \"executor\": \"@nx/expo:export\",\n \"outputs\": [\"{options.outputDir}\"],\n \"options\": {\n \"platform\": \"all\",\n \"bundler\": \"metro\",\n \"outputDir\": \"dist/apps/mobile\"\n },\n \"dependsOn\": [\"sync-deps\"]\n },\n```\n\nor run command: `nx run mobile:export --outputDir=dist/apps/mobile`.\n\n{% /tab %}\n{% tab label=\"Specify the platform\" %}\nThe `platform` option allows you to specify the platform to compile with metro bundler: \"ios\", \"android\", \"all\", and \"web\".\n\nFor example, to bundle for web:\n\n```json\n \"export\": {\n \"executor\": \"@nx/expo:export\",\n \"outputs\": [\"{options.outputDir}\"],\n \"options\": {\n \"platform\": \"web\",\n \"bundler\": \"metro\",\n \"outputDir\": \"dist/apps/dogs\"\n },\n \"dependsOn\": [\"sync-deps\"]\n },\n```\n\nor run command `nx export mobile --platform=web`.\n\n{% /tab %}\n{% tab label=\"Bundle for development\" %}\n\nThe `dev` option allows you to bundle for development environments.\n\n```json\n \"export\": {\n \"executor\": \"@nx/expo:export\",\n \"outputs\": [\"{options.outputDir}\"],\n \"options\": {\n \"platform\": \"web\",\n \"bundler\": \"metro\",\n \"outputDir\": \"dist/apps/dogs\",\n \"dev\": true\n },\n \"dependsOn\": [\"sync-deps\"]\n },\n```\n\nor run command `nx export mobile --dev`.\n\n{% /tab %}\n{% tab label=\"Clear bundle cache\" %}\n\nThe `clear` option allows you to clear bundle cache.\n\n```json\n \"export\": {\n \"executor\": \"@nx/expo:export\",\n \"outputs\": [\"{options.outputDir}\"],\n \"options\": {\n \"platform\": \"web\",\n \"bundler\": \"metro\",\n \"outputDir\": \"dist/apps/dogs\",\n \"clear\": true\n },\n \"dependsOn\": [\"sync-deps\"]\n },\n```\n\nor run command `nx export mobile --clear`.\n\n{% /tab %}\n{% /tabs %}\n", "presets": [] }, "description": "Export the JavaScript and assets for your app using Metro/webpack bundler", diff --git a/docs/generated/packages/expo/executors/install.json b/docs/generated/packages/expo/executors/install.json index 924d55e0117521..1c583fa41666aa 100644 --- a/docs/generated/packages/expo/executors/install.json +++ b/docs/generated/packages/expo/executors/install.json @@ -6,7 +6,7 @@ "version": 2, "outputCapture": "direct-nodejs", "$id": "NxExpoInstall", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Expo Install", "description": "Install a module or other package to a project.", "type": "object", diff --git a/docs/generated/packages/expo/executors/prebuild.json b/docs/generated/packages/expo/executors/prebuild.json index 510f01a5c5ed1f..0f82cb50850063 100644 --- a/docs/generated/packages/expo/executors/prebuild.json +++ b/docs/generated/packages/expo/executors/prebuild.json @@ -6,7 +6,7 @@ "version": 2, "outputCapture": "direct-nodejs", "$id": "NxExpoPrebuild", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Expo Prebuild", "description": "Create native iOS and Android project files for building natively.", "type": "object", @@ -34,6 +34,7 @@ "description": "Project template to clone from. File path pointing to a local tar file or a github repo" } }, + "required": ["platform"], "examplesFile": "The `prebuild` command generates native code before a native app can compile.\n\n`project.json`:\n\n```json\n{\n \"name\": \"mobile\",\n //...\n \"targets\": {\n //...\n \"prebuild\": {\n \"executor\": \"@nx/expo:prebuild\",\n \"options\": {}\n }\n //...\n }\n}\n```\n\n```shell\nnx run mobile:prebuild\n```\n\n## Examples\n\n{% tabs %}\n{% tab label=\"Generate Native Code for Different Platforms\" %}\nThe `platform` option allows you to specify the platform to generate native code for (e.g. android, ios, all).\n\n```json\n \"prebuild\": {\n \"executor\": \"@nx/expo:prebuild\",\n \"options\": {\n \"platform\": \"android\"\n }\n }\n```\n\n{% /tab %}\n{% tab label=\"Regenerate Native Code\" %}\n\nThe `clean` option allows you to delete the native folders and regenerate them before apply changes.\n\n```json\n \"prebuild\": {\n \"executor\": \"@nx/expo:prebuild\",\n \"options\": {\n \"clean\": true\n }\n }\n```\n\n{% /tab %}\n{% tab label=\"Install NPM Packages and CocoaPods\" %}\n\nThe `install` option allows you to install NPM Packages and CocoaPods.\n\n```json\n \"prebuild\": {\n \"executor\": \"@nx/expo:prebuild\",\n \"options\": {\n \"install\": true\n }\n }\n```\n\n{% /tab %}\n{% /tabs %}\n\n---\n", "presets": [] }, diff --git a/docs/generated/packages/expo/executors/run.json b/docs/generated/packages/expo/executors/run.json index ac2318f446eba4..64e9dd74423a6b 100644 --- a/docs/generated/packages/expo/executors/run.json +++ b/docs/generated/packages/expo/executors/run.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoRun", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run iOS or Android application", "description": "Run Expo target options.", "type": "object", diff --git a/docs/generated/packages/expo/executors/serve.json b/docs/generated/packages/expo/executors/serve.json new file mode 100644 index 00000000000000..5943cf5d7cf658 --- /dev/null +++ b/docs/generated/packages/expo/executors/serve.json @@ -0,0 +1,45 @@ +{ + "name": "serve", + "implementation": "/packages/expo/src/executors/serve/serve.impl.ts", + "schema": { + "version": 2, + "outputCapture": "direct-nodejs", + "cli": "nx", + "$id": "NxExpoServe", + "$schema": "http://json-schema.org/schema", + "title": "Serve web app for Expo", + "description": "Packager Server target options.", + "type": "object", + "properties": { + "port": { + "type": "number", + "description": "Port to start the native Metro bundler on (does not apply to web or tunnel)", + "default": 19000, + "alias": "p" + }, + "clear": { + "type": "boolean", + "description": "Clear the Metro bundler cache", + "alias": "c" + }, + "maxWorkers": { + "type": "number", + "description": "Maximum number of tasks to allow Metro to spawn" + }, + "dev": { + "type": "boolean", + "description": "Turn development mode on or off" + }, + "minify": { + "type": "boolean", + "description": "Whether or not to minify code" + } + }, + "presets": [] + }, + "description": "Serve up the Expo web app locally", + "aliases": [], + "hidden": false, + "path": "/packages/expo/src/executors/serve/schema.json", + "type": "executor" +} diff --git a/docs/generated/packages/expo/executors/start.json b/docs/generated/packages/expo/executors/start.json index ecb4fb54279410..693bd4f1f35d62 100644 --- a/docs/generated/packages/expo/executors/start.json +++ b/docs/generated/packages/expo/executors/start.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoStart", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Packager Server for Expo", "description": "Packager Server target options.", "type": "object", @@ -86,7 +86,7 @@ "description": "Allows this command to run while offline" } }, - "examplesFile": "`project.json`:\n\n```json\n{\n \"name\": \"mobile\",\n //...\n \"targets\": {\n //...\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081\n }\n }\n //...\n }\n}\n```\n\n```shell\nnx run mobile:start\n```\n\n## Examples\n\n{% tabs %}\n{% tab label=\"Specify starting on platform\" %}\nThe `ios`, `android` and `web` option allows you to start the server on different platforms.\n\nOpens your app in Expo Go in a currently running iOS simulator on your computer:\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"ios\": true\n }\n }\n```\n\nOpens your app in Expo Go on a connected Android device\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"android\": true\n }\n }\n```\n\nOpens your app in a web browser:\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"web\": true\n }\n }\n```\n\n{% /tab %}\n{% tab label=\"Specify the host\" %}\nThe `host` option allows you to specify the type of host to use. `lan` uses the local network; `tunnel` ues any network by tunnel through ngrok; `localhost` connects to the dev server over localhost.\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"host\": \"localhost\"\n }\n }\n```\n\n{% /tab %}\n{% tab label=\"Starts the server with cache reset\" %}\n\nThe `clear` option allows you to remove Metro bundler cache.\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"clear\": true\n }\n }\n```\n\n{% /tab %}\n{% /tabs %}\n\n---\n", + "examplesFile": "`project.json`:\n\n```json\n{\n \"name\": \"mobile\",\n //...\n \"targets\": {\n //...\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081\n }\n }\n //...\n }\n}\n```\n\n```shell\nnx run mobile:start\n```\n\n## Examples\n\n{% tabs %}\n{% tab label=\"Specify starting on platform\" %}\nThe `ios`, `android` and `web` option allows you to start the server on different platforms.\n\nOpens your app in Expo Go in a currently running iOS simulator on your computer:\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"ios\": true\n }\n }\n```\n\nor run command `nx start --ios`.\n\nOpens your app in Expo Go on a connected Android device\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"android\": true\n }\n }\n```\n\nor run command `nx start --android`.\n\nOpens your app in a web browser:\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"web\": true\n }\n }\n```\n\nor run command `nx start --web`.\n\n{% /tab %}\n{% tab label=\"Specify the host\" %}\nThe `host` option allows you to specify the type of host to use. `lan` uses the local network; `tunnel` ues any network by tunnel through ngrok; `localhost` connects to the dev server over localhost.\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"host\": \"localhost\"\n }\n }\n```\n\n{% /tab %}\n{% tab label=\"Starts the server with cache reset\" %}\n\nThe `clear` option allows you to remove Metro bundler cache.\n\n```json\n \"start\": {\n \"executor\": \"@nx/expo:start\",\n \"options\": {\n \"port\": 8081,\n \"clear\": true\n }\n }\n```\n\n{% /tab %}\n{% /tabs %}\n\n---\n", "presets": [] }, "description": "Start a local dev server for the app or start a Webpack dev server for the web app", diff --git a/docs/generated/packages/expo/executors/submit.json b/docs/generated/packages/expo/executors/submit.json index 27a64ffc4ff976..a9cfcb38bb9f16 100644 --- a/docs/generated/packages/expo/executors/submit.json +++ b/docs/generated/packages/expo/executors/submit.json @@ -2,7 +2,7 @@ "name": "submit", "implementation": "/packages/expo/src/executors/submit/submit.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "EXPO EAS Submit Executor", "description": "Submit app binary to App Store and/or Play Store.", diff --git a/docs/generated/packages/expo/executors/sync-deps.json b/docs/generated/packages/expo/executors/sync-deps.json index 2b01e61b31ed25..dec711b1943199 100644 --- a/docs/generated/packages/expo/executors/sync-deps.json +++ b/docs/generated/packages/expo/executors/sync-deps.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoSyncDeps", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Sync Deps for Expo", "description": "Updates package.json with project dependencies.", "type": "object", diff --git a/docs/generated/packages/expo/executors/update.json b/docs/generated/packages/expo/executors/update.json index e0e598b56ed0b1..07bdeb3c6a3a6d 100644 --- a/docs/generated/packages/expo/executors/update.json +++ b/docs/generated/packages/expo/executors/update.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxExpoEasUpdate", "cli": "nx", "title": "Expo EAS Update executor", diff --git a/docs/generated/packages/expo/generators/application.json b/docs/generated/packages/expo/generators/application.json index 4e457fbc5d3cae..6396844a116c1b 100644 --- a/docs/generated/packages/expo/generators/application.json +++ b/docs/generated/packages/expo/generators/application.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxExpoApplication", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Create an Expo Application for Nx.", "examples": [ { @@ -48,7 +48,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { @@ -75,8 +75,8 @@ "e2eTestRunner": { "description": "Adds the specified e2e test runner", "type": "string", - "enum": ["detox", "none"], - "default": "detox" + "enum": ["cypress", "playwright", "detox", "none"], + "default": "cypress" }, "standaloneConfig": { "description": "Split the project configuration into `/project.json` rather than including it inside `workspace.json`.", diff --git a/docs/generated/packages/expo/generators/component.json b/docs/generated/packages/expo/generators/component.json index 7ba2a2c0279be6..f5579ec90e7022 100644 --- a/docs/generated/packages/expo/generators/component.json +++ b/docs/generated/packages/expo/generators/component.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxExpoComponent", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Create a Expo Component for Nx.", "type": "object", "examples": [ @@ -23,7 +23,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -61,7 +61,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "export": { "type": "boolean", @@ -75,7 +75,7 @@ "description": "Use pascal case component file name (e.g. App.tsx).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "classComponent": { "type": "boolean", diff --git a/docs/generated/packages/expo/generators/init.json b/docs/generated/packages/expo/generators/init.json index cb89fad4b93989..616eff371b5fdb 100644 --- a/docs/generated/packages/expo/generators/init.json +++ b/docs/generated/packages/expo/generators/init.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxExpoInit", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Add Nx Expo Schematics.", "type": "object", "properties": { diff --git a/docs/generated/packages/expo/generators/library.json b/docs/generated/packages/expo/generators/library.json index 10f1a98e01761d..d807880e064043 100644 --- a/docs/generated/packages/expo/generators/library.json +++ b/docs/generated/packages/expo/generators/library.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxExpoLibrary", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Create a Expo Library for Nx.", "type": "object", "examples": [ @@ -34,7 +34,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { diff --git a/docs/generated/packages/express/generators/application.json b/docs/generated/packages/express/generators/application.json index cab14592c56c64..983f7fd1e499d8 100644 --- a/docs/generated/packages/express/generators/application.json +++ b/docs/generated/packages/express/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#applicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "SchematicsNxExpressApp", "title": "Nx Application Options Schema", diff --git a/docs/generated/packages/express/generators/init.json b/docs/generated/packages/express/generators/init.json index 41b84b432e2ed4..128e0c6329492c 100644 --- a/docs/generated/packages/express/generators/init.json +++ b/docs/generated/packages/express/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#initGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxExpressInit", "title": "Init Express Plugin", diff --git a/docs/generated/packages/jest/generators/configuration.json b/docs/generated/packages/jest/generators/configuration.json index db31c454178e04..89028bffd4d367 100644 --- a/docs/generated/packages/jest/generators/configuration.json +++ b/docs/generated/packages/jest/generators/configuration.json @@ -2,7 +2,7 @@ "name": "configuration", "factory": "./src/generators/configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxJestProject", "cli": "nx", "title": "Add Jest Configuration to a project", diff --git a/docs/generated/packages/jest/generators/init.json b/docs/generated/packages/jest/generators/init.json index 03fbf1395fbdce..2595f1879def5f 100644 --- a/docs/generated/packages/jest/generators/init.json +++ b/docs/generated/packages/jest/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#jestInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxJestInit", "cli": "nx", "title": "Jest init", diff --git a/docs/generated/packages/js/executors/node.json b/docs/generated/packages/js/executors/node.json index 3c9b3ffbbe6f97..f69777deebb407 100644 --- a/docs/generated/packages/js/executors/node.json +++ b/docs/generated/packages/js/executors/node.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Node executor", "description": "Execute Nodejs applications.", diff --git a/docs/generated/packages/js/executors/release-publish.json b/docs/generated/packages/js/executors/release-publish.json index 2a46e545047786..b6a36f4f33aa14 100644 --- a/docs/generated/packages/js/executors/release-publish.json +++ b/docs/generated/packages/js/executors/release-publish.json @@ -2,7 +2,7 @@ "name": "release-publish", "implementation": "/packages/js/src/executors/release-publish/release-publish.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "Implementation details of `nx release publish`", "description": "DO NOT INVOKE DIRECTLY WITH `nx run`. Use `nx release publish` instead.", diff --git a/docs/generated/packages/js/executors/swc.json b/docs/generated/packages/js/executors/swc.json index d5c69f904e8173..2c5289db8ef558 100644 --- a/docs/generated/packages/js/executors/swc.json +++ b/docs/generated/packages/js/executors/swc.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Typescript Build Target", "description": "Builds using SWC.", diff --git a/docs/generated/packages/js/executors/verdaccio.json b/docs/generated/packages/js/executors/verdaccio.json index be858203354f2f..324f3fd9602c9c 100644 --- a/docs/generated/packages/js/executors/verdaccio.json +++ b/docs/generated/packages/js/executors/verdaccio.json @@ -2,7 +2,7 @@ "name": "verdaccio", "implementation": "/packages/js/src/executors/verdaccio/verdaccio.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "Verdaccio Local Registry", "description": "Start a local registry with Verdaccio.", diff --git a/docs/generated/packages/js/generators/convert-to-swc.json b/docs/generated/packages/js/generators/convert-to-swc.json index b7054a6c019010..232a80e8524a3c 100644 --- a/docs/generated/packages/js/generators/convert-to-swc.json +++ b/docs/generated/packages/js/generators/convert-to-swc.json @@ -2,7 +2,7 @@ "name": "convert-to-swc", "factory": "./src/generators/convert-to-swc/convert-to-swc#convertToSwcGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxTypescriptLibrary", "cli": "nx", "title": "Convert a TSC library to SWC", diff --git a/docs/generated/packages/js/generators/init.json b/docs/generated/packages/js/generators/init.json index f9d16b10502d4d..9e796004bd42c2 100644 --- a/docs/generated/packages/js/generators/init.json +++ b/docs/generated/packages/js/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#initGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxTypescriptInit", "cli": "nx", "title": "Init nx/js", diff --git a/docs/generated/packages/js/generators/library.json b/docs/generated/packages/js/generators/library.json index 62fa58c9e24cb0..68dfd176d62087 100644 --- a/docs/generated/packages/js/generators/library.json +++ b/docs/generated/packages/js/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "factory": "./src/generators/library/library#libraryGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxTypescriptLibrary", "cli": "nx", "title": "Create a TypeScript Library", diff --git a/docs/generated/packages/js/generators/release-version.json b/docs/generated/packages/js/generators/release-version.json index 7c3a4adff021af..16f235a9cc2341 100644 --- a/docs/generated/packages/js/generators/release-version.json +++ b/docs/generated/packages/js/generators/release-version.json @@ -2,7 +2,7 @@ "name": "release-version", "factory": "./src/generators/release-version/release-version#releaseVersionGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxJSReleaseVersionGenerator", "cli": "nx", "title": "Implementation details of `nx release version`", diff --git a/docs/generated/packages/js/generators/setup-build.json b/docs/generated/packages/js/generators/setup-build.json index 3a318047bfc355..06209946b75176 100644 --- a/docs/generated/packages/js/generators/setup-build.json +++ b/docs/generated/packages/js/generators/setup-build.json @@ -2,7 +2,7 @@ "name": "setup-build", "factory": "./src/generators/setup-build/generator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SetupBuild", "title": "Setup Build", "description": "Sets up build target for a project.", diff --git a/docs/generated/packages/js/generators/setup-verdaccio.json b/docs/generated/packages/js/generators/setup-verdaccio.json index be48e303fa5cec..7e66804e740746 100644 --- a/docs/generated/packages/js/generators/setup-verdaccio.json +++ b/docs/generated/packages/js/generators/setup-verdaccio.json @@ -2,7 +2,7 @@ "name": "setup-verdaccio", "factory": "./src/generators/setup-verdaccio/generator#setupVerdaccio", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SetupVerdaccio", "title": "Setup Verdaccio", "description": "Setup Verdaccio local-registry.", diff --git a/docs/generated/packages/nest/generators/application.json b/docs/generated/packages/nest/generators/application.json index 9bb9beb8f354ac..304141f665d42b 100644 --- a/docs/generated/packages/nest/generators/application.json +++ b/docs/generated/packages/nest/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#applicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestApplicationGenerator", "title": "Nx Application Options Schema", "description": "Nx Application Options Schema.", diff --git a/docs/generated/packages/nest/generators/class.json b/docs/generated/packages/nest/generators/class.json index 2d6df1486c3875..54794b04e55a04 100644 --- a/docs/generated/packages/nest/generators/class.json +++ b/docs/generated/packages/nest/generators/class.json @@ -2,7 +2,7 @@ "name": "class", "factory": "./src/generators/class/class#classGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestClassGenerator", "title": "Nest Class Options Schema", "description": "Nest Class Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/controller.json b/docs/generated/packages/nest/generators/controller.json index e08bc5c982a18f..2f2de5ae7f8fed 100644 --- a/docs/generated/packages/nest/generators/controller.json +++ b/docs/generated/packages/nest/generators/controller.json @@ -2,7 +2,7 @@ "name": "controller", "factory": "./src/generators/controller/controller#controllerGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestControllerGenerator", "title": "Nest Controller Options Schema", "description": "Nest Controller Options Schema.", @@ -20,7 +20,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "nameAndDirectoryFormat": { "description": "Whether to generate the component in the directory as provided, relative to the current working directory and ignoring the project (`as-provided`) or generate it using the project and directory relative to the workspace root (`derived`).", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/docs/generated/packages/nest/generators/decorator.json b/docs/generated/packages/nest/generators/decorator.json index e2f88ea41810f6..2b8a41af5421cb 100644 --- a/docs/generated/packages/nest/generators/decorator.json +++ b/docs/generated/packages/nest/generators/decorator.json @@ -2,7 +2,7 @@ "name": "decorator", "factory": "./src/generators/decorator/decorator#decoratorGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestDecoratorGenerator", "title": "Nest Decorator Options Schema", "description": "Nest Decorator Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -40,7 +40,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/filter.json b/docs/generated/packages/nest/generators/filter.json index 1fbc17835fb984..cd4bb4d3fc52ef 100644 --- a/docs/generated/packages/nest/generators/filter.json +++ b/docs/generated/packages/nest/generators/filter.json @@ -2,7 +2,7 @@ "name": "filter", "factory": "./src/generators/filter/filter#filterGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestFilterGenerator", "title": "Nest Filter Options Schema", "description": "Nest Filter Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/gateway.json b/docs/generated/packages/nest/generators/gateway.json index bb61d3ee2201e2..2bfc26fb702aa7 100644 --- a/docs/generated/packages/nest/generators/gateway.json +++ b/docs/generated/packages/nest/generators/gateway.json @@ -2,7 +2,7 @@ "name": "gateway", "factory": "./src/generators/gateway/gateway#gatewayGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestGatewayGenerator", "title": "Nest Gateway Options Schema", "description": "Nest Gateway Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/guard.json b/docs/generated/packages/nest/generators/guard.json index 0a4d0660ef4616..de1b34351e3bd2 100644 --- a/docs/generated/packages/nest/generators/guard.json +++ b/docs/generated/packages/nest/generators/guard.json @@ -2,7 +2,7 @@ "name": "guard", "factory": "./src/generators/guard/guard#guardGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestGuardGenerator", "title": "Nest Guard Options Schema", "description": "Nest Guard Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/init.json b/docs/generated/packages/nest/generators/init.json index 872d8b1d6bdaf7..7add673fa13e0a 100644 --- a/docs/generated/packages/nest/generators/init.json +++ b/docs/generated/packages/nest/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestInitGenerator", "title": "Init Nest Plugin", "description": "Init Nest Plugin.", diff --git a/docs/generated/packages/nest/generators/interceptor.json b/docs/generated/packages/nest/generators/interceptor.json index 35dd4eb058c06c..7c1283c450442a 100644 --- a/docs/generated/packages/nest/generators/interceptor.json +++ b/docs/generated/packages/nest/generators/interceptor.json @@ -2,7 +2,7 @@ "name": "interceptor", "factory": "./src/generators/interceptor/interceptor#interceptorGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestInterceptorGenerator", "title": "Nest Interceptor Options Schema", "description": "Nest Interceptor Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/interface.json b/docs/generated/packages/nest/generators/interface.json index 7c7392bd100e2d..77ff955953ae69 100644 --- a/docs/generated/packages/nest/generators/interface.json +++ b/docs/generated/packages/nest/generators/interface.json @@ -2,7 +2,7 @@ "name": "interface", "factory": "./src/generators/interface/interface#interfaceGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestInterfaceGenerator", "title": "Nest Interface Options Schema", "description": "Nest Interface Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -40,7 +40,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true } diff --git a/docs/generated/packages/nest/generators/library.json b/docs/generated/packages/nest/generators/library.json index 5d9efb2f94bd51..6fcfb0e1c44de3 100644 --- a/docs/generated/packages/nest/generators/library.json +++ b/docs/generated/packages/nest/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "factory": "./src/generators/library/library#libraryGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestLibraryGenerator", "title": "Create a NestJS Library for Nx", "description": "Create a NestJS Library for Nx.", diff --git a/docs/generated/packages/nest/generators/middleware.json b/docs/generated/packages/nest/generators/middleware.json index db2baef0cb830d..62cd735ec5851e 100644 --- a/docs/generated/packages/nest/generators/middleware.json +++ b/docs/generated/packages/nest/generators/middleware.json @@ -2,7 +2,7 @@ "name": "middleware", "factory": "./src/generators/middleware/middleware#middlewareGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestMiddlewareGenerator", "title": "Nest Middleware Options Schema", "description": "Nest Middleware Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/module.json b/docs/generated/packages/nest/generators/module.json index 42b5e8b612feed..058349d4878c73 100644 --- a/docs/generated/packages/nest/generators/module.json +++ b/docs/generated/packages/nest/generators/module.json @@ -2,7 +2,7 @@ "name": "module", "factory": "./src/generators/module/module#moduleGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestModuleGenerator", "title": "Nest Module Options Schema", "description": "Nest Module Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -40,7 +40,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/docs/generated/packages/nest/generators/pipe.json b/docs/generated/packages/nest/generators/pipe.json index 4fdafec02f4764..985d377cd93109 100644 --- a/docs/generated/packages/nest/generators/pipe.json +++ b/docs/generated/packages/nest/generators/pipe.json @@ -2,7 +2,7 @@ "name": "pipe", "factory": "./src/generators/pipe/pipe#pipeGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestPipeGenerator", "title": "Nest Pipe Options Schema", "description": "Nest Pipe Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/provider.json b/docs/generated/packages/nest/generators/provider.json index 43a41af7216295..7d7f7e17e9119c 100644 --- a/docs/generated/packages/nest/generators/provider.json +++ b/docs/generated/packages/nest/generators/provider.json @@ -2,7 +2,7 @@ "name": "provider", "factory": "./src/generators/provider/provider#providerGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestProviderGenerator", "title": "Nest Provider Options Schema", "description": "Nest Provider Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/docs/generated/packages/nest/generators/resolver.json b/docs/generated/packages/nest/generators/resolver.json index 3698f98d4ad72a..6b534e100f40e7 100644 --- a/docs/generated/packages/nest/generators/resolver.json +++ b/docs/generated/packages/nest/generators/resolver.json @@ -2,7 +2,7 @@ "name": "resolver", "factory": "./src/generators/resolver/resolver#resolverGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestResolverGenerator", "title": "Nest Resolver Options Schema", "description": "Nest Resolver Options Schema.", @@ -20,7 +20,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -41,7 +41,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/docs/generated/packages/nest/generators/resource.json b/docs/generated/packages/nest/generators/resource.json index 2e8fd8fe110990..c41094f06eedc3 100644 --- a/docs/generated/packages/nest/generators/resource.json +++ b/docs/generated/packages/nest/generators/resource.json @@ -2,7 +2,7 @@ "name": "resource", "factory": "./src/generators/resource/resource#resourceGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestResourceGenerator", "title": "Nest Resource Options Schema", "description": "Nest Resource Options Schema.", @@ -20,7 +20,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -41,7 +41,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/docs/generated/packages/nest/generators/service.json b/docs/generated/packages/nest/generators/service.json index 977eab8e82eb4b..7a9152fb5cd40f 100644 --- a/docs/generated/packages/nest/generators/service.json +++ b/docs/generated/packages/nest/generators/service.json @@ -2,7 +2,7 @@ "name": "service", "factory": "./src/generators/service/service#serviceGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestServiceGenerator", "title": "Nest Service Options Schema", "description": "Nest Service Options Schema.", @@ -25,7 +25,7 @@ "type": "string", "$default": { "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -46,7 +46,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/docs/generated/packages/next/executors/build.json b/docs/generated/packages/next/executors/build.json index 3cd26544c5ae86..81911e84a576bb 100644 --- a/docs/generated/packages/next/executors/build.json +++ b/docs/generated/packages/next/executors/build.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "pipe", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Next Build", "description": "Build a Next.js app.", diff --git a/docs/generated/packages/next/generators/application.json b/docs/generated/packages/next/generators/application.json index ec6cee09510aa4..56a27c427b5c54 100644 --- a/docs/generated/packages/next/generators/application.json +++ b/docs/generated/packages/next/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#applicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextApp", "title": "Create a Next.js Application for Nx", @@ -40,11 +40,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/docs/generated/packages/next/generators/component.json b/docs/generated/packages/next/generators/component.json index 95d9c1773ae0f1..b2a5636b055d1c 100644 --- a/docs/generated/packages/next/generators/component.json +++ b/docs/generated/packages/next/generators/component.json @@ -2,7 +2,7 @@ "name": "component", "factory": "./src/generators/component/component#componentGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextReactComponent", "title": "Create a React Component for Next", @@ -14,7 +14,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -35,11 +35,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", @@ -89,21 +89,21 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseFiles": { "type": "boolean", "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `App/App.tsx`).", "alias": "R", "default": false, - "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "skipFormat": { "description": "Skip formatting files.", diff --git a/docs/generated/packages/next/generators/custom-server.json b/docs/generated/packages/next/generators/custom-server.json index 661bf455177b43..c2b83da02a0b6c 100644 --- a/docs/generated/packages/next/generators/custom-server.json +++ b/docs/generated/packages/next/generators/custom-server.json @@ -2,7 +2,7 @@ "name": "custom-server", "factory": "./src/generators/custom-server/custom-server#customServerGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextCustomServer", "title": "Add custom server", diff --git a/docs/generated/packages/next/generators/cypress-component-configuration.json b/docs/generated/packages/next/generators/cypress-component-configuration.json index a0860392846e22..5f982889ddc3c8 100644 --- a/docs/generated/packages/next/generators/cypress-component-configuration.json +++ b/docs/generated/packages/next/generators/cypress-component-configuration.json @@ -2,7 +2,7 @@ "name": "cypress-component-configuration", "factory": "./src/generators/cypress-component-configuration/cypress-component-configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "CypressComponentConfiguration", "title": "NextJS Component Testing Configuration", @@ -41,7 +41,7 @@ } }, "required": ["project"], - "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nNext component testing with Nx requires **Cypress version 10.7.0** and up.\n\nYou can migrate with to v10 via the [migrate-to-cypress-11 generator](/packages/cypress/generators/migrate-to-cypress-11).\n\nThis generator is for Cypress based component testing.\n\nIf you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 18.\n{% /callout %}\n\nThis generator is designed to get your Next project up and running with Cypress Component Testing.\n\n```shell\nnx g @nx/next:cypress-component-configuration --project=my-cool-next-project\n```\n\nRunning this generator, adds the required files to the specified project with a preconfigured `cypress.config.ts` designed for Nx workspaces.\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/next/plugins/component-testing';\n\nexport default defineConfig({\n component: nxComponentTestingPreset(__filename),\n});\n```\n\nHere is an example on how to add custom options to the configuration\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/next/plugins/component-testing';\n\nexport default defineConfig({\n component: {\n ...nxComponentTestingPreset(__filename),\n // extra options here\n },\n});\n```\n\n```shell\nnx g @nx/next:cypress-component-project --project=my-cool-next-project\n```\n\n## Auto Generating Tests\n\nYou can optionally use the `--generate-tests` flag to generate a test file for each component in your project.\n\n```shell\nnx g @nx/next:cypress-component-configuration --project=my-cool-next-project --generate-tests\n```\n\n## Running Component Tests\n\nA new `component-test` target will be added to the specified project to run your component tests.\n\n```shell\nnx g component-test my-cool-next-project\n```\n\nHere is an example of the project configuration that is generated.\n\n```json {% fileName=\"project.json\" %}\n{\n \"targets\" {\n \"component-test\": {\n \"executor\": \"@nx/cypress:cypress\",\n \"options\": {\n \"cypressConfig\": \"/cypress.config.ts\",\n \"testingType\": \"component\",\n \"skipServe\": true\n }\n }\n }\n}\n```\n\nNx also supports [Angular component testing](/packages/angular/generators/cypress-component-configuration).\n", + "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nNext component testing with Nx requires **Cypress version 10.7.0** and up.\n\nYou can migrate with to v10 via the [migrate-to-cypress-11 generator](/packages/cypress/generators/migrate-to-cypress-11).\n\nThis generator is for Cypress based component testing.\n\nIf you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 19.\n{% /callout %}\n\nThis generator is designed to get your Next project up and running with Cypress Component Testing.\n\n```shell\nnx g @nx/next:cypress-component-configuration --project=my-cool-next-project\n```\n\nRunning this generator, adds the required files to the specified project with a preconfigured `cypress.config.ts` designed for Nx workspaces.\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/next/plugins/component-testing';\n\nexport default defineConfig({\n component: nxComponentTestingPreset(__filename),\n});\n```\n\nHere is an example on how to add custom options to the configuration\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/next/plugins/component-testing';\n\nexport default defineConfig({\n component: {\n ...nxComponentTestingPreset(__filename),\n // extra options here\n },\n});\n```\n\n```shell\nnx g @nx/next:cypress-component-project --project=my-cool-next-project\n```\n\n## Auto Generating Tests\n\nYou can optionally use the `--generate-tests` flag to generate a test file for each component in your project.\n\n```shell\nnx g @nx/next:cypress-component-configuration --project=my-cool-next-project --generate-tests\n```\n\n## Running Component Tests\n\nA new `component-test` target will be added to the specified project to run your component tests.\n\n```shell\nnx g component-test my-cool-next-project\n```\n\nHere is an example of the project configuration that is generated.\n\n```json {% fileName=\"project.json\" %}\n{\n \"targets\" {\n \"component-test\": {\n \"executor\": \"@nx/cypress:cypress\",\n \"options\": {\n \"cypressConfig\": \"/cypress.config.ts\",\n \"testingType\": \"component\",\n \"skipServe\": true\n }\n }\n }\n}\n```\n\nNx also supports [Angular component testing](/packages/angular/generators/cypress-component-configuration).\n", "presets": [] }, "description": "cypress-component-configuration generator", diff --git a/docs/generated/packages/next/generators/init.json b/docs/generated/packages/next/generators/init.json index 85f3af40594561..55b9f7888bb734 100644 --- a/docs/generated/packages/next/generators/init.json +++ b/docs/generated/packages/next/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#nextInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextNgInit", "title": "Init Next Plugin", diff --git a/docs/generated/packages/next/generators/library.json b/docs/generated/packages/next/generators/library.json index f760b525a7fde0..0e06738c98c6ef 100644 --- a/docs/generated/packages/next/generators/library.json +++ b/docs/generated/packages/next/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "factory": "./src/generators/library/library#libraryGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactLibrary", "title": "Create a React Library for Nx", @@ -40,11 +40,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/docs/generated/packages/next/generators/page.json b/docs/generated/packages/next/generators/page.json index 9b3221776f5baa..9f0eab986a5756 100644 --- a/docs/generated/packages/next/generators/page.json +++ b/docs/generated/packages/next/generators/page.json @@ -2,7 +2,7 @@ "name": "page", "factory": "./src/generators/page/page#pageGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextReactPage", "title": "Create a Page for Next", @@ -14,7 +14,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -46,11 +46,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", @@ -89,7 +89,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "skipFormat": { "description": "Skip formatting files.", diff --git a/docs/generated/packages/node/generators/application.json b/docs/generated/packages/node/generators/application.json index 70d46d416b9ddd..b4b9a029d7c3ca 100644 --- a/docs/generated/packages/node/generators/application.json +++ b/docs/generated/packages/node/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#applicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "SchematicsNxNodeApp", "title": "Nx Application Options Schema", diff --git a/docs/generated/packages/node/generators/init.json b/docs/generated/packages/node/generators/init.json index 6c7294cb5a9e98..9a5a388e37428d 100644 --- a/docs/generated/packages/node/generators/init.json +++ b/docs/generated/packages/node/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNodeInit", "title": "Init Node Plugin", diff --git a/docs/generated/packages/node/generators/library.json b/docs/generated/packages/node/generators/library.json index 1e4bf249549347..30aecd057ad482 100644 --- a/docs/generated/packages/node/generators/library.json +++ b/docs/generated/packages/node/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "factory": "./src/generators/library/library#libraryGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNodeLibrary", "title": "Create a Node Library for Nx", diff --git a/docs/generated/packages/node/generators/setup-docker.json b/docs/generated/packages/node/generators/setup-docker.json index f2b0c3cd3acced..aace4f77586d9f 100644 --- a/docs/generated/packages/node/generators/setup-docker.json +++ b/docs/generated/packages/node/generators/setup-docker.json @@ -2,7 +2,7 @@ "name": "setup-docker", "factory": "./src/generators/setup-docker/setup-docker", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "SchematicsNxSetupDocker", "title": "Nx Node Docker Options Schema", diff --git a/docs/generated/packages/nuxt/generators/application.json b/docs/generated/packages/nuxt/generators/application.json index 98638f3da4c8a1..fd7c1061369f17 100644 --- a/docs/generated/packages/nuxt/generators/application.json +++ b/docs/generated/packages/nuxt/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNuxtApp", "title": "Create a Nuxt Application for Nx", @@ -89,11 +89,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "none", "label": "None" } ] diff --git a/docs/generated/packages/nuxt/generators/init.json b/docs/generated/packages/nuxt/generators/init.json index d7df654c84c098..5553ce3f172bd7 100644 --- a/docs/generated/packages/nuxt/generators/init.json +++ b/docs/generated/packages/nuxt/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNuxtInit", "title": "Init Nuxt Plugin", "description": "Initialize a Nuxt Plugin.", diff --git a/docs/generated/packages/nuxt/generators/storybook-configuration.json b/docs/generated/packages/nuxt/generators/storybook-configuration.json index b3638ff3c558fe..c22a2a3b5dc81a 100644 --- a/docs/generated/packages/nuxt/generators/storybook-configuration.json +++ b/docs/generated/packages/nuxt/generators/storybook-configuration.json @@ -2,7 +2,7 @@ "name": "storybook-configuration", "factory": "./src/generators/storybook-configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNuxtStorybookConfigure", "title": "Nuxt Storybook Configure", diff --git a/docs/generated/packages/nx/documents/affected-dep-graph.md b/docs/generated/packages/nx/documents/affected-dep-graph.md index d2990a0d66da5a..2a2dd1afc64a84 100644 --- a/docs/generated/packages/nx/documents/affected-dep-graph.md +++ b/docs/generated/packages/nx/documents/affected-dep-graph.md @@ -5,7 +5,7 @@ description: 'Graph dependencies affected by changes' # affected:graph -**Deprecated:** Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18. +**Deprecated:** Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19. Graph dependencies affected by changes diff --git a/docs/generated/packages/nx/documents/print-affected.md b/docs/generated/packages/nx/documents/print-affected.md index d92c41ec16d306..934bcea45fe5be 100644 --- a/docs/generated/packages/nx/documents/print-affected.md +++ b/docs/generated/packages/nx/documents/print-affected.md @@ -5,7 +5,7 @@ description: 'Prints information about the projects and targets affected by chan # print-affected -**Deprecated:** Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18. +**Deprecated:** Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19. Prints information about the projects and targets affected by changes diff --git a/docs/generated/packages/nx/generators/connect-to-nx-cloud.json b/docs/generated/packages/nx/generators/connect-to-nx-cloud.json index c54232addd2a54..c9c3e2eff6933a 100644 --- a/docs/generated/packages/nx/generators/connect-to-nx-cloud.json +++ b/docs/generated/packages/nx/generators/connect-to-nx-cloud.json @@ -2,7 +2,7 @@ "name": "connect-to-nx-cloud", "factory": "./src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "id": "NxCloudInit", "title": "Add Nx Cloud Configuration to the workspace", "description": "Connect a workspace to Nx Cloud.", diff --git a/docs/generated/packages/playwright/executors/playwright.json b/docs/generated/packages/playwright/executors/playwright.json index 039299043e5c6f..5cb06ef6e27ae9 100644 --- a/docs/generated/packages/playwright/executors/playwright.json +++ b/docs/generated/packages/playwright/executors/playwright.json @@ -2,7 +2,7 @@ "name": "playwright", "implementation": "/packages/playwright/src/executors/playwright/playwright.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "Playwright executor", "description": "Run Playwright tests.", diff --git a/docs/generated/packages/playwright/generators/configuration.json b/docs/generated/packages/playwright/generators/configuration.json index 41f740aa111356..9f0685f16068a9 100644 --- a/docs/generated/packages/playwright/generators/configuration.json +++ b/docs/generated/packages/playwright/generators/configuration.json @@ -2,7 +2,7 @@ "name": "configuration", "factory": "./src/generators/configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxPlaywrightConfiguration", "description": "Add a Playwright configuration.", "title": "Add a Playwright configuration", diff --git a/docs/generated/packages/playwright/generators/init.json b/docs/generated/packages/playwright/generators/init.json index ae425e71d6c81a..ef8bb483cc03a4 100644 --- a/docs/generated/packages/playwright/generators/init.json +++ b/docs/generated/packages/playwright/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxPlaywrightInit", "title": "Playwright Init Generator", "description": "Initializes a Playwright project in the current workspace.", diff --git a/docs/generated/packages/plugin/executors/e2e.json b/docs/generated/packages/plugin/executors/e2e.json index 0a47565130f6b4..e6c2f25dc2315d 100644 --- a/docs/generated/packages/plugin/executors/e2e.json +++ b/docs/generated/packages/plugin/executors/e2e.json @@ -201,7 +201,7 @@ "presets": [] }, "description": "Creates and runs the E2E tests for an Nx Plugin.", - "x-deprecated": "@nx/plugin:e2e is deprecated and will be removed in Nx 18. Use @nx/jest:jest instead.", + "x-deprecated": "@nx/plugin:e2e is deprecated and will be removed in Nx v19. Use @nx/jest:jest instead.", "aliases": [], "hidden": false, "path": "/packages/plugin/src/executors/e2e/schema.json", diff --git a/docs/generated/packages/plugin/generators/create-package.json b/docs/generated/packages/plugin/generators/create-package.json index 76d1560b9a2ecb..86536d0fe16bb0 100644 --- a/docs/generated/packages/plugin/generators/create-package.json +++ b/docs/generated/packages/plugin/generators/create-package.json @@ -2,7 +2,7 @@ "name": "create-package", "factory": "./src/generators/create-package/create-package#createPackageGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginCreatePackage", "title": "Create a framework package", diff --git a/docs/generated/packages/plugin/generators/e2e-project.json b/docs/generated/packages/plugin/generators/e2e-project.json index 36ab78142a8e94..6956a0e498ffad 100644 --- a/docs/generated/packages/plugin/generators/e2e-project.json +++ b/docs/generated/packages/plugin/generators/e2e-project.json @@ -2,7 +2,7 @@ "name": "e2e-project", "factory": "./src/generators/e2e-project/e2e#e2eProjectGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginE2E", "title": "Create an E2E app for a Nx Plugin", diff --git a/docs/generated/packages/plugin/generators/executor.json b/docs/generated/packages/plugin/generators/executor.json index bf82c5029a7a07..326befb2d20826 100644 --- a/docs/generated/packages/plugin/generators/executor.json +++ b/docs/generated/packages/plugin/generators/executor.json @@ -2,7 +2,7 @@ "name": "executor", "factory": "./src/generators/executor/executor#executorGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginExecutor", "title": "Create an Executor for an Nx Plugin", @@ -60,7 +60,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipFormat": { "type": "boolean", diff --git a/docs/generated/packages/plugin/generators/generator.json b/docs/generated/packages/plugin/generators/generator.json index a848b150c5a901..acb0f6e9322f30 100644 --- a/docs/generated/packages/plugin/generators/generator.json +++ b/docs/generated/packages/plugin/generators/generator.json @@ -2,7 +2,7 @@ "name": "generator", "factory": "./src/generators/generator/generator#generatorGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginGenerator", "title": "Create a Generator for an Nx Plugin", @@ -49,7 +49,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipFormat": { "type": "boolean", diff --git a/docs/generated/packages/plugin/generators/migration.json b/docs/generated/packages/plugin/generators/migration.json index 48bd04c3b35519..748604daa4d047 100644 --- a/docs/generated/packages/plugin/generators/migration.json +++ b/docs/generated/packages/plugin/generators/migration.json @@ -2,7 +2,7 @@ "name": "migration", "factory": "./src/generators/migration/migration#migrationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginMigration", "title": "Create a Migration for an Nx Plugin", @@ -42,7 +42,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "packageJsonUpdates": { "type": "boolean", diff --git a/docs/generated/packages/plugin/generators/plugin-lint-checks.json b/docs/generated/packages/plugin/generators/plugin-lint-checks.json index bdf4a50fe7c0bf..d4705e2ec908ff 100644 --- a/docs/generated/packages/plugin/generators/plugin-lint-checks.json +++ b/docs/generated/packages/plugin/generators/plugin-lint-checks.json @@ -2,7 +2,7 @@ "name": "plugin-lint-checks", "factory": "./src/generators/lint-checks/generator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "PluginLint", "title": "", diff --git a/docs/generated/packages/plugin/generators/plugin.json b/docs/generated/packages/plugin/generators/plugin.json index 9b346380ebd2a2..783318084799b7 100644 --- a/docs/generated/packages/plugin/generators/plugin.json +++ b/docs/generated/packages/plugin/generators/plugin.json @@ -2,7 +2,7 @@ "name": "plugin", "factory": "./src/generators/plugin/plugin#pluginGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginPlugin", "title": "Create a Plugin for Nx", diff --git a/docs/generated/packages/plugin/generators/preset.json b/docs/generated/packages/plugin/generators/preset.json index 9c92daa6244eaa..0d1ce660e58e55 100644 --- a/docs/generated/packages/plugin/generators/preset.json +++ b/docs/generated/packages/plugin/generators/preset.json @@ -2,7 +2,7 @@ "name": "preset", "factory": "./src/generators/preset/generator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginPreset", "title": "Generator ran by create-nx-plugin", diff --git a/docs/generated/packages/react-native/executors/build-android.json b/docs/generated/packages/react-native/executors/build-android.json index 57c1af8e4a2579..ad753e52a0ba51 100644 --- a/docs/generated/packages/react-native/executors/build-android.json +++ b/docs/generated/packages/react-native/executors/build-android.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeBuildAndroid", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Release Build for Android", "description": "Build target options for Android.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/build-ios.json b/docs/generated/packages/react-native/executors/build-ios.json index 49b82d8e2c1247..ca4496b65e7799 100644 --- a/docs/generated/packages/react-native/executors/build-ios.json +++ b/docs/generated/packages/react-native/executors/build-ios.json @@ -2,7 +2,7 @@ "name": "build-ios", "implementation": "/packages/react-native/src/executors/build-ios/build-ios.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "cli": "nx", "title": "React Native Build iOS executor", diff --git a/docs/generated/packages/react-native/executors/bundle.json b/docs/generated/packages/react-native/executors/bundle.json index 4e04660f68d58c..22dcc39c73e795 100644 --- a/docs/generated/packages/react-native/executors/bundle.json +++ b/docs/generated/packages/react-native/executors/bundle.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeBundle", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Offline JS Bundle for React Native", "description": "JS Bundle target options.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/ensure-symlink.json b/docs/generated/packages/react-native/executors/ensure-symlink.json index cbf8a092f7a011..5145424309d8d3 100644 --- a/docs/generated/packages/react-native/executors/ensure-symlink.json +++ b/docs/generated/packages/react-native/executors/ensure-symlink.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeEnsureSymlink", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Ensure Symlink for React Native", "description": "Ensure workspace node_modules is symlink under app's node_modules folder.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/pod-install.json b/docs/generated/packages/react-native/executors/pod-install.json index e3d37e01a47ea7..1552af8f7930fa 100644 --- a/docs/generated/packages/react-native/executors/pod-install.json +++ b/docs/generated/packages/react-native/executors/pod-install.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativePodInstall", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run Pod Install for React Native iOS Project", "description": "Run `pod install` for React Native iOS Project.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/run-android.json b/docs/generated/packages/react-native/executors/run-android.json index 5593cefeefd1ca..2b37c24a4fc5ac 100644 --- a/docs/generated/packages/react-native/executors/run-android.json +++ b/docs/generated/packages/react-native/executors/run-android.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeRunAndroid", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run Android application", "description": "Run Android target options.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/run-ios.json b/docs/generated/packages/react-native/executors/run-ios.json index cdf60fd6aecb98..9028c9954a8a27 100644 --- a/docs/generated/packages/react-native/executors/run-ios.json +++ b/docs/generated/packages/react-native/executors/run-ios.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeRunIos", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run iOS application", "description": "Run iOS target options.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/start.json b/docs/generated/packages/react-native/executors/start.json index eed219391d3c12..aa6acdbd0b042f 100644 --- a/docs/generated/packages/react-native/executors/start.json +++ b/docs/generated/packages/react-native/executors/start.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeStart", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Packager Server for React Native", "description": "Packager Server target options.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/sync-deps.json b/docs/generated/packages/react-native/executors/sync-deps.json index 3c1a8f4b50b2e1..a832e8ee01772e 100644 --- a/docs/generated/packages/react-native/executors/sync-deps.json +++ b/docs/generated/packages/react-native/executors/sync-deps.json @@ -6,7 +6,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeSyncDeps", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Sync Deps for React Native", "description": "Updates `package.json` with project dependencies.", "type": "object", diff --git a/docs/generated/packages/react-native/executors/upgrade.json b/docs/generated/packages/react-native/executors/upgrade.json new file mode 100644 index 00000000000000..3da81efac70211 --- /dev/null +++ b/docs/generated/packages/react-native/executors/upgrade.json @@ -0,0 +1,21 @@ +{ + "name": "upgrade", + "implementation": "/packages/react-native/src/executors/upgrade/upgrade.impl.ts", + "schema": { + "$schema": "http://json-schema.org/schema", + "version": 2, + "cli": "nx", + "$id": "NxReactNativeUpgrade", + "title": "React Native Upgrade Executor", + "description": "Upgrade React Native code for project.", + "type": "object", + "properties": {}, + "required": [], + "presets": [] + }, + "description": "upgrade executor", + "aliases": [], + "hidden": false, + "path": "/packages/react-native/src/executors/upgrade/schema.json", + "type": "executor" +} diff --git a/docs/generated/packages/react-native/generators/application.json b/docs/generated/packages/react-native/generators/application.json index e98472482f473a..447a4ec4363c07 100644 --- a/docs/generated/packages/react-native/generators/application.json +++ b/docs/generated/packages/react-native/generators/application.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxReactNativeApplication", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create a React Application for Nx", "description": "Create a React Application for Nx.", "examples": [ @@ -48,7 +48,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { @@ -75,20 +75,28 @@ "e2eTestRunner": { "description": "Adds the specified e2e test runner.", "type": "string", - "enum": ["detox", "none"], - "default": "detox" + "enum": ["cypress", "playwright", "detox", "none"], + "default": "cypress" }, "install": { "type": "boolean", "description": "Runs `pod install` for native modules before building iOS app.", - "default": true, - "x-priority": "internal" + "x-prompt": "Run 'pod install' for native modules?", + "default": true }, "skipPackageJson": { "description": "Do not add dependencies to `package.json`.", "type": "boolean", "default": false, "x-priority": "internal" + }, + "bundler": { + "description": "The bundler to use.", + "type": "string", + "enum": ["vite", "webpack"], + "x-prompt": "Which bundler do you want to use to build the application?", + "default": "webpack", + "x-priority": "important" } }, "required": [], diff --git a/docs/generated/packages/react-native/generators/component-story.json b/docs/generated/packages/react-native/generators/component-story.json index a0aafc7f413b97..cef0d5c36513a3 100644 --- a/docs/generated/packages/react-native/generators/component-story.json +++ b/docs/generated/packages/react-native/generators/component-story.json @@ -2,7 +2,7 @@ "name": "component-story", "factory": "./src/generators/component-story/component-story#componentStoryGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeComponentStory", "title": "React native component story", @@ -15,28 +15,36 @@ "description": "The project where to add the components.", "examples": ["shared-ui-component"], "$default": { "$source": "projectName", "index": 0 }, - "x-prompt": "What's the name of the project where the component lives?" + "x-prompt": "What's name of the project where the component lives?", + "x-priority": "important" }, "componentPath": { "type": "string", "description": "Relative path to the component file from the library root.", "examples": ["lib/components"], - "x-prompt": "What's path of the component relative to the project's lib root?" + "x-prompt": "What's path of the component relative to the project's lib root?", + "x-priority": "important" }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", "default": false, "x-priority": "internal" + }, + "interactionTests": { + "type": "boolean", + "description": "Set up Storybook interaction tests.", + "default": true, + "x-priority": "important" } }, "required": ["project", "componentPath"], "presets": [] }, - "description": "Generate Storybook story for a React-native component.", - "hidden": false, + "description": "Generate Storybook story for a React Native component.", "implementation": "/packages/react-native/src/generators/component-story/component-story#componentStoryGenerator.ts", "aliases": [], + "hidden": false, "path": "/packages/react-native/src/generators/component-story/schema.json", "type": "generator" } diff --git a/docs/generated/packages/react-native/generators/component.json b/docs/generated/packages/react-native/generators/component.json index 4f88072b333837..46c67785ff3447 100644 --- a/docs/generated/packages/react-native/generators/component.json +++ b/docs/generated/packages/react-native/generators/component.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxReactNativeApplication", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create a React Native Component for Nx", "description": "Create a React native Component for Nx.", "type": "object", @@ -24,7 +24,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -56,7 +56,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "export": { "type": "boolean", @@ -70,7 +70,7 @@ "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "classComponent": { "type": "boolean", diff --git a/docs/generated/packages/react-native/generators/init.json b/docs/generated/packages/react-native/generators/init.json index 3ef8c1c1166124..2a5b8a6e2567fd 100644 --- a/docs/generated/packages/react-native/generators/init.json +++ b/docs/generated/packages/react-native/generators/init.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxReactNativeInit", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Add Nx React Native Schematics", "description": "Add Nx React native schematics.", "type": "object", @@ -37,7 +37,7 @@ "required": [], "presets": [] }, - "description": "Initialize the `@nrwl/react-native` plugin.", + "description": "Initialize the `@nx/react-native` plugin.", "hidden": true, "implementation": "/packages/react-native/src/generators/init/init#reactNativeInitGenerator.ts", "aliases": [], diff --git a/docs/generated/packages/react-native/generators/library.json b/docs/generated/packages/react-native/generators/library.json index 7865034c3bd370..e5f62087908655 100644 --- a/docs/generated/packages/react-native/generators/library.json +++ b/docs/generated/packages/react-native/generators/library.json @@ -4,7 +4,7 @@ "schema": { "cli": "nx", "$id": "NxReactNativeLibrary", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create a React Native Library for Nx", "description": "Create a React Native Library for Nx.", "type": "object", @@ -36,7 +36,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { diff --git a/docs/generated/packages/react-native/generators/stories.json b/docs/generated/packages/react-native/generators/stories.json index 71dee37f52afab..b0521437272b03 100644 --- a/docs/generated/packages/react-native/generators/stories.json +++ b/docs/generated/packages/react-native/generators/stories.json @@ -2,7 +2,7 @@ "name": "stories", "factory": "./src/generators/stories/stories#storiesGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeStorybookStories", "title": "Generate React Native Storybook stories", @@ -14,7 +14,20 @@ "aliases": ["name", "projectName"], "description": "Project for which to generate stories.", "$default": { "$source": "projectName", "index": 0 }, - "x-prompt": "For which project do you want to generate stories?" + "x-prompt": "For which project do you want to generate stories?", + "x-priority": "important" + }, + "interactionTests": { + "type": "boolean", + "description": "Set up Storybook interaction tests.", + "x-prompt": "Do you want to set up Storybook interaction tests?", + "x-priority": "important", + "default": true + }, + "js": { + "type": "boolean", + "description": "Generate JavaScript files rather than TypeScript files.", + "default": false }, "ignorePaths": { "type": "array", @@ -41,10 +54,10 @@ "required": ["project"], "presets": [] }, - "description": "Create stories/specs for all components declared in an application or library.", - "hidden": false, + "description": "Create stories for all components declared in an application or library.", "implementation": "/packages/react-native/src/generators/stories/stories#storiesGenerator.ts", "aliases": [], + "hidden": false, "path": "/packages/react-native/src/generators/stories/schema.json", "type": "generator" } diff --git a/docs/generated/packages/react-native/generators/storybook-configuration.json b/docs/generated/packages/react-native/generators/storybook-configuration.json index 3f5464210bbe0a..3b6faac5dc7276 100644 --- a/docs/generated/packages/react-native/generators/storybook-configuration.json +++ b/docs/generated/packages/react-native/generators/storybook-configuration.json @@ -2,28 +2,44 @@ "name": "storybook-configuration", "factory": "./src/generators/storybook-configuration/configuration#storybookConfigurationGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeStorybookConfigure", "title": "React native Storybook configuration", "description": "Set up Storybook for a React-Native app or library.", "type": "object", "properties": { - "name": { + "project": { "type": "string", - "aliases": ["project", "projectName"], + "aliases": ["name", "projectName"], "description": "Project for which to generate Storybook configuration.", "$default": { "$source": "argv", "index": 0 }, "x-prompt": "For which project do you want to generate Storybook configuration?", - "x-dropdown": "projects" + "x-dropdown": "projects", + "x-priority": "important" + }, + "interactionTests": { + "type": "boolean", + "description": "Set up Storybook interaction tests.", + "x-prompt": "Do you want to set up Storybook interaction tests?", + "x-priority": "important", + "alias": ["configureTestRunner"], + "default": true }, "generateStories": { "type": "boolean", - "description": "Automatically generate *.stories.ts files for components declared in this project?", + "description": "Automatically generate `*.stories.ts` files for components declared in this project?", "x-prompt": "Automatically generate *.stories.ts files for components declared in this project?", "default": true, "x-priority": "important" }, + "configureStaticServe": { + "type": "boolean", + "description": "Specifies whether to configure a static file server target for serving storybook. Helpful for speeding up CI build/test times.", + "x-prompt": "Configure a static file server for the storybook instance?", + "default": true, + "x-priority": "important" + }, "js": { "type": "boolean", "description": "Generate JavaScript story files rather than TypeScript story files.", @@ -40,12 +56,6 @@ "enum": ["eslint"], "default": "eslint" }, - "standaloneConfig": { - "description": "Split the project configuration into `/project.json` rather than including it inside `workspace.json`.", - "type": "boolean", - "default": true, - "x-deprecated": "Nx only supports standaloneConfig" - }, "ignorePaths": { "type": "array", "description": "Paths to ignore when looking for components.", @@ -62,13 +72,13 @@ ] } }, - "required": ["name"], + "required": ["project"], "presets": [] }, - "description": "Set up Storybook for a React-native application or library.", - "hidden": false, + "description": "Set up Storybook for a React Native application or library.", "implementation": "/packages/react-native/src/generators/storybook-configuration/configuration#storybookConfigurationGenerator.ts", "aliases": [], + "hidden": false, "path": "/packages/react-native/src/generators/storybook-configuration/schema.json", "type": "generator" } diff --git a/docs/generated/packages/react-native/generators/upgrade-native.json b/docs/generated/packages/react-native/generators/upgrade-native.json index e96f322cf12253..98d7f923df80f5 100644 --- a/docs/generated/packages/react-native/generators/upgrade-native.json +++ b/docs/generated/packages/react-native/generators/upgrade-native.json @@ -2,7 +2,7 @@ "name": "upgrade-native", "factory": "./src/generators/upgrade-native/upgrade-native#reactNativeUpgradeNativeGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeUpgradeNativeConfigure", "title": "React native upgrade native configuration", @@ -27,8 +27,8 @@ "e2eTestRunner": { "description": "Adds the specified e2e test runner.", "type": "string", - "enum": ["detox", "none"], - "default": "detox" + "enum": ["cypress", "playwright", "detox", "none"], + "default": "cypress" }, "install": { "type": "boolean", @@ -41,9 +41,9 @@ "presets": [] }, "description": "Destructive command to upgrade native iOS and Android code to latest.", - "hidden": false, "implementation": "/packages/react-native/src/generators/upgrade-native/upgrade-native#reactNativeUpgradeNativeGenerator.ts", "aliases": [], + "hidden": false, "path": "/packages/react-native/src/generators/upgrade-native/schema.json", "type": "generator" } diff --git a/docs/generated/packages/react-native/generators/web-configuration.json b/docs/generated/packages/react-native/generators/web-configuration.json new file mode 100644 index 00000000000000..d472267f6b4ba9 --- /dev/null +++ b/docs/generated/packages/react-native/generators/web-configuration.json @@ -0,0 +1,50 @@ +{ + "name": "web-configuration", + "factory": "./src/generators/web-configuration/web-configuration#webConfigurationGenerator", + "schema": { + "$schema": "http://json-schema.org/schema", + "$id": "NxReactNativeWebConfiguration", + "description": "Setup web configuration to React Native apps using react-native-web.", + "title": "Nx React Native Web configuration", + "type": "object", + "properties": { + "project": { + "type": "string", + "aliases": ["name", "projectName"], + "description": "Project for which to generate web configuration.", + "$default": { "$source": "argv", "index": 0 }, + "x-prompt": "For which project do you want to generate web configuration?", + "x-dropdown": "projects", + "x-priority": "important" + }, + "skipFormat": { + "description": "Skip formatting files.", + "type": "boolean", + "default": false, + "x-priority": "internal" + }, + "skipPackageJson": { + "description": "Do not add dependencies to `package.json`.", + "type": "boolean", + "default": false, + "x-priority": "internal" + }, + "bundler": { + "description": "The bundler to use.", + "type": "string", + "enum": ["vite", "webpack"], + "x-prompt": "Which bundler do you want to use to build the application?", + "default": "webpack", + "x-priority": "important" + } + }, + "required": ["project", "bundler"], + "presets": [] + }, + "description": "Set up web configuration for a React Native app", + "implementation": "/packages/react-native/src/generators/web-configuration/web-configuration#webConfigurationGenerator.ts", + "aliases": [], + "hidden": false, + "path": "/packages/react-native/src/generators/web-configuration/schema.json", + "type": "generator" +} diff --git a/docs/generated/packages/react/generators/application.json b/docs/generated/packages/react/generators/application.json index 13e85e18997b71..b1fcfb1f119eea 100644 --- a/docs/generated/packages/react/generators/application.json +++ b/docs/generated/packages/react/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#applicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactApp", "title": "Create a React Application", @@ -53,11 +53,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/docs/generated/packages/react/generators/component-cypress-spec.json b/docs/generated/packages/react/generators/component-cypress-spec.json index ac932d09c9670d..4efc7e1b564604 100644 --- a/docs/generated/packages/react/generators/component-cypress-spec.json +++ b/docs/generated/packages/react/generators/component-cypress-spec.json @@ -2,7 +2,7 @@ "name": "component-cypress-spec", "factory": "./src/generators/component-cypress-spec/component-cypress-spec#componentCypressGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactComponentCypressSpec", "title": "Create component Cypress spec", diff --git a/docs/generated/packages/react/generators/component-story.json b/docs/generated/packages/react/generators/component-story.json index 5122138cb60da4..a8d1078b65b95a 100644 --- a/docs/generated/packages/react/generators/component-story.json +++ b/docs/generated/packages/react/generators/component-story.json @@ -2,7 +2,7 @@ "name": "component-story", "factory": "./src/generators/component-story/component-story#componentStoryGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactComponentStory", "title": "Create component story", diff --git a/docs/generated/packages/react/generators/component-test.json b/docs/generated/packages/react/generators/component-test.json index b3973d92a1ee52..f3a9a5c76f6d63 100644 --- a/docs/generated/packages/react/generators/component-test.json +++ b/docs/generated/packages/react/generators/component-test.json @@ -2,7 +2,7 @@ "name": "component-test", "factory": "./src/generators/component-test/component-test#componentTestGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactCypressComponentTest", "title": "Add Cypress component test", diff --git a/docs/generated/packages/react/generators/component.json b/docs/generated/packages/react/generators/component.json index 5bf5ea4a2f18a0..7b8aafb0c85c62 100644 --- a/docs/generated/packages/react/generators/component.json +++ b/docs/generated/packages/react/generators/component.json @@ -2,7 +2,7 @@ "name": "component", "factory": "./src/generators/component/component#componentGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactComponent", "title": "Create a React Component", @@ -14,7 +14,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -35,11 +35,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", @@ -83,7 +83,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "export": { "type": "boolean", @@ -97,14 +97,14 @@ "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `App/App.tsx`).", "alias": "R", "default": false, - "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "classComponent": { "type": "boolean", diff --git a/docs/generated/packages/react/generators/cypress-component-configuration.json b/docs/generated/packages/react/generators/cypress-component-configuration.json index 1dfd46c04dfc4b..92318551bd83c9 100644 --- a/docs/generated/packages/react/generators/cypress-component-configuration.json +++ b/docs/generated/packages/react/generators/cypress-component-configuration.json @@ -53,7 +53,7 @@ } }, "required": ["project"], - "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nReact component testing with Nx requires **Cypress version 10.7.0** and up.\n\nYou can migrate with to v10 via the [migrate-to-cypress-10 generator](/packages/cypress/generators/migrate-to-cypress-10).\n\nThis generator is for Cypress based component testing.\n\nIf you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 18.\n{% /callout %}\n\nThis generator is designed to get your React project up and running with Cypress Component Testing.\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project\n```\n\nRunning this generator, adds the required files to the specified project with a preconfigured `cypress.config.ts` designed for Nx workspaces.\n\nThe following file will be added to projects where the Component Testing build target is using `webpack` for bundling:\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/react/plugins/component-testing';\n\nexport default defineConfig({\n component: nxComponentTestingPreset(__filename, {\n bundler: 'webpack',\n }),\n});\n```\n\nThe following file will be added to projects where the Component Testing build target is using `vite` for bundling:\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/react/plugins/component-testing';\n\nexport default defineConfig({\n component: nxComponentTestingPreset(__filename, {\n bundler: 'vite',\n }),\n});\n```\n\nHere is an example on how to add custom options to the configuration\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/react/plugins/component-testing';\n\nexport default defineConfig({\n component: {\n ...nxComponentTestingPreset(__filename, {\n bundler: 'webpack',\n }),\n // extra options here\n },\n});\n```\n\n## The `bundler` option\n\nComponent testing supports two different bundlers: `webpack` and `vite`. The Nx generator will pick up the bundler used in the specified project's build target. If the build target is using `@nx/webpack:webpack`, then the generator will use `webpack` as the bundler. If the build target is using `@nx/vite:build`, then the generator will use `vite` as the bundler.\n\nYou can manually set the bundler by passing `--bundler=webpack` or `--bundler=vite` to the generator, but that is not needed since the generator will pick up the correct bundler for you. However, if you want to use a different bundler than the one that is used in the build target, then you can manually set it using that flag.\n\n## Specifying a Build Target\n\nComponent testing requires a _build target_ to correctly run the component test dev server. This option can be manually specified with `--build-target=some-react-app:build`, but Nx will infer this usage from the [project graph](/concepts/mental-model#the-project-graph) if one isn't provided.\n\nFor React projects, the build target needs to be using the `@nx/webpack:webpack` executor.\nThe generator will throw an error if a build target can't be found and suggest passing one in manually.\n\nLetting Nx infer the build target by default\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project\n```\n\nManually specifying the build target\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project --build-target:some-react-app:build --generate-tests\n```\n\n{% callout type=\"note\" title=\"Build Target with Configuration\" %}\nIf you're wanting to use a build target with a specific configuration. i.e. `my-app:build:production`,\nthen manually providing `--build-target=my-app:build:production` is the best way to do that.\n{% /callout %}\n\n## Auto Generating Tests\n\nYou can optionally use the `--generate-tests` flag to generate a test file for each component in your project.\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project --generate-tests\n```\n\n## Running Component Tests\n\nA new `component-test` target will be added to the specified project to run your component tests.\n\n```shell\nnx g component-test my-cool-react-project\n```\n\nHere is an example of the project configuration that is generated. The `--build-target` option is added as the `devServerTarget` which can be changed as needed.\n\n```json {% fileName=\"project.json\" %}\n{\n \"targets\" {\n \"component-test\": {\n \"executor\": \"@nx/cypress:cypress\",\n \"options\": {\n \"cypressConfig\": \"/cypress.config.ts\",\n \"testingType\": \"component\",\n \"devServerTarget\": \"some-react-app:build\",\n \"skipServe\": true\n }\n }\n }\n}\n```\n\nNx also supports [Angular component testing](/packages/angular/generators/cypress-component-configuration).\n", + "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nReact component testing with Nx requires **Cypress version 10.7.0** and up.\n\nYou can migrate with to v10 via the [migrate-to-cypress-10 generator](/packages/cypress/generators/migrate-to-cypress-10).\n\nThis generator is for Cypress based component testing.\n\nIf you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 19.\n{% /callout %}\n\nThis generator is designed to get your React project up and running with Cypress Component Testing.\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project\n```\n\nRunning this generator, adds the required files to the specified project with a preconfigured `cypress.config.ts` designed for Nx workspaces.\n\nThe following file will be added to projects where the Component Testing build target is using `webpack` for bundling:\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/react/plugins/component-testing';\n\nexport default defineConfig({\n component: nxComponentTestingPreset(__filename, {\n bundler: 'webpack',\n }),\n});\n```\n\nThe following file will be added to projects where the Component Testing build target is using `vite` for bundling:\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/react/plugins/component-testing';\n\nexport default defineConfig({\n component: nxComponentTestingPreset(__filename, {\n bundler: 'vite',\n }),\n});\n```\n\nHere is an example on how to add custom options to the configuration\n\n```ts {% fileName=\"cypress.config.ts\" %}\nimport { defineConfig } from 'cypress';\nimport { nxComponentTestingPreset } from '@nx/react/plugins/component-testing';\n\nexport default defineConfig({\n component: {\n ...nxComponentTestingPreset(__filename, {\n bundler: 'webpack',\n }),\n // extra options here\n },\n});\n```\n\n## The `bundler` option\n\nComponent testing supports two different bundlers: `webpack` and `vite`. The Nx generator will pick up the bundler used in the specified project's build target. If the build target is using `@nx/webpack:webpack`, then the generator will use `webpack` as the bundler. If the build target is using `@nx/vite:build`, then the generator will use `vite` as the bundler.\n\nYou can manually set the bundler by passing `--bundler=webpack` or `--bundler=vite` to the generator, but that is not needed since the generator will pick up the correct bundler for you. However, if you want to use a different bundler than the one that is used in the build target, then you can manually set it using that flag.\n\n## Specifying a Build Target\n\nComponent testing requires a _build target_ to correctly run the component test dev server. This option can be manually specified with `--build-target=some-react-app:build`, but Nx will infer this usage from the [project graph](/concepts/mental-model#the-project-graph) if one isn't provided.\n\nFor React projects, the build target needs to be using the `@nx/webpack:webpack` executor.\nThe generator will throw an error if a build target can't be found and suggest passing one in manually.\n\nLetting Nx infer the build target by default\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project\n```\n\nManually specifying the build target\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project --build-target:some-react-app:build --generate-tests\n```\n\n{% callout type=\"note\" title=\"Build Target with Configuration\" %}\nIf you're wanting to use a build target with a specific configuration. i.e. `my-app:build:production`,\nthen manually providing `--build-target=my-app:build:production` is the best way to do that.\n{% /callout %}\n\n## Auto Generating Tests\n\nYou can optionally use the `--generate-tests` flag to generate a test file for each component in your project.\n\n```shell\nnx g @nx/react:cypress-component-configuration --project=my-cool-react-project --generate-tests\n```\n\n## Running Component Tests\n\nA new `component-test` target will be added to the specified project to run your component tests.\n\n```shell\nnx g component-test my-cool-react-project\n```\n\nHere is an example of the project configuration that is generated. The `--build-target` option is added as the `devServerTarget` which can be changed as needed.\n\n```json {% fileName=\"project.json\" %}\n{\n \"targets\" {\n \"component-test\": {\n \"executor\": \"@nx/cypress:cypress\",\n \"options\": {\n \"cypressConfig\": \"/cypress.config.ts\",\n \"testingType\": \"component\",\n \"devServerTarget\": \"some-react-app:build\",\n \"skipServe\": true\n }\n }\n }\n}\n```\n\nNx also supports [Angular component testing](/packages/angular/generators/cypress-component-configuration).\n", "presets": [] }, "description": "Setup Cypress component testing for a React project", diff --git a/docs/generated/packages/react/generators/federate-module.json b/docs/generated/packages/react/generators/federate-module.json index 0a3ff415c877e9..0f156209fedc09 100644 --- a/docs/generated/packages/react/generators/federate-module.json +++ b/docs/generated/packages/react/generators/federate-module.json @@ -2,7 +2,7 @@ "name": "federate-module", "factory": "./src/generators/federate-module/federate-module#federateModuleGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", diff --git a/docs/generated/packages/react/generators/hook.json b/docs/generated/packages/react/generators/hook.json index 7852066ed8ec29..ef84c39c7671ab 100644 --- a/docs/generated/packages/react/generators/hook.json +++ b/docs/generated/packages/react/generators/hook.json @@ -2,7 +2,7 @@ "name": "hook", "factory": "./src/generators/hook/hook#hookGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactHook", "title": "Create a React Hook for Nx", @@ -20,7 +20,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -54,7 +54,7 @@ "type": "boolean", "description": "Create hook at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "export": { "type": "boolean", @@ -68,14 +68,14 @@ "description": "Use pascal case hook file name (e.g. `useHook.ts`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `useHook/useHook.ts`).", "alias": "R", "default": false, - "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." } }, "required": ["name"], diff --git a/docs/generated/packages/react/generators/host.json b/docs/generated/packages/react/generators/host.json index e9d23a87e3d19c..f6541bee84e48e 100644 --- a/docs/generated/packages/react/generators/host.json +++ b/docs/generated/packages/react/generators/host.json @@ -2,7 +2,7 @@ "name": "host", "factory": "./src/generators/host/host#hostGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactHost", "cli": "nx", "title": "Generate Module Federation Setup for React Host App", @@ -40,11 +40,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/docs/generated/packages/react/generators/init.json b/docs/generated/packages/react/generators/init.json index 7f7ccd41cfec54..d2061793c1e59f 100644 --- a/docs/generated/packages/react/generators/init.json +++ b/docs/generated/packages/react/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#reactInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxReactNgInit", "title": "Init React Plugin", "description": "Initialize a React Plugin.", diff --git a/docs/generated/packages/react/generators/library.json b/docs/generated/packages/react/generators/library.json index cac4960ec08c31..cd86079a665512 100644 --- a/docs/generated/packages/react/generators/library.json +++ b/docs/generated/packages/react/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "factory": "./src/generators/library/library#libraryGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactLibrary", "title": "Create a React Library", @@ -50,11 +50,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/docs/generated/packages/react/generators/redux.json b/docs/generated/packages/react/generators/redux.json index bcd947e5264686..c62324fef9cde3 100644 --- a/docs/generated/packages/react/generators/redux.json +++ b/docs/generated/packages/react/generators/redux.json @@ -2,7 +2,7 @@ "name": "redux", "factory": "./src/generators/redux/redux#reduxGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "redux", "title": "Create Redux state", @@ -20,7 +20,7 @@ "description": "The name of the project to add the slice to. If it is an application, then the store configuration will be updated too.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "directory": { "type": "string", diff --git a/docs/generated/packages/react/generators/remote.json b/docs/generated/packages/react/generators/remote.json index 6a54a251572497..f9b6de2b9fc0be 100644 --- a/docs/generated/packages/react/generators/remote.json +++ b/docs/generated/packages/react/generators/remote.json @@ -2,7 +2,7 @@ "name": "remote", "factory": "./src/generators/remote/remote#remoteGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactRemote", "cli": "nx", "title": "Generate Module Federation Setup for React Remote App", @@ -46,11 +46,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/docs/generated/packages/react/generators/setup-ssr.json b/docs/generated/packages/react/generators/setup-ssr.json index 97a6c23cedcf4e..874b7dbf480f2b 100644 --- a/docs/generated/packages/react/generators/setup-ssr.json +++ b/docs/generated/packages/react/generators/setup-ssr.json @@ -2,7 +2,7 @@ "name": "setup-ssr", "factory": "./src/generators/setup-ssr/setup-ssr#setupSsrGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactSSRSetup", "cli": "nx", "title": "Generate SSR setup for a React app", diff --git a/docs/generated/packages/react/generators/setup-tailwind.json b/docs/generated/packages/react/generators/setup-tailwind.json index 22a29c02ac04d0..e87ffb2fa7c001 100644 --- a/docs/generated/packages/react/generators/setup-tailwind.json +++ b/docs/generated/packages/react/generators/setup-tailwind.json @@ -2,7 +2,7 @@ "name": "setup-tailwind", "factory": "./src/generators/setup-tailwind/setup-tailwind#setupTailwindGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactTailwindSetupGenerator", "title": "Configures Tailwind CSS for an application or a buildable/publishable library.", diff --git a/docs/generated/packages/react/generators/stories.json b/docs/generated/packages/react/generators/stories.json index 031ebf0ccf8c87..4f5a13820c10a3 100644 --- a/docs/generated/packages/react/generators/stories.json +++ b/docs/generated/packages/react/generators/stories.json @@ -2,7 +2,7 @@ "name": "stories", "factory": "./src/generators/stories/stories#storiesGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactStorybookStories", "title": "Generate React Storybook stories", diff --git a/docs/generated/packages/react/generators/storybook-configuration.json b/docs/generated/packages/react/generators/storybook-configuration.json index febf0cf4f75550..a66d9d72601d77 100644 --- a/docs/generated/packages/react/generators/storybook-configuration.json +++ b/docs/generated/packages/react/generators/storybook-configuration.json @@ -2,7 +2,7 @@ "name": "storybook-configuration", "factory": "./src/generators/storybook-configuration/configuration#storybookConfigurationGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactStorybookConfigure", "title": "React Storybook Configure", @@ -29,7 +29,7 @@ "configureCypress": { "type": "boolean", "description": "Run the cypress-configure generator.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "generateStories": { "type": "boolean", @@ -41,7 +41,7 @@ "generateCypressSpecs": { "type": "boolean", "description": "Automatically generate test files in the Cypress E2E app generated by the `cypress-configure` generator.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "configureStaticServe": { "type": "boolean", @@ -53,7 +53,7 @@ "cypressDirectory": { "type": "string", "description": "A directory where the Cypress project will be placed. Placed at the root by default.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "js": { "type": "boolean", diff --git a/docs/generated/packages/remix/executors/build.json b/docs/generated/packages/remix/executors/build.json index 7dbc7c5f72f8b7..1980398baa748f 100644 --- a/docs/generated/packages/remix/executors/build.json +++ b/docs/generated/packages/remix/executors/build.json @@ -4,7 +4,7 @@ "schema": { "version": 2, "outputCapture": "pipe", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Remix Build", "description": "Build a Remix app.", diff --git a/docs/generated/packages/remix/generators/action.json b/docs/generated/packages/remix/generators/action.json index ac87ad81d66b5c..06c12154998705 100644 --- a/docs/generated/packages/remix/generators/action.json +++ b/docs/generated/packages/remix/generators/action.json @@ -2,7 +2,7 @@ "name": "action", "implementation": "/packages/remix/src/generators/action/action.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "action", "type": "object", "description": "Generate an action for a given route.", @@ -22,7 +22,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"], diff --git a/docs/generated/packages/remix/generators/application.json b/docs/generated/packages/remix/generators/application.json index 0cddbd21ceb33b..97b621c845c862 100644 --- a/docs/generated/packages/remix/generators/application.json +++ b/docs/generated/packages/remix/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "implementation": "/packages/remix/src/generators/application/application.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixApplication", "title": "Create an Application", "description": "Generate a new Remix application.", diff --git a/docs/generated/packages/remix/generators/cypress.json b/docs/generated/packages/remix/generators/cypress.json index d70e3f8f72d6be..f18cee4144a465 100644 --- a/docs/generated/packages/remix/generators/cypress.json +++ b/docs/generated/packages/remix/generators/cypress.json @@ -2,7 +2,7 @@ "name": "cypress", "implementation": "/packages/remix/src/generators/cypress/cypress.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixCypress", "title": "", "type": "object", diff --git a/docs/generated/packages/remix/generators/error-boundary.json b/docs/generated/packages/remix/generators/error-boundary.json index 03c2c63a3e63cc..b5834694ecfca3 100644 --- a/docs/generated/packages/remix/generators/error-boundary.json +++ b/docs/generated/packages/remix/generators/error-boundary.json @@ -2,7 +2,7 @@ "name": "error-boundary", "implementation": "/packages/remix/src/generators/error-boundary/error-boundary.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixErrorBoundary", "title": "Create an ErrorBoundary for a Route", "description": "Generate an ErrorBoundary for a given route.", @@ -27,7 +27,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." }, "skipFormat": { "type": "boolean", diff --git a/docs/generated/packages/remix/generators/init.json b/docs/generated/packages/remix/generators/init.json index 4c094d7a8fd0a8..92443abc5f4cc9 100644 --- a/docs/generated/packages/remix/generators/init.json +++ b/docs/generated/packages/remix/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "implementation": "/packages/remix/src/generators/init/init.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixInit", "title": "Init Remix Plugin", "description": "Initialize the Remix Plugin.", diff --git a/docs/generated/packages/remix/generators/library.json b/docs/generated/packages/remix/generators/library.json index 23dbd2f5b6fa92..e1dd418cf8e65d 100644 --- a/docs/generated/packages/remix/generators/library.json +++ b/docs/generated/packages/remix/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "implementation": "/packages/remix/src/generators/library/library.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixLibrary", "title": "Create a Library", "description": "Generate a Remix library to help structure workspace and application.", diff --git a/docs/generated/packages/remix/generators/loader.json b/docs/generated/packages/remix/generators/loader.json index 503b0907535a92..b6a366ab1164aa 100644 --- a/docs/generated/packages/remix/generators/loader.json +++ b/docs/generated/packages/remix/generators/loader.json @@ -2,7 +2,7 @@ "name": "loader", "implementation": "/packages/remix/src/generators/loader/loader.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "data-loader", "type": "object", "description": "Generate an loader for a given route.", @@ -22,7 +22,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"], diff --git a/docs/generated/packages/remix/generators/meta.json b/docs/generated/packages/remix/generators/meta.json index 40d7ebb77b9e92..85399646bdf24e 100644 --- a/docs/generated/packages/remix/generators/meta.json +++ b/docs/generated/packages/remix/generators/meta.json @@ -2,7 +2,7 @@ "name": "meta", "implementation": "/packages/remix/src/generators/meta/meta.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "meta", "type": "object", "description": "Generate a meta function for a given route.", @@ -22,7 +22,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"], diff --git a/docs/generated/packages/remix/generators/preset.json b/docs/generated/packages/remix/generators/preset.json index e04e5842e01c0f..a24979c2067c0a 100644 --- a/docs/generated/packages/remix/generators/preset.json +++ b/docs/generated/packages/remix/generators/preset.json @@ -2,7 +2,7 @@ "name": "preset", "implementation": "/packages/remix/src/generators/preset/preset.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "Remix", "title": "", "type": "object", diff --git a/docs/generated/packages/remix/generators/resource-route.json b/docs/generated/packages/remix/generators/resource-route.json index 8d89f1d3a027c6..f57b7f1d0a0ff1 100644 --- a/docs/generated/packages/remix/generators/resource-route.json +++ b/docs/generated/packages/remix/generators/resource-route.json @@ -2,7 +2,7 @@ "name": "resource-route", "implementation": "/packages/remix/src/generators/resource-route/resource-route.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixResourceRoute", "title": "Create a Resource Route", "type": "object", @@ -29,7 +29,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." }, "action": { "type": "boolean", diff --git a/docs/generated/packages/remix/generators/route.json b/docs/generated/packages/remix/generators/route.json index 62db9da5a73398..e9bc0ee09d1601 100644 --- a/docs/generated/packages/remix/generators/route.json +++ b/docs/generated/packages/remix/generators/route.json @@ -2,7 +2,7 @@ "name": "route", "implementation": "/packages/remix/src/generators/route/route.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixRoute", "title": "Create a Route", "description": "Generate a route.", @@ -29,7 +29,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." }, "style": { "type": "string", diff --git a/docs/generated/packages/remix/generators/setup-tailwind.json b/docs/generated/packages/remix/generators/setup-tailwind.json index d11741283662a8..215eca3cdc2514 100644 --- a/docs/generated/packages/remix/generators/setup-tailwind.json +++ b/docs/generated/packages/remix/generators/setup-tailwind.json @@ -2,7 +2,7 @@ "name": "setup-tailwind", "implementation": "/packages/remix/src/generators/setup-tailwind/setup-tailwind.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixTailwind", "title": "Add TailwindCSS to a Remix App", "description": "Setup tailwindcss for a given project.", diff --git a/docs/generated/packages/remix/generators/setup.json b/docs/generated/packages/remix/generators/setup.json index 2f1a6c7fd71dee..7a901a0d6029b0 100644 --- a/docs/generated/packages/remix/generators/setup.json +++ b/docs/generated/packages/remix/generators/setup.json @@ -2,7 +2,7 @@ "name": "setup", "implementation": "/packages/remix/src/generators/setup/setup.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixSetup", "title": "", "type": "object", diff --git a/docs/generated/packages/remix/generators/storybook-configuration.json b/docs/generated/packages/remix/generators/storybook-configuration.json index a5b090e4f88ae1..0d15ceeac0640e 100644 --- a/docs/generated/packages/remix/generators/storybook-configuration.json +++ b/docs/generated/packages/remix/generators/storybook-configuration.json @@ -2,7 +2,7 @@ "name": "storybook-configuration", "implementation": "/packages/remix/src/generators/storybook-configuration/storybook-configuration.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxRemixStorybookConfigure", "title": "Remix Storybook Configuration", diff --git a/docs/generated/packages/remix/generators/style.json b/docs/generated/packages/remix/generators/style.json index cb39a42df43a97..d298b13073d4e1 100644 --- a/docs/generated/packages/remix/generators/style.json +++ b/docs/generated/packages/remix/generators/style.json @@ -2,7 +2,7 @@ "name": "style", "implementation": "/packages/remix/src/generators/style/style.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixRouteStyle", "title": "Add style import to a route", "description": "Generate a style import and file for a given route.", @@ -29,7 +29,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"], diff --git a/docs/generated/packages/rollup/generators/configuration.json b/docs/generated/packages/rollup/generators/configuration.json index 87e125f21aabfc..813d3e3b3ce83e 100644 --- a/docs/generated/packages/rollup/generators/configuration.json +++ b/docs/generated/packages/rollup/generators/configuration.json @@ -3,7 +3,7 @@ "aliases": ["rollup-project"], "factory": "./src/generators/configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRollupProject", "cli": "nx", "title": "Add Rollup Configuration to a project", diff --git a/docs/generated/packages/rollup/generators/init.json b/docs/generated/packages/rollup/generators/init.json index 41d4c483059933..7b41beaf84dcf5 100644 --- a/docs/generated/packages/rollup/generators/init.json +++ b/docs/generated/packages/rollup/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#rollupInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebpackInit", "cli": "nx", "title": "Init Webpack Plugin", diff --git a/docs/generated/packages/storybook/generators/configuration.json b/docs/generated/packages/storybook/generators/configuration.json index f7df53674b1f91..b615f302188611 100644 --- a/docs/generated/packages/storybook/generators/configuration.json +++ b/docs/generated/packages/storybook/generators/configuration.json @@ -2,7 +2,7 @@ "name": "configuration", "factory": "./src/generators/configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxStorybookConfigure", "title": "Storybook Configuration", @@ -28,12 +28,12 @@ "configureCypress": { "type": "boolean", "description": "Run the cypress-configure generator.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "cypressDirectory": { "type": "string", "description": "A directory where the Cypress project will be placed. Added at root by default.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "linter": { "description": "The tool to use for running lint checks.", @@ -63,13 +63,6 @@ "description": "Add a static-storybook to serve the static storybook built files.", "default": false }, - "bundler": { - "description": "The Storybook builder to use.", - "type": "string", - "enum": ["vite", "webpack"], - "default": "webpack", - "x-priority": "important" - }, "uiFramework": { "type": "string", "description": "Storybook UI Framework to use.", diff --git a/docs/generated/packages/storybook/generators/cypress-project.json b/docs/generated/packages/storybook/generators/cypress-project.json index 9235f914e044c5..cf1579a86e212e 100644 --- a/docs/generated/packages/storybook/generators/cypress-project.json +++ b/docs/generated/packages/storybook/generators/cypress-project.json @@ -2,7 +2,7 @@ "name": "cypress-project", "factory": "./src/generators/cypress-project/cypress-project", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "cypress-configure", "title": "Cypress Configuration", diff --git a/docs/generated/packages/vite/executors/build.json b/docs/generated/packages/vite/executors/build.json index 1677bd58a6f988..6351ec0e8eb9bf 100644 --- a/docs/generated/packages/vite/executors/build.json +++ b/docs/generated/packages/vite/executors/build.json @@ -26,6 +26,12 @@ "description": "Skip type-checking via TypeScript. Skipping type-checking speeds up the build but type errors are not caught.", "default": false }, + "tsConfig": { + "type": "string", + "description": "The path to custom tsconfig file for type-checking when skipTypeCheck is false. Required when tsconfig file is not at the projectRoot level.", + "x-completion-type": "file", + "x-completion-glob": "tsconfig.*.json" + }, "configFile": { "type": "string", "description": "The name of the Vite.js configuration file.", diff --git a/docs/generated/packages/vite/executors/preview-server.json b/docs/generated/packages/vite/executors/preview-server.json index e2081c0e4539e8..155c06d5acc3d1 100644 --- a/docs/generated/packages/vite/executors/preview-server.json +++ b/docs/generated/packages/vite/executors/preview-server.json @@ -2,7 +2,7 @@ "name": "preview-server", "implementation": "/packages/vite/src/executors/preview-server/preview-server.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "cli": "nx", "title": "Vite Preview Server", diff --git a/docs/generated/packages/vite/executors/test.json b/docs/generated/packages/vite/executors/test.json index 86c15857007046..561a9247994d9b 100644 --- a/docs/generated/packages/vite/executors/test.json +++ b/docs/generated/packages/vite/executors/test.json @@ -2,7 +2,7 @@ "name": "test", "implementation": "/packages/vite/src/executors/test/vitest.impl.ts", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "cli": "nx", "title": "Vitest executor", diff --git a/docs/generated/packages/vite/generators/vitest.json b/docs/generated/packages/vite/generators/vitest.json index 7a14929e696a7b..c2e25d88605b4f 100644 --- a/docs/generated/packages/vite/generators/vitest.json +++ b/docs/generated/packages/vite/generators/vitest.json @@ -2,7 +2,7 @@ "name": "vitest", "factory": "./src/generators/vitest/vitest-generator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "Vitest", "title": "Vitest", diff --git a/docs/generated/packages/vue/generators/application.json b/docs/generated/packages/vue/generators/application.json index 31e539a2be8477..848ef8be3bf57e 100644 --- a/docs/generated/packages/vue/generators/application.json +++ b/docs/generated/packages/vue/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueApp", "title": "Create a Vue Application", @@ -49,11 +49,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "none", "label": "None" } ] diff --git a/docs/generated/packages/vue/generators/component.json b/docs/generated/packages/vue/generators/component.json index 9b8263005d3020..1103adece43a14 100644 --- a/docs/generated/packages/vue/generators/component.json +++ b/docs/generated/packages/vue/generators/component.json @@ -2,7 +2,7 @@ "name": "component", "factory": "./src/generators/component/component#componentGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueComponent", "title": "Create a Vue Component", @@ -20,7 +20,7 @@ "description": "The name of the project.", "alias": "p", "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -55,7 +55,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "export": { "type": "boolean", @@ -69,14 +69,14 @@ "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the desired `name` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the desired `name` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `App/App.tsx`).", "alias": "R", "default": false, - "x-deprecated": "Provide the desired `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the desired `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "routing": { "type": "boolean", diff --git a/docs/generated/packages/vue/generators/init.json b/docs/generated/packages/vue/generators/init.json index e80a83693b7f18..85678a1aa0b860 100644 --- a/docs/generated/packages/vue/generators/init.json +++ b/docs/generated/packages/vue/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxVueInit", "title": "Init Vue Plugin", "description": "Initialize a Vue Plugin.", diff --git a/docs/generated/packages/vue/generators/library.json b/docs/generated/packages/vue/generators/library.json index 88b416f1dc7ce8..bab66b7bddf308 100644 --- a/docs/generated/packages/vue/generators/library.json +++ b/docs/generated/packages/vue/generators/library.json @@ -2,7 +2,7 @@ "name": "library", "factory": "./src/generators/library/library", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueLibrary", "title": "Create a Vue Library", diff --git a/docs/generated/packages/vue/generators/setup-tailwind.json b/docs/generated/packages/vue/generators/setup-tailwind.json index 44b58b948e2688..7e9ded504e91e7 100644 --- a/docs/generated/packages/vue/generators/setup-tailwind.json +++ b/docs/generated/packages/vue/generators/setup-tailwind.json @@ -2,7 +2,7 @@ "name": "setup-tailwind", "factory": "./src/generators/setup-tailwind/setup-tailwind", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueTailwindSetupGenerator", "title": "Configures Tailwind CSS for an application or a library.", diff --git a/docs/generated/packages/vue/generators/stories.json b/docs/generated/packages/vue/generators/stories.json index 19dfea258bbff3..203f783bf2cbe0 100644 --- a/docs/generated/packages/vue/generators/stories.json +++ b/docs/generated/packages/vue/generators/stories.json @@ -2,7 +2,7 @@ "name": "stories", "factory": "./src/generators/stories/stories", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueStorybookStories", "title": "Generate Vue Storybook stories", diff --git a/docs/generated/packages/vue/generators/storybook-configuration.json b/docs/generated/packages/vue/generators/storybook-configuration.json index 70f42e987c8a95..3cd96607aa1dfb 100644 --- a/docs/generated/packages/vue/generators/storybook-configuration.json +++ b/docs/generated/packages/vue/generators/storybook-configuration.json @@ -2,7 +2,7 @@ "name": "storybook-configuration", "factory": "./src/generators/storybook-configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueStorybookConfigure", "title": "Vue Storybook Configure", diff --git a/docs/generated/packages/web/generators/application.json b/docs/generated/packages/web/generators/application.json index c10525ee7b12e7..758b8e14e75e68 100644 --- a/docs/generated/packages/web/generators/application.json +++ b/docs/generated/packages/web/generators/application.json @@ -2,7 +2,7 @@ "name": "application", "factory": "./src/generators/application/application#applicationGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxWebApp", "title": "Create a Web Application for Nx", @@ -36,11 +36,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/docs/generated/packages/web/generators/init.json b/docs/generated/packages/web/generators/init.json index e8da402278c38d..1d9572ca8b95d2 100644 --- a/docs/generated/packages/web/generators/init.json +++ b/docs/generated/packages/web/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#webInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebInit", "cli": "nx", "title": "Init Web Plugin", diff --git a/docs/generated/packages/web/generators/static-config.json b/docs/generated/packages/web/generators/static-config.json index 6249445d5ef34e..a68ada04f1aecf 100644 --- a/docs/generated/packages/web/generators/static-config.json +++ b/docs/generated/packages/web/generators/static-config.json @@ -2,7 +2,7 @@ "name": "static-config", "factory": "./src/generators/static-serve/static-serve-configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebStaticServe", "cli": "nx", "title": "Static Serve Configuration", diff --git a/docs/generated/packages/webpack/executors/webpack.json b/docs/generated/packages/webpack/executors/webpack.json index 5f56c5a8d5d36e..5ca86abced7fb9 100644 --- a/docs/generated/packages/webpack/executors/webpack.json +++ b/docs/generated/packages/webpack/executors/webpack.json @@ -311,7 +311,7 @@ "type": "boolean", "description": "Do not apply Nx webpack plugins automatically. Plugins need to be applied in the project's webpack.config.js file (e.g. withNx, withReact, etc.).", "default": true, - "x-deprecated": "Automatic configuration of Webpack is deprecated in favor of an explicit 'webpack.config.js' file. This option will be removed in Nx 18. See https://nx.dev/recipes/webpack/webpack-config-setup." + "x-deprecated": "Automatic configuration of Webpack is deprecated in favor of an explicit 'webpack.config.js' file. This option will be removed in Nx 19. See https://nx.dev/recipes/webpack/webpack-config-setup." }, "standardWebpackConfigFunction": { "type": "boolean", diff --git a/docs/generated/packages/webpack/generators/configuration.json b/docs/generated/packages/webpack/generators/configuration.json index 508705b601e492..79ed5f99a6abd8 100644 --- a/docs/generated/packages/webpack/generators/configuration.json +++ b/docs/generated/packages/webpack/generators/configuration.json @@ -3,7 +3,7 @@ "aliases": ["webpack-project"], "factory": "./src/generators/configuration/configuration", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebpackProject", "cli": "nx", "title": "Add Webpack Configuration to a project", diff --git a/docs/generated/packages/webpack/generators/init.json b/docs/generated/packages/webpack/generators/init.json index d26831485ce04c..4da1d3070aeeb5 100644 --- a/docs/generated/packages/webpack/generators/init.json +++ b/docs/generated/packages/webpack/generators/init.json @@ -2,7 +2,7 @@ "name": "init", "factory": "./src/generators/init/init#webpackInitGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebpackInit", "cli": "nx", "title": "Init Webpack Plugin", diff --git a/docs/generated/packages/workspace/generators/ci-workflow.json b/docs/generated/packages/workspace/generators/ci-workflow.json index 88e6817f72ab70..cfa29d41c919a1 100644 --- a/docs/generated/packages/workspace/generators/ci-workflow.json +++ b/docs/generated/packages/workspace/generators/ci-workflow.json @@ -2,7 +2,7 @@ "name": "ci-workflow", "factory": "./src/generators/ci-workflow/ci-workflow#ciWorkflowGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceCIWorkflow", "title": "Generate a CI workflow.", "description": "Generate a CI workflow.", diff --git a/docs/generated/packages/workspace/generators/convert-to-monorepo.json b/docs/generated/packages/workspace/generators/convert-to-monorepo.json index 6e5b31d954ee6c..d219f0690fcfc7 100644 --- a/docs/generated/packages/workspace/generators/convert-to-monorepo.json +++ b/docs/generated/packages/workspace/generators/convert-to-monorepo.json @@ -2,7 +2,7 @@ "name": "convert-to-monorepo", "factory": "./src/generators/convert-to-monorepo/convert-to-monorepo", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceConvertToMonorepo", "cli": "nx", "title": "Nx Convert to Monorepo", diff --git a/docs/generated/packages/workspace/generators/fix-configuration.json b/docs/generated/packages/workspace/generators/fix-configuration.json index 8b137c96c01d5a..0204c9dedf6a02 100644 --- a/docs/generated/packages/workspace/generators/fix-configuration.json +++ b/docs/generated/packages/workspace/generators/fix-configuration.json @@ -2,7 +2,7 @@ "name": "fix-configuration", "factory": "./src/generators/convert-to-nx-project/convert-to-nx-project#convertToNxProjectGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SchematicsConvertToNxProject", "title": "@nx/workspace:fix-configuration", "description": "Migrates v1 config to v2 standalone configuration.", diff --git a/docs/generated/packages/workspace/generators/move.json b/docs/generated/packages/workspace/generators/move.json index 1de5b88dbddbb8..8fe8f7ed62ba5c 100644 --- a/docs/generated/packages/workspace/generators/move.json +++ b/docs/generated/packages/workspace/generators/move.json @@ -2,7 +2,7 @@ "name": "move", "factory": "./src/generators/move/move#moveGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceMove", "cli": "nx", "title": "Nx Move", diff --git a/docs/generated/packages/workspace/generators/new.json b/docs/generated/packages/workspace/generators/new.json index 64b534f755feed..f1d31c68b83bf0 100644 --- a/docs/generated/packages/workspace/generators/new.json +++ b/docs/generated/packages/workspace/generators/new.json @@ -2,7 +2,7 @@ "name": "new", "factory": "./src/generators/new/new#newGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceNew", "title": "Create an empty workspace", "description": "Create an empty workspace.", diff --git a/docs/generated/packages/workspace/generators/npm-package.json b/docs/generated/packages/workspace/generators/npm-package.json index d99864c55518f6..c8fc39a190a7cb 100644 --- a/docs/generated/packages/workspace/generators/npm-package.json +++ b/docs/generated/packages/workspace/generators/npm-package.json @@ -2,7 +2,7 @@ "name": "npm-package", "factory": "./src/generators/npm-package/npm-package#npmPackageGeneratorInternal", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceNpmPackage", "title": "Add a minimal npm package", "description": "Add a minimal npm package.", diff --git a/docs/generated/packages/workspace/generators/preset.json b/docs/generated/packages/workspace/generators/preset.json index 35a7d51a28a0db..a04f2482976eb1 100644 --- a/docs/generated/packages/workspace/generators/preset.json +++ b/docs/generated/packages/workspace/generators/preset.json @@ -2,7 +2,7 @@ "name": "preset", "factory": "./src/generators/preset/preset#presetGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspacePreset", "cli": "nx", "title": "Creates applications in a new workspace", @@ -36,11 +36,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/docs/generated/packages/workspace/generators/remove.json b/docs/generated/packages/workspace/generators/remove.json index f4dff57a0a5787..695a838b99e432 100644 --- a/docs/generated/packages/workspace/generators/remove.json +++ b/docs/generated/packages/workspace/generators/remove.json @@ -2,7 +2,7 @@ "name": "remove", "factory": "./src/generators/remove/remove#removeGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceRemove", "cli": "nx", "title": "Nx Remove", diff --git a/docs/generated/packages/workspace/generators/run-commands.json b/docs/generated/packages/workspace/generators/run-commands.json index e7f8b805f51d68..00bec0a791c6b0 100644 --- a/docs/generated/packages/workspace/generators/run-commands.json +++ b/docs/generated/packages/workspace/generators/run-commands.json @@ -2,7 +2,7 @@ "name": "run-commands", "factory": "./src/generators/run-commands/run-commands#runCommandsGenerator", "schema": { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SchematicsRunCommands", "title": "Create a custom target to run any command", "description": "Create a custom target to run any command.", diff --git a/docs/nx-cloud/recipes/encryption.md b/docs/nx-cloud/recipes/encryption.md index b52531ba863be8..4700494ab37240 100644 --- a/docs/nx-cloud/recipes/encryption.md +++ b/docs/nx-cloud/recipes/encryption.md @@ -2,7 +2,7 @@ To turn on end to end encryption, specify an encryption key in one of two ways: -- Set the `encryptionKey` property in `nx.json` +- Set the `nxCloudEncryptionKey` property in `nx.json` - Set the `NX_CLOUD_ENCRYPTION_KEY` environment variable The key can be any string up to 32 characters long. diff --git a/docs/nx-cloud/reference/release-notes.md b/docs/nx-cloud/reference/release-notes.md index 7c7a104372cf96..cafc28a7cc48c4 100644 --- a/docs/nx-cloud/reference/release-notes.md +++ b/docs/nx-cloud/reference/release-notes.md @@ -83,7 +83,7 @@ As a reminder, we now only support MongoDB 6+. If you are running an older versi ### 2308.22.7.patch5 -- Fixes a UI issue when navigating to branches containg slashes +- Fixes a UI issue when navigating to branches containing slashes ### 2308.22.7.patch4 @@ -203,7 +203,7 @@ You can read more about the recent DTE improvements in our [Nx Cloud 3.0 blog po ##### Breaking changes -Nx Cloud uses MongoDB internally as its data store. While we've always used Mongo 4.2, in the latest release we started targetting Mongo 6.0. It's a much lighter process, with improved performance, and quicker reads and writes. +Nx Cloud uses MongoDB internally as its data store. While we've always used Mongo 4.2, in the latest release we started targeting Mongo 6.0. It's a much lighter process, with improved performance, and quicker reads and writes. While you can still upgrade to this new image even if you are on Mongo 4.2 (nothing will break), **we strongly recommend you upgrade your Database to Mongo 6.0 to make sure nothing breaks in the future.** [We wrote a full guide on how you can approach the upgrade here](https://github.com/nrwl/nx-cloud-helm/blob/main/MONGO-OPERATOR-GUIDE.md#upgrading-to-mongo-6). If you need assistance, please get in touch at [cloud-support@nrwl.io](mailto:cloud-support@nrwl.io). diff --git a/docs/nx-cloud/tutorial/circle.md b/docs/nx-cloud/tutorial/circle.md index e1572136381962..97a7ab64019ac7 100644 --- a/docs/nx-cloud/tutorial/circle.md +++ b/docs/nx-cloud/tutorial/circle.md @@ -312,18 +312,8 @@ Merge your PR into the `main` branch when you're ready to move to the next secti Reducing the number of tasks to run via [affected commands](/ci/features/affected) (as seen in the previous section) is helpful, but might not be enough. By default [Nx caches the results of tasks](/core-features/cache-task-results) on your local machine. But CI and local developer machines are still performing the same tasks on the same code - wasting time and money. The [Nx Cloud remote cache](/ci/features/remote-cache) can eliminate that waste for you. -```{% command="pnpm nx connect" %} -$ nx g nx:connect-to-nx-cloud --quiet --no-interactive - - > NX Remote caching via Nx Cloud has been enabled - - In addition to the caching, Nx Cloud provides config-free distributed execution, - UI for viewing complex runs and GitHub integration. Learn more at https://nx.app - - Your workspace is currently unclaimed. Run details from unclaimed workspaces can be viewed on cloud.nx.app by anyone - with the link. Claim your workspace at the following link to restrict access. - - https://cloud.nx.app/orgs/workspace-setup?accessToken=[YourAccessTokenHere] +```shell +pnpm nx connect ``` Click the link in the terminal to claim your workspace on [nx.app](https://nx.app). Once your workspace is successfully connected you should see an empty dashboard. diff --git a/docs/nx-cloud/tutorial/github-actions.md b/docs/nx-cloud/tutorial/github-actions.md index 77734ed4e6f513..9e5312b591a312 100644 --- a/docs/nx-cloud/tutorial/github-actions.md +++ b/docs/nx-cloud/tutorial/github-actions.md @@ -313,17 +313,8 @@ Merge your PR into the `main` branch when you're ready to move to the next secti Reducing the number of tasks to run via [affected commands](/ci/features/affected) (as seen in the previous section) is helpful, but might not be enough. By default [Nx caches the results of tasks](/core-features/cache-task-results) on your local machine. But CI and local developer machines are still performing the same tasks on the same code - wasting time and money. The [Nx Cloud remote cache](/ci/features/remote-cache) can eliminate that waste for you. -```{% command="pnpm nx connect" %} - - > NX Remote caching via Nx Cloud has been enabled - - In addition to the caching, Nx Cloud provides config-free distributed execution, - UI for viewing complex runs and GitHub integration. Learn more at https://nx.app - - Your workspace is currently unclaimed. Run details from unclaimed workspaces can be viewed on cloud.nx.app by anyone - with the link. Claim your workspace at the following link to restrict access. - - https://cloud.nx.app/orgs/workspace-setup?accessToken=[YourAccessTokenHere] +```shell +pnpm nx connect ``` Click the link in the terminal to claim your workspace on [nx.app](https://nx.app). Once your workspace is successfully connected you should see an empty dashboard. diff --git a/docs/shared/angular-tutorial/angular-monorepo.md b/docs/shared/angular-tutorial/angular-monorepo.md index 9c2bdbd0170200..f3f0461111cca7 100644 --- a/docs/shared/angular-tutorial/angular-monorepo.md +++ b/docs/shared/angular-tutorial/angular-monorepo.md @@ -385,7 +385,7 @@ All libraries that we generate automatically have aliases created in the root-le Hence we can easily import them into other libraries and our Angular application. As an example, let's create and expose a `ProductListComponent` component from our `libs/products` library. Either create it by hand or run ```shell -nx g @nx/angular:component product-list --project=products --standalone --export +nx g @nx/angular:component product-list --directory=libs/products/src/lib/product-list --nameAndDirectoryFormat=as-provided --standalone --export ``` We don't need to implement anything fancy as we just want to learn how to import it into our main Angular application. diff --git a/docs/shared/deprecated/as-provided-vs-derived.md b/docs/shared/deprecated/as-provided-vs-derived.md index 458db3d2b5145c..19990ef077352f 100644 --- a/docs/shared/deprecated/as-provided-vs-derived.md +++ b/docs/shared/deprecated/as-provided-vs-derived.md @@ -1,6 +1,6 @@ # As Provided vs. Derived Generator Path Options -Nx is moving toward a more transparent and predictable way of determining where code will be generated when you run a generator. The new behavior is to take generator options _as provided_ and place the generated code in the exact folder that you specify. Nx will only use the new behavior in Nx version 18. The directory can be specified with a `--directory` flag or use a fully specified path (i.e. `libs/shared/my-lib/src/my-component`). The `--directory` flag will be calculated relative to where you run the command. +Nx is moving toward a more transparent and predictable way of determining where code will be generated when you run a generator. The new behavior is to take generator options _as provided_ and place the generated code in the exact folder that you specify. Nx will only use the new behavior in Nx version 19. The directory can be specified with a `--directory` flag or use a fully specified path (i.e. `libs/shared/my-lib/src/my-component`). The `--directory` flag will be calculated relative to where you run the command. In the past, Nx had lots of logic to try and _derive_ the best place to put code for you. This approach worked for some people, but there were always people that wanted to generate their code in a slightly different location. Accounting for these variations lead to either (1) people in repos with a different structure not being able to use these generators or (2) Nx introducing lots of flags to allow people to tweak where code was generated (flags like `--project`, `--flat`, `--pascalCaseFiles`, `--pascalCaseDirectory`, `--fileName`). It also caused some confusion when code was not generated in the expected location or frustration when the user did not know how to get Nx to derive the right thing. @@ -19,7 +19,7 @@ You can use [Nx Console](/core-features/integrate-with-editors) for an intuitive ## Prompting -To mitigate the impact of this change of direction, Nx will prompt you when running most generators until Nx 18. We know changing these habits may take time so this prompt allows you to choose the previous behavior. +To mitigate the impact of this change of direction, Nx will prompt you when running most generators until Nx 19. We know changing these habits may take time so this prompt allows you to choose the previous behavior. ```{% command="nx g lib my-lib --directory=shared/my-lib" path="~/myorg" %} ✔ Which generator would you like to use? · @nx/node:library @@ -44,7 +44,7 @@ Your intent is your intent. However, the commands you write and run are based on ## Project Generators -As of Nx 16.8.0, generating a project will prompt you to choose how Nx will calculate where the project should be located. For now, you can choose between `as-provided` and `derived` but `as-provided` will be the only option in Nx 18. The CLI flag to choose between the two algorithms for project generators is `--projectNameAndRootFormat`. +As of Nx 16.8.0, generating a project will prompt you to choose how Nx will calculate where the project should be located. For now, you can choose between `as-provided` and `derived` but `as-provided` will be the only option in Nx 19. The CLI flag to choose between the two algorithms for project generators is `--projectNameAndRootFormat`. ### Generate Paths and Names `as-provided` @@ -83,7 +83,7 @@ If you accidentally generate a project in the wrong folder, use the [move genera ## Code Generators -As of Nx 17, code generators such as `component`, `service`, and others will prompt you to choose whether or not Nx will derive the location based on your options or not. In Nx 18, Nx will take the generator options as provided. The following flags are deprecated and will be removed in Nx 18: `--project`, `--flat`, `--pascalCaseFiles`, `--pascalCaseDirectory`, `--fileName`. The CLI flag to choose between the two algorithms for code generators is `--nameAndDirectoryFormat`. +As of Nx 17, code generators such as `component`, `service`, and others will prompt you to choose whether or not Nx will derive the location based on your options or not. In Nx 19, Nx will take the generator options as provided. The following flags are deprecated and will be removed in Nx 19: `--project`, `--flat`, `--pascalCaseFiles`, `--pascalCaseDirectory`, `--fileName`. The CLI flag to choose between the two algorithms for code generators is `--nameAndDirectoryFormat`. ### Generate Paths and Names `as-provided` @@ -100,7 +100,7 @@ If the directory specified is not inside a project, an error will be thrown. ### Use the Old `derived` Paths and Names -Choosing `derived` makes Nx behave the way it did before version 17. Nx will use the deprecated flags (`--project`, `--flat`, `--pascalCaseFiles`, `--pascalCaseDirectory`, `--fileName`) to calculate where to generate the code. This behavior will not be available in Nx 18. +Choosing `derived` makes Nx behave the way it did before version 17. Nx will use the deprecated flags (`--project`, `--flat`, `--pascalCaseFiles`, `--pascalCaseDirectory`, `--fileName`) to calculate where to generate the code. This behavior will not be available in Nx 19. This makes generators behave in the following way: diff --git a/docs/shared/deprecated/v1-nx-plugin-api.md b/docs/shared/deprecated/v1-nx-plugin-api.md index c9014bf3cfd719..3bf0c86514a72e 100644 --- a/docs/shared/deprecated/v1-nx-plugin-api.md +++ b/docs/shared/deprecated/v1-nx-plugin-api.md @@ -1,7 +1,7 @@ # Extending the Project Graph of Nx (v1 API) {% callout type="caution" title="Experimental" %} -This API has been superceded by the [v2 API](/extending-nx/recipes/project-graph-plugins) and will be removed in Nx 18. If targeting Nx version 16.7 or higher, please use the v2 API instead. +This API has been superceded by the [v2 API](/extending-nx/recipes/project-graph-plugins) and will be removed in Nx 19. If targeting Nx version 16.7 or higher, please use the v2 API instead. {% /callout %} The v1 plugin API for modifying the project graph was split into two parts: diff --git a/docs/shared/guides/react-18.md b/docs/shared/guides/react-18.md index db3c2aefe6c727..010eacb6125c45 100644 --- a/docs/shared/guides/react-18.md +++ b/docs/shared/guides/react-18.md @@ -164,5 +164,5 @@ For manual update, go to [React Native Upgrade Helper](https://react-native-comm Nevertheless, you can use Nx's command `nx g @nx/react-native:upgrade-native ` to replace your iOS and Android folder with the latest code. {% callout type="caution" title="Be careful" %} -Nx's command `nx g @nx/react-native:upgrade-native ` is destructive, do **NOT** use it if you got customized native code.) +Nx's command `nx g @nx/react-native:upgrade-native ` is destructive, do **NOT** use it if you have added customized native code. {% /callout %} diff --git a/docs/shared/installation/troubleshoot-installation.md b/docs/shared/installation/troubleshoot-installation.md index f69094ffe9d93f..e6132450646579 100644 --- a/docs/shared/installation/troubleshoot-installation.md +++ b/docs/shared/installation/troubleshoot-installation.md @@ -25,7 +25,7 @@ When updating Nx that is already on 15.8, the package-lock.json should continue 1. Delete your node_modules and `package-lock.json` (or other lock files) and re-run your package manager's install command. 1. If running on Windows, make sure that the [installed Microsoft Visual C++ Redistributable is up-to-date](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads). -Confirm that you see `@nx/nx-plaform-arch` in your `node_modules` folder (e.g. `@nx/nx-darwin-arm64`, `@nx/nx-win32-x64-msvc`, etc). +Confirm that you see `@nx/nx-` in your `node_modules` folder (e.g. `@nx/nx-darwin-arm64`, `@nx/nx-win32-x64-msvc`, etc). If you are still experiencing issues after following the previous steps, please [open an issue on GitHub](https://github.com/nrwl/nx/issues/new?assignees=&labels=type:+bug&projects=&template=1-bug.yml) and we will help you troubleshoot. Be prepared to give as much detail as possible about your system, we will need the following information at a minimum, the contents of `nx report` plus diff --git a/docs/shared/migration/preserving-git-histories.md b/docs/shared/migration/preserving-git-histories.md index fa6a37358fd61a..761a6df6123bbd 100644 --- a/docs/shared/migration/preserving-git-histories.md +++ b/docs/shared/migration/preserving-git-histories.md @@ -16,6 +16,12 @@ To start we'll add a remote repository url for where the standalone app is locat git remote add my-standalone-app ``` +Now we must fetch the branches from the new remote + +```shell +git fetch my-standalone-app +``` + Assuming that our main branch on this repo is called 'master', then we'll run ```shell diff --git a/docs/shared/packages/eslint/enforce-module-boundaries.md b/docs/shared/packages/eslint/enforce-module-boundaries.md index 3601b6a11b30a7..0bffdba0437514 100644 --- a/docs/shared/packages/eslint/enforce-module-boundaries.md +++ b/docs/shared/packages/eslint/enforce-module-boundaries.md @@ -45,7 +45,7 @@ The `depConstraints` is an array of objects representing the constraints defined | Property | Type | Description | | ------------------------ | --------------- | ---------------------------------------------------------------------------------- | | sourceTag | _string_ | Tag that source project must contain to match the constraint | -| allSourceTags | _Array_ | List of targs the source project must contain to match the constraint | +| allSourceTags | _Array_ | List of tags the source project must contain to match the constraint | | onlyDependOnLibsWithTags | _Array_ | The source **can depend only** on projects that contain at least one of these tags | | notDependOnLibsWithTags | _Array_ | The source **can not depend** on projects that contain at least one of these tags | | allowedExternalImports | _Array_ | Exclusive list of external (npm) packages that are allowed to be imported | diff --git a/docs/shared/recipes/add-stack/add-astro.md b/docs/shared/recipes/add-stack/add-astro.md index 6c1621e4c1c064..748fef3315efe5 100644 --- a/docs/shared/recipes/add-stack/add-astro.md +++ b/docs/shared/recipes/add-stack/add-astro.md @@ -113,7 +113,7 @@ Then generate a project The command below uses the `as-provided` directory flag behavior, which is the default in Nx 16.8.0. If you're on an earlier version of Nx or using the `derived` option, omit the `--directory` flag. See the [as-provided vs. derived documentation](/deprecated/as-provided-vs-derived) for more details. {% /callout %} -```{% command="nx g @nx/js:lib ui --directory=libs/ui --simpleName --minimal} +```{% command="nx g @nx/js:lib ui --directory=libs/ui --simpleName --minimal"%} > NX Generating @nx/js:library ✔ Which unit test runner would you like to use? · none diff --git a/docs/shared/recipes/generators/generator-options.md b/docs/shared/recipes/generators/generator-options.md index dc8d0c51ab70c7..04e260205c464e 100644 --- a/docs/shared/recipes/generators/generator-options.md +++ b/docs/shared/recipes/generators/generator-options.md @@ -32,7 +32,7 @@ Static options for a generator don't prompt the user for input. To add a static ```json { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "id": "my-generator", "type": "object", "properties": { @@ -61,7 +61,7 @@ Dynamic options can prompt the user to select from a list of options. To define ```json { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "id": "my-generator", "type": "object", "properties": { @@ -108,7 +108,7 @@ There's a special dynamic option property that populates a selection list with y ```json { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "id": "my-generator", "type": "object", "properties": { @@ -752,15 +752,15 @@ Example that contains `value` and `label`: }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "sass", - "label": "SASS(.sass) [ http://sass-lang.com ]" + "label": "SASS(.sass) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/docs/shared/recipes/nx-release/publish-in-ci-cd.md b/docs/shared/recipes/nx-release/publish-in-ci-cd.md index 401922b2dfea74..9658569ba172bb 100644 --- a/docs/shared/recipes/nx-release/publish-in-ci-cd.md +++ b/docs/shared/recipes/nx-release/publish-in-ci-cd.md @@ -154,7 +154,7 @@ jobs: This workflow will install node, install npm dependencies, then run `nx release publish` to publish the packages. It will run on every push to the repository that creates a tag that matches the pattern `v*.*.*`. A release process using this workflow is as follows: -1. Run `nx release --skip-publish` locally. This will create a commit with the version and changelog updates, then create a tag for the new version version. +1. Run `nx release --skip-publish` locally. This will create a commit with the version and changelog updates, then create a tag for the new version. 2. Push the changes (including the new tag) to the remote repository with `git push && git push --tags`. 3. The publish workflow will automatically trigger and publish the packages to the npm registry. diff --git a/docs/shared/recipes/plugins/local-executors.md b/docs/shared/recipes/plugins/local-executors.md index 66e8fdd4f86ec2..2ae29cdf6ba86a 100644 --- a/docs/shared/recipes/plugins/local-executors.md +++ b/docs/shared/recipes/plugins/local-executors.md @@ -45,7 +45,7 @@ This file describes the options being sent to the executor (very similar to the ```json { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "type": "object", "properties": { "textToEcho": { diff --git a/docs/shared/recipes/rescope.md b/docs/shared/recipes/rescope.md index 58702b3555754b..a1702fd0ad26df 100644 --- a/docs/shared/recipes/rescope.md +++ b/docs/shared/recipes/rescope.md @@ -65,4 +65,4 @@ All other packages keep the same name, but change scope from `@nrwl` to `@nx`. ## @nrwl Scope End of Life -Starting in version 18, the `@nrwl` scoped packages will no longer be published to npm. Only the `@nx` scoped packages will be available on the npm registry. +Starting in version 19, the `@nrwl` scoped packages will no longer be published to npm. Only the `@nx` scoped packages will be available on the npm registry. diff --git a/docs/shared/reference/sitemap.md b/docs/shared/reference/sitemap.md index 33eb35183f86f0..85f79c08c05f8e 100644 --- a/docs/shared/reference/sitemap.md +++ b/docs/shared/reference/sitemap.md @@ -343,6 +343,7 @@ - [component-cypress-spec](/nx-api/angular/generators/component-cypress-spec) - [component-story](/nx-api/angular/generators/component-story) - [component-test](/nx-api/angular/generators/component-test) + - [convert-to-application-executor](/nx-api/angular/generators/convert-to-application-executor) - [directive](/nx-api/angular/generators/directive) - [federate-module](/nx-api/angular/generators/federate-module) - [init](/nx-api/angular/generators/init) @@ -432,6 +433,7 @@ - [install](/nx-api/expo/executors/install) - [export](/nx-api/expo/executors/export) - [submit](/nx-api/expo/executors/submit) + - [serve](/nx-api/expo/executors/serve) - [generators](/nx-api/expo/generators) - [init](/nx-api/expo/generators/init) - [application](/nx-api/expo/generators/application) @@ -611,6 +613,7 @@ - [ensure-symlink](/nx-api/react-native/executors/ensure-symlink) - [storybook](/nx-api/react-native/executors/storybook) - [pod-install](/nx-api/react-native/executors/pod-install) + - [upgrade](/nx-api/react-native/executors/upgrade) - [generators](/nx-api/react-native/generators) - [init](/nx-api/react-native/generators/init) - [application](/nx-api/react-native/generators/application) @@ -620,6 +623,7 @@ - [component-story](/nx-api/react-native/generators/component-story) - [stories](/nx-api/react-native/generators/stories) - [upgrade-native](/nx-api/react-native/generators/upgrade-native) + - [web-configuration](/nx-api/react-native/generators/web-configuration) - [remix](/nx-api/remix) - [documents](/nx-api/remix/documents) - [Overview](/nx-api/remix/documents/overview) diff --git a/e2e/angular-core/src/projects.test.ts b/e2e/angular-core/src/projects.test.ts index 4912d9b21a2783..c30eb14951504b 100644 --- a/e2e/angular-core/src/projects.test.ts +++ b/e2e/angular-core/src/projects.test.ts @@ -1,5 +1,6 @@ import { names } from '@nx/devkit'; import { + checkFilesDoNotExist, checkFilesExist, cleanupProject, getSize, @@ -8,6 +9,7 @@ import { newProject, readFile, removeFile, + rmDist, runCLI, runCommandUntil, runE2ETests, @@ -552,4 +554,52 @@ describe('Angular Projects', () => { `Successfully ran target test for project ${libName}` ); }, 500_000); + + it('should support generating applications with SSR and converting targets with webpack-based executors to use the application executor', async () => { + const esbuildApp = uniq('esbuild-app'); + const webpackApp = uniq('webpack-app'); + + runCLI( + `generate @nx/angular:app ${esbuildApp} --bundler=esbuild --ssr --project-name-and-root-format=as-provided --no-interactive` + ); + + // check build produces both the browser and server bundles + runCLI(`build ${esbuildApp} --output-hashing none`); + checkFilesExist( + `dist/${esbuildApp}/browser/main.js`, + `dist/${esbuildApp}/server/server.mjs` + ); + + runCLI( + `generate @nx/angular:app ${webpackApp} --bundler=webpack --ssr --project-name-and-root-format=as-provided --no-interactive` + ); + + // check build only produces the browser bundle + runCLI(`build ${webpackApp} --output-hashing none`); + checkFilesExist(`dist/${webpackApp}/browser/main.js`); + checkFilesDoNotExist(`dist/${webpackApp}/server/main.js`); + + // check server produces the server bundle + runCLI(`server ${webpackApp} --output-hashing none`); + checkFilesExist(`dist/${webpackApp}/server/main.js`); + + rmDist(); + + // convert target with webpack-based executors to use the application executor + runCLI( + `generate @nx/angular:convert-to-application-executor ${webpackApp}` + ); + + // check build now produces both the browser and server bundles + runCLI(`build ${webpackApp} --output-hashing none`); + checkFilesExist( + `dist/${webpackApp}/browser/main.js`, + `dist/${webpackApp}/server/server.mjs` + ); + + // check server target is no longer available + expect(() => + runCLI(`server ${webpackApp} --output-hashing none`) + ).toThrow(); + }, 500_000); }); diff --git a/e2e/expo/src/expo-pcv3.test.ts b/e2e/expo/src/expo-pcv3.test.ts index d688f51e3bcb0d..6e78195180be00 100644 --- a/e2e/expo/src/expo-pcv3.test.ts +++ b/e2e/expo/src/expo-pcv3.test.ts @@ -10,15 +10,16 @@ import { checkFilesExist, updateFile, runCLIAsync, + runE2ETests, + killPorts, } from 'e2e/utils'; import { join } from 'path'; describe('@nx/expo/plugin', () => { - let project: string; let appName: string; beforeAll(() => { - project = newProject(); + newProject(); appName = uniq('app'); runCLI( `generate @nx/expo:app ${appName} --project-name-and-root-format=as-provided --no-interactive`, @@ -107,6 +108,32 @@ describe('@nx/expo/plugin', () => { const prebuildResult = await runCLIAsync( `prebuild ${appName} --no-interactive --install=false` ); - expect(prebuildResult.combinedOutput).toContain('Config synced'); + expect(prebuildResult.combinedOutput).toContain( + 'Successfully ran target prebuild for project' + ); + }); + + it('should run e2e for cypress', async () => { + if (runE2ETests()) { + const results = runCLI(`e2e ${appName}-e2e`); + expect(results).toContain('Successfully ran target e2e'); + + // port and process cleanup + try { + await killPorts(4200); + } catch (err) { + expect(err).toBeFalsy(); + } + } + }); + + it('should create storybook with application', async () => { + runCLI( + `generate @nx/react:storybook-configuration ${appName} --generateStories --no-interactive` + ); + checkFilesExist( + `${appName}/.storybook/main.ts`, + `${appName}/src/app/App.stories.tsx` + ); }); }); diff --git a/e2e/expo/src/expo.test.ts b/e2e/expo/src/expo.test.ts index d6ebc680f98050..53fe9d79e6b395 100644 --- a/e2e/expo/src/expo.test.ts +++ b/e2e/expo/src/expo.test.ts @@ -11,10 +11,12 @@ import { runCLIAsync, runCommand, runCommandUntil, + runE2ETests, uniq, updateFile, updateJson, } from '@nx/e2e/utils'; +import { ChildProcess } from 'child_process'; import { join } from 'path'; describe('expo', () => { @@ -34,7 +36,9 @@ describe('expo', () => { nxJson.targetDefaults.build.inputs = ['production', '^production']; return nxJson; }); - runCLI(`generate @nx/expo:application ${appName} --no-interactive`); + runCLI( + `generate @nx/expo:application ${appName} --e2eTestRunner=cypress --no-interactive` + ); runCLI( `generate @nx/expo:library ${libName} --buildable --publishable --importPath=${proj}/${libName}` ); @@ -63,22 +67,46 @@ describe('expo', () => { expect(libLintResults.combinedOutput).toContain('All files pass linting.'); }); + it('should serve with metro', async () => { + let process: ChildProcess; + const port = 8081; + + try { + process = await runCommandUntil( + `serve ${appName} --interactive=false --port=${port}`, + (output) => { + return ( + output.includes(`http://localhost::${port}`) || + output.includes('Starting JS server...') + ); + } + ); + } catch (err) { + console.error(err); + } + + // port and process cleanup + try { + if (process && process.pid) { + await promisifiedTreeKill(process.pid, 'SIGKILL'); + await killPorts(port); + } + } catch (err) { + expect(err).toBeFalsy(); + } + }); + it('should export', async () => { const exportResults = await runCLIAsync( `export ${appName} --no-interactive` ); expect(exportResults.combinedOutput).toContain( - 'Export was successful. Your exported files can be found' + 'Successfully ran target export for project' + ); + checkFilesExist( + `dist/apps/${appName}/index.html`, + `dist/apps/${appName}/metadata.json` ); - checkFilesExist(`dist/apps/${appName}/metadata.json`); - }); - - it('should export-web', async () => { - expect(() => { - runCLI(`export-web ${appName}`); - checkFilesExist(`apps/${appName}/dist/index.html`); - checkFilesExist(`apps/${appName}/dist/metadata.json`); - }).not.toThrow(); }); it('should prebuild', async () => { @@ -100,10 +128,14 @@ describe('expo', () => { const prebuildResult = await runCLIAsync( `prebuild ${appName} --no-interactive --install=false` ); - expect(prebuildResult.combinedOutput).toContain('Config synced'); + expect(prebuildResult.combinedOutput).toContain( + 'Successfully ran target prebuild for project' + ); }); - it('should install', async () => { + // TODO (@xiongemi): this test is disabled due to expo requires typescript ^5.3.0 + // re-enable it when typescript is updated + xit('should install', async () => { // run install command const installResults = await runCLIAsync( `install ${appName} --no-interactive` @@ -189,4 +221,60 @@ describe('expo', () => { `Successfully ran target test for project ${libName}` ); }); + + it('should create storybook with application', async () => { + runCLI( + `generate @nx/react:storybook-configuration ${appName} --generateStories --no-interactive` + ); + checkFilesExist( + `apps/${appName}/.storybook/main.ts`, + `apps/${appName}/src/app/App.stories.tsx` + ); + }); + + it('should run e2e for cypress', async () => { + if (runE2ETests()) { + const results = runCLI(`e2e ${appName}-e2e`); + expect(results).toContain('Successfully ran target e2e'); + + // port and process cleanup + try { + await killPorts(4200); + } catch (err) { + expect(err).toBeFalsy(); + } + } + }); + + it('should run e2e for cypress with configuration ci', async () => { + if (runE2ETests()) { + const results = runCLI(`e2e ${appName}-e2e --configuration=ci`); + expect(results).toContain('Successfully ran target e2e'); + + // port and process cleanup + try { + await killPorts(4200); + } catch (err) { + expect(err).toBeFalsy(); + } + } + }); + + it('should run e2e for playwright', async () => { + const appName2 = uniq('my-app'); + runCLI( + `generate @nx/expo:application ${appName2} --e2eTestRunner=playwright --no-interactive` + ); + if (runE2ETests()) { + const results = runCLI(`e2e ${appName2}-e2e`, { verbose: true }); + expect(results).toContain('Successfully ran target e2e'); + + // port and process cleanup + try { + await killPorts(4200); + } catch (err) { + expect(err).toBeFalsy(); + } + } + }); }); diff --git a/e2e/js/src/js-inlining.test.ts b/e2e/js/src/js-inlining.test.ts index 75f600d34b3460..5e6374624cbf3e 100644 --- a/e2e/js/src/js-inlining.test.ts +++ b/e2e/js/src/js-inlining.test.ts @@ -148,4 +148,25 @@ describe('inlining', () => { ); expect(childFileContent).toContain(`${grandChild}/src`); }, 240_000); + + it('should allow inlining to be enabled without imports', async () => { + const parent = uniq('parent'); + runCLI(`generate @nx/js:lib ${parent} --no-interactive`); + + updateFile(`libs/${parent}/src/lib/${parent}.ts`, () => { + return ` + export function ${parent}() { + console.log('hello'); + } + `; + }); + + // 1. external is set to all + execSync(`rm -rf dist`); + runCLI(`build ${parent} --external=all`); + + // 1. external is set to none + execSync(`rm -rf dist`); + runCLI(`build ${parent} --external=none`); + }, 240_000); }); diff --git a/e2e/react-native/src/react-native-pcv3.test.ts b/e2e/react-native/src/react-native-pcv3.test.ts index bdc4993ac2a790..0887aae53e9cbb 100644 --- a/e2e/react-native/src/react-native-pcv3.test.ts +++ b/e2e/react-native/src/react-native-pcv3.test.ts @@ -8,6 +8,8 @@ import { runCommandUntil, killProcessAndPorts, fileExists, + checkFilesExist, + runE2ETests, } from 'e2e/utils'; describe('@nx/react-native/plugin', () => { @@ -70,4 +72,49 @@ describe('@nx/react-native/plugin', () => { await killProcessAndPorts(process.pid, port); } }); + + it('should serve', async () => { + let process: ChildProcess; + const port = 8081; + + try { + process = await runCommandUntil( + `serve ${appName} --interactive=false --port=${port}`, + (output) => { + return output.includes(`http://localhost:${port}`); + } + ); + } catch (err) { + console.error(err); + } + + // port and process cleanup + try { + if (process && process.pid) { + await killProcessAndPorts(process.pid, port); + } + } catch (err) { + expect(err).toBeFalsy(); + } + }); + + it('should run e2e for cypress', async () => { + if (runE2ETests()) { + let results = runCLI(`e2e ${appName}-e2e`); + expect(results).toContain('Successfully ran target e2e'); + + results = runCLI(`e2e ${appName}-e2e --configuration=ci`); + expect(results).toContain('Successfully ran target e2e'); + } + }); + + it('should create storybook with application', async () => { + runCLI( + `generate @nx/react:storybook-configuration ${appName} --generateStories --no-interactive` + ); + checkFilesExist( + `${appName}/.storybook/main.ts`, + `${appName}/src/app/App.stories.tsx` + ); + }); }); diff --git a/e2e/react-native/src/react-native.test.ts b/e2e/react-native/src/react-native.test.ts index d3d2eab7b17c43..32a15178d1979b 100644 --- a/e2e/react-native/src/react-native.test.ts +++ b/e2e/react-native/src/react-native.test.ts @@ -4,14 +4,14 @@ import { expectTestsPass, getPackageManagerCommand, isOSX, - killPorts, + killProcessAndPorts, newProject, - promisifiedTreeKill, readJson, runCLI, runCLIAsync, runCommand, runCommandUntil, + runE2ETests, uniq, updateFile, updateJson, @@ -37,7 +37,7 @@ describe('react native', () => { return nxJson; }); runCLI( - `generate @nx/react-native:application ${appName} --install=false --no-interactive` + `generate @nx/react-native:application ${appName} --bunlder=webpack --e2eTestRunner=cypress --install=false --no-interactive` ); runCLI( `generate @nx/react-native:library ${libName} --buildable --publishable --importPath=${proj}/${libName} --no-interactive` @@ -45,6 +45,11 @@ describe('react native', () => { }); afterAll(() => cleanupProject()); + it('should build for web', async () => { + const results = runCLI(`build ${appName}`); + expect(results).toContain('Successfully ran target build'); + }); + it('should test and lint', async () => { const componentName = uniq('Component'); runCLI( @@ -66,6 +71,16 @@ describe('react native', () => { expect(libLintResults.combinedOutput).toContain('All files pass linting.'); }); + it('should run e2e for cypress', async () => { + if (runE2ETests()) { + let results = runCLI(`e2e ${appName}-e2e`); + expect(results).toContain('Successfully ran target e2e'); + + results = runCLI(`e2e ${appName}-e2e --configuration=ci`); + expect(results).toContain('Successfully ran target e2e'); + } + }); + it('should bundle-ios', async () => { const iosBundleResult = await runCLIAsync( `bundle-ios ${appName} --sourcemapOutput=../../dist/apps/${appName}/ios/main.map` @@ -114,8 +129,32 @@ describe('react native', () => { // port and process cleanup try { if (process && process.pid) { - await promisifiedTreeKill(process.pid, 'SIGKILL'); - await killPorts(port); + await killProcessAndPorts(process.pid, port); + } + } catch (err) { + expect(err).toBeFalsy(); + } + }); + + it('should serve', async () => { + let process: ChildProcess; + const port = 8081; + + try { + process = await runCommandUntil( + `serve ${appName} --interactive=false --port=${port}`, + (output) => { + return output.includes(`http://localhost:${port}`); + } + ); + } catch (err) { + console.error(err); + } + + // port and process cleanup + try { + if (process && process.pid) { + await killProcessAndPorts(process.pid, port); } } catch (err) { expect(err).toBeFalsy(); @@ -136,33 +175,14 @@ describe('react native', () => { runCLI( `generate @nx/react-native:storybook-configuration ${appName} --generateStories --no-interactive` ); - expect(() => - checkFilesExist( - `.storybook/story-loader.ts`, - `apps/${appName}/src/storybook/storybook.ts`, - `apps/${appName}/src/storybook/toggle-storybook.tsx`, - `apps/${appName}/src/app/App.stories.tsx` - ) - ).not.toThrow(); - - await runCLIAsync(`storybook ${appName}`); - const result = readJson(join('apps', appName, 'package.json')); - expect(result).toMatchObject({ - dependencies: { - '@storybook/addon-ondevice-actions': '*', - '@storybook/addon-ondevice-backgrounds': '*', - '@storybook/addon-ondevice-controls': '*', - '@storybook/addon-ondevice-notes': '*', - }, - }); + checkFilesExist( + `apps/${appName}/.storybook/main.ts`, + `apps/${appName}/src/app/App.stories.tsx` + ); }); it('should upgrade native for application', async () => { - expect(() => - runCLI( - `generate @nx/react-native:upgrade-native ${appName} --install=false` - ) - ).not.toThrow(); + expect(() => runCLI(`upgrade ${appName}`)).not.toThrow(); }); it('should build publishable library', async () => { @@ -180,13 +200,11 @@ describe('react native', () => { it('sync npm dependencies for autolink', async () => { // Add npm package with native modules - updateFile(join('package.json'), (content) => { - const json = JSON.parse(content); - json.dependencies['react-native-image-picker'] = '5.3.1'; - json.dependencies['@react-native-async-storage/async-storage'] = '1.18.1'; - return JSON.stringify(json, null, 2); - }); - runCommand(`${getPackageManagerCommand().install}`); + runCommand( + `${ + getPackageManagerCommand().addDev + } react-native-image-picker @react-native-async-storage/async-storage` + ); // Add import for Nx to pick up updateFile(join('apps', appName, 'src/app/App.tsx'), (content) => { @@ -202,6 +220,8 @@ describe('react native', () => { dependencies: { 'react-native-image-picker': '*', 'react-native': '*', + }, + devDependencies: { '@react-native-async-storage/async-storage': '*', }, }); @@ -261,4 +281,25 @@ describe('react native', () => { `Successfully ran target test for project ${libName}` ); }); + + it('should run build with vite bundler and e2e with playwright', async () => { + const appName2 = uniq('my-app'); + runCLI( + `generate @nx/react-native:application ${appName2} --bundler=vite --e2eTestRunner=playwright --install=false --no-interactive` + ); + const buildResults = runCLI(`build ${appName2}`); + expect(buildResults).toContain('Successfully ran target build'); + if (runE2ETests()) { + const e2eResults = runCLI(`e2e ${appName2}-e2e`); + expect(e2eResults).toContain('Successfully ran target e2e'); + } + + runCLI( + `generate @nx/react-native:storybook-configuration ${appName2} --generateStories --no-interactive` + ); + checkFilesExist( + `apps/${appName2}/.storybook/main.ts`, + `apps/${appName2}/src/app/App.stories.tsx` + ); + }); }); diff --git a/e2e/vite/src/vite.test.ts b/e2e/vite/src/vite.test.ts index ab10b95c9d7db8..2b58827da01479 100644 --- a/e2e/vite/src/vite.test.ts +++ b/e2e/vite/src/vite.test.ts @@ -117,6 +117,29 @@ describe('Vite Plugin', () => { }); rmDist(); }, 200_000); + + it('should build application without copying exisiting package json when generatePackageJson=false', async () => { + createFile( + `apps/${myApp}/package.json`, + JSON.stringify({ + name: 'my-existing-app', + version: '1.0.1', + scripts: { + start: 'node server.js', + }, + }) + ); + runCLI(`build ${myApp} --generatePackageJson=false`); + expect(readFile(`dist/apps/${myApp}/index.html`)).toBeDefined(); + const fileArray = listFiles(`dist/apps/${myApp}/assets`); + const mainBundle = fileArray.find((file) => file.endsWith('.js')); + expect( + readFile(`dist/apps/${myApp}/assets/${mainBundle}`) + ).toBeDefined(); + + expect(fileExists(`dist/apps/${myApp}/package.json`)).toBe(false); + rmDist(); + }, 200_000); }); 100_000; diff --git a/graph/client/src/app/external-api-impl.ts b/graph/client/src/app/external-api-impl.ts index 724c9ebf878171..c3bad95cde1d03 100644 --- a/graph/client/src/app/external-api-impl.ts +++ b/graph/client/src/app/external-api-impl.ts @@ -81,10 +81,8 @@ export class ExternalApiImpl extends ExternalApi { } } - async openProjectDetails(projectName: string, targetName?: string) { - await this.router.navigate( - `/project-details/${encodeURIComponent(projectName)}` - ); + openProjectDetails(projectName: string, targetName?: string) { + this.router.navigate(`/project-details/${encodeURIComponent(projectName)}`); if (targetName) { this.focusTargetInProjectDetails(targetName); } diff --git a/graph/client/src/app/ui-tooltips/graph-tooltip-display.tsx b/graph/client/src/app/ui-tooltips/graph-tooltip-display.tsx index 31385ac8dd06dc..28152e9312c9c9 100644 --- a/graph/client/src/app/ui-tooltips/graph-tooltip-display.tsx +++ b/graph/client/src/app/ui-tooltips/graph-tooltip-display.tsx @@ -8,7 +8,11 @@ import { } from '@nx/graph/ui-tooltips'; import { ProjectNodeActions } from './project-node-actions'; import { TaskNodeActions } from './task-node-actions'; -import { useEnvironmentConfig, useRouteConstructor } from '@nx/graph/shared'; +import { + getExternalApiService, + useEnvironmentConfig, + useRouteConstructor, +} from '@nx/graph/shared'; import { useNavigate } from 'react-router-dom'; const tooltipService = getTooltipService(); @@ -17,6 +21,7 @@ export function TooltipDisplay() { const environment = useEnvironmentConfig()?.environment; const navigate = useNavigate(); const routeConstructor = useRouteConstructor(); + const externalApiService = getExternalApiService(); const currentTooltip = useSyncExternalStore( (callback) => tooltipService.subscribe(callback), @@ -42,7 +47,7 @@ export function TooltipDisplay() { }; } else { return () => - this.externalApiService.postEvent({ + externalApiService.postEvent({ type: 'open-project-config', payload: { projectName: currentTooltip.props.id, @@ -81,7 +86,7 @@ export function TooltipDisplay() { }; } else { return () => - this.externalApiService.postEvent({ + externalApiService.postEvent({ type: 'open-project-config', payload: { projectName, diff --git a/graph/project-details/src/lib/project-details-wrapper.tsx b/graph/project-details/src/lib/project-details-wrapper.tsx index d42f5acccc89b4..e9c56339741b8f 100644 --- a/graph/project-details/src/lib/project-details-wrapper.tsx +++ b/graph/project-details/src/lib/project-details-wrapper.tsx @@ -95,13 +95,13 @@ export function ProjectDetailsWrapper(props: ProjectDetailsProps) { const handleTargetCollapse = useCallback( (targetName: string) => { + const expandedSections = searchParams.get('expanded')?.split(',') || []; + if (!expandedSections.includes(targetName)) return; + const newExpandedSections = expandedSections.filter( + (section) => section !== targetName + ); setSearchParams( (currentSearchParams) => { - const expandedSections = - currentSearchParams.get('expanded')?.split(',') || []; - const newExpandedSections = expandedSections.filter( - (section) => section !== targetName - ); updateSearchParams(currentSearchParams, newExpandedSections); return currentSearchParams; }, @@ -111,38 +111,34 @@ export function ProjectDetailsWrapper(props: ProjectDetailsProps) { } ); }, - [setSearchParams] + [setSearchParams, searchParams] ); const handleTargetExpand = useCallback( (targetName: string) => { + const expandedSections = searchParams.get('expanded')?.split(',') || []; + if (expandedSections.includes(targetName)) return; + expandedSections.push(targetName); setSearchParams( (currentSearchParams) => { - const expandedSections = - currentSearchParams.get('expanded')?.split(',') || []; - if (!expandedSections.includes(targetName)) { - expandedSections.push(targetName); - updateSearchParams(currentSearchParams, expandedSections); - } + updateSearchParams(currentSearchParams, expandedSections); return currentSearchParams; }, { replace: true, preventScrollReset: true } ); }, - [setSearchParams] + [setSearchParams, searchParams] ); - // On initial render, expand the sections that are included in the URL search params. - const isExpandedHandled = useRef(false); useLayoutEffect(() => { if (!props.project.data.targets) return; - if (isExpandedHandled.current) return; - isExpandedHandled.current = true; const expandedSections = searchParams.get('expanded')?.split(',') || []; for (const targetName of Object.keys(props.project.data.targets)) { if (expandedSections.includes(targetName)) { projectDetailsRef.current?.expandTarget(targetName); + } else { + projectDetailsRef.current?.collapseTarget(targetName); } } }, [searchParams, props.project.data.targets, projectDetailsRef]); diff --git a/graph/shared/src/lib/external-api.ts b/graph/shared/src/lib/external-api.ts index a7e87cb277a80c..bf4fc79e1ef2c2 100644 --- a/graph/shared/src/lib/external-api.ts +++ b/graph/shared/src/lib/external-api.ts @@ -6,6 +6,8 @@ import type { } from 'nx/src/command-line/graph/graph'; export abstract class ExternalApi { + abstract openProjectDetails(projectName: string, targetName?: string): void; + abstract focusProject(projectName: string): void; abstract toggleSelectProject(projectName: string): void; diff --git a/nx-dev/nx-dev-e2e/playwright.config.ts b/nx-dev/nx-dev-e2e/playwright.config.ts index 1968ceb3e67240..f13fec3217d653 100644 --- a/nx-dev/nx-dev-e2e/playwright.config.ts +++ b/nx-dev/nx-dev-e2e/playwright.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from '@playwright/test'; +import { defineConfig, devices } from '@playwright/test'; import { nxE2EPreset } from '@nx/playwright/preset'; // nx-ignore-next-line @@ -39,4 +39,20 @@ export default defineConfig({ reuseExistingServer: !process.env.CI, cwd: workspaceRoot, }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + ], }); diff --git a/nx-dev/nx-dev/lib/rspack/schema/executors/dev-server.ts b/nx-dev/nx-dev/lib/rspack/schema/executors/dev-server.ts index a133ca1b61a4d5..6e45c2002eddc0 100644 --- a/nx-dev/nx-dev/lib/rspack/schema/executors/dev-server.ts +++ b/nx-dev/nx-dev/lib/rspack/schema/executors/dev-server.ts @@ -3,7 +3,7 @@ export const schema = { implementation: '/packages/rspack/src/executors/dev-server/dev-server.impl.ts', schema: { - $schema: 'http://json-schema.org/schema', + $schema: 'https://json-schema.org/schema', version: 2, cli: 'nx', title: 'Rspack dev-server executor', diff --git a/nx-dev/nx-dev/lib/rspack/schema/executors/rspack.ts b/nx-dev/nx-dev/lib/rspack/schema/executors/rspack.ts index e71d951b82627c..b8fea79079c66f 100644 --- a/nx-dev/nx-dev/lib/rspack/schema/executors/rspack.ts +++ b/nx-dev/nx-dev/lib/rspack/schema/executors/rspack.ts @@ -2,7 +2,7 @@ export const schema = { name: 'rspack', implementation: '/packages/rspack/src/executors/rspack/rspack.impl.ts', schema: { - $schema: 'http://json-schema.org/schema', + $schema: 'https://json-schema.org/schema', version: 2, cli: 'nx', title: 'Rspack build executor', diff --git a/nx-dev/nx-dev/lib/rspack/schema/generators/application.ts b/nx-dev/nx-dev/lib/rspack/schema/generators/application.ts index 62bfa5de5fc0a5..a1d4a5b52e90fb 100644 --- a/nx-dev/nx-dev/lib/rspack/schema/generators/application.ts +++ b/nx-dev/nx-dev/lib/rspack/schema/generators/application.ts @@ -2,7 +2,7 @@ export const schema = { name: 'application', factory: './src/generators/application/application#applicationGenerator', schema: { - $schema: 'http://json-schema.org/schema', + $schema: 'https://json-schema.org/schema', cli: 'nx', $id: 'Application', title: 'Application generator for React + rspack', @@ -51,12 +51,12 @@ export const schema = { { value: 'scss', label: - 'SASS(.scss) [ http://sass-lang.com ]', + 'SASS(.scss) [ https://sass-lang.com ]', }, { value: 'less', label: - 'LESS [ http://lesscss.org ]', + 'LESS [ https://lesscss.org ]', }, { value: 'none', diff --git a/nx-dev/nx-dev/lib/rspack/schema/generators/configuration.ts b/nx-dev/nx-dev/lib/rspack/schema/generators/configuration.ts index 8c20986e90959a..8099ae3addd2fd 100644 --- a/nx-dev/nx-dev/lib/rspack/schema/generators/configuration.ts +++ b/nx-dev/nx-dev/lib/rspack/schema/generators/configuration.ts @@ -3,7 +3,7 @@ export const schema = { factory: './src/generators/configuration/configuration#configurationGenerator', schema: { - $schema: 'http://json-schema.org/schema', + $schema: 'https://json-schema.org/schema', cli: 'nx', $id: 'Rspack', title: '', diff --git a/nx-dev/nx-dev/lib/rspack/schema/generators/init.ts b/nx-dev/nx-dev/lib/rspack/schema/generators/init.ts index 1736278f7025e6..dab70b4200a0bb 100644 --- a/nx-dev/nx-dev/lib/rspack/schema/generators/init.ts +++ b/nx-dev/nx-dev/lib/rspack/schema/generators/init.ts @@ -2,7 +2,7 @@ export const schema = { name: 'init', factory: './src/generators/init/init#rspackInitGenerator', schema: { - $schema: 'http://json-schema.org/schema', + $schema: 'https://json-schema.org/schema', cli: 'nx', $id: 'Init', title: '', diff --git a/nx-dev/nx-dev/pages/launch-nx.tsx b/nx-dev/nx-dev/pages/launch-nx.tsx index 9ff7ea96cdee72..5656f59344360f 100644 --- a/nx-dev/nx-dev/pages/launch-nx.tsx +++ b/nx-dev/nx-dev/pages/launch-nx.tsx @@ -3,11 +3,12 @@ import { LaunchWeekAgenda, LaunchWeekAnnouncements, LaunchWeekSpeakers, + LaunchNxCommunityPartners, + ConfHealthAndSafety, } from '@nx/nx-dev/ui-conference'; import { NextSeo } from 'next-seo'; import Link from 'next/link'; import { useRouter } from 'next/router'; -import Script from 'next/script'; export default function ConfPage(): JSX.Element { const router = useRouter(); @@ -106,6 +107,15 @@ export default function ConfPage(): JSX.Element { className="text-blue-500 dark:text-sky-500" > Linkedin + + ,{' '} + + Youtube {' '} or{' '} Launch Conf - {/**/} - {/* Community Partners*/} - {/**/} + + Community Partners + + {/* + Code of Conduct + */} @@ -218,160 +234,31 @@ export default function ConfPage(): JSX.Element { - {/*SPONSORS -
-
-

- Sponsors -

+ {/*COMMUNITY PARTNERS*/} +
+
+

+ Community Partners +

+
-
- */} - {/*
- SPONSORS -
-

- Sponsors -

-
-
- - - - - - - - -
-
- - - - - - - - - -
+ + + {/*HEALTH AND SAFETY*/} + {/*
+
+

+ Code of Conduct (CoC) +

-
*/} + */}
diff --git a/package.json b/package.json index 1b97c5218f2ea1..dca260992f8523 100644 --- a/package.json +++ b/package.json @@ -39,9 +39,9 @@ "@angular/compiler-cli": "~17.1.0", "@angular/core": "~17.1.0", "@angular/router": "~17.1.0", - "@babel/core": "^7.22.9", + "@babel/core": "^7.23.2", "@babel/helper-create-regexp-features-plugin": "^7.22.9", - "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/plugin-transform-runtime": "^7.23.2", "@babel/preset-react": "^7.22.5", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", @@ -168,7 +168,7 @@ "enhanced-resolve": "^5.8.3", "esbuild": "0.19.5", "eslint": "8.48.0", - "eslint-config-next": "13.1.1", + "eslint-config-next": "14.0.4", "eslint-config-prettier": "9.0.0", "eslint-plugin-cypress": "2.14.0", "eslint-plugin-import": "2.27.5", @@ -224,8 +224,8 @@ "mdast-util-to-markdown": "^1.5.0", "mdast-util-to-string": "^3.2.0", "memfs": "^3.0.1", - "metro-config": "0.76.8", - "metro-resolver": "0.76.8", + "metro-config": "~0.80.4", + "metro-resolver": "~0.80.4", "mini-css-extract-plugin": "~2.4.7", "minimatch": "9.0.3", "next-sitemap": "^3.1.10", @@ -264,7 +264,7 @@ "rxjs": "^7.8.0", "sass": "1.55.0", "sass-loader": "^12.2.0", - "semver": "7.5.3", + "semver": "^7.5.3", "source-map": "0.7.3", "source-map-loader": "^3.0.0", "source-map-support": "0.5.19", @@ -327,7 +327,7 @@ "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.6", - "axios": "^1.5.1", + "axios": "^1.6.0", "classnames": "^2.3.1", "cliui": "^8.0.1", "core-js": "^3.6.5", @@ -339,7 +339,7 @@ "json-schema-to-typescript": "^10.1.5", "jsonpointer": "^5.0.0", "license-checker": "^25.0.1", - "next": "13.3.4", + "next": "14.0.4", "next-seo": "^5.13.0", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", diff --git a/packages-legacy/js/executors.json b/packages-legacy/js/executors.json index 905d55a5f5a930..ff218748b08f76 100644 --- a/packages-legacy/js/executors.json +++ b/packages-legacy/js/executors.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "executors": { "tsc": { "implementation": "@nx/js/src/executors/tsc/tsc.impl", diff --git a/packages/angular/executors.ts b/packages/angular/executors.ts index 7160a154c3a963..8149bc6e1f68d4 100644 --- a/packages/angular/executors.ts +++ b/packages/angular/executors.ts @@ -11,9 +11,9 @@ export * from './src/executors/application/application.impl'; import { executeDevServerBuilder } from './src/builders/dev-server/dev-server.impl'; export { - // TODO(v18): remove this alias + // TODO(v19): remove this alias /** - * @deprecated Use executeDevServerBuilder instead. It will be removed in Nx v18. + * @deprecated Use executeDevServerBuilder instead. It will be removed in Nx v19. */ executeDevServerBuilder as executeWebpackDevServerBuilder, executeDevServerBuilder, diff --git a/packages/angular/generators.json b/packages/angular/generators.json index 7a81ee936f6050..7946ed4b2afb08 100644 --- a/packages/angular/generators.json +++ b/packages/angular/generators.json @@ -39,6 +39,11 @@ "schema": "./src/generators/component-test/schema.json", "description": "Creates a cypress component test file for a component." }, + "convert-to-application-executor": { + "factory": "./src/generators/convert-to-application-executor/convert-to-application-executor", + "schema": "./src/generators/convert-to-application-executor/schema.json", + "description": "Converts projects to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. _Note: this is only supported in Angular versions >= 17.0.0_." + }, "directive": { "factory": "./src/generators/directive/directive", "schema": "./src/generators/directive/schema.json", @@ -81,7 +86,7 @@ "schema": "./src/generators/move/schema.json", "aliases": ["mv"], "description": "Moves an Angular application or library to another folder within the workspace and updates the project configuration.", - "x-deprecated": "Use the `@nx/workspace:move` generator instead. This generator will be removed in Nx v18." + "x-deprecated": "Use the `@nx/workspace:move` generator instead. This generator will be removed in Nx v19." }, "convert-to-with-mf": { "factory": "./src/generators/convert-to-with-mf/convert-to-with-mf", diff --git a/packages/angular/migrations.json b/packages/angular/migrations.json index a9e7d97156c286..952842c320fea8 100644 --- a/packages/angular/migrations.json +++ b/packages/angular/migrations.json @@ -356,6 +356,12 @@ }, "description": "Add 'autoprefixer' as dev dependency when '@nx/angular:ng-packagr-lite' or '@nx/angular:package` is used.", "factory": "./src/migrations/update-17-3-0/add-autoprefixer-dependency" + }, + "add-module-federation-env-var-to-target-defaults": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Add NX_MF_DEV_SERVER_STATIC_REMOTES to inputs for task hashing when '@nx/angular:webpack-browser' is used for Module Federation.", + "factory": "./src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults" } }, "packageJsonUpdates": { diff --git a/packages/angular/package.json b/packages/angular/package.json index 3156c6aac9c304..eabda4446add18 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -53,7 +53,7 @@ "ignore": "^5.0.4", "magic-string": "~0.30.2", "minimatch": "9.0.3", - "semver": "7.5.3", + "semver": "^7.5.3", "tslib": "^2.3.0", "webpack": "^5.80.0", "webpack-merge": "^5.8.0", diff --git a/packages/angular/src/builders/dev-server/dev-server.impl.ts b/packages/angular/src/builders/dev-server/dev-server.impl.ts index fdd7409e993a76..ae6a7c147d16cc 100644 --- a/packages/angular/src/builders/dev-server/dev-server.impl.ts +++ b/packages/angular/src/builders/dev-server/dev-server.impl.ts @@ -53,7 +53,7 @@ export function executeDevServerBuilder( rawOptions: Schema, context: import('@angular-devkit/architect').BuilderContext ) { - if (rawOptions.esbuildMiddleware) { + if (rawOptions.esbuildMiddleware?.length > 0) { const { major: angularMajorVersion, version: angularVersion } = getInstalledAngularVersionInfo(); if (angularMajorVersion < 17) { diff --git a/packages/angular/src/builders/dev-server/schema.json b/packages/angular/src/builders/dev-server/schema.json index ab5142d7e511ee..b45dc7c659ba4f 100644 --- a/packages/angular/src/builders/dev-server/schema.json +++ b/packages/angular/src/builders/dev-server/schema.json @@ -17,7 +17,7 @@ "type": "string", "description": "A browser builder target to serve in the format of `project:target[:configuration]`. Ignored if `buildTarget` is set.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v18." + "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v19." }, "buildTarget": { "type": "string", diff --git a/packages/angular/src/executors/module-federation-dev-server/schema.json b/packages/angular/src/executors/module-federation-dev-server/schema.json index 9b9c99312c438e..ce44d249b1c15f 100644 --- a/packages/angular/src/executors/module-federation-dev-server/schema.json +++ b/packages/angular/src/executors/module-federation-dev-server/schema.json @@ -15,7 +15,7 @@ "type": "string", "description": "A browser builder target to serve in the format of `project:target[:configuration]`.", "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$", - "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v18." + "x-deprecated": "Use 'buildTarget' instead. It will be removed in Nx v19." }, "buildTarget": { "type": "string", diff --git a/packages/angular/src/executors/ng-packagr-lite/schema.json b/packages/angular/src/executors/ng-packagr-lite/schema.json index dd402ee18b3550..5161329873f21a 100644 --- a/packages/angular/src/executors/ng-packagr-lite/schema.json +++ b/packages/angular/src/executors/ng-packagr-lite/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "ng-packagr Target", "description": "Builds a library with support for incremental builds.\n\nThis executor is meant to be used with buildable libraries in an incremental build scenario. It is similar to the `@nx/angular:package` executor but with some key differences:\n- For supported Angular versions lower than v16, it doesn't run `ngcc` automatically (`ngcc` is no longer available from Angular v16 onwards, for lower versions, it needs to be run separately beforehand if needed, this can be done in a `postinstall` hook on `package.json`).\n- It only produces ESM2022 bundles (ESM2020 for supported Angular versions lower than v16).", "cli": "nx", diff --git a/packages/angular/src/executors/package/schema.json b/packages/angular/src/executors/package/schema.json index 23ddf9abc80441..c93cb01b0a7fcd 100644 --- a/packages/angular/src/executors/package/schema.json +++ b/packages/angular/src/executors/package/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "ng-packagr Target", "description": "Builds and packages an Angular library producing an output following the Angular Package Format (APF) to be distributed as an NPM package.\n\nThis executor is similar to the `@angular-devkit/build-angular:ng-packagr` with additional support for incremental builds.", "cli": "nx", diff --git a/packages/angular/src/generators/add-linting/schema.json b/packages/angular/src/generators/add-linting/schema.json index 517bab667841c6..a4020522f5581e 100644 --- a/packages/angular/src/generators/add-linting/schema.json +++ b/packages/angular/src/generators/add-linting/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularAddLintingGenerator", "title": "Add linting to an Angular project.", "description": "Adds linting configuration to an Angular project.", diff --git a/packages/angular/src/generators/application/application.ts b/packages/angular/src/generators/application/application.ts index 5c97c9234dde09..c79fee0b29851d 100644 --- a/packages/angular/src/generators/application/application.ts +++ b/packages/angular/src/generators/application/application.ts @@ -26,6 +26,7 @@ import { updateEditorTsConfig, } from './lib'; import type { Schema } from './schema'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function applicationGenerator( tree: Tree, @@ -103,6 +104,7 @@ export async function applicationGeneratorInternal( return () => { installPackagesTask(tree); + logShowProjectCommand(options.name); }; } diff --git a/packages/angular/src/generators/application/schema.json b/packages/angular/src/generators/application/schema.json index 6de1e0bf3b1e4b..daf56df4bd41c6 100644 --- a/packages/angular/src/generators/application/schema.json +++ b/packages/angular/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorNxApp", "title": "Creates an Angular application.", "description": "Creates an Angular application.", @@ -41,15 +41,15 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "sass", - "label": "SASS(.sass) [ http://sass-lang.com ]" + "label": "SASS(.sass) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/packages/angular/src/generators/component-cypress-spec/schema.json b/packages/angular/src/generators/component-cypress-spec/schema.json index 1fe12972afa20e..16b81139ba5e1e 100644 --- a/packages/angular/src/generators/component-cypress-spec/schema.json +++ b/packages/angular/src/generators/component-cypress-spec/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularComponentCypressSpecGenerator", "type": "object", "cli": "nx", diff --git a/packages/angular/src/generators/component-test/schema.json b/packages/angular/src/generators/component-test/schema.json index 1c61215d9ec575..142868ac8035be 100644 --- a/packages/angular/src/generators/component-test/schema.json +++ b/packages/angular/src/generators/component-test/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularComponentTestGenerator", "type": "object", "cli": "nx", diff --git a/packages/angular/src/generators/component/schema.d.ts b/packages/angular/src/generators/component/schema.d.ts index 7b233baff33108..41caeb1dc29962 100644 --- a/packages/angular/src/generators/component/schema.d.ts +++ b/packages/angular/src/generators/component/schema.d.ts @@ -22,15 +22,15 @@ export interface Schema { skipFormat?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `directory` option instead. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. It will be removed in Nx v19. */ path?: string; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/angular/src/generators/component/schema.json b/packages/angular/src/generators/component/schema.json index a67189761c62f7..113b30663163dc 100644 --- a/packages/angular/src/generators/component/schema.json +++ b/packages/angular/src/generators/component/schema.json @@ -34,7 +34,7 @@ "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "prefix": { "type": "string", @@ -98,7 +98,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "skipImport": { "type": "boolean", diff --git a/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.spec.ts b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.spec.ts new file mode 100644 index 00000000000000..45d42f245fa3dc --- /dev/null +++ b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.spec.ts @@ -0,0 +1,315 @@ +import { + addProjectConfiguration, + logger, + readProjectConfiguration, + updateJson, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { convertToApplicationExecutor } from './convert-to-application-executor'; + +describe('convert-to-application-executor generator', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + jest.spyOn(logger, 'info').mockImplementation(() => {}); + jest.spyOn(logger, 'warn').mockImplementation(() => {}); + }); + + it.each` + executor | expected + ${'@angular-devkit/build-angular:browser'} | ${'@angular-devkit/build-angular:application'} + ${'@angular-devkit/build-angular:browser-esbuild'} | ${'@angular-devkit/build-angular:application'} + ${'@nx/angular:webpack-browser'} | ${'@nx/angular:application'} + ${'@nx/angular:browser-esbuild'} | ${'@nx/angular:application'} + `( + 'should replace "$executor" with "$expected"', + async ({ executor, expected }) => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { build: { executor } }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.executor).toBe(expected); + } + ); + + it('should not convert the target when using a custom webpack config', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@nx/angular:webpack-browser', + options: { + customWebpackConfig: { + path: 'app1/webpack.config.js', + }, + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.executor).toBe('@nx/angular:webpack-browser'); + expect(project.targets.build.options.customWebpackConfig).toStrictEqual({ + path: 'app1/webpack.config.js', + }); + }); + + it('should rename "main" to "browser"', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + main: 'app1/main.ts', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.options.browser).toBe('app1/main.ts'); + expect(project.targets.build.options.main).toBeUndefined(); + }); + + it('should rename "ngswConfigPath" to "serviceWorker"', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + ngswConfigPath: 'app1/ngsw-config.json', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.options.serviceWorker).toBe( + 'app1/ngsw-config.json' + ); + expect(project.targets.build.options.ngswConfigPath).toBeUndefined(); + }); + + it('should convert a string value for "polyfills" to an array', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + polyfills: 'zone.js', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.options.polyfills).toStrictEqual(['zone.js']); + }); + + it('should update "outputs"', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + outputs: ['{options.outputPath}'], + options: { + outputPath: 'dist/app1', + resourcesOutputPath: 'media', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.outputs).toStrictEqual([ + '{options.outputPath.base}', + ]); + }); + + it('should replace "outputPath" to string if "resourcesOutputPath" is set to "media"', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + outputPath: 'dist/app1', + resourcesOutputPath: 'media', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + const { outputPath, resourcesOutputPath } = project.targets.build.options; + expect(outputPath).toStrictEqual({ base: 'dist/app1' }); + expect(resourcesOutputPath).toBeUndefined(); + }); + + it('should set "outputPath.media" if "resourcesOutputPath" is set and is not "media"', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + outputPath: 'dist/app1', + resourcesOutputPath: 'resources', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + const { outputPath, resourcesOutputPath } = project.targets.build.options; + expect(outputPath).toStrictEqual({ base: 'dist/app1', media: 'resources' }); + expect(resourcesOutputPath).toBeUndefined(); + }); + + it('should remove "browser" portion from "outputPath"', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: { + outputPath: 'dist/app1/browser', + resourcesOutputPath: 'resources', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.options.outputPath).toStrictEqual({ + base: 'dist/app1', + media: 'resources', + }); + }); + + it('should remove unsupported options', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + options: {}, + configurations: { + development: { + buildOptimizer: false, + vendorChunk: true, + commonChunk: true, + }, + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect( + project.targets.build.configurations.development.buildOptimizer + ).toBeUndefined(); + expect( + project.targets.build.configurations.development.vendorChunk + ).toBeUndefined(); + expect( + project.targets.build.configurations.development.commonChunk + ).toBeUndefined(); + }); + + describe('compat', () => { + it('should not convert outputs to the object notation when angular version is lower that 17.1.0', async () => { + updateJson(tree, 'package.json', (json) => { + json.dependencies['@angular/core'] = '17.0.0'; + return json; + }); + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + outputs: ['{options.outputPath}'], + options: { + outputPath: 'dist/app1', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.outputs).toStrictEqual([ + '{options.outputPath}', + ]); + expect(project.targets.build.options.outputPath).toBe('dist/app1'); + }); + + it('should remove trailing "/browser" from output path when angular version is lower that 17.1.0', async () => { + updateJson(tree, 'package.json', (json) => { + json.dependencies['@angular/core'] = '17.0.0'; + return json; + }); + addProjectConfiguration(tree, 'app1', { + root: 'app1', + projectType: 'application', + targets: { + build: { + executor: '@angular-devkit/build-angular:browser', + outputs: ['{options.outputPath}'], + options: { + outputPath: 'dist/app1/browser', + }, + }, + }, + }); + + await convertToApplicationExecutor(tree, {}); + + const project = readProjectConfiguration(tree, 'app1'); + expect(project.targets.build.outputs).toStrictEqual([ + '{options.outputPath}', + ]); + expect(project.targets.build.options.outputPath).toBe('dist/app1'); + }); + }); +}); diff --git a/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts new file mode 100644 index 00000000000000..528b64c6200158 --- /dev/null +++ b/packages/angular/src/generators/convert-to-application-executor/convert-to-application-executor.ts @@ -0,0 +1,338 @@ +import { + formatFiles, + getProjects, + installPackagesTask, + logger, + readJson, + readProjectConfiguration, + updateProjectConfiguration, + writeJson, + type TargetConfiguration, + type Tree, +} from '@nx/devkit'; +import { dirname, join } from 'node:path/posix'; +import { gte, lt } from 'semver'; +import { allTargetOptions } from '../../utils/targets'; +import { setupSsr } from '../setup-ssr/setup-ssr'; +import { validateProject } from '../utils/validations'; +import { getInstalledAngularVersionInfo } from '../utils/version-utils'; +import type { GeneratorOptions } from './schema'; + +const executorsToConvert = new Set([ + '@angular-devkit/build-angular:browser', + '@angular-devkit/build-angular:browser-esbuild', + '@nx/angular:webpack-browser', + '@nx/angular:browser-esbuild', +]); +const serverTargetExecutors = new Set([ + '@angular-devkit/build-angular:server', + '@nx/angular:webpack-server', +]); +const redundantExecutors = new Set([ + '@angular-devkit/build-angular:server', + '@angular-devkit/build-angular:prerender', + '@angular-devkit/build-angular:app-shell', + '@angular-devkit/build-angular:ssr-dev-server', + '@nx/angular:webpack-server', +]); + +export async function convertToApplicationExecutor( + tree: Tree, + options: GeneratorOptions +) { + const { major: angularMajorVersion, version: angularVersion } = + getInstalledAngularVersionInfo(tree); + if (angularMajorVersion < 17) { + throw new Error( + `The "convert-to-application-executor" generator is only supported in Angular >= 17.0.0. You are currently using "${angularVersion}".` + ); + } + + let didAnySucceed = false; + if (options.project) { + validateProject(tree, options.project); + didAnySucceed = await convertProjectTargets( + tree, + options.project, + angularVersion, + true + ); + } else { + const projects = getProjects(tree); + for (const [projectName] of projects) { + logger.info(`Converting project "${projectName}"...`); + const success = await convertProjectTargets( + tree, + projectName, + angularVersion + ); + + if (success) { + logger.info(`Project "${projectName}" converted successfully.`); + } else { + logger.info( + `Project "${projectName}" could not be converted. See above for more information.` + ); + } + logger.info(''); + didAnySucceed = didAnySucceed || success; + } + } + + if (!options.skipFormat) { + await formatFiles(tree); + } + + return didAnySucceed ? () => installPackagesTask(tree) : () => {}; +} + +async function convertProjectTargets( + tree: Tree, + projectName: string, + angularVersion: string, + isProvidedProject = false +): Promise { + function warnIfProvided(message: string): void { + if (isProvidedProject) { + logger.warn(message); + } + } + + let project = readProjectConfiguration(tree, projectName); + if (project.projectType !== 'application') { + warnIfProvided( + `The provided project "${projectName}" is not an application. Skipping conversion.` + ); + return false; + } + + const { buildTargetName, serverTargetName } = getTargetsToConvert( + project.targets + ); + if (!buildTargetName) { + warnIfProvided( + `The provided project "${projectName}" does not have any targets using on of the ` + + `'@angular-devkit/build-angular:browser', '@angular-devkit/build-angular:browser-esbuild', ` + + `'@nx/angular:browser' and '@nx/angular:browser-esbuild' executors. Skipping conversion.` + ); + return false; + } + + const useNxExecutor = + project.targets[buildTargetName].executor.startsWith('@nx/angular:'); + const newExecutor = useNxExecutor + ? '@nx/angular:application' + : '@angular-devkit/build-angular:application'; + + const buildTarget = project.targets[buildTargetName]; + buildTarget.executor = newExecutor; + + if (gte(angularVersion, '17.1.0') && buildTarget.outputs) { + buildTarget.outputs = buildTarget.outputs.map((output) => + output === '{options.outputPath}' ? '{options.outputPath.base}' : output + ); + } + + for (const [, options] of allTargetOptions(buildTarget)) { + if (options['index'] === '') { + options['index'] = false; + } + + // Rename and transform options + options['browser'] = options['main']; + if (serverTargetName && typeof options['browser'] === 'string') { + options['server'] = dirname(options['browser']) + '/main.server.ts'; + } + options['serviceWorker'] = + options['ngswConfigPath'] ?? options['serviceWorker']; + + if (typeof options['polyfills'] === 'string') { + options['polyfills'] = [options['polyfills']]; + } + + let outputPath = options['outputPath']; + if (lt(angularVersion, '17.1.0')) { + options['outputPath'] = outputPath?.replace(/\/browser\/?$/, ''); + } else if (typeof outputPath === 'string') { + if (!/\/browser\/?$/.test(outputPath)) { + logger.warn( + `The output location of the browser build has been updated from "${outputPath}" to ` + + `"${join(outputPath, 'browser')}". ` + + 'You might need to adjust your deployment pipeline or, as an alternative, ' + + 'set outputPath.browser to "" in order to maintain the previous functionality.' + ); + } else { + outputPath = outputPath.replace(/\/browser\/?$/, ''); + } + + options['outputPath'] = { + base: outputPath, + }; + + if (typeof options['resourcesOutputPath'] === 'string') { + const media = options['resourcesOutputPath'].replaceAll('/', ''); + if (media && media !== 'media') { + options['outputPath'] = { + base: outputPath, + media: media, + }; + } + } + } + + // Delete removed options + delete options['deployUrl']; + delete options['vendorChunk']; + delete options['commonChunk']; + delete options['resourcesOutputPath']; + delete options['buildOptimizer']; + delete options['main']; + delete options['ngswConfigPath']; + } + + // Merge browser and server tsconfig + if (serverTargetName) { + const browserTsConfigPath = buildTarget?.options?.tsConfig; + const serverTsConfigPath = project.targets['server']?.options?.tsConfig; + + if (typeof browserTsConfigPath !== 'string') { + logger.warn( + `Cannot update project "${projectName}" to use the application executor ` + + `as the browser tsconfig cannot be located.` + ); + } + + if (typeof serverTsConfigPath !== 'string') { + logger.warn( + `Cannot update project "${projectName}" to use the application executor ` + + `as the server tsconfig cannot be located.` + ); + } + + const browserTsConfigJson = readJson(tree, browserTsConfigPath); + const serverTsConfigJson = readJson(tree, serverTsConfigPath); + + const files = new Set([ + ...(browserTsConfigJson.files ?? []), + ...(serverTsConfigJson.files ?? []), + ]); + + // Server file will be added later by the setup-ssr generator + files.delete('server.ts'); + + browserTsConfigJson.files = Array.from(files); + browserTsConfigJson.compilerOptions ?? {}; + browserTsConfigJson.compilerOptions.types = Array.from( + new Set([ + ...(browserTsConfigJson.compilerOptions.types ?? []), + ...(serverTsConfigJson.compilerOptions?.types ?? []), + ]) + ); + + // Delete server tsconfig + tree.delete(serverTsConfigPath); + } + + // Update project main tsconfig + const projectRootTsConfigPath = join(project.root, 'tsconfig.json'); + if (tree.exists(projectRootTsConfigPath)) { + const rootTsConfigJson = readJson(tree, projectRootTsConfigPath); + rootTsConfigJson.compilerOptions ?? {}; + rootTsConfigJson.compilerOptions.esModuleInterop = true; + rootTsConfigJson.compilerOptions.downlevelIteration = undefined; + rootTsConfigJson.compilerOptions.allowSyntheticDefaultImports = undefined; + writeJson(tree, projectRootTsConfigPath, rootTsConfigJson); + } + + // Update server file + const ssrMainFile = project.targets['server']?.options?.['main']; + if (typeof ssrMainFile === 'string') { + tree.delete(ssrMainFile); + // apply changes so the setup-ssr generator can access the updated project + updateProjectConfiguration(tree, projectName, project); + await setupSsr(tree, { project: projectName, skipFormat: true }); + // re-read project configuration as it might have changed + project = readProjectConfiguration(tree, projectName); + } + + // Delete all redundant targets + for (const [targetName, target] of Object.entries(project.targets)) { + if (redundantExecutors.has(target.executor)) { + delete project.targets[targetName]; + } + } + + updateProjectConfiguration(tree, projectName, project); + return true; +} + +function getTargetsToConvert(targets: Record): { + buildTargetName?: string; + serverTargetName?: string; +} { + let buildTargetName: string; + let serverTargetName: string; + for (const target of Object.keys(targets)) { + if ( + targets[target].executor === '@nx/angular:application' || + targets[target].executor === '@angular-devkit/build-angular:application' + ) { + logger.warn( + 'The project is already using the application builder. Skipping conversion.' + ); + return {}; + } + + // build target + if (executorsToConvert.has(targets[target].executor)) { + for (const [, options] of allTargetOptions(targets[target])) { + if (options.deployUrl) { + logger.warn( + `The project is using the "deployUrl" option which is not available in the application builder. Skipping conversion.` + ); + return {}; + } + if (options.customWebpackConfig) { + logger.warn( + `The project is using a custom webpack configuration which is not supported by the esbuild-based application executor. Skipping conversion.` + ); + return {}; + } + } + + if (buildTargetName) { + logger.warn( + 'The project has more than one build target. Skipping conversion.' + ); + return {}; + } + buildTargetName = target; + } + + // server target + if (serverTargetExecutors.has(targets[target].executor)) { + if (targets[target].executor === '@nx/angular:webpack-server') { + for (const [, options] of allTargetOptions(targets[target])) { + if (options.customWebpackConfig) { + logger.warn( + `The project is using a custom webpack configuration which is not supported by the esbuild-based application executor. Skipping conversion.` + ); + return {}; + } + } + } + + if (serverTargetName) { + logger.warn( + 'The project has more than one server target. Skipping conversion.' + ); + return {}; + } + serverTargetName = target; + } + } + + return { buildTargetName, serverTargetName }; +} + +export default convertToApplicationExecutor; diff --git a/packages/angular/src/generators/convert-to-application-executor/schema.d.ts b/packages/angular/src/generators/convert-to-application-executor/schema.d.ts new file mode 100644 index 00000000000000..89d185c1bb2d74 --- /dev/null +++ b/packages/angular/src/generators/convert-to-application-executor/schema.d.ts @@ -0,0 +1,4 @@ +export interface GeneratorOptions { + project?: string; + skipFormat?: boolean; +} diff --git a/packages/angular/src/generators/convert-to-application-executor/schema.json b/packages/angular/src/generators/convert-to-application-executor/schema.json new file mode 100644 index 00000000000000..f4cadea063e4af --- /dev/null +++ b/packages/angular/src/generators/convert-to-application-executor/schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "NxAngularConvertToApplicationExecutorGenerator", + "cli": "nx", + "title": "Converts projects to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. _Note: this is only supported in Angular versions >= 17.0.0_.", + "description": "Converts a project or all projects using one of the `@angular-devkit/build-angular:browser`, `@angular-devkit/build-angular:browser-esbuild`, `@nx/angular:browser` and `@nx/angular:browser-esbuild` executors to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder. If the converted target is using one of the `@nx/angular` executors, the `@nx/angular:application` executor will be used. Otherwise, the `@angular-devkit/build-angular:application` builder will be used.", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "Name of the Angular application project to convert. It has to contain a target using one of the `@angular-devkit/build-angular:browser`, `@angular-devkit/build-angular:browser-esbuild`, `@nx/angular:browser` and `@nx/angular:browser-esbuild` executors. If not specified, all projects with such targets will be converted.", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-priority": "important" + }, + "skipFormat": { + "description": "Skip formatting files.", + "type": "boolean", + "default": false, + "x-priority": "internal" + } + }, + "additionalProperties": false +} diff --git a/packages/angular/src/generators/directive/schema.d.ts b/packages/angular/src/generators/directive/schema.d.ts index 3e7ff0884574f4..09459e008245e6 100644 --- a/packages/angular/src/generators/directive/schema.d.ts +++ b/packages/angular/src/generators/directive/schema.d.ts @@ -13,15 +13,15 @@ export interface Schema { export?: boolean; skipFormat?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `directory` option instead. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. It will be removed in Nx v19. */ path?: string; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/angular/src/generators/directive/schema.json b/packages/angular/src/generators/directive/schema.json index d09ad646feb8ef..c9c6b78079822c 100644 --- a/packages/angular/src/generators/directive/schema.json +++ b/packages/angular/src/generators/directive/schema.json @@ -34,7 +34,7 @@ "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "prefix": { "type": "string", @@ -74,7 +74,7 @@ "type": "boolean", "description": "When true (the default), creates the new files at the top level of the current project.", "default": true, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "module": { "type": "string", diff --git a/packages/angular/src/generators/federate-module/schema.json b/packages/angular/src/generators/federate-module/schema.json index e2ae3cf35691a2..a9807819c79238 100644 --- a/packages/angular/src/generators/federate-module/schema.json +++ b/packages/angular/src/generators/federate-module/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", diff --git a/packages/angular/src/generators/host/host.ts b/packages/angular/src/generators/host/host.ts index 57bd850d067fcd..6942429589f4c8 100644 --- a/packages/angular/src/generators/host/host.ts +++ b/packages/angular/src/generators/host/host.ts @@ -12,6 +12,7 @@ import remoteGenerator from '../remote/remote'; import { setupMf } from '../setup-mf/setup-mf'; import { updateSsrSetup } from './lib'; import type { Schema } from './schema'; +import { addMfEnvToTargetDefaultInputs } from '../utils/add-mf-env-to-inputs'; export async function host(tree: Tree, options: Schema) { return await hostInternal(tree, { @@ -113,6 +114,8 @@ export async function hostInternal(tree: Tree, schema: Schema) { }); } + addMfEnvToTargetDefaultInputs(tree); + if (!options.skipFormat) { await formatFiles(tree); } diff --git a/packages/angular/src/generators/host/schema.json b/packages/angular/src/generators/host/schema.json index 6fdb48fff646b1..53f0da7e4d98bf 100644 --- a/packages/angular/src/generators/host/schema.json +++ b/packages/angular/src/generators/host/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxMFHost", "cli": "nx", "title": "Nx Module Federation Host Application", @@ -55,15 +55,15 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "sass", - "label": "SASS(.sass) [ http://sass-lang.com ]" + "label": "SASS(.sass) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/packages/angular/src/generators/init/schema.json b/packages/angular/src/generators/init/schema.json index a5417ec85c8597..311d0ff0462e7e 100644 --- a/packages/angular/src/generators/init/schema.json +++ b/packages/angular/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SchematicsAngularModuleInit", "cli": "nx", "title": "Init Angular Plugin", diff --git a/packages/angular/src/generators/library-secondary-entry-point/schema.json b/packages/angular/src/generators/library-secondary-entry-point/schema.json index ffc5d2b441767f..725270373238c1 100644 --- a/packages/angular/src/generators/library-secondary-entry-point/schema.json +++ b/packages/angular/src/generators/library-secondary-entry-point/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularLibrarySecondaryEntryPoint", "title": "Creates a secondary entry point for a library", "description": "Creates a secondary entry point for an Angular publishable library.", diff --git a/packages/angular/src/generators/library/library.ts b/packages/angular/src/generators/library/library.ts index 8a81da33f1db40..871e21875d0141 100644 --- a/packages/angular/src/generators/library/library.ts +++ b/packages/angular/src/generators/library/library.ts @@ -31,6 +31,7 @@ import { addProject } from './lib/add-project'; import { addJest } from '../utils/add-jest'; import { setGeneratorDefaults } from './lib/set-generator-defaults'; import { ensureAngularDependencies } from '../utils/ensure-angular-dependencies'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function libraryGenerator( tree: Tree, @@ -119,6 +120,7 @@ export async function libraryGeneratorInternal( return () => { installPackagesTask(tree); + logShowProjectCommand(libraryOptions.name); }; } diff --git a/packages/angular/src/generators/library/schema.json b/packages/angular/src/generators/library/schema.json index da68e2fcd70470..a3f47f1b035736 100644 --- a/packages/angular/src/generators/library/schema.json +++ b/packages/angular/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularLibrary", "title": "Create a library", "description": "Creates an Angular library.", diff --git a/packages/angular/src/generators/move/schema.json b/packages/angular/src/generators/move/schema.json index 30063cbf459f27..87f1c441d65152 100644 --- a/packages/angular/src/generators/move/schema.json +++ b/packages/angular/src/generators/move/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularMove", "cli": "nx", "title": "Nx Angular Move", diff --git a/packages/angular/src/generators/ng-add/schema.json b/packages/angular/src/generators/ng-add/schema.json index 8ada29d6e3b51f..34fe9186f9e868 100644 --- a/packages/angular/src/generators/ng-add/schema.json +++ b/packages/angular/src/generators/ng-add/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularNgAddGenerator", "title": "Angular plugin initialization", "cli": "nx", diff --git a/packages/angular/src/generators/ngrx-feature-store/schema.json b/packages/angular/src/generators/ngrx-feature-store/schema.json index c0f1adb56e8467..0ac37fa3381822 100644 --- a/packages/angular/src/generators/ngrx-feature-store/schema.json +++ b/packages/angular/src/generators/ngrx-feature-store/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNgrxFeatureStoreGenerator", "title": "NgRx Feature Store Generator", "description": "Add an NgRx Feature Store to an application or library.", diff --git a/packages/angular/src/generators/ngrx-root-store/schema.json b/packages/angular/src/generators/ngrx-root-store/schema.json index 532aab92c18f5a..acf4262d3dd406 100644 --- a/packages/angular/src/generators/ngrx-root-store/schema.json +++ b/packages/angular/src/generators/ngrx-root-store/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNgrxRootStoreGenerator", "title": "Add NgRx support to an application.", "description": "Adds NgRx support to an application.", diff --git a/packages/angular/src/generators/ngrx/schema.json b/packages/angular/src/generators/ngrx/schema.json index 3ce79b1af633e3..8ad09955522ec5 100644 --- a/packages/angular/src/generators/ngrx/schema.json +++ b/packages/angular/src/generators/ngrx/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNgrxGenerator", "title": "Add NgRx support to an application or library.", "description": "Adds NgRx support to an application or library.", diff --git a/packages/angular/src/generators/pipe/schema.d.ts b/packages/angular/src/generators/pipe/schema.d.ts index 9e76d205193da6..21944949519747 100644 --- a/packages/angular/src/generators/pipe/schema.d.ts +++ b/packages/angular/src/generators/pipe/schema.d.ts @@ -11,15 +11,15 @@ export interface Schema { export?: boolean; skipFormat?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `directory` option instead. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. It will be removed in Nx v19. */ path?: string; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/angular/src/generators/pipe/schema.json b/packages/angular/src/generators/pipe/schema.json index bdee60e7d2effe..5300c9a361d37f 100644 --- a/packages/angular/src/generators/pipe/schema.json +++ b/packages/angular/src/generators/pipe/schema.json @@ -34,13 +34,13 @@ "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "flat": { "type": "boolean", "default": true, "description": "When true (the default) creates files at the top level of the project.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "skipTests": { "type": "boolean", diff --git a/packages/angular/src/generators/remote/remote.ts b/packages/angular/src/generators/remote/remote.ts index 341240104d8b23..598682aa9b91bb 100644 --- a/packages/angular/src/generators/remote/remote.ts +++ b/packages/angular/src/generators/remote/remote.ts @@ -12,6 +12,7 @@ import { setupMf } from '../setup-mf/setup-mf'; import { findNextAvailablePort, updateSsrSetup } from './lib'; import type { Schema } from './schema'; import { swcHelpersVersion } from '@nx/js/src/utils/versions'; +import { addMfEnvToTargetDefaultInputs } from '../utils/add-mf-env-to-inputs'; export async function remote(tree: Tree, options: Schema) { return await remoteInternal(tree, { @@ -90,6 +91,8 @@ export async function remoteInternal(tree: Tree, schema: Schema) { installTasks.push(ssrInstallTask); } + addMfEnvToTargetDefaultInputs(tree); + if (!options.skipFormat) { await formatFiles(tree); } diff --git a/packages/angular/src/generators/remote/schema.json b/packages/angular/src/generators/remote/schema.json index f9c106130a47a6..a323446f7e6900 100644 --- a/packages/angular/src/generators/remote/schema.json +++ b/packages/angular/src/generators/remote/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxMFRemote", "cli": "nx", "title": "Nx Module Federation Remote App", @@ -55,15 +55,15 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "sass", - "label": "SASS(.sass) [ http://sass-lang.com ]" + "label": "SASS(.sass) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/packages/angular/src/generators/scam-directive/schema.d.ts b/packages/angular/src/generators/scam-directive/schema.d.ts index 0ce5d2bb5d9c4d..f61c3da69c3378 100644 --- a/packages/angular/src/generators/scam-directive/schema.d.ts +++ b/packages/angular/src/generators/scam-directive/schema.d.ts @@ -11,15 +11,15 @@ export interface Schema { export?: boolean; skipFormat?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `directory` option instead. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. It will be removed in Nx v19. */ path?: string; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/angular/src/generators/scam-directive/schema.json b/packages/angular/src/generators/scam-directive/schema.json index 63ea015a39e01a..455e3cd97873ff 100644 --- a/packages/angular/src/generators/scam-directive/schema.json +++ b/packages/angular/src/generators/scam-directive/schema.json @@ -41,7 +41,7 @@ "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipTests": { "type": "boolean", @@ -58,7 +58,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": true, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "selector": { "type": "string", diff --git a/packages/angular/src/generators/scam-pipe/schema.d.ts b/packages/angular/src/generators/scam-pipe/schema.d.ts index 6cde78c48cda24..31ec4dcfdcdf12 100644 --- a/packages/angular/src/generators/scam-pipe/schema.d.ts +++ b/packages/angular/src/generators/scam-pipe/schema.d.ts @@ -9,15 +9,15 @@ export interface Schema { export?: boolean; skipFormat?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `directory` option instead. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. It will be removed in Nx v19. */ path?: string; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/angular/src/generators/scam-pipe/schema.json b/packages/angular/src/generators/scam-pipe/schema.json index b324b432c416d5..7a0b9f653c0dd0 100644 --- a/packages/angular/src/generators/scam-pipe/schema.json +++ b/packages/angular/src/generators/scam-pipe/schema.json @@ -41,7 +41,7 @@ "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipTests": { "type": "boolean", @@ -58,7 +58,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": true, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "export": { "type": "boolean", diff --git a/packages/angular/src/generators/scam-to-standalone/schema.json b/packages/angular/src/generators/scam-to-standalone/schema.json index 3987dcb68d3c76..d22df2fa3461cd 100644 --- a/packages/angular/src/generators/scam-to-standalone/schema.json +++ b/packages/angular/src/generators/scam-to-standalone/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularScamToStandalone", "cli": "nx", "title": "Convert an Inline SCAM to Standalone Component", diff --git a/packages/angular/src/generators/scam/schema.d.ts b/packages/angular/src/generators/scam/schema.d.ts index 2fa2c6e1233bf8..a38470cff067ac 100644 --- a/packages/angular/src/generators/scam/schema.d.ts +++ b/packages/angular/src/generators/scam/schema.d.ts @@ -19,15 +19,15 @@ export interface Schema { export?: boolean; skipFormat?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `directory` option instead. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. It will be removed in Nx v19. */ path?: string; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/angular/src/generators/scam/schema.json b/packages/angular/src/generators/scam/schema.json index f2843277451a98..a669d72a62a236 100644 --- a/packages/angular/src/generators/scam/schema.json +++ b/packages/angular/src/generators/scam/schema.json @@ -40,7 +40,7 @@ "$source": "projectName" }, "x-dropdown": "projects", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "displayBlock": { "description": "Specifies if the style will contain `:host { display: block; }`.", @@ -94,7 +94,7 @@ "type": "boolean", "description": "Create the new files at the top level of the current project.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "selector": { "type": "string", diff --git a/packages/angular/src/generators/setup-mf/schema.json b/packages/angular/src/generators/setup-mf/schema.json index 5986fad2a3be2c..66b263026a4fff 100644 --- a/packages/angular/src/generators/setup-mf/schema.json +++ b/packages/angular/src/generators/setup-mf/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularMFSetup", "cli": "nx", "title": "Generate Module Federation Setup for Angular App", diff --git a/packages/angular/src/generators/setup-ssr/lib/add-hydration.spec.ts b/packages/angular/src/generators/setup-ssr/lib/add-hydration.spec.ts new file mode 100644 index 00000000000000..269ffffbe77368 --- /dev/null +++ b/packages/angular/src/generators/setup-ssr/lib/add-hydration.spec.ts @@ -0,0 +1,159 @@ +import { addProjectConfiguration, type Tree } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { addHydration } from './add-hydration'; + +describe('add-hydration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'app1', { + root: 'app1', + sourceRoot: 'app1/src', + projectType: 'application', + targets: {}, + }); + }); + + it('should add "provideClientHydration" for standalone config', () => { + tree.write( + 'app1/src/app/app.config.ts', + `import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes)], +}; +` + ); + + addHydration(tree, { project: 'app1', standalone: true }); + + 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(),provideRouter(appRoutes)], + }; + " + `); + }); + + it('should not duplicate "provideClientHydration" for standalone config', () => { + tree.write( + 'app1/src/app/app.config.ts', + `import { ApplicationConfig } from '@angular/core'; +import { provideClientHydration } from '@angular/platform-browser'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideClientHydration(), provideRouter(appRoutes)], +}; +` + ); + + addHydration(tree, { project: 'app1', standalone: true }); + + expect(tree.read('app1/src/app/app.config.ts', 'utf-8')) + .toMatchInlineSnapshot(` + "import { ApplicationConfig } from '@angular/core'; + import { provideClientHydration } from '@angular/platform-browser'; + import { provideRouter } from '@angular/router'; + import { appRoutes } from './app.routes'; + + export const appConfig: ApplicationConfig = { + providers: [provideClientHydration(), provideRouter(appRoutes)], + }; + " + `); + }); + + it('should add "provideClientHydration" for non-standalone config', () => { + tree.write( + 'app1/src/app/app.module.ts', + `import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { RouterModule } from '@angular/router'; +import { AppComponent } from './app.component'; +import { appRoutes } from './app.routes'; +import { NxWelcomeComponent } from './nx-welcome.component'; + +@NgModule({ + declarations: [AppComponent, NxWelcomeComponent], + imports: [BrowserModule, RouterModule.forRoot(appRoutes)], + bootstrap: [AppComponent], +}) +export class AppModule {} +` + ); + + addHydration(tree, { project: 'app1', standalone: false }); + + 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)], + bootstrap: [AppComponent], + providers: [provideClientHydration()], + }) + export class AppModule {} + " + `); + }); + + it('should not duplicate "provideClientHydration" for non-standalone config', () => { + tree.write( + 'app1/src/app/app.module.ts', + `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)], + bootstrap: [AppComponent], + providers: [provideClientHydration()], +}) +export class AppModule {} +` + ); + + addHydration(tree, { project: 'app1', standalone: false }); + + 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)], + bootstrap: [AppComponent], + providers: [provideClientHydration()], + }) + export class AppModule {} + " + `); + }); +}); diff --git a/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts b/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts index 131070c7a442a3..9dc8fc5ef1a105 100644 --- a/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts +++ b/packages/angular/src/generators/setup-ssr/lib/add-hydration.ts @@ -3,23 +3,46 @@ import { readProjectConfiguration, type Tree, } from '@nx/devkit'; -import { type Schema } from '../schema'; +import { insertImport } from '@nx/js'; +import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; +import type { CallExpression, SourceFile } from 'typescript'; import { addProviderToAppConfig, addProviderToModule, } from '../../../utils/nx-devkit/ast-utils'; -import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; -import { SourceFile } from 'typescript'; -import { insertImport } from '@nx/js'; +import { type Schema } from '../schema'; let tsModule: typeof import('typescript'); +let tsquery: typeof import('@phenomnomnominal/tsquery').tsquery; export function addHydration(tree: Tree, options: Schema) { const projectConfig = readProjectConfiguration(tree, options.project); if (!tsModule) { tsModule = ensureTypescript(); + tsquery = require('@phenomnomnominal/tsquery').tsquery; + } + + const pathToClientConfigFile = options.standalone + ? joinPathFragments(projectConfig.sourceRoot, 'app/app.config.ts') + : joinPathFragments(projectConfig.sourceRoot, 'app/app.module.ts'); + + const sourceText = tree.read(pathToClientConfigFile, 'utf-8'); + let sourceFile = tsModule.createSourceFile( + pathToClientConfigFile, + sourceText, + tsModule.ScriptTarget.Latest, + true + ); + + const provideClientHydrationCallExpression = tsquery( + sourceFile, + 'ObjectLiteralExpression PropertyAssignment:has(Identifier[name=providers]) ArrayLiteralExpression CallExpression:has(Identifier[name=provideClientHydration])' + )[0]; + if (provideClientHydrationCallExpression) { + return; } + const addImport = ( source: SourceFile, symbolName: string, @@ -37,18 +60,6 @@ export function addHydration(tree: Tree, options: Schema) { ); }; - const pathToClientConfigFile = options.standalone - ? joinPathFragments(projectConfig.sourceRoot, 'app/app.config.ts') - : joinPathFragments(projectConfig.sourceRoot, 'app/app.module.ts'); - - const sourceText = tree.read(pathToClientConfigFile, 'utf-8'); - let sourceFile = tsModule.createSourceFile( - pathToClientConfigFile, - sourceText, - tsModule.ScriptTarget.Latest, - true - ); - sourceFile = addImport( sourceFile, 'provideClientHydration', 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 71fffd66f75240..783fa63c7efcfe 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 @@ -84,7 +84,9 @@ export function updateProjectConfigForBrowserBuilder( projectConfig.targets.server = { dependsOn: ['build'], - executor: '@angular-devkit/build-angular:server', + executor: buildTarget.executor.startsWith('@angular-devkit/build-angular:') + ? '@angular-devkit/build-angular:server' + : '@nx/angular:webpack-server', options: { outputPath: joinPathFragments(baseOutputPath, 'server'), main: joinPathFragments(projectConfig.root, schema.serverFileName), diff --git a/packages/angular/src/generators/setup-ssr/schema.json b/packages/angular/src/generators/setup-ssr/schema.json index 4a569f33d5d67a..48650bf32b4da4 100644 --- a/packages/angular/src/generators/setup-ssr/schema.json +++ b/packages/angular/src/generators/setup-ssr/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorAngularUniversalSetup", "cli": "nx", "title": "Generate Angular Universal (SSR) setup for an Angular App", diff --git a/packages/angular/src/generators/setup-ssr/setup-ssr.ts b/packages/angular/src/generators/setup-ssr/setup-ssr.ts index 83fa3f152e1a6a..7de23cbd33815b 100644 --- a/packages/angular/src/generators/setup-ssr/setup-ssr.ts +++ b/packages/angular/src/generators/setup-ssr/setup-ssr.ts @@ -27,7 +27,8 @@ export async function setupSsr(tree: Tree, schema: Schema) { const { targets } = readProjectConfiguration(tree, options.project); const isUsingApplicationBuilder = - targets.build.executor === '@angular-devkit/build-angular:application'; + targets.build.executor === '@angular-devkit/build-angular:application' || + targets.build.executor === '@nx/angular:application'; addDependencies(tree, isUsingApplicationBuilder); generateSSRFiles(tree, options, isUsingApplicationBuilder); diff --git a/packages/angular/src/generators/setup-tailwind/schema.json b/packages/angular/src/generators/setup-tailwind/schema.json index 34a4a6503b95f7..c690921efcb7c0 100644 --- a/packages/angular/src/generators/setup-tailwind/schema.json +++ b/packages/angular/src/generators/setup-tailwind/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularTailwindSetupGenerator", "cli": "nx", "title": "Configures Tailwind CSS for an application or a buildable/publishable library.", diff --git a/packages/angular/src/generators/stories/schema.json b/packages/angular/src/generators/stories/schema.json index 9205553f000f53..835dfdbc15bb35 100644 --- a/packages/angular/src/generators/stories/schema.json +++ b/packages/angular/src/generators/stories/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularStorybookStoriesGenerator", "title": "Create Storybook stories/specs", "description": "Creates Storybook stories/specs for all Angular components declared in a project.", diff --git a/packages/angular/src/generators/stories/stories-app.spec.ts b/packages/angular/src/generators/stories/stories-app.spec.ts index 7c8f8612ebfbac..fb924e816b2b69 100644 --- a/packages/angular/src/generators/stories/stories-app.spec.ts +++ b/packages/angular/src/generators/stories/stories-app.spec.ts @@ -11,7 +11,7 @@ import { stripIndents } from '@nx/devkit'; // which is v9 while we are testing for the new v10 version jest.mock('@nx/cypress/src/utils/cypress-version'); -// TODO(katerina): Nx 18 -> remove Cypress +// TODO(katerina): Nx 19 -> remove Cypress describe('angularStories generator: applications', () => { let tree: Tree; diff --git a/packages/angular/src/generators/stories/stories-lib.spec.ts b/packages/angular/src/generators/stories/stories-lib.spec.ts index dbdfffc78df74c..77b68310035004 100644 --- a/packages/angular/src/generators/stories/stories-lib.spec.ts +++ b/packages/angular/src/generators/stories/stories-lib.spec.ts @@ -14,7 +14,7 @@ import { angularStoriesGenerator } from './stories'; // need to mock cypress otherwise it'll use the nx installed version from package.json // which is v9 while we are testing for the new v10 version jest.mock('@nx/cypress/src/utils/cypress-version'); -// TODO(katerina): Nx 18 -> remove Cypress +// TODO(katerina): Nx 19 -> remove Cypress describe('angularStories generator: libraries', () => { const libName = 'test-ui-lib'; diff --git a/packages/angular/src/generators/storybook-configuration/schema.json b/packages/angular/src/generators/storybook-configuration/schema.json index 8cd81bdbf57aba..2871ece213f2de 100644 --- a/packages/angular/src/generators/storybook-configuration/schema.json +++ b/packages/angular/src/generators/storybook-configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxAngularStorybookConfigurationGenerator", "title": "Adds Storybook configuration to a project.", "description": "Adds Storybook configuration to a project to be able to use and create stories.", @@ -29,7 +29,7 @@ "configureCypress": { "type": "boolean", "description": "Specifies whether to configure Cypress or not.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "generateStories": { "type": "boolean", @@ -41,7 +41,7 @@ "generateCypressSpecs": { "type": "boolean", "description": "Specifies whether to automatically generate test files in the generated Cypress e2e app.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "configureStaticServe": { "type": "boolean", @@ -53,7 +53,7 @@ "cypressDirectory": { "type": "string", "description": "A directory where the Cypress project will be placed. Placed at the root by default.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "linter": { "description": "The tool to use for running lint checks.", diff --git a/packages/angular/src/generators/storybook-configuration/storybook-configuration.ts b/packages/angular/src/generators/storybook-configuration/storybook-configuration.ts index 6a87257f184b63..47ccf08be6568e 100644 --- a/packages/angular/src/generators/storybook-configuration/storybook-configuration.ts +++ b/packages/angular/src/generators/storybook-configuration/storybook-configuration.ts @@ -5,7 +5,7 @@ import { generateStorybookConfiguration } from './lib/generate-storybook-configu import { validateOptions } from './lib/validate-options'; import type { StorybookConfigurationOptions } from './schema'; -// TODO(katerina): Nx 18 -> remove Cypress +// TODO(katerina): Nx 19 -> remove Cypress export async function storybookConfigurationGenerator( tree: Tree, options: StorybookConfigurationOptions diff --git a/packages/angular/src/generators/utils/add-mf-env-to-inputs.ts b/packages/angular/src/generators/utils/add-mf-env-to-inputs.ts new file mode 100644 index 00000000000000..a989ca5c679def --- /dev/null +++ b/packages/angular/src/generators/utils/add-mf-env-to-inputs.ts @@ -0,0 +1,23 @@ +import { type Tree, readNxJson, updateNxJson } from '@nx/devkit'; + +export function addMfEnvToTargetDefaultInputs(tree: Tree) { + const nxJson = readNxJson(tree); + const webpackExecutor = '@nx/angular:webpack-browser'; + const mfEnvVar = 'NX_MF_DEV_SERVER_STATIC_REMOTES'; + + nxJson.targetDefaults ??= {}; + nxJson.targetDefaults[webpackExecutor] ??= {}; + nxJson.targetDefaults[webpackExecutor].inputs ??= []; + + let mfEnvVarExists = false; + for (const input of nxJson.targetDefaults[webpackExecutor].inputs) { + if (typeof input === 'object' && input['env'] === mfEnvVar) { + mfEnvVarExists = true; + break; + } + } + if (!mfEnvVarExists) { + nxJson.targetDefaults[webpackExecutor].inputs.push({ env: mfEnvVar }); + updateNxJson(tree, nxJson); + } +} 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 index 969005d04164c3..5d60998555a3be 100644 --- 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 @@ -5,7 +5,6 @@ import { readJson, removeDependenciesFromPackageJson, visitNotIgnoredFiles, - type TargetConfiguration, type Tree, } from '@nx/devkit'; import { dirname, relative } from 'path'; @@ -13,6 +12,7 @@ import { getInstalledPackageVersionInfo, versions, } from '../../generators/utils/version-utils'; +import { allTargetOptions } from '../../utils/targets'; import { getProjectsFilteredByDependencies } from '../utils/projects'; const UNIVERSAL_PACKAGES = [ @@ -141,24 +141,6 @@ export default async function (tree: Tree) { 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'; diff --git a/packages/angular/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.spec.ts b/packages/angular/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.spec.ts new file mode 100644 index 00000000000000..78eecc67326ddb --- /dev/null +++ b/packages/angular/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.spec.ts @@ -0,0 +1,123 @@ +import addMfEnvVarToTargetDefaults from './add-mf-env-var-to-target-defaults'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { addProjectConfiguration, readNxJson, updateNxJson } from '@nx/devkit'; + +describe('addMfEnvVarToTargetDefaults', () => { + it('should add the executor and input when it does not exist', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'test', { + root: '', + targets: { + build: { + executor: '@nx/angular:webpack-browser', + }, + }, + }); + + tree.write('module-federation.config.ts', ''); + + // ACT + await addMfEnvVarToTargetDefaults(tree); + + // ASSERT + const nxJson = readNxJson(tree); + expect(nxJson.targetDefaults).toMatchInlineSnapshot(` + { + "@nx/angular:webpack-browser": { + "inputs": [ + { + "env": "NX_MF_DEV_SERVER_STATIC_REMOTES", + }, + ], + }, + "build": { + "cache": true, + }, + "lint": { + "cache": true, + }, + } + `); + }); + + it('should not add the executor and input when no project uses it', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'test', { + root: '', + targets: { + build: { + executor: '@nx/angular:module-federation-dev-server', + }, + }, + }); + + // ACT + await addMfEnvVarToTargetDefaults(tree); + + // ASSERT + const nxJson = readNxJson(tree); + expect(nxJson.targetDefaults).toMatchInlineSnapshot(` + { + "build": { + "cache": true, + }, + "lint": { + "cache": true, + }, + } + `); + }); + + it('should update the executor and input target default when it already exists', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'test', { + root: '', + targets: { + build: { + executor: '@nx/angular:webpack-browser', + }, + }, + }); + tree.write('module-federation.config.ts', ''); + + let nxJson = readNxJson(tree); + nxJson = { + ...nxJson, + targetDefaults: { + ...nxJson.targetDefaults, + ['@nx/angular:webpack-browser']: { + inputs: ['^build'], + }, + }, + }; + + updateNxJson(tree, nxJson); + + // ACT + await addMfEnvVarToTargetDefaults(tree); + + // ASSERT + nxJson = readNxJson(tree); + expect(nxJson.targetDefaults).toMatchInlineSnapshot(` + { + "@nx/angular:webpack-browser": { + "inputs": [ + "^build", + { + "env": "NX_MF_DEV_SERVER_STATIC_REMOTES", + }, + ], + }, + "build": { + "cache": true, + }, + "lint": { + "cache": true, + }, + } + `); + }); +}); diff --git a/packages/angular/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.ts b/packages/angular/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.ts new file mode 100644 index 00000000000000..14cc7c7a25d7c3 --- /dev/null +++ b/packages/angular/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.ts @@ -0,0 +1,38 @@ +import { + getProjects, + type Tree, + type ProjectConfiguration, + joinPathFragments, + formatFiles, +} from '@nx/devkit'; +import { addMfEnvToTargetDefaultInputs } from '../../generators/utils/add-mf-env-to-inputs'; + +export default async function (tree: Tree) { + if (!isWebpackBrowserUsed(tree)) { + return; + } + addMfEnvToTargetDefaultInputs(tree); + + await formatFiles(tree); +} + +function isWebpackBrowserUsed(tree: Tree) { + const projects = getProjects(tree); + for (const project of projects.values()) { + const targets = project.targets; + for (const [_, target] of Object.entries(targets)) { + if ( + target.executor === '@nx/angular:webpack-browser' && + (tree.exists( + joinPathFragments(project.root, 'module-federation.config.ts') + ) || + tree.exists( + joinPathFragments(project.root, 'module-federation.config.js') + )) + ) { + return true; + } + } + } + return false; +} diff --git a/packages/angular/src/utils/targets.ts b/packages/angular/src/utils/targets.ts new file mode 100644 index 00000000000000..b46122730d9c35 --- /dev/null +++ b/packages/angular/src/utils/targets.ts @@ -0,0 +1,19 @@ +import { TargetConfiguration } from '@nx/devkit'; + +export 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]; + } + } +} diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index 900da8036f5a0a..1906444a6624bc 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -194,7 +194,7 @@ export const commandsObject: yargs.Argv = yargs [ normalizeArgsMiddleware, normalizeAndWarnOnDeprecatedPreset({ - // TODO(v18): Remove Empty and Core presets + // TODO(v19): Remove Empty and Core presets [Preset.Core]: Preset.NPM, [Preset.Empty]: Preset.Apps, }), @@ -211,10 +211,6 @@ export const commandsObject: yargs.Argv = yargs async function main(parsedArgs: yargs.Arguments) { output.log({ title: `Creating your v${nxVersion} workspace.`, - bodyLines: [ - 'To make sure the command works reliably in all environments, and that the preset is applied correctly,', - `Nx will run "${parsedArgs.packageManager} install" several times. Please wait.`, - ], }); const workspaceInfo = await createWorkspace( @@ -286,9 +282,6 @@ async function normalizeArgsMiddleware( try { let thirdPartyPreset: string | null; - // Node options - let docker: boolean; - try { thirdPartyPreset = await getThirdPartyPreset(argv.preset); } catch (e) { @@ -593,11 +586,11 @@ async function determineReactOptions( }, { name: 'scss', - message: 'SASS(.scss) [ http://sass-lang.com ]', + message: 'SASS(.scss) [ https://sass-lang.com ]', }, { name: 'less', - message: 'LESS [ http://lesscss.org ]', + message: 'LESS [ https://lesscss.org ]', }, { name: 'styled-components', @@ -689,11 +682,11 @@ async function determineVueOptions( }, { name: 'scss', - message: 'SASS(.scss) [ http://sass-lang.com ]', + message: 'SASS(.scss) [ https://sass-lang.com ]', }, { name: 'less', - message: 'LESS [ http://lesscss.org ]', + message: 'LESS [ https://lesscss.org ]', }, { name: 'none', @@ -781,11 +774,11 @@ async function determineAngularOptions( }, { name: 'scss', - message: 'SASS(.scss) [ http://sass-lang.com ]', + message: 'SASS(.scss) [ https://sass-lang.com ]', }, { name: 'less', - message: 'LESS [ http://lesscss.org ]', + message: 'LESS [ https://lesscss.org ]', }, ], }, diff --git a/packages/create-nx-workspace/package.json b/packages/create-nx-workspace/package.json index c1db6bd0331e79..a1077374eaf7cc 100644 --- a/packages/create-nx-workspace/package.json +++ b/packages/create-nx-workspace/package.json @@ -36,7 +36,7 @@ "tmp": "~0.2.1", "tslib": "^2.3.0", "yargs": "^17.6.2", - "axios": "^1.5.1" + "axios": "^1.6.0" }, "publishConfig": { "access": "public" diff --git a/packages/create-nx-workspace/src/create-workspace.ts b/packages/create-nx-workspace/src/create-workspace.ts index 12824ac4a00f9b..54e8f3e3c3f7d4 100644 --- a/packages/create-nx-workspace/src/create-workspace.ts +++ b/packages/create-nx-workspace/src/create-workspace.ts @@ -29,7 +29,7 @@ export async function createWorkspace( const tmpDir = await createSandbox(packageManager); - // nx new requires preset currently. We should probably make it optional. + // nx new requires a preset currently. We should probably make it optional. const directory = await createEmptyWorkspace( tmpDir, name, @@ -38,7 +38,7 @@ export async function createWorkspace( ); // If the preset is a third-party preset, we need to call createPreset to install it - // For first-party presets, it will created by createEmptyWorkspace instead. + // For first-party presets, it will be created by createEmptyWorkspace instead. // In createEmptyWorkspace, it will call `nx new` -> `@nx/workspace newGenerator` -> `@nx/workspace generatePreset`. const thirdPartyPreset = await getThirdPartyPreset(preset); if (thirdPartyPreset) { @@ -47,7 +47,7 @@ export async function createWorkspace( let nxCloudInstallRes; if (nxCloud !== 'skip') { - nxCloudInstallRes = await setupNxCloud(directory, packageManager); + nxCloudInstallRes = await setupNxCloud(directory, packageManager, nxCloud); if (nxCloud !== 'yes') { await setupCI( diff --git a/packages/create-nx-workspace/src/utils/nx/nx-cloud.ts b/packages/create-nx-workspace/src/utils/nx/nx-cloud.ts index 0d7dc9419db9be..028cdc866c14d7 100644 --- a/packages/create-nx-workspace/src/utils/nx/nx-cloud.ts +++ b/packages/create-nx-workspace/src/utils/nx/nx-cloud.ts @@ -8,7 +8,8 @@ export type NxCloud = 'yes' | 'github' | 'circleci' | 'skip'; export async function setupNxCloud( directory: string, - packageManager: PackageManager + packageManager: PackageManager, + nxCloud: NxCloud ) { const nxCloudSpinner = ora(`Setting up Nx Cloud`).start(); try { @@ -17,7 +18,13 @@ export async function setupNxCloud( `${pmc.exec} nx g nx:connect-to-nx-cloud --no-interactive --quiet`, directory ); - nxCloudSpinner.succeed('Nx Cloud has been set up successfully'); + if (nxCloud !== 'yes') { + nxCloudSpinner.succeed( + 'CI workflow with Nx Cloud has been generated successfully' + ); + } else { + nxCloudSpinner.succeed('Nx Cloud has been set up successfully'); + } return res; } catch (e) { nxCloudSpinner.fail(); @@ -38,11 +45,18 @@ export async function setupNxCloud( } export function printNxCloudSuccessMessage(nxCloudOut: string) { - const bodyLines = nxCloudOut - .split('Remote caching via Nx Cloud has been enabled')[1] - .trim(); - output.note({ - title: `Remote caching via Nx Cloud has been enabled`, - bodyLines: bodyLines.split('\n').map((r) => r.trim()), + // remove leading Nx carret and any new lines + const logContent = nxCloudOut.split('> NX ')[1]; + const indexOfTitleEnd = logContent.indexOf('\n'); + const title = logContent.slice(0, logContent.indexOf('\n')).trim(); + const bodyLines = logContent + .slice(indexOfTitleEnd) + .replace(/^\n*/, '') // remove leading new lines + .replace(/\n*$/, '') // remove trailing new lines + .split('\n') + .map((r) => r.trim()); + output.warn({ + title, + bodyLines, }); } diff --git a/packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts b/packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts index 73e450efdcd6b5..039e1dc44795d6 100644 --- a/packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts +++ b/packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts @@ -1,6 +1,7 @@ import { execSync } from 'child_process'; import { resolve } from 'path'; import { output } from '../output'; +import { getPackageManagerCommand } from '../package-manager'; export function showNxWarning(workspaceName: string) { try { @@ -11,12 +12,13 @@ export function showNxWarning(workspaceName: string) { }); } catch (e) { // no nx found + const { exec, globalAdd } = getPackageManagerCommand(); output.addVerticalSeparator(); output.note({ title: `Nx CLI is not installed globally.`, bodyLines: [ - `This means that you might have to use "yarn nx" or "npx nx" to execute commands in the workspace.`, - `Run "yarn global add nx" or "npm install -g nx" to be able to execute command directly.`, + `This means that you will have to use "${exec} nx" to execute commands in the workspace.`, + `Run "${globalAdd} nx" to be able to execute command directly.`, ], }); } diff --git a/packages/create-nx-workspace/src/utils/package-manager.ts b/packages/create-nx-workspace/src/utils/package-manager.ts index 6d0281c29c3c72..5966089e91b5aa 100644 --- a/packages/create-nx-workspace/src/utils/package-manager.ts +++ b/packages/create-nx-workspace/src/utils/package-manager.ts @@ -37,6 +37,7 @@ export function getPackageManagerCommand( install: string; exec: string; preInstall?: string; + globalAdd: string; } { const pmVersion = getPackageManagerVersion(packageManager); const [pmMajor, pmMinor] = pmVersion.split('.'); @@ -52,6 +53,7 @@ export function getPackageManagerCommand( : `${installCommand} --ignore-scripts`, // using npx is necessary to avoid yarn classic manipulating the version detection when using berry exec: useBerry ? 'npx' : 'yarn', + globalAdd: 'yarn global add', }; case 'pnpm': @@ -62,12 +64,14 @@ export function getPackageManagerCommand( return { install: 'pnpm install --no-frozen-lockfile --silent --ignore-scripts', exec: useExec ? 'pnpm exec' : 'pnpx', + globalAdd: 'pnpm add -g', }; case 'npm': return { install: 'npm install --silent --ignore-scripts', exec: 'npx', + globalAdd: 'npm i -g', }; } } diff --git a/packages/cypress/index.ts b/packages/cypress/index.ts index 25e308c012adaf..5b1043e1c9b605 100644 --- a/packages/cypress/index.ts +++ b/packages/cypress/index.ts @@ -5,13 +5,13 @@ import { cypressProjectGenerator as _cypressProjectGenerator } from './src/gener export { configurationGenerator, componentConfigurationGenerator }; // Maintain backwards compatibility with the old names in case community plugins used them. -// TODO(v18): Remove old name -/** @deprecated Use `configurationGenerator` instead. It will be removed in Nx 18. */ +// TODO(v19): Remove old name +/** @deprecated Use `configurationGenerator` instead. It will be removed in Nx 19. */ export const cypressComponentConfiguration = componentConfigurationGenerator; export { configurationGenerator as cypressE2EConfigurationGenerator }; -// TODO(v18): Remove project generator -/** @deprecated Add a new project and call `configurationGenerator` instead. It will be removed in Nx 18. */ +// TODO(v19): Remove project generator +/** @deprecated Add a new project and call `configurationGenerator` instead. It will be removed in Nx 19. */ export const cypressProjectGenerator = _cypressProjectGenerator; export { cypressInitGenerator } from './src/generators/init/init'; export { migrateCypressProject } from './src/generators/migrate-to-cypress-11/migrate-to-cypress-11'; diff --git a/packages/cypress/package.json b/packages/cypress/package.json index 397a4dfdeb84ee..9c19a16d90dae0 100644 --- a/packages/cypress/package.json +++ b/packages/cypress/package.json @@ -39,7 +39,7 @@ "@nx/js": "file:../js", "@phenomnomnominal/tsquery": "~5.0.1", "detect-port": "^1.5.1", - "semver": "7.5.3", + "semver": "^7.5.3", "tslib": "^2.3.0" }, "peerDependencies": { diff --git a/packages/cypress/plugins/cypress-preset.ts b/packages/cypress/plugins/cypress-preset.ts index 54fc3a61e7363d..a7dbe1dd0345f8 100644 --- a/packages/cypress/plugins/cypress-preset.ts +++ b/packages/cypress/plugins/cypress-preset.ts @@ -101,7 +101,7 @@ export function nxE2EPreset( }*/ = { ...nxBaseCypressPreset(pathToConfig), fileServerFolder: '.', - supportFile: `${basePath}/support/e2e.ts`, + supportFile: `${basePath}/support/e2e.{js,ts}`, specPattern: `${basePath}/**/*.cy.{js,jsx,ts,tsx}`, fixturesFolder: `${basePath}/fixtures`, diff --git a/packages/cypress/src/generators/component-configuration/schema.json b/packages/cypress/src/generators/component-configuration/schema.json index d7ac0b043ed81a..069b1ee3c7745d 100644 --- a/packages/cypress/src/generators/component-configuration/schema.json +++ b/packages/cypress/src/generators/component-configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressComponentConfiguration", "cli": "nx", "title": "Set up Cypress component testing for a project", diff --git a/packages/cypress/src/generators/configuration/configuration.spec.ts b/packages/cypress/src/generators/configuration/configuration.spec.ts index 7d411ebba82c12..5f30067ec3c29a 100644 --- a/packages/cypress/src/generators/configuration/configuration.spec.ts +++ b/packages/cypress/src/generators/configuration/configuration.spec.ts @@ -310,6 +310,15 @@ describe('Cypress e2e configuration', () => { baseUrl: 'http://localhost:4200', }); assertCypressFiles(tree, 'libs/my-lib/src/e2e', 'js'); + + expect(readProjectConfiguration(tree, 'my-lib').targets['e2e'].options) + .toMatchInlineSnapshot(` + { + "baseUrl": "http://localhost:4200", + "cypressConfig": "libs/my-lib/cypress.config.js", + "testingType": "e2e", + } + `); }); it('should not override eslint settings if preset', async () => { diff --git a/packages/cypress/src/generators/configuration/configuration.ts b/packages/cypress/src/generators/configuration/configuration.ts index d0b89ad0f1150d..d3a68d4d646ef7 100644 --- a/packages/cypress/src/generators/configuration/configuration.ts +++ b/packages/cypress/src/generators/configuration/configuration.ts @@ -264,7 +264,9 @@ function addTarget(tree: Tree, opts: NormalizedSchema) { options: { cypressConfig: joinPathFragments( projectConfig.root, - cyVersion && cyVersion < 10 ? 'cypress.json' : 'cypress.config.ts' + cyVersion && cyVersion < 10 + ? 'cypress.json' + : `cypress.config.${opts.js ? 'js' : 'ts'}` ), testingType: 'e2e', }, diff --git a/packages/cypress/src/generators/configuration/schema.json b/packages/cypress/src/generators/configuration/schema.json index 9b7025b813a88d..8dc9aa4e84e59e 100644 --- a/packages/cypress/src/generators/configuration/schema.json +++ b/packages/cypress/src/generators/configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressE2EConfigGenerator", "cli": "nx", "title": "Add a Cypress Configuration.", diff --git a/packages/cypress/src/generators/cypress-project/cypress-project.ts b/packages/cypress/src/generators/cypress-project/cypress-project.ts index 3e7c7c3416730f..544d552c411d77 100644 --- a/packages/cypress/src/generators/cypress-project/cypress-project.ts +++ b/packages/cypress/src/generators/cypress-project/cypress-project.ts @@ -34,6 +34,7 @@ import { } from '../../utils/versions'; import { cypressInitGenerator } from '../init/init'; import { Schema } from './schema'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export interface CypressProjectSchema extends Schema { projectName: string; @@ -229,7 +230,14 @@ function ensureDependencies(tree: Tree, options: CypressProjectSchema) { devDependencies['vite'] = viteVersion; } - return addDependenciesToPackageJson(tree, {}, devDependencies); + return runTasksInSerial( + ...[ + addDependenciesToPackageJson(tree, {}, devDependencies), + () => { + logShowProjectCommand(options.projectName); + }, + ] + ); } async function normalizeOptions( diff --git a/packages/cypress/src/generators/cypress-project/schema.json b/packages/cypress/src/generators/cypress-project/schema.json index ba3de2c6c2b747..e6f53b764f7a55 100644 --- a/packages/cypress/src/generators/cypress-project/schema.json +++ b/packages/cypress/src/generators/cypress-project/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressProjectGeneratorSchema", "cli": "nx", "title": "Create Cypress Configuration for the workspace", diff --git a/packages/cypress/src/generators/init/schema.json b/packages/cypress/src/generators/init/schema.json index d484c738ba60be..c8f47b4b75d1a6 100644 --- a/packages/cypress/src/generators/init/schema.json +++ b/packages/cypress/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressInit", "cli": "nx", "title": "Add Cypress Configuration to the workspace", diff --git a/packages/cypress/src/generators/migrate-to-cypress-11/schema.json b/packages/cypress/src/generators/migrate-to-cypress-11/schema.json index 8bbf655ee6ddd6..80bf4b05fb9655 100644 --- a/packages/cypress/src/generators/migrate-to-cypress-11/schema.json +++ b/packages/cypress/src/generators/migrate-to-cypress-11/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxCypressMigrateTo11", "cli": "nx", "title": "Migrate e2e project to Cypress 11", diff --git a/packages/detox/migrations.json b/packages/detox/migrations.json index 39313f3bb14261..0ba28cd22f582c 100644 --- a/packages/detox/migrations.json +++ b/packages/detox/migrations.json @@ -99,6 +99,15 @@ "alwaysAddToPackageJson": false } } + }, + "18.0.0": { + "version": "18.0.0-beta.0", + "packages": { + "detox": { + "version": "^20.16.0", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/detox/src/generators/application/schema.json b/packages/detox/src/generators/application/schema.json index ba0fe35329e80e..a62b3353afaf16 100644 --- a/packages/detox/src/generators/application/schema.json +++ b/packages/detox/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create Detox Configuration for the workspace", "description": "Create Detox Configuration for the workspace.", "type": "object", diff --git a/packages/detox/src/generators/init/schema.json b/packages/detox/src/generators/init/schema.json index d9648d5357a131..2907ca65bf062c 100644 --- a/packages/detox/src/generators/init/schema.json +++ b/packages/detox/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Add Detox Schematics", "description": "Add Detox Schematics.", "type": "object", diff --git a/packages/detox/src/utils/versions.ts b/packages/detox/src/utils/versions.ts index 2051664bd3d567..a1cf2c95596172 100644 --- a/packages/detox/src/utils/versions.ts +++ b/packages/detox/src/utils/versions.ts @@ -1,5 +1,5 @@ export const nxVersion = require('../../package.json').version; -export const detoxVersion = '^20.11.1'; -export const testingLibraryJestDom = '5.16.5'; +export const detoxVersion = '^20.16.0'; +export const testingLibraryJestDom = '6.2.0'; export const configPluginsDetoxVersion = '~6.0.0'; // only required for expo diff --git a/packages/devkit/nx.ts b/packages/devkit/nx.ts index fd978a398b540e..88089dd4943aab 100644 --- a/packages/devkit/nx.ts +++ b/packages/devkit/nx.ts @@ -1,4 +1,4 @@ -// After Nx v18, this can be removed and replaced with either: +// After Nx v19, this can be removed and replaced with either: // - import {} from 'nx/src/devkit-exports' // - import {} from 'nx/src/devkit-internals' export function requireNx(): typeof import('nx/src/devkit-exports') & @@ -7,7 +7,7 @@ export function requireNx(): typeof import('nx/src/devkit-exports') & try { result = { ...result, - // Remove in Nx v18, devkit should not support Nx v16.0.2 at that point. + // Remove in Nx v19, devkit should not support Nx v16.0.2 at that point. ...require('nx/src/devkit-internals'), }; } catch {} diff --git a/packages/devkit/package.json b/packages/devkit/package.json index b7fecafb8e714e..0af3a425b93f12 100644 --- a/packages/devkit/package.json +++ b/packages/devkit/package.json @@ -33,7 +33,7 @@ "ignore": "^5.0.4", "tmp": "~0.2.1", "tslib": "^2.3.0", - "semver": "7.5.3", + "semver": "^7.5.3", "yargs-parser": "21.1.1" }, "peerDependencies": { diff --git a/packages/devkit/src/executors/parse-target-string.ts b/packages/devkit/src/executors/parse-target-string.ts index ff63c393485c69..0bbc33278f80e1 100644 --- a/packages/devkit/src/executors/parse-target-string.ts +++ b/packages/devkit/src/executors/parse-target-string.ts @@ -6,7 +6,7 @@ import { requireNx } from '../../nx'; let { readCachedProjectGraph, splitTarget, splitByColons } = requireNx(); -// TODO: Remove this in Nx 18 when Nx 16.7.0 is no longer supported +// TODO: Remove this in Nx 19 when Nx 16.7.0 is no longer supported splitTarget = splitTarget ?? require('nx/src/utils/split-target').splitTarget; splitByColons = splitByColons ?? ((s: string) => s.split(':') as [string, ...string[]]); diff --git a/packages/devkit/src/executors/read-target-options.ts b/packages/devkit/src/executors/read-target-options.ts index ad193880b8d823..b0180bf47193ce 100644 --- a/packages/devkit/src/executors/read-target-options.ts +++ b/packages/devkit/src/executors/read-target-options.ts @@ -10,7 +10,7 @@ let { combineOptionsForExecutor, } = requireNx(); -// TODO: Remove this in Nx 18 when Nx 16.7.0 is no longer supported +// TODO: Remove this in Nx 19 when Nx 16.7.0 is no longer supported combineOptionsForExecutor = combineOptionsForExecutor ?? require('nx/src/utils/params').combineOptionsForExecutor; @@ -34,7 +34,11 @@ export function readTargetOptions( const targetConfiguration = projectConfiguration.targets[target]; - // TODO(v18): remove Workspaces. + if (!targetConfiguration) { + throw new Error(`Unable to find target ${target} for project ${project}`); + } + + // TODO(v19): remove Workspaces. const ws = new Workspaces(context.root); const [nodeModule, executorName] = targetConfiguration.executor.split(':'); const { schema } = getExecutorInformation @@ -44,7 +48,7 @@ export function readTargetOptions( context.root, context.projectsConfigurations?.projects ?? context.workspace.projects ) - : // TODO(v18): remove readExecutor. This is to be backwards compatible with Nx 16.5 and below. + : // TODO(v19): remove readExecutor. This is to be backwards compatible with Nx 16.5 and below. (ws as any).readExecutor(nodeModule, executorName); const defaultProject = calculateDefaultProjectName @@ -54,7 +58,7 @@ export function readTargetOptions( { version: 2, projects: context.projectsConfigurations.projects }, context.nxJsonConfiguration ) - : // TODO(v18): remove calculateDefaultProjectName. This is to be backwards compatible with Nx 16.5 and below. + : // TODO(v19): remove calculateDefaultProjectName. This is to be backwards compatible with Nx 16.5 and below. (ws as any).calculateDefaultProjectName( context.cwd, { version: 2, projects: context.projectsConfigurations.projects }, diff --git a/packages/devkit/src/generators/artifact-name-and-directory-utils.ts b/packages/devkit/src/generators/artifact-name-and-directory-utils.ts index d6ad31446a1c12..68796b086da2f6 100644 --- a/packages/devkit/src/generators/artifact-name-and-directory-utils.ts +++ b/packages/devkit/src/generators/artifact-name-and-directory-utils.ts @@ -142,7 +142,7 @@ function logDeprecationMessage( formats: NameAndDirectoryFormats ) { logger.warn(` -In Nx 18, generating a ${options.artifactType} will no longer support providing a project and deriving the directory. +In Nx 19, generating a ${options.artifactType} will no longer support providing a project and deriving the directory. Please provide the exact directory in the future. Example: nx g ${options.callingGenerator} ${formats['derived'].artifactName} --directory ${formats['derived'].directory} NOTE: The example above assumes the command is being run from the workspace root. If the command is being run from a subdirectory, the directory option should be adjusted accordingly. diff --git a/packages/devkit/src/generators/format-files.ts b/packages/devkit/src/generators/format-files.ts index 55b0fd642d9335..e4d616b1dd4152 100644 --- a/packages/devkit/src/generators/format-files.ts +++ b/packages/devkit/src/generators/format-files.ts @@ -5,7 +5,7 @@ import { requireNx } from '../../nx'; let { updateJson, readJson, sortObjectByKeys } = requireNx(); -// TODO: Remove this in Nx 18 when Nx 16.7.0 is no longer supported +// TODO: Remove this in Nx 19 when Nx 16.7.0 is no longer supported sortObjectByKeys = sortObjectByKeys ?? require('nx/src/utils/object-sort').sortObjectByKeys; diff --git a/packages/devkit/src/generators/project-name-and-root-utils.ts b/packages/devkit/src/generators/project-name-and-root-utils.ts index c397999c9169a4..cd4959f2b64fec 100644 --- a/packages/devkit/src/generators/project-name-and-root-utils.ts +++ b/packages/devkit/src/generators/project-name-and-root-utils.ts @@ -130,7 +130,7 @@ function logDeprecationMessage( formats: ProjectNameAndRootFormats ) { logger.warn(stripIndents` - In Nx 18, generating projects will no longer derive the name and root. + In Nx 19, generating projects will no longer derive the name and root. Please provide the exact project name and root in the future. Example: nx g ${callingGenerator} ${formats['derived'].projectName} --directory ${formats['derived'].projectRoot} `); diff --git a/packages/devkit/src/utils/convert-nx-executor.ts b/packages/devkit/src/utils/convert-nx-executor.ts index fee060ba3c5753..3fcfd6bdc8b48e 100644 --- a/packages/devkit/src/utils/convert-nx-executor.ts +++ b/packages/devkit/src/utils/convert-nx-executor.ts @@ -21,7 +21,7 @@ export function convertNxExecutor(executor: Executor) { const workspaces = new Workspaces(builderContext.workspaceRoot); const nxJsonConfiguration = readNxJsonFromDisk ? readNxJsonFromDisk(builderContext.workspaceRoot) - : // TODO(v18): remove readNxJson. This is to be backwards compatible with Nx 16.5 and below. + : // TODO(v19): remove readNxJson. This is to be backwards compatible with Nx 16.5 and below. (workspaces as any).readNxJson(); const promise = async () => { @@ -34,7 +34,7 @@ export function convertNxExecutor(executor: Executor) { nxJsonConfiguration ).then((p) => (p as any).projectNodes ?? p.projects), } - : // TODO(v18): remove retrieveProjectConfigurations. This is to be backwards compatible with Nx 16.5 and below. + : // TODO(v19): remove retrieveProjectConfigurations. This is to be backwards compatible with Nx 16.5 and below. (workspaces as any).readProjectsConfigurations({ _includeProjectsFromAngularJson: true, }); diff --git a/packages/devkit/src/utils/invoke-nx-generator.ts b/packages/devkit/src/utils/invoke-nx-generator.ts index 2b69226118617e..c158a71c87649b 100644 --- a/packages/devkit/src/utils/invoke-nx-generator.ts +++ b/packages/devkit/src/utils/invoke-nx-generator.ts @@ -13,7 +13,7 @@ import { requireNx } from '../../nx'; let { logger, stripIndent } = requireNx(); -// TODO: Remove this in Nx 18 when Nx 16.7.0 is no longer supported +// TODO: Remove this in Nx 19 when Nx 16.7.0 is no longer supported stripIndent = stripIndent ?? require('nx/src/utils/logger').stripIndent; class RunCallbackTask { diff --git a/packages/devkit/src/utils/log-show-project-command.ts b/packages/devkit/src/utils/log-show-project-command.ts new file mode 100644 index 00000000000000..d085ea74fc1fc1 --- /dev/null +++ b/packages/devkit/src/utils/log-show-project-command.ts @@ -0,0 +1,11 @@ +import { requireNx } from '../../nx'; + +export function logShowProjectCommand(projectName: string): void { + const { output } = requireNx(); + output.log({ + title: `👀 View Details of ${projectName}`, + bodyLines: [ + `Run "nx show project ${projectName} --web" to view details about this project.`, + ], + }); +} diff --git a/packages/esbuild/src/generators/configuration/schema.json b/packages/esbuild/src/generators/configuration/schema.json index 3de4555f0d5016..a5797f1951481a 100644 --- a/packages/esbuild/src/generators/configuration/schema.json +++ b/packages/esbuild/src/generators/configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxEsBuildProject", "cli": "nx", "title": "Add esbuild configuration to a project", diff --git a/packages/esbuild/src/generators/init/schema.json b/packages/esbuild/src/generators/init/schema.json index a0f1bb670f18a0..dcce648b328919 100644 --- a/packages/esbuild/src/generators/init/schema.json +++ b/packages/esbuild/src/generators/init/schema.json @@ -1,9 +1,9 @@ { - "$schema": "http://json-schema.org/schema", - "$id": "NxWebpackInit", + "$schema": "https://json-schema.org/schema", + "$id": "NxEsbuildInit", "cli": "nx", - "title": "Init Webpack Plugin", - "description": "Init Webpack Plugin.", + "title": "Init Esbuild Plugin", + "description": "Init Esbuild Plugin.", "type": "object", "properties": { "skipFormat": { diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 67c18298253b3f..752402cd8eb3b7 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -40,7 +40,7 @@ "chalk": "^4.1.0", "confusing-browser-globals": "^1.0.9", "jsonc-eslint-parser": "^2.1.0", - "semver": "7.5.3", + "semver": "^7.5.3", "tslib": "^2.3.0" }, "publishConfig": { diff --git a/packages/eslint-plugin/src/configs/javascript.ts b/packages/eslint-plugin/src/configs/javascript.ts index 50d4e8523d4dc0..dbdd9669000e1c 100644 --- a/packages/eslint-plugin/src/configs/javascript.ts +++ b/packages/eslint-plugin/src/configs/javascript.ts @@ -18,9 +18,6 @@ const isPrettierAvailable = * it should yield a performance improvement but could introduce subtle * breaking changes - we should also look to replace all the @typescript-eslint * related plugins and rules below. - * - * TODO: Reevaluate stylistic plugin and added specific rules in the next major - * version of Nx. Related to https://github.com/nrwl/nx/pull/21066 */ export default { env: { @@ -37,33 +34,12 @@ export default { 'eslint:recommended', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', - /** - * This was added to preserve the linting rules that were previously - * defined v5 of @typescript-eslint. v6 of @typescript-eslint changed - * how configurations are defined. This should be reevaluated in the - * next major version of Nx. - */ - 'plugin:@typescript-eslint/stylistic', ...(isPrettierAvailable ? ['prettier'] : []), ], rules: { '@typescript-eslint/explicit-member-accessibility': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/explicit-function-return-type': 'off', - /** - * These 3 rules: - * `no-extra-semi` - * `@typescript-eslint/no-extra-semi` - * `@typescript-eslint/no-non-null-assertion` - * were added to preserve the linting rules that were - * previously defined v5 of `@typescript-eslint`. v6 of `@typescript-eslint` - * changed how configurations are defined. This should be reevaluated in - * the next major version of Nx. - */ - 'no-extra-semi': 'off', - '@typescript-eslint/no-extra-semi': 'error', - '@typescript-eslint/no-non-null-assertion': 'warn', - '@typescript-eslint/no-parameter-properties': 'off', /** * Until ESM usage in Node matures, using require in e.g. JS config files @@ -71,5 +47,26 @@ export default { * having to frequently use "eslint-disable-next-line" in their configs. */ '@typescript-eslint/no-var-requires': 'off', + + /** + * From https://typescript-eslint.io/blog/announcing-typescript-eslint-v6/#updated-configuration-rules + * + * The following rules were added to preserve the linting rules that were + * previously defined v5 of `@typescript-eslint`. v6 of `@typescript-eslint` + * changed how configurations are defined. + * + * TODO(v19): re-evalute these deviations from @typescript-eslint/recommended in v19 of Nx + */ + 'no-extra-semi': 'off', + '@typescript-eslint/no-extra-semi': 'error', + '@typescript-eslint/no-non-null-assertion': 'warn', + '@typescript-eslint/adjacent-overload-signatures': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-inferrable-types': 'error', + '@typescript-eslint/no-unused-vars': 'warn', + '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/no-explicit-any': 'warn', }, }; diff --git a/packages/eslint-plugin/src/configs/typescript.ts b/packages/eslint-plugin/src/configs/typescript.ts index d63c1f4381656d..5cbb3d2f32b026 100644 --- a/packages/eslint-plugin/src/configs/typescript.ts +++ b/packages/eslint-plugin/src/configs/typescript.ts @@ -10,9 +10,6 @@ const isPrettierAvailable = * * It should therefore NOT contain any rules or plugins which are specific * to one ecosystem, such as React, Angular, Node etc. - * - * TODO: Reevaluate stylistic plugin and added specific rules in the next major - * version of Nx. Related to https://github.com/nrwl/nx/pull/21066 */ export default { parser: '@typescript-eslint/parser', @@ -26,32 +23,33 @@ export default { 'eslint:recommended', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', - /** - * This was added to preserve the linting rules that were previously - * defined v5 of @typescript-eslint. v6 of @typescript-eslint changed - * how configurations are defined. This should be reevaluated in the - * next major version of Nx. - */ - 'plugin:@typescript-eslint/stylistic', ...(isPrettierAvailable ? ['prettier'] : []), ], rules: { '@typescript-eslint/explicit-member-accessibility': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-parameter-properties': 'off', + /** - * These 3 rules: - * `no-extra-semi` - * `@typescript-eslint/no-extra-semi` - * `@typescript-eslint/no-non-null-assertion` - * were added to preserve the linting rules that were + * From https://typescript-eslint.io/blog/announcing-typescript-eslint-v6/#updated-configuration-rules + * + * The following rules were added to preserve the linting rules that were * previously defined v5 of `@typescript-eslint`. v6 of `@typescript-eslint` - * changed how configurations are defined. This should be reevaluated in - * the next major version of Nx. + * changed how configurations are defined. + * + * TODO(v19): re-evalute these deviations from @typescript-eslint/recommended in v19 of Nx */ 'no-extra-semi': 'off', '@typescript-eslint/no-extra-semi': 'error', '@typescript-eslint/no-non-null-assertion': 'warn', - '@typescript-eslint/no-parameter-properties': 'off', + '@typescript-eslint/adjacent-overload-signatures': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-inferrable-types': 'error', + '@typescript-eslint/no-unused-vars': 'warn', + '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/no-explicit-any': 'warn', }, }; diff --git a/packages/eslint/package.json b/packages/eslint/package.json index fe2a13d1bcd98a..5e13c26e77304d 100644 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -30,19 +30,16 @@ "generators": "./generators.json", "executors": "./executors.json", "peerDependencies": { - "eslint": "^8.0.0", "js-yaml": "4.1.0" }, "dependencies": { "@nx/devkit": "file:../devkit", "@nx/js": "file:../js", + "eslint": "^8.0.0", "tslib": "^2.3.0", "typescript": "~5.3.2" }, "peerDependenciesMeta": { - "eslint": { - "optional": true - }, "js-yaml": { "optional": true } diff --git a/packages/eslint/src/executors/lint/schema.json b/packages/eslint/src/executors/lint/schema.json index 9ded29d1710e47..64e467322d5e31 100644 --- a/packages/eslint/src/executors/lint/schema.json +++ b/packages/eslint/src/executors/lint/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "ESLint Lint Target", "description": "ESLint Lint Target.", "cli": "nx", diff --git a/packages/eslint/src/generators/convert-to-flat-config/schema.json b/packages/eslint/src/generators/convert-to-flat-config/schema.json index c74b85a8926616..f738885e508343 100644 --- a/packages/eslint/src/generators/convert-to-flat-config/schema.json +++ b/packages/eslint/src/generators/convert-to-flat-config/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "ConvertToFlatConfig", "cli": "nx", "description": "Convert an Nx workspace's ESLint configs to use Flat Config.", diff --git a/packages/eslint/src/generators/init/schema.json b/packages/eslint/src/generators/init/schema.json index 8b56ce3cc1128d..440e521e4c5019 100644 --- a/packages/eslint/src/generators/init/schema.json +++ b/packages/eslint/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxESLintInit", "title": "Initialize ESLint Plugin", diff --git a/packages/eslint/src/generators/workspace-rule/schema.json b/packages/eslint/src/generators/workspace-rule/schema.json index 5733d094d9bdb6..1fb3aa9e339c3f 100644 --- a/packages/eslint/src/generators/workspace-rule/schema.json +++ b/packages/eslint/src/generators/workspace-rule/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceRule", "cli": "nx", "title": "Create a new Workspace Lint Rule", diff --git a/packages/eslint/src/generators/workspace-rules-project/schema.json b/packages/eslint/src/generators/workspace-rules-project/schema.json index 32f2d6fd91bb87..7801b3b88ea458 100644 --- a/packages/eslint/src/generators/workspace-rules-project/schema.json +++ b/packages/eslint/src/generators/workspace-rules-project/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceRulesProject", "cli": "nx", "title": "Create the Workspace Lint Rules Project", diff --git a/packages/eslint/src/migrations/update-17-2-9/move-options-to-target-defaults.ts b/packages/eslint/src/migrations/update-17-2-9/move-options-to-target-defaults.ts index a6d6a7d0e94719..344e9ff06f4a98 100644 --- a/packages/eslint/src/migrations/update-17-2-9/move-options-to-target-defaults.ts +++ b/packages/eslint/src/migrations/update-17-2-9/move-options-to-target-defaults.ts @@ -134,7 +134,9 @@ export default async function update(tree: Tree) { } // remove options if empty - if (Object.keys(projConfig.targets[targetName].options).length === 0) { + if ( + Object.keys(projConfig.targets[targetName]?.options ?? {}).length === 0 + ) { delete projConfig.targets[targetName].options; } diff --git a/packages/expo/.eslintrc.json b/packages/expo/.eslintrc.json index 7d17ab0ff9d08d..78fc1f13d70c38 100644 --- a/packages/expo/.eslintrc.json +++ b/packages/expo/.eslintrc.json @@ -27,6 +27,9 @@ "nx", "@nx/rollup", "@nx/webpack", + "@nx/cypress", + "@nx/playwright", + "@nx/detox", "typescript", "eslint", "expo", diff --git a/packages/expo/docs/export-examples.md b/packages/expo/docs/export-examples.md new file mode 100644 index 00000000000000..4de61c36c111bd --- /dev/null +++ b/packages/expo/docs/export-examples.md @@ -0,0 +1,112 @@ +`project.json`: + +```json +{ + "name": "mobile", + //... + "targets": { + //... + "export": { + "executor": "@nx/expo:export", + "options": { + "outputs": ["{options.outputDir}"], + "platform": "all", + "outputDir": "dist/apps/mobile" + }, + "dependsOn": ["sync-deps"] + } + //... + } +} +``` + +```shell +nx run mobile:export +``` + +## Examples + +{% tabs %} +{% tab label="Specify outputDir" %} +The `outputDir` option allows you to specify the output directory of your bundle: + +```json + "export": { + "executor": "@nx/expo:export", + "outputs": ["{options.outputDir}"], + "options": { + "platform": "all", + "bundler": "metro", + "outputDir": "dist/apps/mobile" + }, + "dependsOn": ["sync-deps"] + }, +``` + +or run command: `nx run mobile:export --outputDir=dist/apps/mobile`. + +{% /tab %} +{% tab label="Specify the platform" %} +The `platform` option allows you to specify the platform to compile with metro bundler: "ios", "android", "all", and "web". + +For example, to bundle for web: + +```json + "export": { + "executor": "@nx/expo:export", + "outputs": ["{options.outputDir}"], + "options": { + "platform": "web", + "bundler": "metro", + "outputDir": "dist/apps/dogs" + }, + "dependsOn": ["sync-deps"] + }, +``` + +or run command `nx export mobile --platform=web`. + +{% /tab %} +{% tab label="Bundle for development" %} + +The `dev` option allows you to bundle for development environments. + +```json + "export": { + "executor": "@nx/expo:export", + "outputs": ["{options.outputDir}"], + "options": { + "platform": "web", + "bundler": "metro", + "outputDir": "dist/apps/dogs", + "dev": true + }, + "dependsOn": ["sync-deps"] + }, +``` + +or run command `nx export mobile --dev`. + +{% /tab %} +{% tab label="Clear bundle cache" %} + +The `clear` option allows you to clear bundle cache. + +```json + "export": { + "executor": "@nx/expo:export", + "outputs": ["{options.outputDir}"], + "options": { + "platform": "web", + "bundler": "metro", + "outputDir": "dist/apps/dogs", + "clear": true + }, + "dependsOn": ["sync-deps"] + }, +``` + +or run command `nx export mobile --clear`. + +{% /tab %} +{% /tabs %} diff --git a/packages/expo/docs/start-examples.md b/packages/expo/docs/start-examples.md index 1d2114f9976c98..a20bb5b01eb587 100644 --- a/packages/expo/docs/start-examples.md +++ b/packages/expo/docs/start-examples.md @@ -39,6 +39,8 @@ Opens your app in Expo Go in a currently running iOS simulator on your computer: } ``` +or run command `nx start --ios`. + Opens your app in Expo Go on a connected Android device ```json @@ -51,6 +53,8 @@ Opens your app in Expo Go on a connected Android device } ``` +or run command `nx start --android`. + Opens your app in a web browser: ```json @@ -63,6 +67,8 @@ Opens your app in a web browser: } ``` +or run command `nx start --web`. + {% /tab %} {% tab label="Specify the host" %} The `host` option allows you to specify the type of host to use. `lan` uses the local network; `tunnel` ues any network by tunnel through ngrok; `localhost` connects to the dev server over localhost. diff --git a/packages/expo/executors.json b/packages/expo/executors.json index 698998e09a7f03..cf2de4150cdc19 100644 --- a/packages/expo/executors.json +++ b/packages/expo/executors.json @@ -54,6 +54,11 @@ "implementation": "./src/executors/submit/submit.impl", "schema": "./src/executors/submit/schema.json", "description": "Submit app binary to App Store and/or Play Store" + }, + "serve": { + "implementation": "./src/executors/serve/serve.impl", + "schema": "./src/executors/serve/schema.json", + "description": "Serve up the Expo web app locally" } } } diff --git a/packages/expo/migrations.json b/packages/expo/migrations.json index 5f42f04eea9620..a34bbaac0de36a 100644 --- a/packages/expo/migrations.json +++ b/packages/expo/migrations.json @@ -36,12 +36,6 @@ "description": "Update package.json eas build lifecycle scripts", "implementation": "./src/migrations/update-16-1-4/update-eas-scripts" }, - "add-detox-app-json-16-1-4": { - "version": "16.1.4-beta.0", - "cli": "nx", - "description": "Add app.json for detox", - "factory": "./src/migrations/update-16-1-4/add-detox-app-json" - }, "update-16-6-0-add-dependsOn": { "cli": "nx", "version": "16.6.0-beta.0", @@ -65,6 +59,30 @@ "version": "16.9.0-beta.1", "description": "Update eas.json cli version", "implementation": "./src/migrations/update-16-9-0/update-eas-cli-version" + }, + "update-18-0-0-remove-block-list": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Remove blockList in metro.config.js", + "implementation": "./src/migrations/update-18-0-0/remove-block-list" + }, + "update-18-0-0-remove-symlink-target": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Remove symlink target in project.json", + "implementation": "./src/migrations/update-18-0-0/remove-symlink-target" + }, + "update-18-0-0-remove-eas-cli": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Remove eas-cli from package.json", + "implementation": "./src/migrations/update-18-0-0/remove-eas-cli" + }, + "update-18-0-0-remove-offset-export-outputDir": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Remove the offset from the outputDir of the export target", + "implementation": "./src/migrations/update-18-0-0/change-outputDir-export-target" } }, "packageJsonUpdates": { @@ -605,6 +623,67 @@ "alwaysAddToPackageJson": false } } + }, + "18.0.0": { + "version": "18.0.0-beta.0", + "packages": { + "expo": { + "version": "50.0.1", + "alwaysAddToPackageJson": false + }, + "expo-splash-screen": { + "version": "~0.26.1", + "alwaysAddToPackageJson": false + }, + "expo-status-bar": { + "version": "~1.11.1", + "alwaysAddToPackageJson": false + }, + "@expo/cli": { + "version": "~0.16.5", + "alwaysAddToPackageJson": false + }, + "babel-preset-expo": { + "version": "~10.0.0", + "alwaysAddToPackageJson": false + }, + "@types/react": { + "version": "~18.2.45", + "alwaysAddToPackageJson": false + }, + "react-native": { + "version": "~0.73.2", + "alwaysAddToPackageJson": false + }, + "react-native-web": { + "version": "~0.19.9", + "alwaysAddToPackageJson": false + }, + "@expo/metro-config": { + "version": "~0.17.3", + "alwaysAddToPackageJson": false + }, + "@expo/metro-runtime": { + "version": "~3.1.1", + "addToPackageJson": "devDependencies" + }, + "react-native-svg-transformer": { + "version": "1.2.0", + "alwaysAddToPackageJson": false + }, + "react-native-svg": { + "version": "14.1.0", + "alwaysAddToPackageJson": false + }, + "@testing-library/react-native": { + "version": "~12.4.2", + "alwaysAddToPackageJson": false + }, + "jest-expo": { + "version": "~50.0.1", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/expo/package.json b/packages/expo/package.json index 55dc9d5cfb1332..067e7f5c339751 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -26,27 +26,23 @@ "main": "./index", "types": "index.d.ts", "dependencies": { + "@nx/devkit": "file:../devkit", "chalk": "^4.1.0", "enhanced-resolve": "^5.8.3", "fs-extra": "^11.1.0", - "metro-config": "~0.76.8", - "metro-resolver": "~0.76.8", + "metro-config": "~0.80.4", + "metro-resolver": "~0.80.4", + "node-fetch": "^2.6.7", "tslib": "^2.3.0", "tsconfig-paths": "^4.1.2", "tsconfig-paths-webpack-plugin": "^4.0.0", - "@nx/detox": "file:../detox", - "@nx/devkit": "file:../devkit", "@nx/jest": "file:../jest", "@nx/js": "file:../js", "@nx/eslint": "file:../eslint", "@nx/react": "file:../react", + "@nx/web": "file:../web", "@nx/webpack": "file:../webpack" }, - "peerDependencies": { - "expo": ">= 49.0.0", - "@expo/cli": ">= 0.10.0", - "eas-cli": ">= 3.15.0" - }, "executors": "./executors.json", "ng-update": { "requirements": {}, diff --git a/packages/expo/plugins/metro-resolver.ts b/packages/expo/plugins/metro-resolver.ts index 3e9b70a72cd973..9273b187eedce4 100644 --- a/packages/expo/plugins/metro-resolver.ts +++ b/packages/expo/plugins/metro-resolver.ts @@ -45,6 +45,11 @@ export function getResolveRequest(extensions: string[]) { if (resolvedPath) { return resolvedPath; } + if (debug) { + console.log( + chalk.red(`[Nx] Unable to resolve with any resolver: ${realModuleName}`) + ); + } throw new Error(`Cannot resolve ${chalk.bold(realModuleName)}`); }; } @@ -53,7 +58,7 @@ function resolveRequestFromContext( resolveRequest: Function, context: any, realModuleName: string, - platform: string, + platform: string | null, debug: boolean ) { try { @@ -75,7 +80,7 @@ function resolveRequestFromContext( function defaultMetroResolver( context: any, realModuleName: string, - platform: string, + platform: string | null, debug: boolean ) { try { @@ -130,7 +135,7 @@ function tsconfigPathsResolver( context: any, extensions: string[], realModuleName: string, - platform: string, + platform: string | null, debug: boolean ) { try { @@ -145,7 +150,7 @@ function tsconfigPathsResolver( } catch { if (debug) { console.log( - chalk.red(`[Nx] Failed to resolve ${chalk.bold(realModuleName)}`) + chalk.cyan(`[Nx] Failed to resolve ${chalk.bold(realModuleName)}`) ); console.log( chalk.cyan( diff --git a/packages/expo/plugins/with-nx-metro.ts b/packages/expo/plugins/with-nx-metro.ts index 2bb660b286ef62..812bb1d77526b6 100644 --- a/packages/expo/plugins/with-nx-metro.ts +++ b/packages/expo/plugins/with-nx-metro.ts @@ -1,7 +1,7 @@ -import { workspaceRoot } from '@nx/devkit'; +import { joinPathFragments, workspaceRoot } from '@nx/devkit'; import { mergeConfig } from 'metro-config'; import type { MetroConfig } from 'metro-config'; -import { existsSync } from 'fs-extra'; +import { existsSync, readdirSync, statSync } from 'fs-extra'; import { getResolveRequest } from './metro-resolver'; @@ -19,16 +19,26 @@ export async function withNxMetro( if (opts.debug) process.env.NX_REACT_NATIVE_DEBUG = 'true'; if (opts.extensions) extensions.push(...opts.extensions); - let watchFolders = [workspaceRoot]; + let watchFolders = readdirSync(workspaceRoot) + .filter( + (fileName) => + !['dist', 'e2e'].includes(fileName) && !fileName.startsWith('.') + ) + .map((fileName) => joinPathFragments(workspaceRoot, fileName)) + .filter((filePath) => statSync(filePath).isDirectory()); + if (opts.watchFolders?.length) { watchFolders = watchFolders.concat(opts.watchFolders); } - watchFolders = watchFolders.filter((folder) => existsSync(folder)); + watchFolders = [...new Set(watchFolders)].filter((folder) => + existsSync(folder) + ); const nxConfig: MetroConfig = { resolver: { resolveRequest: getResolveRequest(extensions), + nodeModulesPaths: [joinPathFragments(workspaceRoot, 'node_modules')], }, watchFolders, }; diff --git a/packages/expo/plugins/with-nx-webpack.ts b/packages/expo/plugins/with-nx-webpack.ts index 814fb625bed656..af536b44ed9bd0 100644 --- a/packages/expo/plugins/with-nx-webpack.ts +++ b/packages/expo/plugins/with-nx-webpack.ts @@ -2,12 +2,14 @@ import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin'; import { resolve } from 'path'; /** - * @deprecated TODO(v17) use bundler: 'metro' instead, will be removed in 16.0.0 + * @deprecated TODO(v19) use bundler: 'metro' instead, will be removed in v19 * This function add additional rules to expo's webpack config to make expo web working */ export async function withNxWebpack(config) { // add additional rule to load files under libs - const rules = config.module.rules[1]?.oneOf; + const rules = config.module.rules.find((rule) => + Array.isArray(rule.oneOf) + )?.oneOf; if (rules) { rules.push({ test: /\.(mjs|[jt]sx?)$/, @@ -34,17 +36,19 @@ export async function withNxWebpack(config) { if (!config.resolve.plugins) { config.resolve.plugins = []; } - const extensions = ['.ts', '.tsx', '.mjs', '.js', '.jsx']; - const tsConfigPath = resolve('tsconfig.json'); - + const tsConfigPath = resolve(__dirname, 'tsconfig.json'); config.resolve.plugins.push( new TsconfigPathsPlugin({ configFile: tsConfigPath, extensions, }) ); + config.resolve.fallback = { + ...config.resolve.fallback, + crypto: require.resolve('crypto-browserify'), + stream: require.resolve('stream-browserify'), + }; - config.resolve.symlinks = true; return config; } diff --git a/packages/expo/src/executors/build-list/build-list.impl.ts b/packages/expo/src/executors/build-list/build-list.impl.ts index 1f2829a6f0ce78..3b100a6037e0cc 100644 --- a/packages/expo/src/executors/build-list/build-list.impl.ts +++ b/packages/expo/src/executors/build-list/build-list.impl.ts @@ -2,7 +2,7 @@ import { ExecutorContext, logger, names } from '@nx/devkit'; import { resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; +import { resolveEas } from '../../utils/resolve-eas'; import { ExpoEasBuildListOptions } from './schema'; @@ -18,7 +18,6 @@ export default async function* buildListExecutor( ): AsyncGenerator { const projectRoot = context.projectsConfigurations.projects[context.projectName].root; - ensureNodeModulesSymlink(context.root, projectRoot); try { if (options.json) { @@ -42,7 +41,7 @@ export function runCliBuildList( ): Promise { return new Promise((resolve, reject) => { childProcess = fork( - require.resolve('eas-cli/bin/run'), + resolveEas(workspaceRoot), ['build:list', ...createBuildListOptions(options)], { cwd: pathResolve(workspaceRoot, projectRoot), diff --git a/packages/expo/src/executors/build-list/schema.json b/packages/expo/src/executors/build-list/schema.json index a77b17f8236a74..f2a4cbdc6b606d 100644 --- a/packages/expo/src/executors/build-list/schema.json +++ b/packages/expo/src/executors/build-list/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxExpoEasBuildList", "cli": "nx", "title": "Expo EAS Build List executor", diff --git a/packages/expo/src/executors/build/build.impl.ts b/packages/expo/src/executors/build/build.impl.ts index 9c1c3d377712c6..6066c9df80c51e 100644 --- a/packages/expo/src/executors/build/build.impl.ts +++ b/packages/expo/src/executors/build/build.impl.ts @@ -2,6 +2,8 @@ import { ExecutorContext, names } from '@nx/devkit'; import { resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; +import { resolveEas } from '../../utils/resolve-eas'; + import { ExpoEasBuildOptions } from './schema'; export interface ReactNativeBuildOutput { @@ -34,7 +36,7 @@ function runCliBuild( ) { return new Promise((resolve, reject) => { childProcess = fork( - require.resolve('eas-cli/bin/run'), + resolveEas(workspaceRoot), ['build', ...createBuildOptions(options)], { cwd: pathResolve(workspaceRoot, projectRoot), diff --git a/packages/expo/src/executors/build/schema.json b/packages/expo/src/executors/build/schema.json index 2821cb7c2a29fb..d0edcdd30f2f3e 100644 --- a/packages/expo/src/executors/build/schema.json +++ b/packages/expo/src/executors/build/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxExpoEasBuild", "cli": "nx", "title": "Expo EAS Build executor", diff --git a/packages/expo/src/executors/ensure-symlink/ensure-symlink.impl.ts b/packages/expo/src/executors/ensure-symlink/ensure-symlink.impl.ts index 80207b9b50776e..737a74f33a8505 100644 --- a/packages/expo/src/executors/ensure-symlink/ensure-symlink.impl.ts +++ b/packages/expo/src/executors/ensure-symlink/ensure-symlink.impl.ts @@ -6,6 +6,10 @@ export interface ExpoEnsureSymlinkOutput { success: boolean; } +/** + * TODO (@xiongemi): remove this function in v19. + * @deprecated It is no longer needed for react native 73. + */ export default async function* ensureSymlinkExecutor( _, context: ExecutorContext diff --git a/packages/expo/src/executors/ensure-symlink/schema.json b/packages/expo/src/executors/ensure-symlink/schema.json index deea737d861dd2..1d4ca69fc487e0 100644 --- a/packages/expo/src/executors/ensure-symlink/schema.json +++ b/packages/expo/src/executors/ensure-symlink/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoEnsureSymlink", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Ensure Symlink for Expo", "description": "Ensure workspace node_modules is symlink under app's node_modules folder.", "type": "object", diff --git a/packages/expo/src/executors/export/export.impl.spec.ts b/packages/expo/src/executors/export/export.impl.spec.ts new file mode 100644 index 00000000000000..a4587c88e8360b --- /dev/null +++ b/packages/expo/src/executors/export/export.impl.spec.ts @@ -0,0 +1,18 @@ +import { createExportOptions } from './export.impl'; + +describe('createExportOptions', () => { + it('should not pass --dev if dev is false', () => { + const options = createExportOptions({ dev: false }, ''); + expect(options).toEqual([]); + }); + + it('should pass --dev if dev is true', () => { + const options = createExportOptions({ dev: true }, ''); + expect(options).toEqual(['--dev']); + }); + + it('should pass --output-dir with offset to workspace root', () => { + const options = createExportOptions({ outputDir: 'dist' }, 'apps/app'); + expect(options).toEqual(['--output-dir', '../../dist']); + }); +}); diff --git a/packages/expo/src/executors/export/export.impl.ts b/packages/expo/src/executors/export/export.impl.ts index 242012ce9a4673..0d901f2a31ac7c 100644 --- a/packages/expo/src/executors/export/export.impl.ts +++ b/packages/expo/src/executors/export/export.impl.ts @@ -1,4 +1,9 @@ -import { ExecutorContext, names } from '@nx/devkit'; +import { + ExecutorContext, + joinPathFragments, + names, + offsetFromRoot, +} from '@nx/devkit'; import { ChildProcess, fork } from 'child_process'; import { resolve as pathResolve } from 'path'; @@ -19,7 +24,6 @@ export default async function* exportExecutor( try { await exportAsync(context.root, projectRoot, options); - yield { success: true, }; @@ -38,11 +42,7 @@ function exportAsync( return new Promise((resolve, reject) => { childProcess = fork( require.resolve('@expo/cli/build/bin/cli'), - [ - `export${options.bundler === 'webpack' ? ':web' : ''}`, - '.', - ...createExportOptions(options), - ], + [`export`, ...createExportOptions(options, projectRoot)], { cwd: pathResolve(workspaceRoot, projectRoot), env: process.env } ); @@ -63,19 +63,34 @@ function exportAsync( }); } -const nxOptions = ['bundler']; +const nxOptions = ['bundler', 'interactive']; // interactive is passed in by e2e tests // options from https://github.com/expo/expo/blob/main/packages/@expo/cli/src/export/index.ts -function createExportOptions(options: ExportExecutorSchema) { +export function createExportOptions( + options: ExportExecutorSchema, + projectRoot: string +) { return Object.keys(options).reduce((acc, k) => { if (!nxOptions.includes(k)) { const v = options[k]; - if (typeof v === 'boolean') { - if (v === true) { - // when true, does not need to pass the value true, just need to pass the flag in kebob case - acc.push(`--${names(k).fileName}`); - } - } else { - acc.push(`--${names(k).fileName}`, v); + switch (k) { + case 'outputDir': + const path = joinPathFragments(offsetFromRoot(projectRoot), v); // need to add offset for the outputDir + acc.push('--output-dir', path); + break; + case 'minify': + if (v === false) { + acc.push('--no-minify'); // cli only accpets --no-minify + } + break; + default: + if (typeof v === 'boolean') { + if (v === true) { + // when true, does not need to pass the value true, just need to pass the flag in kebob case + acc.push(`--${names(k).fileName}`); + } + } else { + acc.push(`--${names(k).fileName}`, v); + } } } return acc; diff --git a/packages/expo/src/executors/export/schema.d.ts b/packages/expo/src/executors/export/schema.d.ts index e93be69b912666..f23104d9407a38 100644 --- a/packages/expo/src/executors/export/schema.d.ts +++ b/packages/expo/src/executors/export/schema.d.ts @@ -1,11 +1,13 @@ // options form https://github.com/expo/expo/blob/main/packages/%40expo/cli/src/export/resolveOptions.ts +// https://github.com/expo/expo/blob/main/packages/%40expo/cli/src/export/index.ts + export interface ExportExecutorSchema { platform?: 'ios' | 'android' | 'all' | 'web'; // default is 'all' outputDir?: string; clear?: boolean; dev?: boolean; + minify?: boolean; maxWorkers?: number; dumpAssetmap?: boolean; - dumpSourcemap?: boolean; - bundler: 'metro' | 'webpack'; + sourcemap?: boolean; } diff --git a/packages/expo/src/executors/export/schema.json b/packages/expo/src/executors/export/schema.json index e4895932796a25..5928fe41d92fc8 100644 --- a/packages/expo/src/executors/export/schema.json +++ b/packages/expo/src/executors/export/schema.json @@ -3,7 +3,7 @@ "version": 2, "outputCapture": "direct-nodejs", "$id": "NxExpoExport", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Expo Export", "description": "Export the JavaScript and assets for your app using Metro/webpack bundler.", "type": "object", @@ -11,38 +11,39 @@ "platform": { "description": "Choose the platform to compile for", "enum": ["ios", "android", "all", "web"], + "default": "all", "alias": "p", "x-priority": "important" }, "dev": { "type": "boolean", - "description": "Bundle for development environments without minifying code or stripping the __DEV__ boolean. Configure static files for developing locally using a non-https server." + "description": "Configure static files for developing locally using a non-https server" }, "clear": { "type": "boolean", "description": "Clear the bundler cache before exporting" }, + "minify": { + "type": "boolean", + "description": "Minify source" + }, "outputDir": { "type": "string", - "description": "The directory to export the static files to. Default: dist" + "description": "Relative to workspace root, the directory to export the static files to. Default: dist" }, "maxWorkers": { "type": "number", - "description": "Maximum number of tasks to allow Metro to spawn" + "description": "When bundler is metro, the maximum number of tasks to allow the bundler to spawn" }, "dumpAssetmap": { "type": "boolean", - "description": "Dump the asset map for further processing" + "description": "When bundler is metro, whether to dump the asset map for further processing" }, - "dumpSourcemap": { + "sourceMaps": { "type": "boolean", - "description": "Dump the source map for debugging the JS bundle" - }, - "bundler": { - "enum": ["metro", "webpack"], - "description": "Choose the bundler to compile for", - "default": "metro" + "description": "When bundler is metro, whether to emit JavaScript source maps" } }, - "required": [] + "required": ["platform"], + "examplesFile": "../../../docs/export-examples.md" } diff --git a/packages/expo/src/executors/install/install.impl.ts b/packages/expo/src/executors/install/install.impl.ts index ad1053ad0854b0..b78c51bad86299 100644 --- a/packages/expo/src/executors/install/install.impl.ts +++ b/packages/expo/src/executors/install/install.impl.ts @@ -1,7 +1,6 @@ import { ExecutorContext, names } from '@nx/devkit'; import { ChildProcess, fork } from 'child_process'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; import { ExpoInstallOptions } from './schema'; export interface ExpoInstallOutput { @@ -19,7 +18,6 @@ export default async function* installExecutor( try { await installAsync(context.root, options); - ensureNodeModulesSymlink(context.root, projectRoot); yield { success: true, diff --git a/packages/expo/src/executors/install/schema.json b/packages/expo/src/executors/install/schema.json index a6f1e086b1416c..ea1869992eae92 100644 --- a/packages/expo/src/executors/install/schema.json +++ b/packages/expo/src/executors/install/schema.json @@ -3,7 +3,7 @@ "version": 2, "outputCapture": "direct-nodejs", "$id": "NxExpoInstall", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Expo Install", "description": "Install a module or other package to a project.", "type": "object", diff --git a/packages/expo/src/executors/prebuild/prebuild.impl.ts b/packages/expo/src/executors/prebuild/prebuild.impl.ts index 05de40d8b7db71..27421fa94b528e 100644 --- a/packages/expo/src/executors/prebuild/prebuild.impl.ts +++ b/packages/expo/src/executors/prebuild/prebuild.impl.ts @@ -1,8 +1,7 @@ -import { ExecutorContext, names } from '@nx/devkit'; +import { ExecutorContext, names, workspaceRoot } from '@nx/devkit'; import { ChildProcess, fork } from 'child_process'; import { join } from 'path'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; import { podInstall } from '../../utils/pod-install-task'; import { installAsync } from '../install/install.impl'; import { ExpoPrebuildOptions } from './schema'; @@ -19,13 +18,12 @@ export default async function* prebuildExecutor( ): AsyncGenerator { const projectRoot = context.projectsConfigurations.projects[context.projectName].root; - ensureNodeModulesSymlink(context.root, projectRoot); try { await prebuildAsync(context.root, projectRoot, options); if (options.install) { - await installAsync(context.root, {}); + await installAsync(workspaceRoot, {}); if (options.platform === 'ios') { podInstall(join(context.root, projectRoot, 'ios')); } @@ -70,13 +68,20 @@ export function prebuildAsync( }); } -const nxOptions = ['install', 'interactive']; +const nxOptions = ['install', 'interactive']; // interactive is passed in by e2e tests // options from https://github.com/expo/expo/blob/main/packages/%40expo/cli/src/prebuild/index.ts function createPrebuildOptions(options: ExpoPrebuildOptions) { return Object.keys(options).reduce((acc, k) => { if (!nxOptions.includes(k)) { const v = options[k]; - acc.push(`--${names(k).fileName}=${v}`); + if (typeof v === 'boolean') { + if (v === true) { + // when true, does not need to pass the value true, just need to pass the flag in kebob case + acc.push(`--${names(k).fileName}`); + } + } else { + acc.push(`--${names(k).fileName}`, v); + } } return acc; }, []); diff --git a/packages/expo/src/executors/prebuild/schema.json b/packages/expo/src/executors/prebuild/schema.json index 5de6a0f19f94d6..0b9b895eaa65d5 100644 --- a/packages/expo/src/executors/prebuild/schema.json +++ b/packages/expo/src/executors/prebuild/schema.json @@ -3,7 +3,7 @@ "version": 2, "outputCapture": "direct-nodejs", "$id": "NxExpoPrebuild", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Expo Prebuild", "description": "Create native iOS and Android project files for building natively.", "type": "object", @@ -31,5 +31,6 @@ "description": "Project template to clone from. File path pointing to a local tar file or a github repo" } }, + "required": ["platform"], "examplesFile": "../../../docs/prebuild-examples.md" } diff --git a/packages/expo/src/executors/run/run.impl.ts b/packages/expo/src/executors/run/run.impl.ts index 9e9fe8ee0b429d..6ac8350714d97d 100644 --- a/packages/expo/src/executors/run/run.impl.ts +++ b/packages/expo/src/executors/run/run.impl.ts @@ -4,11 +4,6 @@ import { ChildProcess, fork } from 'child_process'; import { platform } from 'os'; import { existsSync } from 'fs-extra'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; -import { - displayNewlyAddedDepsMessage, - syncDeps, -} from '../sync-deps/sync-deps.impl'; import { ExpoRunOptions } from './schema'; import { prebuildAsync } from '../prebuild/prebuild.impl'; import { podInstall } from '../../utils/pod-install-task'; diff --git a/packages/expo/src/executors/run/schema.json b/packages/expo/src/executors/run/schema.json index 9137b7ea45dcd0..96f0385776db31 100644 --- a/packages/expo/src/executors/run/schema.json +++ b/packages/expo/src/executors/run/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoRun", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run iOS or Android application", "description": "Run Expo target options.", "type": "object", diff --git a/packages/expo/src/executors/serve/lib/is-packager-running.ts b/packages/expo/src/executors/serve/lib/is-packager-running.ts new file mode 100644 index 00000000000000..4ea543fb7a014c --- /dev/null +++ b/packages/expo/src/executors/serve/lib/is-packager-running.ts @@ -0,0 +1,13 @@ +import fetch from 'node-fetch'; + +export async function isPackagerRunning( + packagerPort: number +): Promise<'running' | 'not_running' | 'unrecognized'> { + try { + const resp = await fetch(`http://localhost:${packagerPort}/status`); + const data = await resp.text(); + return data === 'packager-status:running' ? 'running' : 'unrecognized'; + } catch { + return 'not_running'; + } +} diff --git a/packages/expo/src/executors/serve/schema.d.ts b/packages/expo/src/executors/serve/schema.d.ts new file mode 100644 index 00000000000000..b8dd101736abda --- /dev/null +++ b/packages/expo/src/executors/serve/schema.d.ts @@ -0,0 +1,7 @@ +export interface ExpoServeExecutorSchema { + port: number; + dev?: boolean; + minify?: boolean; + https?: boolean; + clear?: boolean; +} diff --git a/packages/expo/src/executors/serve/schema.json b/packages/expo/src/executors/serve/schema.json new file mode 100644 index 00000000000000..b0672b0a9f83e2 --- /dev/null +++ b/packages/expo/src/executors/serve/schema.json @@ -0,0 +1,35 @@ +{ + "version": 2, + "outputCapture": "direct-nodejs", + "cli": "nx", + "$id": "NxExpoServe", + "$schema": "http://json-schema.org/schema", + "title": "Serve web app for Expo", + "description": "Packager Server target options.", + "type": "object", + "properties": { + "port": { + "type": "number", + "description": "Port to start the native Metro bundler on (does not apply to web or tunnel)", + "default": 19000, + "alias": "p" + }, + "clear": { + "type": "boolean", + "description": "Clear the Metro bundler cache", + "alias": "c" + }, + "maxWorkers": { + "type": "number", + "description": "Maximum number of tasks to allow Metro to spawn" + }, + "dev": { + "type": "boolean", + "description": "Turn development mode on or off" + }, + "minify": { + "type": "boolean", + "description": "Whether or not to minify code" + } + } +} diff --git a/packages/expo/src/executors/serve/serve.impl.ts b/packages/expo/src/executors/serve/serve.impl.ts new file mode 100644 index 00000000000000..0ca46e1fc2fc03 --- /dev/null +++ b/packages/expo/src/executors/serve/serve.impl.ts @@ -0,0 +1,127 @@ +import { ExecutorContext, logger, names } from '@nx/devkit'; +import { ChildProcess, fork } from 'child_process'; +import { resolve as pathResolve } from 'path'; +import { isPackagerRunning } from './lib/is-packager-running'; +import { ExpoServeExecutorSchema } from './schema'; + +export interface ExpoServeOutput { + port?: number; + baseUrl?: string; + success: boolean; +} + +export default async function* serveExecutor( + options: ExpoServeExecutorSchema, + context: ExecutorContext +): AsyncGenerator { + const projectRoot = + context.projectsConfigurations.projects[context.projectName].root; + + const serveProcess = await runCliServe(context.root, projectRoot, options); + + yield { + port: options.port, + baseUrl: `http://localhost:${options.port}`, + success: true, + }; + + if (!serveProcess) { + return; + } + await new Promise((resolve) => { + const processExitListener = (signal?: number | NodeJS.Signals) => () => { + serveProcess.kill(signal); + resolve(); + process.exit(); + }; + process.once('exit', (signal) => serveProcess.kill(signal)); + process.once('SIGTERM', processExitListener); + process.once('SIGINT', processExitListener); + process.once('SIGQUIT', processExitListener); + }); +} + +export async function runCliServe( + workspaceRoot: string, + projectRoot: string, + options: ExpoServeExecutorSchema +): Promise { + const result = await isPackagerRunning(options.port); + if (result === 'running') { + logger.info(`JS server already running on port ${options.port}.`); + } else if (result === 'unrecognized') { + logger.warn('JS server not recognized.'); + } else { + // result === 'not_running' + logger.info('Starting JS server...'); + + try { + return await serveAsync(workspaceRoot, projectRoot, options); + } catch (error) { + logger.error( + `Failed to serve the packager server. Error details: ${error.message}` + ); + throw error; + } + } +} + +function serveAsync( + workspaceRoot: string, + projectRoot: string, + options: ExpoServeExecutorSchema +): Promise { + return new Promise((resolve, reject) => { + const childProcess = fork( + require.resolve('@expo/cli/build/bin/cli'), + ['start', '--web', ...createServeOptions(options)], + { + cwd: pathResolve(workspaceRoot, projectRoot), + env: process.env, + stdio: ['inherit', 'pipe', 'pipe', 'ipc'], + } + ); + + childProcess.stdout.on('data', (data) => { + process.stdout.write(data); + if (data.toString().includes('Bundling complete')) { + resolve(childProcess); + } + }); + childProcess.stderr.on('data', (data) => { + process.stderr.write(data); + }); + + childProcess.on('error', (err) => { + reject(err); + }); + childProcess.on('exit', (code) => { + if (code === 0) { + resolve(childProcess); + } else { + reject(code); + } + }); + }); +} + +function createServeOptions(options: ExpoServeExecutorSchema): string[] { + return Object.keys(options).reduce((acc, k) => { + const v = options[k]; + if (k === 'dev') { + if (v === false) { + acc.push(`--no-dev`); // only no-dev flag is supported + } + } else { + if (typeof v === 'boolean') { + if (v === true) { + // when true, does not need to pass the value true, just need to pass the flag in kebob case + acc.push(`--${names(k).fileName}`); + } + } else { + acc.push(`--${names(k).fileName}`, v); + } + } + return acc; + }, []); +} diff --git a/packages/expo/src/executors/start/schema.json b/packages/expo/src/executors/start/schema.json index c7cee12527e38b..29f4fb3cede3ac 100644 --- a/packages/expo/src/executors/start/schema.json +++ b/packages/expo/src/executors/start/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoStart", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Packager Server for Expo", "description": "Packager Server target options.", "type": "object", diff --git a/packages/expo/src/executors/start/start.impl.ts b/packages/expo/src/executors/start/start.impl.ts index 46ff86162eddf4..07977aa2befa45 100644 --- a/packages/expo/src/executors/start/start.impl.ts +++ b/packages/expo/src/executors/start/start.impl.ts @@ -45,7 +45,13 @@ function startAsync( childProcess = fork( require.resolve('@expo/cli/build/bin/cli'), ['start', ...createStartOptions(options)], - { cwd: pathResolve(workspaceRoot, projectRoot), env: process.env } + { + cwd: pathResolve(workspaceRoot, projectRoot), + env: { + RCT_METRO_PORT: options.port.toString(), + ...process.env, + }, + } ); // Ensure the child process is killed when the parent exits diff --git a/packages/expo/src/executors/submit/schema.json b/packages/expo/src/executors/submit/schema.json index c46ef169080dd5..367e9a54e66d61 100644 --- a/packages/expo/src/executors/submit/schema.json +++ b/packages/expo/src/executors/submit/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "EXPO EAS Submit Executor", "description": "Submit app binary to App Store and/or Play Store.", diff --git a/packages/expo/src/executors/submit/submit.impl.ts b/packages/expo/src/executors/submit/submit.impl.ts index a3d6c8b3f58227..e18d03cb5bd286 100644 --- a/packages/expo/src/executors/submit/submit.impl.ts +++ b/packages/expo/src/executors/submit/submit.impl.ts @@ -2,6 +2,8 @@ import { ExecutorContext, names } from '@nx/devkit'; import { resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; +import { resolveEas } from '../../utils/resolve-eas'; + import { SubmitExecutorSchema } from './schema'; export interface ReactNativeSubmitOutput { @@ -35,7 +37,7 @@ function runCliSubmit( ) { return new Promise((resolve, reject) => { childProcess = fork( - require.resolve('eas-cli/bin/run'), + resolveEas(workspaceRoot), ['submit', ...createSubmitOptions(options)], { cwd: pathResolve(workspaceRoot, projectRoot), diff --git a/packages/expo/src/executors/sync-deps/schema.json b/packages/expo/src/executors/sync-deps/schema.json index fa23ea8f4bf63e..5ba21b496df96a 100644 --- a/packages/expo/src/executors/sync-deps/schema.json +++ b/packages/expo/src/executors/sync-deps/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxExpoSyncDeps", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Sync Deps for Expo", "description": "Updates package.json with project dependencies.", "type": "object", diff --git a/packages/expo/src/executors/sync-deps/sync-deps.impl.ts b/packages/expo/src/executors/sync-deps/sync-deps.impl.ts index 5dec1e81370424..0c17f5d97d11ef 100644 --- a/packages/expo/src/executors/sync-deps/sync-deps.impl.ts +++ b/packages/expo/src/executors/sync-deps/sync-deps.impl.ts @@ -3,32 +3,27 @@ import * as chalk from 'chalk'; import { ExecutorContext, logger, - ProjectGraph, readJsonFile, writeJsonFile, } from '@nx/devkit'; -import { findAllNpmDependencies } from '../../utils/find-all-npm-dependencies'; - import { ExpoSyncDepsOptions } from './schema'; -export interface ExpoSyncDepsOutput { +export interface ReactNativeSyncDepsOutput { success: boolean; } export default async function* syncDepsExecutor( options: ExpoSyncDepsOptions, context: ExecutorContext -): AsyncGenerator { +): AsyncGenerator { const projectRoot = context.projectsConfigurations.projects[context.projectName].root; displayNewlyAddedDepsMessage( context.projectName, await syncDeps( - context.projectName, projectRoot, context.root, - context.projectGraph, typeof options.include === 'string' ? options.include.split(',') : options.include, @@ -42,14 +37,16 @@ export default async function* syncDepsExecutor( } export async function syncDeps( - projectName: string, projectRoot: string, workspaceRoot: string, - projectGraph: ProjectGraph, include: string[] = [], exclude: string[] = [] ): Promise { - let npmDeps = findAllNpmDependencies(projectGraph, projectName); + const workspacePackageJsonPath = join(workspaceRoot, 'package.json'); + const workspacePackageJson = readJsonFile(workspacePackageJsonPath); + let npmDeps = Object.keys(workspacePackageJson.dependencies || {}); + let npmDevdeps = Object.keys(workspacePackageJson.devDependencies || {}); + const packageJsonPath = join(workspaceRoot, projectRoot, 'package.json'); const packageJson = readJsonFile(packageJsonPath); const newDeps = []; @@ -67,13 +64,27 @@ export async function syncDeps( npmDeps = npmDeps.filter((dep) => !exclude.includes(dep)); } + if (!packageJson.devDependencies) { + packageJson.devDependencies = {}; + } + if (!packageJson.dependencies) { + packageJson.dependencies = {}; + } + npmDeps.forEach((dep) => { - if (!packageJson.dependencies[dep]) { + if (!packageJson.dependencies[dep] && !packageJson.devDependencies[dep]) { packageJson.dependencies[dep] = '*'; newDeps.push(dep); updated = true; } }); + npmDevdeps.forEach((dep) => { + if (!packageJson.dependencies[dep] && !packageJson.devDependencies[dep]) { + packageJson.devDependencies[dep] = '*'; + newDeps.push(dep); + updated = true; + } + }); if (updated) { writeJsonFile(packageJsonPath, packageJson); diff --git a/packages/expo/src/executors/update/schema.json b/packages/expo/src/executors/update/schema.json index c9d72d9a5dfc84..c93dbfa5eb7893 100644 --- a/packages/expo/src/executors/update/schema.json +++ b/packages/expo/src/executors/update/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxExpoEasUpdate", "cli": "nx", "title": "Expo EAS Update executor", diff --git a/packages/expo/src/executors/update/update.impl.ts b/packages/expo/src/executors/update/update.impl.ts index 99e828dbfaa453..bec9621d68b6e9 100644 --- a/packages/expo/src/executors/update/update.impl.ts +++ b/packages/expo/src/executors/update/update.impl.ts @@ -2,15 +2,15 @@ import { ExecutorContext, names } from '@nx/devkit'; import { resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; - -import { ExpoEasUpdateOptions } from './schema'; +import { resolveEas } from '../../utils/resolve-eas'; import { displayNewlyAddedDepsMessage, syncDeps, } from '../sync-deps/sync-deps.impl'; import { installAsync } from '../install/install.impl'; +import { ExpoEasUpdateOptions } from './schema'; + export interface ReactNativeUpdateOutput { success: boolean; } @@ -26,15 +26,8 @@ export default async function* buildExecutor( await installAsync(context.root, { packages: ['expo-updates'] }); displayNewlyAddedDepsMessage( context.projectName, - await syncDeps( - context.projectName, - projectRoot, - context.root, - context.projectGraph, - ['expo-updates'] - ) + await syncDeps(projectRoot, context.root, ['expo-updates']) ); - ensureNodeModulesSymlink(context.root, projectRoot); try { await runCliUpdate(context.root, projectRoot, options); @@ -53,7 +46,7 @@ function runCliUpdate( ) { return new Promise((resolve, reject) => { childProcess = fork( - require.resolve('eas-cli/bin/run'), + resolveEas(workspaceRoot), ['update', ...createUpdateOptions(options)], { cwd: pathResolve(workspaceRoot, projectRoot), env: process.env } ); diff --git a/packages/expo/src/generators/application/application.ts b/packages/expo/src/generators/application/application.ts index 9173648ce42618..4da5a959111a29 100644 --- a/packages/expo/src/generators/application/application.ts +++ b/packages/expo/src/generators/application/application.ts @@ -7,7 +7,6 @@ import { } from '@nx/devkit'; import { initGenerator as jsInitGenerator } from '@nx/js'; -import { runSymlink } from '../../utils/symlink-task'; import { addLinting } from '../../utils/add-linting'; import { addJest } from '../../utils/add-jest'; @@ -16,10 +15,11 @@ import initGenerator from '../init/init'; import { addProject } from './lib/add-project'; import { createApplicationFiles } from './lib/create-application-files'; import { addEasScripts } from './lib/add-eas-scripts'; -import { addDetox } from './lib/add-detox'; +import { addE2e } from './lib/add-e2e'; import { Schema } from './schema'; import { ensureDependencies } from '../../utils/ensure-dependencies'; import { initRootBabelConfig } from '../../utils/init-root-babel-config'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function expoApplicationGenerator( host: Tree, @@ -71,16 +71,18 @@ export async function expoApplicationGeneratorInternal( options.skipPackageJson ); tasks.push(jestTask); - const detoxTask = await addDetox(host, options); - tasks.push(detoxTask); - const symlinkTask = runSymlink(host.root, options.appProjectRoot); - tasks.push(symlinkTask); + const e2eTask = await addE2e(host, options); + tasks.push(e2eTask); addEasScripts(host); if (!options.skipFormat) { await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/expo/src/generators/application/files/babel.config.js.template b/packages/expo/src/generators/application/files/.babelrc.js.template similarity index 100% rename from packages/expo/src/generators/application/files/babel.config.js.template rename to packages/expo/src/generators/application/files/.babelrc.js.template diff --git a/packages/expo/src/generators/application/files/app.json.template b/packages/expo/src/generators/application/files/app.json.template index b01971a14ef57a..4ebff55dc115c7 100644 --- a/packages/expo/src/generators/application/files/app.json.template +++ b/packages/expo/src/generators/application/files/app.json.template @@ -30,6 +30,7 @@ "bundler": "metro" }, "plugins": [ + <% if (e2eTestRunner === 'detox') { %> [ "@config-plugins/detox", { @@ -37,6 +38,7 @@ "subdomains": ["10.0.2.2", "localhost"] } ] + <% } %> ] } } diff --git a/packages/expo/src/generators/application/files/eas.json.template b/packages/expo/src/generators/application/files/eas.json.template index 7c3f3cdcdae961..2d3e40b58b4d0d 100644 --- a/packages/expo/src/generators/application/files/eas.json.template +++ b/packages/expo/src/generators/application/files/eas.json.template @@ -21,8 +21,5 @@ }, "submit": { "production": {} - }, - "cli": { - "version": ">= <%= easCliVersion.replace('~', '') %>" } } diff --git a/packages/expo/src/generators/application/files/metro.config.js.template b/packages/expo/src/generators/application/files/metro.config.js.template index 60c1d91ac415a2..c4ec6e7509c442 100644 --- a/packages/expo/src/generators/application/files/metro.config.js.template +++ b/packages/expo/src/generators/application/files/metro.config.js.template @@ -1,7 +1,6 @@ const { withNxMetro } = require('@nx/expo'); const { getDefaultConfig } = require('@expo/metro-config'); const { mergeConfig } = require('metro-config'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); const defaultConfig = getDefaultConfig(__dirname); const { assetExts, sourceExts } = defaultConfig.resolver; @@ -19,9 +18,6 @@ const customConfig = { resolver: { assetExts: assetExts.filter((ext) => ext !== 'svg'), sourceExts: [...sourceExts, 'svg'], - blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), - // unstable_enableSymlinks: true, - // unstable_enablePackageExports: true, }, }; diff --git a/packages/expo/src/generators/application/files/src/app/App.tsx.template b/packages/expo/src/generators/application/files/src/app/App.tsx.template index 259890c2af601d..441e0660275023 100644 --- a/packages/expo/src/generators/application/files/src/app/App.tsx.template +++ b/packages/expo/src/generators/application/files/src/app/App.tsx.template @@ -19,7 +19,10 @@ export const App = () => { return ( <> - + { scrollViewRef.current = ref; @@ -29,7 +32,7 @@ export const App = () => { > Hello there, - + Welcome <%= displayName %> 👋 diff --git a/packages/expo/src/generators/application/files/webpack.config.js.template b/packages/expo/src/generators/application/files/webpack.config.js.template new file mode 100644 index 00000000000000..7772ece5f960c1 --- /dev/null +++ b/packages/expo/src/generators/application/files/webpack.config.js.template @@ -0,0 +1,57 @@ +const createExpoWebpackConfigAsync = require('@expo/webpack-config'); +const { TsconfigPathsPlugin } = require('tsconfig-paths-webpack-plugin'); +const { resolve } = require('path'); + +/** + * @deprecated use bundler: 'metro' instead + */ +module.exports = async function (env, argv) { + const config = await createExpoWebpackConfigAsync(env, argv); + + // Customize the config before returning it. + // add additional rule to load files under libs + const rules = config.module.rules.find((rule) => + Array.isArray(rule.oneOf) + )?.oneOf; + if (rules) { + rules.push({ + test: /\.(mjs|[jt]sx?)$/, + exclude: /node_modules/, + use: { + loader: require.resolve('@nx/webpack/src/utils/web-babel-loader.js'), + options: { + presets: [ + [ + '@nx/react/babel', + { + runtime: 'automatic', + }, + ], + ], + }, + }, + }); + } + + if (!config.resolve) { + config.resolve = {}; + } + if (!config.resolve.plugins) { + config.resolve.plugins = []; + } + const extensions = ['.ts', '.tsx', '.mjs', '.js', '.jsx']; + const tsConfigPath = resolve(__dirname, 'tsconfig.json'); + config.resolve.plugins.push( + new TsconfigPathsPlugin({ + configFile: tsConfigPath, + extensions, + }) + ); + config.resolve.fallback = { + ...config.resolve.fallback, + crypto: require.resolve('crypto-browserify'), + stream: require.resolve('stream-browserify'), + }; + + return config; +}; diff --git a/packages/expo/src/generators/application/lib/add-detox.ts b/packages/expo/src/generators/application/lib/add-detox.ts deleted file mode 100644 index ffe8be1c9de74a..00000000000000 --- a/packages/expo/src/generators/application/lib/add-detox.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { detoxApplicationGenerator } from '@nx/detox'; -import { Tree } from '@nx/devkit'; -import { NormalizedSchema } from './normalize-options'; -import { Linter } from '@nx/eslint'; - -export async function addDetox(host: Tree, options: NormalizedSchema) { - if (options?.e2eTestRunner !== 'detox') { - return () => {}; - } - - return detoxApplicationGenerator(host, { - ...options, - linter: Linter.EsLint, - e2eName: `${options.projectName}-e2e`, - e2eDirectory: `${options.appProjectRoot}-e2e`, - projectNameAndRootFormat: 'as-provided', - appProject: options.projectName, - appDisplayName: options.displayName, - appName: options.name, - framework: 'expo', - setParserOptionsProject: options.setParserOptionsProject, - skipFormat: true, - }); -} diff --git a/packages/expo/src/generators/application/lib/add-e2e.ts b/packages/expo/src/generators/application/lib/add-e2e.ts new file mode 100644 index 00000000000000..0d48fc589bb554 --- /dev/null +++ b/packages/expo/src/generators/application/lib/add-e2e.ts @@ -0,0 +1,104 @@ +import type { GeneratorCallback, Tree } from '@nx/devkit'; +import { + addProjectConfiguration, + ensurePackage, + getPackageManagerCommand, + joinPathFragments, +} from '@nx/devkit'; +import { webStaticServeGenerator } from '@nx/web'; + +import { nxVersion } from '../../../utils/versions'; +import { hasExpoPlugin } from '../../../utils/has-expo-plugin'; +import { NormalizedSchema } from './normalize-options'; + +export async function addE2e( + tree: Tree, + options: NormalizedSchema +): Promise { + switch (options.e2eTestRunner) { + case 'cypress': { + const hasNxExportPlugin = hasExpoPlugin(tree); + if (!hasNxExportPlugin) { + webStaticServeGenerator(tree, { + buildTarget: `${options.projectName}:export`, + targetName: 'serve-static', + }); + } + + const { configurationGenerator } = ensurePackage< + typeof import('@nx/cypress') + >('@nx/cypress', nxVersion); + + addProjectConfiguration(tree, options.e2eProjectName, { + projectType: 'application', + root: options.e2eProjectRoot, + sourceRoot: joinPathFragments(options.e2eProjectRoot, 'src'), + targets: {}, + implicitDependencies: [options.projectName], + tags: [], + }); + + return await configurationGenerator(tree, { + ...options, + project: options.e2eProjectName, + directory: 'src', + // the name and root are already normalized, instruct the generator to use them as is + bundler: 'none', + skipFormat: true, + devServerTarget: `${options.projectName}:serve`, + port: 4200, + baseUrl: 'http://localhost:4200', + ciWebServerCommand: hasNxExportPlugin + ? `nx run ${options.projectName}:serve-static` + : undefined, + jsx: true, + rootProject: options.rootProject, + }); + } + case 'playwright': { + const { configurationGenerator } = ensurePackage< + typeof import('@nx/playwright') + >('@nx/playwright', nxVersion); + addProjectConfiguration(tree, options.e2eProjectName, { + projectType: 'application', + root: options.e2eProjectRoot, + sourceRoot: joinPathFragments(options.e2eProjectRoot, 'src'), + targets: {}, + implicitDependencies: [options.projectName], + }); + return configurationGenerator(tree, { + project: options.e2eProjectName, + skipFormat: true, + skipPackageJson: options.skipPackageJson, + directory: 'src', + js: false, + linter: options.linter, + setParserOptionsProject: options.setParserOptionsProject, + webServerCommand: `${getPackageManagerCommand().exec} nx serve ${ + options.name + }`, + webServerAddress: 'http://localhost:4200', + rootProject: options.rootProject, + }); + } + case 'detox': + const { detoxApplicationGenerator } = ensurePackage< + typeof import('@nx/detox') + >('@nx/detox', nxVersion); + return detoxApplicationGenerator(tree, { + ...options, + e2eName: options.e2eProjectName, + e2eDirectory: options.e2eProjectRoot, + projectNameAndRootFormat: 'as-provided', + appProject: options.projectName, + appDisplayName: options.displayName, + appName: options.name, + framework: 'expo', + setParserOptionsProject: options.setParserOptionsProject, + skipFormat: true, + }); + case 'none': + default: + return () => {}; + } +} diff --git a/packages/expo/src/generators/application/lib/add-project.ts b/packages/expo/src/generators/application/lib/add-project.ts index 0e44ea33399279..1f5e7254744644 100644 --- a/packages/expo/src/generators/application/lib/add-project.ts +++ b/packages/expo/src/generators/application/lib/add-project.ts @@ -1,6 +1,5 @@ import { addProjectConfiguration, - offsetFromRoot, ProjectConfiguration, readNxJson, TargetConfiguration, @@ -40,22 +39,21 @@ function getTargets(options: NormalizedSchema) { architect.start = { executor: '@nx/expo:start', - dependsOn: ['ensure-symlink', 'sync-deps'], - options: { - port: 8081, - }, + dependsOn: ['sync-deps'], + options: {}, }; architect.serve = { - executor: 'nx:run-commands', + executor: '@nx/expo:serve', + dependsOn: ['sync-deps'], options: { - command: `nx start ${options.projectName}`, + port: 4200, }, }; architect['run-ios'] = { executor: '@nx/expo:run', - dependsOn: ['ensure-symlink', 'sync-deps'], + dependsOn: ['sync-deps'], options: { platform: 'ios', }, @@ -63,7 +61,7 @@ function getTargets(options: NormalizedSchema) { architect['run-android'] = { executor: '@nx/expo:run', - dependsOn: ['ensure-symlink', 'sync-deps'], + dependsOn: ['sync-deps'], options: { platform: 'android', }, @@ -71,6 +69,7 @@ function getTargets(options: NormalizedSchema) { architect['build'] = { executor: '@nx/expo:build', + dependsOn: ['sync-deps'], options: {}, }; @@ -89,14 +88,9 @@ function getTargets(options: NormalizedSchema) { options: {}, }; - architect['ensure-symlink'] = { - executor: '@nx/expo:ensure-symlink', - options: {}, - }; - architect['prebuild'] = { executor: '@nx/expo:prebuild', - dependsOn: ['ensure-symlink', 'sync-deps'], + dependsOn: ['sync-deps'], options: {}, }; @@ -112,19 +106,11 @@ function getTargets(options: NormalizedSchema) { architect['export'] = { executor: '@nx/expo:export', - dependsOn: ['ensure-symlink', 'sync-deps'], + dependsOn: ['sync-deps'], + outputs: ['{options.outputDir}'], options: { platform: 'all', - outputDir: `${offsetFromRoot(options.appProjectRoot)}dist/${ - options.appProjectRoot - }`, - }, - }; - - architect['export-web'] = { - executor: '@nx/expo:export', - options: { - bundler: 'metro', + outputDir: `dist/${options.appProjectRoot}`, }, }; diff --git a/packages/expo/src/generators/application/lib/create-application-files.ts b/packages/expo/src/generators/application/lib/create-application-files.ts index 95b9ce18919c35..4efeee32010532 100644 --- a/packages/expo/src/generators/application/lib/create-application-files.ts +++ b/packages/expo/src/generators/application/lib/create-application-files.ts @@ -7,7 +7,6 @@ import { Tree, } from '@nx/devkit'; import { join } from 'path'; -import { easCliVersion } from '../../../utils/versions'; import { NormalizedSchema } from './normalize-options'; export function createApplicationFiles(host: Tree, options: NormalizedSchema) { @@ -23,7 +22,6 @@ export function createApplicationFiles(host: Tree, options: NormalizedSchema) { offsetFromRoot: offsetFromRoot(options.appProjectRoot), packageManager, packageLockFile, - easCliVersion, }); if (options.unitTestRunner === 'none') { host.delete(join(options.appProjectRoot, `App.spec.tsx`)); diff --git a/packages/expo/src/generators/application/lib/normalize-options.spec.ts b/packages/expo/src/generators/application/lib/normalize-options.spec.ts index 77ed878a33db5d..8a70c86860ba41 100644 --- a/packages/expo/src/generators/application/lib/normalize-options.spec.ts +++ b/packages/expo/src/generators/application/lib/normalize-options.spec.ts @@ -2,7 +2,7 @@ import { Tree } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { Linter } from '@nx/eslint'; import { Schema } from '../schema'; -import { normalizeOptions } from './normalize-options'; +import { NormalizedSchema, normalizeOptions } from './normalize-options'; describe('Normalize Options', () => { let appTree: Tree; @@ -36,7 +36,10 @@ describe('Normalize Options', () => { unitTestRunner: 'jest', skipFormat: false, js: true, - }); + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'my-app-e2e', + } as NormalizedSchema); }); it('should normalize options with name in camel case', async () => { @@ -64,7 +67,10 @@ describe('Normalize Options', () => { skipFormat: false, js: true, unitTestRunner: 'jest', - }); + rootProject: false, + e2eProjectName: 'myApp-e2e', + e2eProjectRoot: 'myApp-e2e', + } as NormalizedSchema); }); it('should normalize options with directory', async () => { @@ -94,7 +100,10 @@ describe('Normalize Options', () => { linter: Linter.EsLint, skipFormat: false, js: true, - }); + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'directory-e2e', + } as NormalizedSchema); }); it('should normalize options that has directory in its name', async () => { @@ -122,7 +131,10 @@ describe('Normalize Options', () => { linter: Linter.EsLint, skipFormat: false, js: true, - }); + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'directory/my-app-e2e', + } as NormalizedSchema); }); it('should normalize options with display name', async () => { @@ -151,6 +163,9 @@ describe('Normalize Options', () => { linter: Linter.EsLint, skipFormat: false, js: true, - }); + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'my-app-e2e', + } as NormalizedSchema); }); }); diff --git a/packages/expo/src/generators/application/lib/normalize-options.ts b/packages/expo/src/generators/application/lib/normalize-options.ts index 6802d217fdcfe8..f63232b36c4613 100644 --- a/packages/expo/src/generators/application/lib/normalize-options.ts +++ b/packages/expo/src/generators/application/lib/normalize-options.ts @@ -8,6 +8,9 @@ export interface NormalizedSchema extends Schema { appProjectRoot: string; lowerCaseName: string; parsedTags: string[]; + rootProject: boolean; + e2eProjectName: string; + e2eProjectRoot: string; } export async function normalizeOptions( @@ -32,11 +35,14 @@ export async function normalizeOptions( const parsedTags = options.tags ? options.tags.split(',').map((s) => s.trim()) : []; + const rootProject = appProjectRoot === '.'; + const e2eProjectName = rootProject ? 'e2e' : `${appProjectName}-e2e`; + const e2eProjectRoot = rootProject ? 'e2e' : `${appProjectRoot}-e2e`; return { ...options, unitTestRunner: options.unitTestRunner || 'jest', - e2eTestRunner: options.e2eTestRunner || 'detox', + e2eTestRunner: options.e2eTestRunner, name: projectNames.projectSimpleName, className, lowerCaseName: className.toLowerCase(), @@ -44,5 +50,8 @@ export async function normalizeOptions( projectName: appProjectName, appProjectRoot, parsedTags, + rootProject, + e2eProjectName, + e2eProjectRoot, }; } diff --git a/packages/expo/src/generators/application/schema.d.ts b/packages/expo/src/generators/application/schema.d.ts index 549d7683ee4548..ee83c063c57838 100644 --- a/packages/expo/src/generators/application/schema.d.ts +++ b/packages/expo/src/generators/application/schema.d.ts @@ -15,7 +15,7 @@ export interface Schema { js: boolean; // default is false linter: Linter; // default is eslint setParserOptionsProject?: boolean; // default is false - e2eTestRunner: 'detox' | 'none'; // default is detox + e2eTestRunner: 'cypress' | 'playwright' | 'detox' | 'none'; // default is cypress standaloneConfig?: boolean; skipPackageJson?: boolean; // default is false } diff --git a/packages/expo/src/generators/application/schema.json b/packages/expo/src/generators/application/schema.json index 904106a0d75e4d..4aa0731e95ba20 100644 --- a/packages/expo/src/generators/application/schema.json +++ b/packages/expo/src/generators/application/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxExpoApplication", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Create an Expo Application for Nx.", "examples": [ { @@ -48,7 +48,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { @@ -75,8 +75,8 @@ "e2eTestRunner": { "description": "Adds the specified e2e test runner", "type": "string", - "enum": ["detox", "none"], - "default": "detox" + "enum": ["cypress", "playwright", "detox", "none"], + "default": "cypress" }, "standaloneConfig": { "description": "Split the project configuration into `/project.json` rather than including it inside `workspace.json`.", diff --git a/packages/expo/src/generators/component/schema.d.ts b/packages/expo/src/generators/component/schema.d.ts index 9b7bd3cb0d74b5..e3a3408119b2e0 100644 --- a/packages/expo/src/generators/component/schema.d.ts +++ b/packages/expo/src/generators/component/schema.d.ts @@ -4,21 +4,21 @@ export interface Schema { name: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project: string; directory?: string; skipFormat: boolean; // default is false skipTests: boolean; // default is false /** - * @deprecated Provide the name in pascal-case and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the name in pascal-case and use the `as-provided` format. This option will be removed in Nx v19. */ export: boolean; // default is false pascalCaseFiles: boolean; // default is false classComponent: boolean; // default is false js: boolean; // default is false /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ flat: boolean; // default is false nameAndDirectoryFormat?: 'as-provided' | 'derived'; diff --git a/packages/expo/src/generators/component/schema.json b/packages/expo/src/generators/component/schema.json index d1a220c028cacd..59f223e29e3bba 100644 --- a/packages/expo/src/generators/component/schema.json +++ b/packages/expo/src/generators/component/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxExpoComponent", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Create a Expo Component for Nx.", "type": "object", "examples": [ @@ -22,7 +22,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -63,7 +63,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "export": { "type": "boolean", @@ -77,7 +77,7 @@ "description": "Use pascal case component file name (e.g. App.tsx).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "classComponent": { "type": "boolean", diff --git a/packages/expo/src/generators/init/init.ts b/packages/expo/src/generators/init/init.ts index 3f0425a14c375f..0ca7e1d2daab1a 100644 --- a/packages/expo/src/generators/init/init.ts +++ b/packages/expo/src/generators/init/init.ts @@ -11,7 +11,6 @@ import { import { updatePackageScripts } from '@nx/devkit/src/utils/update-package-scripts'; import { createNodes, ExpoPluginOptions } from '../../../plugins/plugin'; import { - easCliVersion, expoCliVersion, expoVersion, nxVersion, @@ -20,6 +19,7 @@ import { reactVersion, } from '../../utils/versions'; import { hasExpoPlugin } from '../../utils/has-expo-plugin'; + import { addGitIgnoreEntry } from './lib/add-git-ignore-entry'; import { Schema } from './schema'; @@ -59,7 +59,6 @@ export function updateDependencies(host: Tree, schema: Schema) { { '@nx/expo': nxVersion, '@expo/cli': expoCliVersion, - 'eas-cli': easCliVersion, }, undefined, schema.keepExistingVersions diff --git a/packages/expo/src/generators/init/schema.json b/packages/expo/src/generators/init/schema.json index 98ad5bd39834e1..33af02d329c3d5 100644 --- a/packages/expo/src/generators/init/schema.json +++ b/packages/expo/src/generators/init/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxExpoInit", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Add Nx Expo Schematics.", "type": "object", "properties": { diff --git a/packages/expo/src/generators/library/files/lib/.babelrc.js.template b/packages/expo/src/generators/library/files/lib/.babelrc.js.template new file mode 100644 index 00000000000000..f64e4f92420628 --- /dev/null +++ b/packages/expo/src/generators/library/files/lib/.babelrc.js.template @@ -0,0 +1,21 @@ +module.exports = function (api) { + api.cache(true); + + return { + presets: [ + [ + '@nx/react/babel', + { + runtime: 'automatic', + useBuiltIns: 'usage', + }, + ], + ], + plugins: [], + env: { + test: { + presets: ['babel-preset-expo'], + }, + }, + }; +}; diff --git a/packages/expo/src/generators/library/files/lib/babel.config.json b/packages/expo/src/generators/library/files/lib/babel.config.json deleted file mode 100644 index b9ba048f2c060c..00000000000000 --- a/packages/expo/src/generators/library/files/lib/babel.config.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "presets": [ - [ - "@nx/react/babel", - { - "runtime": "automatic", - "useBuiltIns": "usage" - } - ] - ], - "plugins": [], - "env": { - "test": { - "presets": ["babel-preset-expo"] - } - } -} diff --git a/packages/expo/src/generators/library/library.ts b/packages/expo/src/generators/library/library.ts index 17b4208ca65156..f440635c625ef3 100644 --- a/packages/expo/src/generators/library/library.ts +++ b/packages/expo/src/generators/library/library.ts @@ -33,6 +33,7 @@ import { Schema } from './schema'; import { ensureDependencies } from '../../utils/ensure-dependencies'; import { initRootBabelConfig } from '../../utils/init-root-babel-config'; import { addBuildTargetDefaults } from '@nx/devkit/src/generators/add-build-target-defaults'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function expoLibraryGenerator( host: Tree, @@ -113,6 +114,10 @@ export async function expoLibraryGeneratorInternal( await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.name); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/expo/src/generators/library/schema.json b/packages/expo/src/generators/library/schema.json index 1115a76e430365..8bb20daccc6112 100644 --- a/packages/expo/src/generators/library/schema.json +++ b/packages/expo/src/generators/library/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxExpoLibrary", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "description": "Create a Expo Library for Nx.", "type": "object", "examples": [ @@ -34,7 +34,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { diff --git a/packages/expo/src/migrations/update-16-1-4/add-detox-app-json.spec.ts b/packages/expo/src/migrations/update-16-1-4/add-detox-app-json.spec.ts deleted file mode 100644 index 235c75a74d7e0d..00000000000000 --- a/packages/expo/src/migrations/update-16-1-4/add-detox-app-json.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { addProjectConfiguration, getProjects, Tree } from '@nx/devkit'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import update from './add-detox-app-json'; - -describe('add-eas-update-target', () => { - let tree: Tree; - - beforeEach(async () => { - tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); - addProjectConfiguration(tree, 'product', { - root: 'apps/product', - sourceRoot: 'apps/product/src', - targets: { - start: { - executor: '@nrwl/expo:start', - }, - }, - }); - tree.write('apps/product/app.json', '{"expo": {}}'); - }); - - it(`should update app.json with plugin detox`, async () => { - await update(tree); - - const appJson = JSON.parse(tree.read('apps/product/app.json').toString()); - expect(appJson).toEqual({ - expo: { - plugins: [ - [ - '@config-plugins/detox', - { - skipProguard: false, - subdomains: ['10.0.2.2', 'localhost'], - }, - ], - ], - }, - }); - }); -}); diff --git a/packages/expo/src/migrations/update-16-1-4/add-detox-app-json.ts b/packages/expo/src/migrations/update-16-1-4/add-detox-app-json.ts deleted file mode 100644 index 15ba9df00905ae..00000000000000 --- a/packages/expo/src/migrations/update-16-1-4/add-detox-app-json.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Tree, formatFiles, getProjects, updateJson } from '@nx/devkit'; - -/** - * Add detox plugin to app.json for expo - */ -export default async function update(tree: Tree) { - const projects = getProjects(tree); - - projects.forEach((config) => { - if ( - config.targets?.['start']?.executor === '@nrwl/expo:start' || - config.targets?.['start']?.executor === '@nx/expo:start' - ) { - updateJson(tree, `${config.root}/app.json`, (json) => { - if (!json.expo.plugins) { - json.expo.plugins = []; - } - json.expo.plugins.push([ - '@config-plugins/detox', - { - skipProguard: false, - subdomains: ['10.0.2.2', 'localhost'], - }, - ]); - return json; - }); - } - }); - - await formatFiles(tree); -} diff --git a/packages/expo/src/migrations/update-16-6-0/update-metro-config.ts b/packages/expo/src/migrations/update-16-6-0/update-metro-config.ts index d1f405d7ae4aa8..8a165cc66c1c10 100644 --- a/packages/expo/src/migrations/update-16-6-0/update-metro-config.ts +++ b/packages/expo/src/migrations/update-16-6-0/update-metro-config.ts @@ -36,7 +36,6 @@ const content = ` const { withNxMetro } = require('@nx/expo'); const { getDefaultConfig } = require('@expo/metro-config'); const { mergeConfig } = require('metro-config'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); const defaultConfig = getDefaultConfig(__dirname); const { assetExts, sourceExts } = defaultConfig.resolver; @@ -54,9 +53,6 @@ const customConfig = { resolver: { assetExts: assetExts.filter((ext) => ext !== 'svg'), sourceExts: [...sourceExts, 'cjs', 'mjs', 'svg'], - blockList: exclusionList([/^(?!.*node_modules).*\\/dist\\/.*/]), - unstable_enableSymlinks: true, - unstable_enablePackageExports: true, }, }; diff --git a/packages/expo/src/migrations/update-16-9-0/remove-types-react-native.ts b/packages/expo/src/migrations/update-16-9-0/remove-types-react-native.ts index e3a2030698c29a..a2a9daabb16909 100644 --- a/packages/expo/src/migrations/update-16-9-0/remove-types-react-native.ts +++ b/packages/expo/src/migrations/update-16-9-0/remove-types-react-native.ts @@ -1,4 +1,8 @@ -import { readJson, Tree, updateJson } from '@nx/devkit'; +import { + formatFiles, + removeDependenciesFromPackageJson, + Tree, +} from '@nx/devkit'; /** * Remove @types/react-native package since it is no longer required. It would be a part of react native package. @@ -6,17 +10,6 @@ import { readJson, Tree, updateJson } from '@nx/devkit'; * @returns */ export default async function update(tree: Tree) { - const packageJson = readJson(tree, 'package.json'); - - if ( - !packageJson.devDependencies['@types/react-native'] || - !packageJson.dependencies['react-native'] - ) { - return; - } - - updateJson(tree, 'package.json', (packageJson) => { - delete packageJson.devDependencies['@types/react-native']; - return packageJson; - }); + removeDependenciesFromPackageJson(tree, [], ['@types/react-native']); + await formatFiles(tree); } diff --git a/packages/expo/src/migrations/update-16-9-0/update-eas-cli-version.ts b/packages/expo/src/migrations/update-16-9-0/update-eas-cli-version.ts index 48d17a0248813e..49de4ae51b3b95 100644 --- a/packages/expo/src/migrations/update-16-9-0/update-eas-cli-version.ts +++ b/packages/expo/src/migrations/update-16-9-0/update-eas-cli-version.ts @@ -1,11 +1,4 @@ -import { - Tree, - formatFiles, - getProjects, - updateProjectConfiguration, - updateJson, -} from '@nx/devkit'; -import { easCliVersion } from '../../utils/versions'; +import { Tree, getProjects, updateJson } from '@nx/devkit'; export default async function update(tree: Tree) { const projects = getProjects(tree); @@ -14,7 +7,7 @@ export default async function update(tree: Tree) { if (config.targets?.['start']?.executor === '@nx/expo:start') { updateJson(tree, `${config.root}/eas.json`, (easJson) => { if (easJson?.cli?.version) { - easJson.cli.version = `>= ${easCliVersion.replace('~', '')}`; + easJson.cli.version = `>= 5`; } return easJson; }); diff --git a/packages/expo/src/migrations/update-18-0-0/change-outputDir-export-target.spec.ts b/packages/expo/src/migrations/update-18-0-0/change-outputDir-export-target.spec.ts new file mode 100644 index 00000000000000..04d176320be23b --- /dev/null +++ b/packages/expo/src/migrations/update-18-0-0/change-outputDir-export-target.spec.ts @@ -0,0 +1,41 @@ +import { addProjectConfiguration, getProjects, Tree } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import update from './change-outputDir-export-target'; + +describe('change-outputDir-export-target', () => { + let tree: Tree; + + beforeEach(async () => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + addProjectConfiguration(tree, 'product', { + root: 'apps/product', + sourceRoot: 'apps/product/src', + targets: { + export: { + executor: '@nx/expo:export', + options: { + platform: 'all', + outputDir: '../../dist/apps/dogs', + }, + dependsOn: ['sync-deps'], + }, + }, + }); + }); + + it(`should remove offset from outputDir`, async () => { + await update(tree); + + getProjects(tree).forEach((project) => { + expect(project.targets['export']).toEqual({ + dependsOn: ['sync-deps'], + executor: '@nx/expo:export', + options: { + outputDir: 'dist/apps/dogs', + platform: 'all', + }, + outputs: ['{options.outputDir}'], + }); + }); + }); +}); diff --git a/packages/expo/src/migrations/update-18-0-0/change-outputDir-export-target.ts b/packages/expo/src/migrations/update-18-0-0/change-outputDir-export-target.ts new file mode 100644 index 00000000000000..90115cc57b43b0 --- /dev/null +++ b/packages/expo/src/migrations/update-18-0-0/change-outputDir-export-target.ts @@ -0,0 +1,29 @@ +import { + Tree, + getProjects, + offsetFromRoot, + updateProjectConfiguration, +} from '@nx/devkit'; + +/** + * Remove the offset from the outputDir of the export target + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + for (const [projectName, config] of projects.entries()) { + if (config.targets?.['export']?.executor === '@nx/expo:export') { + const target = config.targets['export']; + if (target.options?.outputDir) { + const offset = offsetFromRoot(config.root); + target.options.outputDir = target.options.outputDir.replace(offset, ''); + target.outputs = ['{options.outputDir}']; + updateProjectConfiguration(tree, projectName, config); + } + } + if (config.targets?.['export-web']?.executor === '@nx/expo:export') { + delete config.targets['export-web']; + updateProjectConfiguration(tree, projectName, config); + } + } +} diff --git a/packages/expo/src/migrations/update-18-0-0/remove-block-list.spec.ts b/packages/expo/src/migrations/update-18-0-0/remove-block-list.spec.ts new file mode 100644 index 00000000000000..41ba3cad03718e --- /dev/null +++ b/packages/expo/src/migrations/update-18-0-0/remove-block-list.spec.ts @@ -0,0 +1,68 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, addProjectConfiguration } from '@nx/devkit'; +import update from './remove-block-list'; + +describe('remove-block-list', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + addProjectConfiguration(tree, 'product', { + root: 'apps/product', + targets: { + start: { + executor: '@nx/expo:start', + }, + }, + }); + tree.write( + 'apps/product/metro.config.js', + ` +const { withNxMetro } = require('@nx/expo'); +const { getDefaultConfig } = require('@expo/metro-config'); +const { mergeConfig } = require('metro-config'); +const exclusionList = require('metro-config/src/defaults/exclusionList'); + +const defaultConfig = getDefaultConfig(__dirname); +const { assetExts, sourceExts } = defaultConfig.resolver; + +/** + * Metro configuration + * https://facebook.github.io/metro/docs/configuration + * + * @type {import('metro-config').MetroConfig} + */ +const customConfig = { + transformer: { + babelTransformerPath: require.resolve('react-native-svg-transformer'), + }, + resolver: { + assetExts: assetExts.filter((ext) => ext !== 'svg'), + sourceExts: [...sourceExts, 'svg'], + blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), + unstable_enableSymlinks: true, + unstable_enablePackageExports: true, + }, +}; + + +module.exports = withNxMetro(mergeConfig(defaultConfig, customConfig), { + // Change this to true to see debugging info. + // Useful if you have issues resolving modules + debug: false, + // all the file extensions used for imports other than 'ts', 'tsx', 'js', 'jsx', 'json' + extensions: [], + // Specify folders to watch, in addition to Nx defaults (workspace libraries and node_modules) + watchFolders: [], +});` + ); + }); + + it('should remove blockList', async () => { + await update(tree); + const metroConfig = tree.read(`apps/product/metro.config.js`).toString(); + expect(metroConfig).not.toContain('blockList'); + expect(metroConfig).not.toContain('unstable_enableSymlinks'); + expect(metroConfig).not.toContain('unstable_enablePackageExports'); + }); +}); diff --git a/packages/expo/src/migrations/update-18-0-0/remove-block-list.ts b/packages/expo/src/migrations/update-18-0-0/remove-block-list.ts new file mode 100644 index 00000000000000..27c2e516fc1284 --- /dev/null +++ b/packages/expo/src/migrations/update-18-0-0/remove-block-list.ts @@ -0,0 +1,32 @@ +import { Tree, formatFiles, getProjects, joinPathFragments } from '@nx/devkit'; + +/** + * This migration remove blockList in metro.config.js. + * It is now excluding dist folder in watchFolders in withNxMetro. + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + for (const [_, config] of projects.entries()) { + if (config.targets?.['start']?.executor === '@nx/expo:start') { + if (tree.exists(joinPathFragments(config.root, 'metro.config.js'))) { + let content = tree + .read(joinPathFragments(config.root, 'metro.config.js')) + .toString(); + content = content.replace( + `blockList: exclusionList([/^(?!.*node_modules).*/dist/.*/]),`, + '' + ); + content = content.replace('unstable_enableSymlinks: true,', ''); + content = content.replace('unstable_enablePackageExports: true,', ''); + content = content.replace( + `const exclusionList = require('metro-config/src/defaults/exclusionList');`, + '' + ); + + tree.write(joinPathFragments(config.root, 'metro.config.js'), content); + await formatFiles(tree); + } + } + } +} diff --git a/packages/expo/src/migrations/update-18-0-0/remove-eas-cli.ts b/packages/expo/src/migrations/update-18-0-0/remove-eas-cli.ts new file mode 100644 index 00000000000000..2580ef8f0f198f --- /dev/null +++ b/packages/expo/src/migrations/update-18-0-0/remove-eas-cli.ts @@ -0,0 +1,24 @@ +import { + formatFiles, + removeDependenciesFromPackageJson, + Tree, +} from '@nx/devkit'; + +/** + * Remove eas-cli from dev dependencies. + * Use globally eas-cli. + * + * Remove metro and metro-resolver from dev dependencies. + * react-native has dependency of @react-native/community-cli-plugin + * @react-native/community-cli-plugin has dependency of metro + * @param tree + * @returns + */ +export default async function update(tree: Tree) { + removeDependenciesFromPackageJson( + tree, + [], + ['eas-cli', 'metro', 'metro-resolver'] + ); + await formatFiles(tree); +} diff --git a/packages/expo/src/migrations/update-18-0-0/remove-symlink-target.spec.ts b/packages/expo/src/migrations/update-18-0-0/remove-symlink-target.spec.ts new file mode 100644 index 00000000000000..99e55882d90ce4 --- /dev/null +++ b/packages/expo/src/migrations/update-18-0-0/remove-symlink-target.spec.ts @@ -0,0 +1,38 @@ +import { addProjectConfiguration, getProjects, Tree } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import update from './remove-symlink-target'; + +describe('remove-symlink-target', () => { + let tree: Tree; + + beforeEach(async () => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + addProjectConfiguration(tree, 'product', { + root: 'apps/product', + sourceRoot: 'apps/product/src', + targets: { + 'ensure-symlink': { + executor: '@nx/expo:ensure-symlink', + options: {}, + }, + export: { + executor: '@nx/expo:export', + options: { + platform: 'all', + outputDir: '../../dist/apps/dogs', + }, + dependsOn: ['ensure-symlink', 'sync-deps'], + }, + }, + }); + }); + + it(`should remove ensure-symlink target from project.json`, async () => { + await update(tree); + + getProjects(tree).forEach((project) => { + expect(project.targets['ensure-symlink']).toBeUndefined(); + expect(project.targets['export'].dependsOn).toEqual(['sync-deps']); + }); + }); +}); diff --git a/packages/expo/src/migrations/update-18-0-0/remove-symlink-target.ts b/packages/expo/src/migrations/update-18-0-0/remove-symlink-target.ts new file mode 100644 index 00000000000000..e5e6db10348f78 --- /dev/null +++ b/packages/expo/src/migrations/update-18-0-0/remove-symlink-target.ts @@ -0,0 +1,43 @@ +import { + TargetConfiguration, + Tree, + getProjects, + updateProjectConfiguration, +} from '@nx/devkit'; +import { removeSync } from 'fs-extra'; + +/** + * Remove ensure-symlink target. + * It is going to be supported by react-native version 0.73 by default. + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + for (const [projectName, config] of projects.entries()) { + if ( + config.targets?.['ensure-symlink']?.executor === '@nx/expo:ensure-symlink' + ) { + removeTargets(config.targets, 'ensure-symlink'); + updateProjectConfiguration(tree, projectName, config); + removeSync(`${config.root}/node_modules`); + } + } +} + +function removeTargets( + targets: { + [targetName: string]: TargetConfiguration; + }, + targetNameToRemove: string +) { + for (const targetName in targets) { + if (targetName === targetNameToRemove) { + delete targets[targetName]; + } + if (targets[targetName]?.dependsOn?.length) { + targets[targetName].dependsOn = targets[targetName].dependsOn.filter( + (dependsOn) => dependsOn !== targetNameToRemove + ); + } + } +} diff --git a/packages/expo/src/utils/add-jest.ts b/packages/expo/src/utils/add-jest.ts index 418e3ea2c3c622..ba0bfe4bde9668 100644 --- a/packages/expo/src/utils/add-jest.ts +++ b/packages/expo/src/utils/add-jest.ts @@ -25,19 +25,28 @@ export async function addJest( }); // overwrite the jest.config.ts file because react native needs to have special transform property + // use preset from https://github.com/expo/expo/blob/main/packages/jest-expo/jest-preset.js const configPath = `${appProjectRoot}/jest.config.${js ? 'js' : 'ts'}`; const content = `module.exports = { displayName: '${projectName}', resolver: '@nx/jest/plugins/resolver', preset: 'jest-expo', - transformIgnorePatterns: [ - 'node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg)', - ], moduleFileExtensions: ['ts', 'js', 'html', 'tsx', 'jsx'], setupFilesAfterEnv: ['/test-setup.${js ? 'js' : 'ts'}'], moduleNameMapper: { '\\\\.svg$': '@nx/expo/plugins/jest/svg-mock' - } + }, + transform: { + '\\.[jt]sx?$': [ + 'babel-jest', + { + configFile: __dirname + '/.babelrc.js', + }, + ], + '^.+\\.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp|ttf|otf|m4v|mov|mp4|mpeg|mpg|webm|aac|aiff|caf|m4a|mp3|wav|html|pdf|obj)$': require.resolve( + 'jest-expo/src/preset/assetFileTransformer.js' + ), + }, };`; host.write(configPath, content); diff --git a/packages/expo/src/utils/ensure-dependencies.ts b/packages/expo/src/utils/ensure-dependencies.ts index 4e63cd5e4787d7..7f3ffe7c6883e6 100644 --- a/packages/expo/src/utils/ensure-dependencies.ts +++ b/packages/expo/src/utils/ensure-dependencies.ts @@ -6,10 +6,10 @@ import { import { babelPresetExpoVersion, expoMetroConfigVersion, + expoMetroRuntimeVersion, expoSplashScreenVersion, expoStatusBarVersion, jestExpoVersion, - metroVersion, reactNativeSvgTransformerVersion, reactNativeSvgVersion, reactNativeWebVersion, @@ -27,13 +27,12 @@ export function ensureDependencies(host: Tree): GeneratorCallback { 'expo-status-bar': expoStatusBarVersion, 'react-native-web': reactNativeWebVersion, '@expo/metro-config': expoMetroConfigVersion, + '@expo/metro-runtime': expoMetroRuntimeVersion, 'react-native-svg-transformer': reactNativeSvgTransformerVersion, 'react-native-svg': reactNativeSvgVersion, }, { '@types/react': typesReactVersion, - metro: metroVersion, - 'metro-resolver': metroVersion, 'react-test-renderer': reactTestRendererVersion, '@testing-library/react-native': testingLibraryReactNativeVersion, '@testing-library/jest-native': testingLibraryJestNativeVersion, diff --git a/packages/expo/src/utils/find-all-npm-dependencies.spec.ts b/packages/expo/src/utils/find-all-npm-dependencies.spec.ts deleted file mode 100644 index 3a8738180b36af..00000000000000 --- a/packages/expo/src/utils/find-all-npm-dependencies.spec.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { findAllNpmDependencies } from './find-all-npm-dependencies'; -import { DependencyType, ProjectGraph } from '@nx/devkit'; - -test('findAllNpmDependencies', () => { - const graph: ProjectGraph = { - nodes: { - myapp: { - type: 'app', - name: 'myapp', - data: { files: [] }, - }, - lib1: { - type: 'lib', - name: 'lib1', - data: { files: [] }, - }, - lib2: { - type: 'lib', - name: 'lib2', - data: { files: [] }, - }, - lib3: { - type: 'lib', - name: 'lib3', - data: { files: [] }, - }, - } as any, - externalNodes: { - 'npm:react-native-image-picker': { - type: 'npm', - name: 'npm:react-native-image-picker', - data: { - version: '1', - packageName: 'react-native-image-picker', - }, - }, - 'npm:react-native-dialog': { - type: 'npm', - name: 'npm:react-native-dialog', - data: { - version: '1', - packageName: 'react-native-dialog', - }, - }, - 'npm:react-native-snackbar': { - type: 'npm', - name: 'npm:react-native-snackbar', - data: { - version: '1', - packageName: 'react-native-snackbar', - }, - }, - 'npm:@nx/react-native': { - type: 'npm', - name: 'npm:@nx/react-native', - data: { - version: '1', - packageName: '@nx/react-native', - }, - }, - }, - dependencies: { - myapp: [ - { type: DependencyType.static, source: 'myapp', target: 'lib1' }, - { type: DependencyType.static, source: 'myapp', target: 'lib2' }, - { - type: DependencyType.static, - source: 'myapp', - target: 'npm:react-native-image-picker', - }, - { - type: DependencyType.static, - source: 'myapp', - target: 'npm:@nx/react-native', - }, - ], - lib1: [ - { type: DependencyType.static, source: 'lib1', target: 'lib2' }, - { - type: DependencyType.static, - source: 'lib3', - target: 'npm:react-native-snackbar', - }, - ], - lib2: [{ type: DependencyType.static, source: 'lib2', target: 'lib3' }], - lib3: [ - { - type: DependencyType.static, - source: 'lib3', - target: 'npm:react-native-dialog', - }, - ], - }, - }; - - const result = findAllNpmDependencies(graph, 'myapp'); - - expect(result).toEqual([ - 'react-native-dialog', - 'react-native-snackbar', - 'react-native-image-picker', - ]); -}); diff --git a/packages/expo/src/utils/find-all-npm-dependencies.ts b/packages/expo/src/utils/find-all-npm-dependencies.ts deleted file mode 100644 index df7a5e3bedfca6..00000000000000 --- a/packages/expo/src/utils/find-all-npm-dependencies.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ProjectGraph } from '@nx/devkit'; - -export function findAllNpmDependencies( - graph: ProjectGraph, - projectName: string, - list: string[] = [], - seen = new Set() -) { - // In case of bad circular dependencies - if (seen.has(projectName)) { - return list; - } - seen.add(projectName); - - const node = graph.externalNodes[projectName]; - - // Don't want to include '@nx/react-native' because React Native - // autolink will warn that the package has no podspec file for iOS. - if (node) { - if ( - node.name !== `npm:@nx/react-native` && - node.name !== `npm:@nrwl/react-native` - ) { - list.push(node.data.packageName); - } - } else { - // it's workspace project, search for it's dependencies - graph.dependencies[projectName]?.forEach((dep) => - findAllNpmDependencies(graph, dep.target, list, seen) - ); - } - return list; -} diff --git a/packages/expo/src/utils/resolve-eas.ts b/packages/expo/src/utils/resolve-eas.ts new file mode 100644 index 00000000000000..7058d875ffac62 --- /dev/null +++ b/packages/expo/src/utils/resolve-eas.ts @@ -0,0 +1,37 @@ +import { execSync } from 'child_process'; + +export function resolveEas(workspaceRoot: string): string { + try { + execSync('eas --version'); + } catch { + throw new Error( + 'EAS is not installed. Please run `npm install --global eas-cli` or `yarn global add eas-cli`.' + ); + } + + let npmGlobalPath: string, yarnGlobalPath: string; + try { + npmGlobalPath = execSync('npm root -g') + ?.toString() + ?.trim() + ?.replace('\u001b[2K\u001b[1G', ''); // strip out ansi codes + } catch {} + try { + yarnGlobalPath = execSync('yarn global dir') + ?.toString() + ?.trim() + ?.replace('\u001b[2K\u001b[1G', ''); // strip out ansi codes + } catch {} + + try { + return require.resolve('eas-cli/bin/run', { + paths: [npmGlobalPath, yarnGlobalPath, workspaceRoot].filter( + Boolean + ) as string[], + }); + } catch { + throw new Error( + 'Can not resolve EAS. Please run `npm install --global eas-cli` or `yarn global add eas-cli`.' + ); + } +} diff --git a/packages/expo/src/utils/symlink-task.ts b/packages/expo/src/utils/symlink-task.ts deleted file mode 100644 index 08bc05949c7a19..00000000000000 --- a/packages/expo/src/utils/symlink-task.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ensureNodeModulesSymlink } from './ensure-node-modules-symlink'; -import * as chalk from 'chalk'; -import { GeneratorCallback, logger } from '@nx/devkit'; - -export function runSymlink( - workspaceRoot: string, - projectRoot: string -): GeneratorCallback { - return () => { - logger.info(`creating symlinks for ${chalk.bold(projectRoot)}`); - try { - ensureNodeModulesSymlink(workspaceRoot, projectRoot); - } catch { - throw new Error( - `Failed to create symlinks for ${chalk.bold(projectRoot)}` - ); - } - }; -} diff --git a/packages/expo/src/utils/versions.ts b/packages/expo/src/utils/versions.ts index 22fbef1b4a604a..2b9adddfb3e210 100644 --- a/packages/expo/src/utils/versions.ts +++ b/packages/expo/src/utils/versions.ts @@ -1,26 +1,25 @@ export const nxVersion = require('../../package.json').version; -export const expoVersion = '49.0.16'; -export const expoMetroConfigVersion = '~0.10.7'; -export const expoSplashScreenVersion = '~0.20.5'; -export const expoStatusBarVersion = '~1.6.0'; -export const expoCliVersion = '~0.10.13'; // @expo/cli -export const easCliVersion = '~5.2.0'; -export const babelPresetExpoVersion = '~9.5.2'; +export const expoVersion = '~50.0.3'; +export const expoSplashScreenVersion = '~0.26.1'; +export const expoStatusBarVersion = '~1.11.1'; +export const expoCliVersion = '~0.16.5'; // @expo/cli +export const babelPresetExpoVersion = '~10.0.0'; export const reactVersion = '18.2.0'; export const reactDomVersion = '18.2.0'; export const reactTestRendererVersion = '18.2.0'; -export const typesReactVersion = '18.0.28'; +export const typesReactVersion = '~18.2.45'; -export const reactNativeVersion = '0.72.6'; +export const reactNativeVersion = '0.73.2'; export const reactNativeWebVersion = '~0.19.9'; -export const reactNativeSvgTransformerVersion = '1.0.0'; -export const reactNativeSvgVersion = '13.9.0'; +export const expoMetroConfigVersion = '~0.17.3'; +export const expoMetroRuntimeVersion = '~3.1.1'; -export const metroVersion = '0.76.8'; +export const reactNativeSvgTransformerVersion = '1.2.0'; +export const reactNativeSvgVersion = '14.1.0'; -export const testingLibraryReactNativeVersion = '~12.3.0'; +export const testingLibraryReactNativeVersion = '~12.4.2'; export const testingLibraryJestNativeVersion = '~5.4.3'; -export const jestExpoVersion = '~49.0.0'; +export const jestExpoVersion = '~50.0.1'; diff --git a/packages/express/src/generators/application/schema.json b/packages/express/src/generators/application/schema.json index f3b31758449166..6a0185ed2467a1 100644 --- a/packages/express/src/generators/application/schema.json +++ b/packages/express/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "SchematicsNxExpressApp", "title": "Nx Application Options Schema", diff --git a/packages/express/src/generators/init/schema.json b/packages/express/src/generators/init/schema.json index a9778c399a718a..bf2f966b622c8f 100644 --- a/packages/express/src/generators/init/schema.json +++ b/packages/express/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxExpressInit", "title": "Init Express Plugin", diff --git a/packages/jest/src/generators/configuration/schema.json b/packages/jest/src/generators/configuration/schema.json index a39db66f6bfd5e..16f9ed60f54fba 100644 --- a/packages/jest/src/generators/configuration/schema.json +++ b/packages/jest/src/generators/configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxJestProject", "cli": "nx", "title": "Add Jest Configuration to a project", diff --git a/packages/jest/src/generators/init/schema.json b/packages/jest/src/generators/init/schema.json index 483006134da7b5..416c9b73d4b152 100644 --- a/packages/jest/src/generators/init/schema.json +++ b/packages/jest/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxJestInit", "cli": "nx", "title": "Jest init", diff --git a/packages/js/babel.ts b/packages/js/babel.ts index 246f6e63596880..4841bd04e5273e 100644 --- a/packages/js/babel.ts +++ b/packages/js/babel.ts @@ -36,11 +36,11 @@ module.exports = function (api: any, options: NxWebBabelPresetOptions = {}) { // Determine settings for `@babel//babel-plugin-transform-class-properties`, // so that we can sync the `loose` option with `@babel/preset-env`. - // TODO(v18): Remove classProperties since it's no longer needed, now that the class props transform is in preset-env. + // TODO(v19): Remove classProperties since it's no longer needed, now that the class props transform is in preset-env. const loose = options.classProperties?.loose ?? options.loose ?? true; if (options.classProperties) { logger.warn( - `Use =\`loose\` option instead of \`classProperties.loose\`. The \`classProperties\` option will be removed in Nx 18` + `Use =\`loose\` option instead of \`classProperties.loose\`. The \`classProperties\` option will be removed in Nx 19` ); } diff --git a/packages/js/executors.json b/packages/js/executors.json index 884efedeac4595..248c555e9b659b 100644 --- a/packages/js/executors.json +++ b/packages/js/executors.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "executors": { "tsc": { "implementation": "./src/executors/tsc/tsc.impl", diff --git a/packages/js/package.json b/packages/js/package.json index 254187166a7925..376e217d021780 100644 --- a/packages/js/package.json +++ b/packages/js/package.json @@ -30,11 +30,11 @@ "generators": "./generators.json", "executors": "./executors.json", "dependencies": { - "@babel/core": "^7.22.9", + "@babel/core": "^7.23.2", "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/plugin-transform-runtime": "^7.23.2", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/preset-env": "^7.22.9", + "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", "@phenomnomnominal/tsquery": "~5.0.1", @@ -54,7 +54,7 @@ "js-tokens": "^4.0.0", "minimatch": "9.0.3", "ora": "5.3.0", - "semver": "7.5.3", + "semver": "^7.5.3", "source-map-support": "0.5.19", "tslib": "^2.3.0", "@nx/devkit": "file:../devkit", diff --git a/packages/js/src/executors/node/schema.json b/packages/js/src/executors/node/schema.json index 923c4057570335..7992aa4c200eac 100644 --- a/packages/js/src/executors/node/schema.json +++ b/packages/js/src/executors/node/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Node executor", "description": "Execute Nodejs applications.", diff --git a/packages/js/src/executors/release-publish/schema.json b/packages/js/src/executors/release-publish/schema.json index 92bb52f7ad2b99..36b77bbd8f7875 100644 --- a/packages/js/src/executors/release-publish/schema.json +++ b/packages/js/src/executors/release-publish/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "Implementation details of `nx release publish`", "description": "DO NOT INVOKE DIRECTLY WITH `nx run`. Use `nx release publish` instead.", diff --git a/packages/js/src/executors/swc/schema.json b/packages/js/src/executors/swc/schema.json index feedbbd575daec..195de7d0086a32 100644 --- a/packages/js/src/executors/swc/schema.json +++ b/packages/js/src/executors/swc/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "direct-nodejs", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Typescript Build Target", "description": "Builds using SWC.", diff --git a/packages/js/src/executors/verdaccio/schema.json b/packages/js/src/executors/verdaccio/schema.json index 0948d7cae6dde2..009e7e8983571f 100644 --- a/packages/js/src/executors/verdaccio/schema.json +++ b/packages/js/src/executors/verdaccio/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "Verdaccio Local Registry", "description": "Start a local registry with Verdaccio.", diff --git a/packages/js/src/generators/convert-to-swc/schema.json b/packages/js/src/generators/convert-to-swc/schema.json index 0b15cdffe02643..db0530b77dfadb 100644 --- a/packages/js/src/generators/convert-to-swc/schema.json +++ b/packages/js/src/generators/convert-to-swc/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxTypescriptLibrary", "cli": "nx", "title": "Convert a TSC library to SWC", diff --git a/packages/js/src/generators/init/schema.json b/packages/js/src/generators/init/schema.json index 35fd0129281fa6..21d94373c353e0 100644 --- a/packages/js/src/generators/init/schema.json +++ b/packages/js/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxTypescriptInit", "cli": "nx", "title": "Init nx/js", diff --git a/packages/js/src/generators/library/library.ts b/packages/js/src/generators/library/library.ts index c9fb3cbc8d289f..f45c933af326e4 100644 --- a/packages/js/src/generators/library/library.ts +++ b/packages/js/src/generators/library/library.ts @@ -41,6 +41,7 @@ import jsInitGenerator from '../init/init'; import { type PackageJson } from 'nx/src/utils/package-json'; import setupVerdaccio from '../setup-verdaccio/generator'; import { tsConfigBaseOptions } from '../../utils/typescript/create-ts-config'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function libraryGenerator( tree: Tree, @@ -163,6 +164,10 @@ export async function libraryGeneratorInternal( await formatFiles(tree); } + tasks.push(() => { + logShowProjectCommand(options.name); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/js/src/generators/library/schema.json b/packages/js/src/generators/library/schema.json index 205b636d69ce1d..f6cd27ec2e801c 100644 --- a/packages/js/src/generators/library/schema.json +++ b/packages/js/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxTypescriptLibrary", "cli": "nx", "title": "Create a TypeScript Library", diff --git a/packages/js/src/generators/release-version/schema.json b/packages/js/src/generators/release-version/schema.json index ea28ef95dcdee4..aab95e9e3d036e 100644 --- a/packages/js/src/generators/release-version/schema.json +++ b/packages/js/src/generators/release-version/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxJSReleaseVersionGenerator", "cli": "nx", "title": "Implementation details of `nx release version`", diff --git a/packages/js/src/generators/setup-build/schema.json b/packages/js/src/generators/setup-build/schema.json index a7984d746df182..be1dc53222cb66 100644 --- a/packages/js/src/generators/setup-build/schema.json +++ b/packages/js/src/generators/setup-build/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SetupBuild", "title": "Setup Build", "description": "Sets up build target for a project.", diff --git a/packages/js/src/generators/setup-verdaccio/schema.json b/packages/js/src/generators/setup-verdaccio/schema.json index 9efc84a8ef517f..2c0c72bc8da79f 100644 --- a/packages/js/src/generators/setup-verdaccio/schema.json +++ b/packages/js/src/generators/setup-verdaccio/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SetupVerdaccio", "title": "Setup Verdaccio", "description": "Setup Verdaccio local-registry.", diff --git a/packages/js/src/utils/inline.ts b/packages/js/src/utils/inline.ts index 7508ee5cbe65e4..7f418cab979845 100644 --- a/packages/js/src/utils/inline.ts +++ b/packages/js/src/utils/inline.ts @@ -278,10 +278,12 @@ function updateImports( destOutputPath: string, inlinedDepsDestOutputRecord: Record ) { + const pathAliases = Object.keys(inlinedDepsDestOutputRecord); + if (pathAliases.length == 0) { + return; + } const importRegex = new RegExp( - Object.keys(inlinedDepsDestOutputRecord) - .map((pathAlias) => `["'](${pathAlias})["']`) - .join('|'), + pathAliases.map((pathAlias) => `["'](${pathAlias})["']`).join('|'), 'g' ); recursiveUpdateImport( diff --git a/packages/nest/src/generators/application/schema.json b/packages/nest/src/generators/application/schema.json index 24e04c88f9d410..f75c0487da7eba 100644 --- a/packages/nest/src/generators/application/schema.json +++ b/packages/nest/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestApplicationGenerator", "title": "Nx Application Options Schema", "description": "Nx Application Options Schema.", diff --git a/packages/nest/src/generators/class/schema.json b/packages/nest/src/generators/class/schema.json index 724c8f99aa7efb..2a17b1fd15fc97 100644 --- a/packages/nest/src/generators/class/schema.json +++ b/packages/nest/src/generators/class/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestClassGenerator", "title": "Nest Class Options Schema", "description": "Nest Class Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/controller/schema.json b/packages/nest/src/generators/controller/schema.json index ab9fb4b624669f..93163618b3251e 100644 --- a/packages/nest/src/generators/controller/schema.json +++ b/packages/nest/src/generators/controller/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestControllerGenerator", "title": "Nest Controller Options Schema", "description": "Nest Controller Options Schema.", @@ -22,7 +22,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "nameAndDirectoryFormat": { "description": "Whether to generate the component in the directory as provided, relative to the current working directory and ignoring the project (`as-provided`) or generate it using the project and directory relative to the workspace root (`derived`).", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/packages/nest/src/generators/decorator/schema.json b/packages/nest/src/generators/decorator/schema.json index 948750732ad71a..d682c49936abb2 100644 --- a/packages/nest/src/generators/decorator/schema.json +++ b/packages/nest/src/generators/decorator/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestDecoratorGenerator", "title": "Nest Decorator Options Schema", "description": "Nest Decorator Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -42,7 +42,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/filter/schema.json b/packages/nest/src/generators/filter/schema.json index ac369749aa4e1b..c53b0a99ffa282 100644 --- a/packages/nest/src/generators/filter/schema.json +++ b/packages/nest/src/generators/filter/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestFilterGenerator", "title": "Nest Filter Options Schema", "description": "Nest Filter Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/gateway/schema.json b/packages/nest/src/generators/gateway/schema.json index 8228e1054a539c..c098767288420c 100644 --- a/packages/nest/src/generators/gateway/schema.json +++ b/packages/nest/src/generators/gateway/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestGatewayGenerator", "title": "Nest Gateway Options Schema", "description": "Nest Gateway Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/guard/schema.json b/packages/nest/src/generators/guard/schema.json index 85c0314c39f22a..bfdfc9a53139d4 100644 --- a/packages/nest/src/generators/guard/schema.json +++ b/packages/nest/src/generators/guard/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestGuardGenerator", "title": "Nest Guard Options Schema", "description": "Nest Guard Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/init/schema.json b/packages/nest/src/generators/init/schema.json index 39763032bf8b2d..058ee5f94831b2 100644 --- a/packages/nest/src/generators/init/schema.json +++ b/packages/nest/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestInitGenerator", "title": "Init Nest Plugin", "description": "Init Nest Plugin.", diff --git a/packages/nest/src/generators/interceptor/schema.json b/packages/nest/src/generators/interceptor/schema.json index d3933e96b87071..50e52787c05fcb 100644 --- a/packages/nest/src/generators/interceptor/schema.json +++ b/packages/nest/src/generators/interceptor/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestInterceptorGenerator", "title": "Nest Interceptor Options Schema", "description": "Nest Interceptor Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/interface/schema.json b/packages/nest/src/generators/interface/schema.json index bfdeece61eef60..fa9ced365826be 100644 --- a/packages/nest/src/generators/interface/schema.json +++ b/packages/nest/src/generators/interface/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestInterfaceGenerator", "title": "Nest Interface Options Schema", "description": "Nest Interface Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -42,7 +42,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true } diff --git a/packages/nest/src/generators/library/lib/normalize-options.ts b/packages/nest/src/generators/library/lib/normalize-options.ts index 6c38f4e08612a3..419be62f332846 100644 --- a/packages/nest/src/generators/library/lib/normalize-options.ts +++ b/packages/nest/src/generators/library/lib/normalize-options.ts @@ -63,6 +63,7 @@ export function toJsLibraryGeneratorOptions( publishable: options.publishable, skipFormat: true, skipTsConfig: options.skipTsConfig, + skipPackageJson: options.skipPackageJson, strict: options.strict, tags: options.tags, testEnvironment: options.testEnvironment, diff --git a/packages/nest/src/generators/library/library.ts b/packages/nest/src/generators/library/library.ts index 2ffc3a63d3f055..38252684385a4b 100644 --- a/packages/nest/src/generators/library/library.ts +++ b/packages/nest/src/generators/library/library.ts @@ -1,5 +1,5 @@ import type { GeneratorCallback, Tree } from '@nx/devkit'; -import { formatFiles } from '@nx/devkit'; +import { formatFiles, runTasksInSerial } from '@nx/devkit'; import { libraryGenerator as jsLibraryGenerator } from '@nx/js'; import { addDependencies } from '../init/lib'; import { @@ -13,6 +13,7 @@ import { } from './lib'; import type { LibraryGeneratorOptions } from './schema'; import initGenerator from '../init/init'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function libraryGenerator( tree: Tree, @@ -30,7 +31,7 @@ export async function libraryGeneratorInternal( ): Promise { const options = await normalizeOptions(tree, rawOptions); await jsLibraryGenerator(tree, toJsLibraryGeneratorOptions(options)); - const initTask = initGenerator(tree, rawOptions); + const initTask = await initGenerator(tree, rawOptions); deleteFiles(tree, options); createFiles(tree, options); addExportsToBarrelFile(tree, options); @@ -41,7 +42,14 @@ export async function libraryGeneratorInternal( await formatFiles(tree); } - return initTask; + return runTasksInSerial( + ...[ + initTask, + () => { + logShowProjectCommand(options.projectName); + }, + ] + ); } export default libraryGenerator; diff --git a/packages/nest/src/generators/library/schema.json b/packages/nest/src/generators/library/schema.json index 05b4bad001af9f..e4fdd442238ab2 100644 --- a/packages/nest/src/generators/library/schema.json +++ b/packages/nest/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestLibraryGenerator", "title": "Create a NestJS Library for Nx", "description": "Create a NestJS Library for Nx.", diff --git a/packages/nest/src/generators/middleware/schema.json b/packages/nest/src/generators/middleware/schema.json index 160c8987a7ea5a..96bd8293e8885b 100644 --- a/packages/nest/src/generators/middleware/schema.json +++ b/packages/nest/src/generators/middleware/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestMiddlewareGenerator", "title": "Nest Middleware Options Schema", "description": "Nest Middleware Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/module/schema.json b/packages/nest/src/generators/module/schema.json index 3021c2b309bf00..bb344b275f7ecf 100644 --- a/packages/nest/src/generators/module/schema.json +++ b/packages/nest/src/generators/module/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestModuleGenerator", "title": "Nest Module Options Schema", "description": "Nest Module Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -42,7 +42,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/packages/nest/src/generators/pipe/schema.json b/packages/nest/src/generators/pipe/schema.json index 9b8ce4e032f4bd..25ff965bc3660f 100644 --- a/packages/nest/src/generators/pipe/schema.json +++ b/packages/nest/src/generators/pipe/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestPipeGenerator", "title": "Nest Pipe Options Schema", "description": "Nest Pipe Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/provider/schema.json b/packages/nest/src/generators/provider/schema.json index abee3200dac592..43d2ea8d11f366 100644 --- a/packages/nest/src/generators/provider/schema.json +++ b/packages/nest/src/generators/provider/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestProviderGenerator", "title": "Nest Provider Options Schema", "description": "Nest Provider Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": true }, diff --git a/packages/nest/src/generators/resolver/schema.json b/packages/nest/src/generators/resolver/schema.json index 168e2a8d97b108..0ad68e4b47a2d6 100644 --- a/packages/nest/src/generators/resolver/schema.json +++ b/packages/nest/src/generators/resolver/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestResolverGenerator", "title": "Nest Resolver Options Schema", "description": "Nest Resolver Options Schema.", @@ -22,7 +22,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -43,7 +43,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/packages/nest/src/generators/resource/schema.json b/packages/nest/src/generators/resource/schema.json index bc550c4fb851df..3d887ae856d8f8 100644 --- a/packages/nest/src/generators/resource/schema.json +++ b/packages/nest/src/generators/resource/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestResourceGenerator", "title": "Nest Resource Options Schema", "description": "Nest Resource Options Schema.", @@ -22,7 +22,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -43,7 +43,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/packages/nest/src/generators/service/schema.json b/packages/nest/src/generators/service/schema.json index 6dcfc93b7afd9f..e49e8ef8bede14 100644 --- a/packages/nest/src/generators/service/schema.json +++ b/packages/nest/src/generators/service/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNestServiceGenerator", "title": "Nest Service Options Schema", "description": "Nest Service Options Schema.", @@ -27,7 +27,7 @@ "$source": "projectName" }, "alias": "p", - "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v18." + "x-deprecated": "Provide The `directory` option instead and use the `as-provided` format. the project will be determined from the directory provided. it will be removed in nx v19." }, "directory": { "description": "Directory where the generated files are placed. when `--nameAndDirectoryFormat=as-provided`, it will be relative to the current working directory. otherwise, it will be relative to the workspace root.", @@ -48,7 +48,7 @@ }, "flat": { "description": "Flag to indicate if a directory is created.", - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18.", + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19.", "type": "boolean", "default": false }, diff --git a/packages/nest/src/generators/utils/types.ts b/packages/nest/src/generators/utils/types.ts index 9ea71847523946..95165cb89a1a8d 100644 --- a/packages/nest/src/generators/utils/types.ts +++ b/packages/nest/src/generators/utils/types.ts @@ -32,11 +32,11 @@ export type NestGeneratorOptions = { nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; }; diff --git a/packages/next/docs/cypress-component-configuration-examples.md b/packages/next/docs/cypress-component-configuration-examples.md index 633f405f731a30..1a5f18e5079a6a 100644 --- a/packages/next/docs/cypress-component-configuration-examples.md +++ b/packages/next/docs/cypress-component-configuration-examples.md @@ -5,7 +5,7 @@ You can migrate with to v10 via the [migrate-to-cypress-11 generator](/packages/ This generator is for Cypress based component testing. -If you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 18. +If you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 19. {% /callout %} This generator is designed to get your Next project up and running with Cypress Component Testing. diff --git a/packages/next/migrations.json b/packages/next/migrations.json index 17a141efc96e44..a9453f9a80fe76 100644 --- a/packages/next/migrations.json +++ b/packages/next/migrations.json @@ -83,6 +83,15 @@ "alwaysAddToPackageJson": false } } + }, + "17.3.1-beta.0": { + "version": "17.3.1-beta.0", + "packages": { + "next": { + "version": "14.0.4", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/next/package.json b/packages/next/package.json index 83c19090bb5bb5..c5ceafcfe01ee2 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -31,7 +31,7 @@ "migrations": "./migrations.json" }, "peerDependencies": { - "next": ">=13.0.0" + "next": ">=14.0.0" }, "dependencies": { "@nx/devkit": "file:../devkit", @@ -41,7 +41,7 @@ "copy-webpack-plugin": "^10.2.4", "fs-extra": "^11.1.0", "ignore": "^5.0.4", - "semver": "7.5.3", + "semver": "^7.5.3", "url-loader": "^4.1.1", "tslib": "^2.3.0", "webpack-merge": "^5.8.0", diff --git a/packages/next/plugins/with-nx.ts b/packages/next/plugins/with-nx.ts index cd2556282b599c..f55667b34e0095 100644 --- a/packages/next/plugins/with-nx.ts +++ b/packages/next/plugins/with-nx.ts @@ -384,7 +384,7 @@ function getNxEnvironmentVariables() { } /** - * TODO(v18) + * TODO(v19) * @deprecated Use Next.js 9.4+ built-in support for environment variables. Reference https://nextjs.org/docs/pages/api-reference/next-config-js/env */ function addNxEnvVariables(config: any) { diff --git a/packages/next/plugins/with-stylus.ts b/packages/next/plugins/with-stylus.ts index f892705971f8b0..35ff041bb241fe 100644 --- a/packages/next/plugins/with-stylus.ts +++ b/packages/next/plugins/with-stylus.ts @@ -1,7 +1,7 @@ import { NextConfigFn } from '../src/utils/config'; import { WithNxOptions } from './with-nx'; -// TODO(v18): Remove file, it is here until users migrate over to SASS manually. +// TODO(v19): Remove file, it is here until users migrate over to SASS manually. export function withStylus( configOrFn: WithNxOptions | NextConfigFn ): NextConfigFn { diff --git a/packages/next/src/executors/build/schema.json b/packages/next/src/executors/build/schema.json index f7e668fa1cc02b..494aed17888ba4 100644 --- a/packages/next/src/executors/build/schema.json +++ b/packages/next/src/executors/build/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "pipe", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Next Build", "description": "Build a Next.js app.", diff --git a/packages/next/src/generators/application/application.ts b/packages/next/src/generators/application/application.ts index 3c5829a2418f0a..c14ed56eb53549 100644 --- a/packages/next/src/generators/application/application.ts +++ b/packages/next/src/generators/application/application.ts @@ -28,6 +28,7 @@ import { customServerGenerator } from '../custom-server/custom-server'; import { updateCypressTsConfig } from './lib/update-cypress-tsconfig'; import { showPossibleWarnings } from './lib/show-possible-warnings'; import { tsLibVersion } from '../../utils/versions'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function applicationGenerator(host: Tree, schema: Schema) { return await applicationGeneratorInternal(host, { @@ -108,5 +109,9 @@ export async function applicationGeneratorInternal(host: Tree, schema: Schema) { await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/next/src/generators/application/schema.json b/packages/next/src/generators/application/schema.json index 242e9fed49ee9e..951d30be32a35a 100644 --- a/packages/next/src/generators/application/schema.json +++ b/packages/next/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextApp", "title": "Create a Next.js Application for Nx", @@ -40,11 +40,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/packages/next/src/generators/component/component.ts b/packages/next/src/generators/component/component.ts index f757d7425518a4..a416b5dc9d8e88 100644 --- a/packages/next/src/generators/component/component.ts +++ b/packages/next/src/generators/component/component.ts @@ -15,28 +15,28 @@ import { determineArtifactNameAndDirectoryOptions } from '@nx/devkit/src/generat interface Schema { name: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; style: SupportedStyles; directory?: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19. */ pascalCaseFiles?: boolean; /** - * @deprecated Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19. */ pascalCaseDirectory?: boolean; nameAndDirectoryFormat?: 'as-provided' | 'derived'; skipFormat?: boolean; } -// TODO(v18): Remove this logic once we no longer derive directory. +// TODO(v19): Remove this logic once we no longer derive directory. function maybeGetDerivedDirectory(host: Tree, options: Schema): string { if (!options.project) return options.directory; const workspace = getProjects(host); diff --git a/packages/next/src/generators/component/schema.json b/packages/next/src/generators/component/schema.json index 635b1f7dfad125..ee57d51dbf8427 100644 --- a/packages/next/src/generators/component/schema.json +++ b/packages/next/src/generators/component/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextReactComponent", "title": "Create a React Component for Next", @@ -13,7 +13,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -40,11 +40,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", @@ -97,21 +97,21 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseFiles": { "type": "boolean", "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `App/App.tsx`).", "alias": "R", "default": false, - "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "skipFormat": { "description": "Skip formatting files.", diff --git a/packages/next/src/generators/custom-server/schema.json b/packages/next/src/generators/custom-server/schema.json index 1000914a90d1e4..3a6d2d5c3fdfc3 100644 --- a/packages/next/src/generators/custom-server/schema.json +++ b/packages/next/src/generators/custom-server/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextCustomServer", "title": "Add custom server", diff --git a/packages/next/src/generators/cypress-component-configuration/schema.json b/packages/next/src/generators/cypress-component-configuration/schema.json index 0eb33f80c03c60..df46feabd6131b 100644 --- a/packages/next/src/generators/cypress-component-configuration/schema.json +++ b/packages/next/src/generators/cypress-component-configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "CypressComponentConfiguration", "title": "NextJS Component Testing Configuration", diff --git a/packages/next/src/generators/init/init.ts b/packages/next/src/generators/init/init.ts index d285e7912c3b3c..45d9865f156cc8 100644 --- a/packages/next/src/generators/init/init.ts +++ b/packages/next/src/generators/init/init.ts @@ -7,7 +7,6 @@ import { } from '@nx/devkit'; import { updatePackageScripts } from '@nx/devkit/src/utils/update-package-scripts'; import { reactDomVersion, reactVersion } from '@nx/react/src/utils/versions'; -import { createNodes } from '../../plugins/plugin'; import { addGitIgnoreEntry } from '../../utils/add-gitignore-entry'; import { nextVersion, nxVersion } from '../../utils/versions'; import { addPlugin } from './lib/add-plugin'; @@ -50,6 +49,7 @@ export async function nextInitGenerator(host: Tree, schema: InitSchema) { } if (schema.updatePackageScripts) { + const { createNodes } = await import('../../plugins/plugin'); await updatePackageScripts(host, createNodes); } diff --git a/packages/next/src/generators/init/schema.json b/packages/next/src/generators/init/schema.json index e0feeaf58f8351..3e96ecc004c547 100644 --- a/packages/next/src/generators/init/schema.json +++ b/packages/next/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextNgInit", "title": "Init Next Plugin", diff --git a/packages/next/src/generators/library/schema.json b/packages/next/src/generators/library/schema.json index d4cbe3a09a2434..f8b09c5914c48b 100644 --- a/packages/next/src/generators/library/schema.json +++ b/packages/next/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactLibrary", "title": "Create a React Library for Nx", @@ -40,11 +40,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/packages/next/src/generators/page/page.ts b/packages/next/src/generators/page/page.ts index 8e407c92c73977..a5bb0b377877d8 100644 --- a/packages/next/src/generators/page/page.ts +++ b/packages/next/src/generators/page/page.ts @@ -56,7 +56,7 @@ async function normalizeOptions(host: Tree, options: Schema) { if (options.project) { // Legacy behavior, detect app vs page router from specified project. - // TODO(v18): remove this logic + // TODO(v19): remove this logic const project = readProjectConfiguration(host, options.project); // app/ is a reserved folder in nextjs so it is safe to check it's existence isAppRouter = diff --git a/packages/next/src/generators/page/schema.d.ts b/packages/next/src/generators/page/schema.d.ts index 687c6c30f7148c..577a3cb4ae7f66 100644 --- a/packages/next/src/generators/page/schema.d.ts +++ b/packages/next/src/generators/page/schema.d.ts @@ -3,7 +3,7 @@ import { SupportedStyles } from '@nx/react'; export interface Schema { name: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; style: SupportedStyles; @@ -12,7 +12,7 @@ export interface Schema { withTests?: boolean; js?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ flat?: boolean; skipFormat?: boolean; diff --git a/packages/next/src/generators/page/schema.json b/packages/next/src/generators/page/schema.json index a09b716c5f0c94..5162011a091605 100644 --- a/packages/next/src/generators/page/schema.json +++ b/packages/next/src/generators/page/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNextReactPage", "title": "Create a Page for Next", @@ -13,7 +13,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -51,11 +51,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", @@ -97,7 +97,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "skipFormat": { "description": "Skip formatting files.", diff --git a/packages/node/migrations.json b/packages/node/migrations.json index 155a202b82c6a0..13b0d3de921ba3 100644 --- a/packages/node/migrations.json +++ b/packages/node/migrations.json @@ -34,6 +34,15 @@ "alwaysAddToPackageJson": false } } + }, + "17.3.1": { + "version": "17.3.1-beta.0", + "packages": { + "axios": { + "version": "^1.6.0", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/node/src/generators/application/application.ts b/packages/node/src/generators/application/application.ts index 9c25e29c47f7bf..68930bd7fa6d30 100644 --- a/packages/node/src/generators/application/application.ts +++ b/packages/node/src/generators/application/application.ts @@ -48,6 +48,7 @@ import { setupDockerGenerator } from '../setup-docker/setup-docker'; import { Schema } from './schema'; import { hasWebpackPlugin } from '../../utils/has-webpack-plugin'; import { addBuildTargetDefaults } from '@nx/devkit/src/generators/add-build-target-defaults'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export interface NormalizedSchema extends Schema { appProjectRoot: string; @@ -389,7 +390,18 @@ export async function applicationGeneratorInternal(tree: Tree, schema: Schema) { if (options.framework === 'nest') { const { applicationGenerator } = ensurePackage('@nx/nest', nxVersion); - return await applicationGenerator(tree, { ...options, skipFormat: true }); + const nestTasks = await applicationGenerator(tree, { + ...options, + skipFormat: true, + }); + return runTasksInSerial( + ...[ + nestTasks, + () => { + logShowProjectCommand(options.name); + }, + ] + ); } const jsInitTask = await jsInitGenerator(tree, { @@ -420,7 +432,11 @@ export async function applicationGeneratorInternal(tree: Tree, schema: Schema) { const { ensureDependencies } = await import( '@nx/webpack/src/utils/ensure-dependencies' ); - tasks.push(ensureDependencies(tree, { uiFramework: 'react' })); + tasks.push( + ensureDependencies(tree, { + uiFramework: options.isNest ? 'none' : 'react', + }) + ); } } @@ -490,6 +506,10 @@ export async function applicationGeneratorInternal(tree: Tree, schema: Schema) { await formatFiles(tree); } + tasks.push(() => { + logShowProjectCommand(options.name); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/node/src/generators/application/schema.json b/packages/node/src/generators/application/schema.json index 7efac7738b40e9..ee1f83d675f1ec 100644 --- a/packages/node/src/generators/application/schema.json +++ b/packages/node/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "SchematicsNxNodeApp", "title": "Nx Application Options Schema", diff --git a/packages/node/src/generators/e2e-project/e2e-project.ts b/packages/node/src/generators/e2e-project/e2e-project.ts index cac4c97e5ea957..429852b03c8cd4 100644 --- a/packages/node/src/generators/e2e-project/e2e-project.ts +++ b/packages/node/src/generators/e2e-project/e2e-project.ts @@ -25,6 +25,7 @@ import { isEslintConfigSupported, replaceOverridesInLintConfig, } from '@nx/eslint/src/generators/utils/eslint-file'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function e2eProjectGenerator(host: Tree, options: Schema) { return await e2eProjectGeneratorInternal(host, { @@ -134,6 +135,10 @@ export async function e2eProjectGeneratorInternal( await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.e2eProjectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/node/src/generators/e2e-project/schema.json b/packages/node/src/generators/e2e-project/schema.json index 98094697871fdb..35171878fdb785 100644 --- a/packages/node/src/generators/e2e-project/schema.json +++ b/packages/node/src/generators/e2e-project/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "SchematicsNxNodeE2eProject", "title": "Node E2E Project Generator", diff --git a/packages/node/src/generators/init/schema.json b/packages/node/src/generators/init/schema.json index 7dc33578bf3056..d6dc89625c3417 100644 --- a/packages/node/src/generators/init/schema.json +++ b/packages/node/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNodeInit", "title": "Init Node Plugin", diff --git a/packages/node/src/generators/library/schema.json b/packages/node/src/generators/library/schema.json index c706806527fe7c..4e54e7a4cf20b2 100644 --- a/packages/node/src/generators/library/schema.json +++ b/packages/node/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNodeLibrary", "title": "Create a Node Library for Nx", diff --git a/packages/node/src/generators/setup-docker/schema.json b/packages/node/src/generators/setup-docker/schema.json index 4361b8d6f7f70a..71d546ebabe56d 100644 --- a/packages/node/src/generators/setup-docker/schema.json +++ b/packages/node/src/generators/setup-docker/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "SchematicsNxSetupDocker", "title": "Nx Node Docker Options Schema", diff --git a/packages/node/src/utils/versions.ts b/packages/node/src/utils/versions.ts index a61596dea3f83e..f95028cc670476 100644 --- a/packages/node/src/utils/versions.ts +++ b/packages/node/src/utils/versions.ts @@ -15,4 +15,4 @@ export const fastifyAutoloadVersion = '~5.7.1'; export const fastifySensibleVersion = '~5.2.0'; export const fastifyPluginVersion = '~4.5.0'; -export const axiosVersion = '^1.0.0'; +export const axiosVersion = '^1.6.0'; diff --git a/packages/nuxt/src/generators/application/application.ts b/packages/nuxt/src/generators/application/application.ts index 6e019364163134..4860c1d2af891d 100644 --- a/packages/nuxt/src/generators/application/application.ts +++ b/packages/nuxt/src/generators/application/application.ts @@ -25,6 +25,7 @@ import { addLinting } from '../../utils/add-linting'; import { addVitest } from './lib/add-vitest'; import { vueTestUtilsVersion, vitePluginVueVersion } from '@nx/vue'; import { ensureDependencies } from './lib/ensure-dependencies'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function applicationGenerator(tree: Tree, schema: Schema) { const tasks: GeneratorCallback[] = []; @@ -122,6 +123,10 @@ export async function applicationGenerator(tree: Tree, schema: Schema) { if (!options.skipFormat) await formatFiles(tree); + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/nuxt/src/generators/application/schema.json b/packages/nuxt/src/generators/application/schema.json index c3a9c2b5e6c818..4fedebc6c3ec73 100644 --- a/packages/nuxt/src/generators/application/schema.json +++ b/packages/nuxt/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNuxtApp", "title": "Create a Nuxt Application for Nx", @@ -89,11 +89,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "none", "label": "None" } ] diff --git a/packages/nuxt/src/generators/init/schema.json b/packages/nuxt/src/generators/init/schema.json index e0273e041520b0..3426c68b49e035 100644 --- a/packages/nuxt/src/generators/init/schema.json +++ b/packages/nuxt/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxNuxtInit", "title": "Init Nuxt Plugin", "description": "Initialize a Nuxt Plugin.", diff --git a/packages/nuxt/src/generators/storybook-configuration/schema.json b/packages/nuxt/src/generators/storybook-configuration/schema.json index 45c2d40586e0d1..51819e5983e7b1 100644 --- a/packages/nuxt/src/generators/storybook-configuration/schema.json +++ b/packages/nuxt/src/generators/storybook-configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxNuxtStorybookConfigure", "title": "Nuxt Storybook Configure", diff --git a/packages/nx/bin/init-local.ts b/packages/nx/bin/init-local.ts index f9cfcf9e401dc8..0d015ba4d829dc 100644 --- a/packages/nx/bin/init-local.ts +++ b/packages/nx/bin/init-local.ts @@ -13,10 +13,32 @@ import * as Mod from 'module'; */ export function initLocal(workspace: WorkspaceTypeAndRoot) { + // If module.register is not available, we need to restart the process with the experimental ESM loader. + // Otherwise, usage of `registerTsProject` will not work for `.ts` files using ESM. + // TODO: Remove this once Node 18 is out of LTS (March 2024). + if (shouldRestartWithExperimentalTsEsmLoader()) { + const child = require('child_process').fork( + require.resolve('./nx'), + process.argv.slice(2), + { + env: { + ...process.env, + RESTARTED_WITH_EXPERIMENTAL_TS_ESM_LOADER: '1', + }, + execArgv: execArgvWithExperimentalLoaderOptions(), + } + ); + child.on('close', (code: number | null) => { + if (code !== 0 && code !== null) process.exit(code); + }); + return; + } + process.env.NX_CLI_SET = 'true'; try { performance.mark('init-local'); + monkeyPatchRequire(); if (workspace.type !== 'nx' && shouldDelegateToAngularCLI()) { @@ -229,3 +251,36 @@ function monkeyPatchRequire() { // do some side-effect of your own }; } + +function shouldRestartWithExperimentalTsEsmLoader(): boolean { + // Already restarted with experimental loader + if (process.env.RESTARTED_WITH_EXPERIMENTAL_TS_ESM_LOADER === '1') + return false; + const nodeVersion = parseInt(process.versions.node.split('.')[0]); + // `--experimental-loader` is only supported in Nodejs >= 16 so there is no point restarting for older versions + if (nodeVersion < 16) return false; + // Node 20.6.0 adds `module.register`, otherwise we need to restart process with "--experimental-loader ts-node/esm". + return ( + !require('node:module').register && + moduleResolves('ts-node/esm') && + moduleResolves('typescript') + ); +} + +function execArgvWithExperimentalLoaderOptions() { + return [ + ...process.execArgv, + '--no-warnings', + '--experimental-loader', + 'ts-node/esm', + ]; +} + +function moduleResolves(packageName: string) { + try { + require.resolve(packageName); + return true; + } catch { + return false; + } +} diff --git a/packages/nx/bin/run-executor.ts b/packages/nx/bin/run-executor.ts index 23ed41d06f3e60..7b43b2bb7a1fdb 100644 --- a/packages/nx/bin/run-executor.ts +++ b/packages/nx/bin/run-executor.ts @@ -90,7 +90,7 @@ process.on( ); process.exit(statusCode); } catch (e) { - console.error(`Could not find 'nx' module in this workspace.`, e); + console.error(e); process.exit(1); } } diff --git a/packages/nx/package.json b/packages/nx/package.json index 2d55c802dfe0b1..8cdb150a76b116 100644 --- a/packages/nx/package.json +++ b/packages/nx/package.json @@ -36,7 +36,7 @@ "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.6", - "axios": "^1.5.1", + "axios": "^1.6.0", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -55,7 +55,7 @@ "minimatch": "9.0.3", "npm-run-path": "^4.0.1", "open": "^8.4.0", - "semver": "7.5.3", + "semver": "^7.5.3", "string-width": "^4.2.3", "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", diff --git a/packages/nx/src/adapter/compat.ts b/packages/nx/src/adapter/compat.ts index dd06c7c19fd00f..57e13300539984 100644 --- a/packages/nx/src/adapter/compat.ts +++ b/packages/nx/src/adapter/compat.ts @@ -43,6 +43,7 @@ export const allowedProjectExtensions = [ 'sourceRoot', 'projectType', 'release', + 'includedScripts', ] as const; // If we pass props on the workspace that angular doesn't know about, diff --git a/packages/nx/src/command-line/affected/command-object.ts b/packages/nx/src/command-line/affected/command-object.ts index b989a3ca8f8df4..8cf5757790bc41 100644 --- a/packages/nx/src/command-line/affected/command-object.ts +++ b/packages/nx/src/command-line/affected/command-object.ts @@ -109,9 +109,9 @@ export const yargsAffectedE2ECommand: CommandModule = { }; export const affectedGraphDeprecationMessage = - 'Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18.'; + 'Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19.'; /** - * @deprecated 'Use `nx graph --affected`, or` nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18.' + * @deprecated 'Use `nx graph --affected`, or` nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19.' */ export const yargsAffectedGraphCommand: CommandModule = { command: 'affected:graph', @@ -132,9 +132,9 @@ export const yargsAffectedGraphCommand: CommandModule = { }; export const printAffectedDeprecationMessage = - 'Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18.'; + 'Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19.'; /** - * @deprecated 'Use `nx show --affected`, `nx affected --graph` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18.' + * @deprecated 'Use `nx show --affected`, `nx affected --graph` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19.' */ export const yargsPrintAffectedCommand: CommandModule = { command: 'print-affected', diff --git a/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts b/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts index e998387f7fab3e..127b5577cbfdba 100644 --- a/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts +++ b/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts @@ -1,10 +1,6 @@ import { output } from '../../utils/output'; import { readNxJson } from '../../config/configuration'; -import { - getNxCloudToken, - getNxCloudUrl, - isNxCloudUsed, -} from '../../utils/nx-cloud-utils'; +import { getNxCloudUrl, isNxCloudUsed } from '../../utils/nx-cloud-utils'; import { runNxSync } from '../../utils/child-process'; import { NxJsonConfiguration } from '../../config/nx-json'; import { NxArgs } from '../../utils/command-line-utils'; @@ -54,15 +50,10 @@ export async function connectToNxCloudCommand(): Promise { const nxJson = readNxJson(); if (isNxCloudUsed(nxJson)) { output.log({ - title: '✅ This workspace is already connected to Nx Cloud.', + title: '✔ This workspace has already Nx Cloud set up', bodyLines: [ - 'This means your workspace can use computation caching, distributed task execution, and show you run analytics.', - 'Go to https://nx.app to learn more.', - ' ', - 'If you have not done so already, please claim this workspace:', - `${getNxCloudUrl( - nxJson - )}/orgs/workspace-setup?accessToken=${getNxCloudToken(nxJson)}`, + 'If you have not done so already, connect your workspace to your Nx Cloud account:', + `- Login at ${getNxCloudUrl(nxJson)} to connect your repository`, ], }); return false; diff --git a/packages/nx/src/command-line/graph/graph.ts b/packages/nx/src/command-line/graph/graph.ts index 8b415d04550729..9cfe18d136a198 100644 --- a/packages/nx/src/command-line/graph/graph.ts +++ b/packages/nx/src/command-line/graph/graph.ts @@ -427,7 +427,7 @@ export async function generateGraph( '- affectedProjects', '- criticalPath', '', - 'These fields will be removed in Nx 18. If you need to see which projects were affected, use `nx show projects --affected`.', + 'These fields will be removed in Nx 19. If you need to see which projects were affected, use `nx show projects --affected`.', ], }); @@ -1034,12 +1034,12 @@ interface GraphJsonResponse { graph: ProjectGraph; /** - * @deprecated To see affected projects, use `nx show projects --affected`. This will be removed in Nx 18. + * @deprecated To see affected projects, use `nx show projects --affected`. This will be removed in Nx 19. */ affectedProjects?: string[]; /** - * @deprecated To see affected projects, use `nx show projects --affected`. This will be removed in Nx 18. + * @deprecated To see affected projects, use `nx show projects --affected`. This will be removed in Nx 19. */ criticalPath?: string[]; } diff --git a/packages/nx/src/command-line/init/implementation/utils.ts b/packages/nx/src/command-line/init/implementation/utils.ts index b9c6491ec2b4a8..4f51fb17f0f9ff 100644 --- a/packages/nx/src/command-line/init/implementation/utils.ts +++ b/packages/nx/src/command-line/init/implementation/utils.ts @@ -25,12 +25,13 @@ export function createNxJsonFile( scriptOutputs: { [name: string]: string } ) { const nxJsonPath = joinPathFragments(repoRoot, 'nx.json'); - let nxJson = {} as Partial; + let nxJson = {} as Partial & { $schema: string }; try { nxJson = readJsonFile(nxJsonPath); // eslint-disable-next-line no-empty } catch {} + nxJson.$schema = './node_modules/nx/schemas/nx-schema.json'; nxJson.targetDefaults ??= {}; if (topologicalTargets.length > 0) { diff --git a/packages/nx/src/command-line/report/report.ts b/packages/nx/src/command-line/report/report.ts index 311ae546f24e9e..ec8d24346a6ac6 100644 --- a/packages/nx/src/command-line/report/report.ts +++ b/packages/nx/src/command-line/report/report.ts @@ -270,7 +270,7 @@ export function findInstalledCommunityPlugins(): PackageJson[] { } export function findInstalledPackagesWeCareAbout() { const packagesWeMayCareAbout: Record = {}; - // TODO (v18): Remove workaround for hiding @nrwl packages when matching @nx package is found. + // TODO (v19): Remove workaround for hiding @nrwl packages when matching @nx package is found. const packageChangeMap: Record = { '@nrwl/nx-plugin': '@nx/plugin', '@nx/plugin': '@nrwl/nx-plugin', diff --git a/packages/nx/src/config/project-graph.ts b/packages/nx/src/config/project-graph.ts index 8b5f7dd4eefae0..6c9772a7a3988b 100644 --- a/packages/nx/src/config/project-graph.ts +++ b/packages/nx/src/config/project-graph.ts @@ -145,7 +145,7 @@ export interface ProjectGraphDependency { /** * Additional information to be used to process a project graph - * @deprecated The {@link ProjectGraphProcessor} is deprecated. This will be removed in Nx 18. + * @deprecated The {@link ProjectGraphProcessor} is deprecated. This will be removed in Nx 19. */ export interface ProjectGraphProcessorContext { /** @@ -171,7 +171,7 @@ export interface ProjectGraphProcessorContext { /** * A function that produces an updated ProjectGraph - * @deprecated Use {@link CreateNodes} and {@link CreateDependencies} instead. This will be removed in Nx 18. + * @deprecated Use {@link CreateNodes} and {@link CreateDependencies} instead. This will be removed in Nx 19. */ export type ProjectGraphProcessor = ( currentGraph: ProjectGraph, diff --git a/packages/nx/src/config/workspaces.ts b/packages/nx/src/config/workspaces.ts index 6885bd136b0eed..1401ff5c1f1a21 100644 --- a/packages/nx/src/config/workspaces.ts +++ b/packages/nx/src/config/workspaces.ts @@ -8,9 +8,9 @@ import type { NxJsonConfiguration } from './nx-json'; import { readNxJson } from './nx-json'; import { ProjectsConfigurations } from './workspace-json-project-json'; -// TODO(v18): remove this class +// TODO(v19): remove this class /** - * @deprecated This will be removed in v18. Use {@link readProjectsConfigurationFromProjectGraph} instead. + * @deprecated This will be removed in v19. Use {@link readProjectsConfigurationFromProjectGraph} instead. */ export class Workspaces { constructor(private root: string) {} diff --git a/packages/nx/src/daemon/client/client.ts b/packages/nx/src/daemon/client/client.ts index b9dde79589a1ee..a52a9cfd4ef991 100644 --- a/packages/nx/src/daemon/client/client.ts +++ b/packages/nx/src/daemon/client/client.ts @@ -65,7 +65,7 @@ export class DaemonClient { enabled() { if (this._enabled === undefined) { - // TODO(v18): Add migration to move it out of existing configs and remove the ?? here. + // TODO(v19): Add migration to move it out of existing configs and remove the ?? here. const useDaemonProcessOption = this.nxJson.useDaemonProcess ?? this.nxJson.tasksRunnerOptions?.['default']?.options?.useDaemonProcess; diff --git a/packages/nx/src/devkit-exports.ts b/packages/nx/src/devkit-exports.ts index b7da714177f11b..be21b376ce0197 100644 --- a/packages/nx/src/devkit-exports.ts +++ b/packages/nx/src/devkit-exports.ts @@ -37,7 +37,7 @@ export type { HasherContext, } from './config/misc-interfaces'; -// TODO(v18): Remove this export +// TODO(v19): Remove this export /** * @category Workspace */ diff --git a/packages/nx/src/executors/run-script/run-script.impl.ts b/packages/nx/src/executors/run-script/run-script.impl.ts index 053388f8200d0e..60bf9c9ed8f542 100644 --- a/packages/nx/src/executors/run-script/run-script.impl.ts +++ b/packages/nx/src/executors/run-script/run-script.impl.ts @@ -1,10 +1,8 @@ -import { getPackageManagerCommand } from '../../utils/package-manager'; -import type { ExecutorContext } from '../../config/misc-interfaces'; import * as path from 'path'; -import { env as appendLocalEnv } from 'npm-run-path'; +import type { ExecutorContext } from '../../config/misc-interfaces'; import { runCommand } from '../../native'; import { PseudoTtyProcess } from '../../utils/child-process'; -import { signalToCode } from '../../utils/exit-codes'; +import { getPackageManagerCommand } from '../../utils/package-manager'; export interface RunScriptOptions { script: string; @@ -25,10 +23,7 @@ export default async function ( context.root, context.projectsConfigurations.projects[context.projectName].root ), - { - ...process.env, - ...appendLocalEnv(), - } + process.env ) ); cp.onExit((code) => { diff --git a/packages/nx/src/hasher/hash-task.ts b/packages/nx/src/hasher/hash-task.ts index 086c8a60fc9fe1..08ce18b05b220e 100644 --- a/packages/nx/src/hasher/hash-task.ts +++ b/packages/nx/src/hasher/hash-task.ts @@ -64,7 +64,7 @@ export async function hashTask( hasher, projectGraph, taskGraph, - workspaceConfig: projectsConfigurations, // to make the change non-breaking. Remove after v18 + workspaceConfig: projectsConfigurations, // to make the change non-breaking. Remove after v19 projectsConfigurations, nxJsonConfiguration: readNxJson(), env, diff --git a/packages/nx/src/hasher/native-task-hasher-impl.spec.ts b/packages/nx/src/hasher/native-task-hasher-impl.spec.ts index d7f1c67e2fa5b6..4a9d7923130c69 100644 --- a/packages/nx/src/hasher/native-task-hasher-impl.spec.ts +++ b/packages/nx/src/hasher/native-task-hasher-impl.spec.ts @@ -655,6 +655,86 @@ describe('native task hasher', () => { `); }); + it('should include typescript hash in the TsConfig final hash', async () => { + const workspaceFiles = await retrieveWorkspaceFiles(tempFs.tempDir, { + 'libs/parent': 'parent', + 'libs/child': 'child', + }); + const builder = new ProjectGraphBuilder( + undefined, + workspaceFiles.fileMap.projectFileMap + ); + builder.addNode({ + name: 'parent', + type: 'lib', + data: { + root: 'libs/parent', + targets: { + build: { + executor: 'nx:run-commands', + }, + }, + }, + }); + builder.addNode({ + name: 'child', + type: 'lib', + data: { + root: 'libs/child', + targets: { + build: { + executor: 'nx:run-commands', + }, + }, + }, + }); + builder.addExternalNode({ + data: { + packageName: 'typescript', + version: '1.2.3', + hash: '1234', + }, + name: 'npm:typescript', + type: 'npm', + }); + + builder.addStaticDependency( + 'parent', + 'npm:typescript', + 'libs/parent/filea.ts' + ); + let projectGraph = builder.getUpdatedProjectGraph(); + + const taskGraph = createTaskGraph( + projectGraph, + { build: ['^build'] }, + ['parent', 'child'], + ['build'], + undefined, + {} + ); + + let hasher = new NativeTaskHasherImpl( + tempFs.tempDir, + nxJson, + projectGraph, + workspaceFiles.rustReferences, + { selectivelyHashTsConfig: true } + ); + + let typescriptHash = ( + await hasher.hashTask(taskGraph.tasks['parent:build'], taskGraph, {}) + ).details['parent:TsConfig']; + + let noTypescriptHash = ( + await hasher.hashTask(taskGraph.tasks['child:build'], taskGraph, {}) + ).details['child:TsConfig']; + + expect(typescriptHash).not.toEqual(noTypescriptHash); + expect(typescriptHash).toMatchInlineSnapshot(`"8661678577354855152"`); + expect(noTypescriptHash).toMatchInlineSnapshot(`"11547179436948425249"`); + }); + /** * commented out to show how to debug issues with hashing * diff --git a/packages/nx/src/hasher/task-hasher.ts b/packages/nx/src/hasher/task-hasher.ts index 4e9ff22aea20aa..e8d528d2811ce7 100644 --- a/packages/nx/src/hasher/task-hasher.ts +++ b/packages/nx/src/hasher/task-hasher.ts @@ -40,13 +40,13 @@ export interface Hash { export interface TaskHasher { /** - * @deprecated use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 + * @deprecated use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 * @param task */ hashTask(task: Task): Promise; /** - * @deprecated use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 + * @deprecated use hashTask(task:Task, taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 */ hashTask(task: Task, taskGraph: TaskGraph): Promise; @@ -57,13 +57,13 @@ export interface TaskHasher { ): Promise; /** - * @deprecated use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 + * @deprecated use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 * @param tasks */ hashTasks(tasks: Task[]): Promise; /** - * @deprecated use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v18 + * @deprecated use hashTasks(tasks:Task[], taskGraph: TaskGraph, env: NodeJS.ProcessEnv) instead. This will be removed in v19 */ hashTasks(tasks: Task[], taskGraph: TaskGraph): Promise; diff --git a/packages/nx/src/native/command.rs b/packages/nx/src/native/command.rs index 82c275e36f1e78..56af29d4c34976 100644 --- a/packages/nx/src/native/command.rs +++ b/packages/nx/src/native/command.rs @@ -13,6 +13,9 @@ use napi::threadsafe_function::ThreadsafeFunctionCallMode::NonBlocking; use napi::{Env, JsFunction}; use portable_pty::{ChildKiller, CommandBuilder, NativePtySystem, PtySize, PtySystem}; +#[cfg(target_os = "windows")] +static CURSOR_POSITION: std::sync::OnceLock = std::sync::OnceLock::new(); + fn command_builder() -> CommandBuilder { if cfg!(target_os = "windows") { let comspec = std::env::var("COMSPEC"); @@ -170,6 +173,16 @@ pub fn run_command( // remove cursor position 1,1 content = content.replacen("\x1B[H", "", 1); } + + #[cfg(target_os = "windows")] + { + let regex = CURSOR_POSITION.get_or_init(|| { + regex::Regex::new(r"\x1B\[\d+;\d+H") + .expect("failed to compile CURSOR ansi regex") + }); + content = regex.replace_all(&content, "").to_string(); + } + message_tx.send(content.to_string()).ok(); if !quiet { stdout.write_all(content.as_bytes()).ok(); diff --git a/packages/nx/src/native/tasks/hashers/hash_workspace_files.rs b/packages/nx/src/native/tasks/hashers/hash_workspace_files.rs index e92ea6e4a9e6dc..b572b34cbeb319 100644 --- a/packages/nx/src/native/tasks/hashers/hash_workspace_files.rs +++ b/packages/nx/src/native/tasks/hashers/hash_workspace_files.rs @@ -16,7 +16,7 @@ pub fn hash_workspace_files( let Some(file_set) = file_set else { warn!( - "{workspace_file_set} does not start with {}. This will throw an error in Nx 18.", + "{workspace_file_set} does not start with {}. This will throw an error in Nx 19.", "{workspaceRoot}/" ); return Ok(hash(b"")); diff --git a/packages/nx/src/native/tasks/task_hasher.rs b/packages/nx/src/native/tasks/task_hasher.rs index 8c814715ea7549..333a23e13422dd 100644 --- a/packages/nx/src/native/tasks/task_hasher.rs +++ b/packages/nx/src/native/tasks/task_hasher.rs @@ -222,8 +222,20 @@ impl TaskHasher { project_root_mappings, )? }; + + let ts_hash = self + .project_graph + .external_nodes + .get("typescript") + .and_then(|pkg| pkg.hash.as_deref()) + .map(|pkg_hash| { + hash(&[pkg_hash.as_bytes(), ts_config_hash.as_bytes()].concat()) + }) + // the unwrap_or is for the case where typescript is not installed + .unwrap_or(ts_config_hash); + trace!(parent: &span, "hash_tsconfig: {:?}", now.elapsed()); - ts_config_hash + ts_hash } HashInstruction::TaskOutput(glob, outputs) => { let hashed_task_output = hash_task_output(&self.workspace_root, glob, outputs)?; diff --git a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts index 525ce105089a61..6f4f85c7fd6e00 100644 --- a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts +++ b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts @@ -73,21 +73,17 @@ async function createNxCloudWorkspace( } function printSuccessMessage(url: string) { - let host = 'nx.app'; + let origin = 'https://nx.app'; try { - host = new URL(url).host; + origin = new URL(url).origin; } catch (e) {} output.note({ - title: `Remote caching via Nx Cloud has been enabled`, + title: `Your Nx Cloud workspace is public`, bodyLines: [ - `In addition to the caching, Nx Cloud provides config-free distributed execution,`, - `UI for viewing complex runs and GitHub integration. Learn more at https://nx.app`, - ``, - `Your workspace is currently unclaimed. Run details from unclaimed workspaces can be viewed on ${host} by anyone`, - `with the link. Claim your workspace at the following link to restrict access.`, - ``, - `${url}`, + `To restrict access, connect it to your Nx Cloud account:`, + `- Push your changes`, + `- Login at ${origin} to connect your repository`, ], }); } diff --git a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json index 82cddd20cad43b..4e7453f6065715 100644 --- a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json +++ b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "id": "NxCloudInit", "title": "Add Nx Cloud Configuration to the workspace", "description": "Connect a workspace to Nx Cloud.", diff --git a/packages/nx/src/plugins/js/project-graph/build-dependencies/strip-source-code.ts b/packages/nx/src/plugins/js/project-graph/build-dependencies/strip-source-code.ts index 02c3de67817349..128e477362ec42 100644 --- a/packages/nx/src/plugins/js/project-graph/build-dependencies/strip-source-code.ts +++ b/packages/nx/src/plugins/js/project-graph/build-dependencies/strip-source-code.ts @@ -3,7 +3,7 @@ import type { Scanner } from 'typescript'; let SyntaxKind: typeof import('typescript').SyntaxKind; /** - * @deprecated This is deprecated and will be removed in Nx 18. + * @deprecated This is deprecated and will be removed in Nx 19. * This was not intended to be exposed. * Please talk to us if you need this. */ diff --git a/packages/nx/src/plugins/js/project-graph/build-dependencies/typescript-import-locator.ts b/packages/nx/src/plugins/js/project-graph/build-dependencies/typescript-import-locator.ts index 92fc063a0ed028..ed119689796c97 100644 --- a/packages/nx/src/plugins/js/project-graph/build-dependencies/typescript-import-locator.ts +++ b/packages/nx/src/plugins/js/project-graph/build-dependencies/typescript-import-locator.ts @@ -14,7 +14,7 @@ import { stripSourceCode } from './strip-source-code'; let tsModule: typeof import('typescript'); /** - * @deprecated This is deprecated and will be removed in Nx 18. + * @deprecated This is deprecated and will be removed in Nx 19. * This was not intended to be exposed. * Please talk to us if you need this. */ diff --git a/packages/nx/src/plugins/js/utils/register.ts b/packages/nx/src/plugins/js/utils/register.ts index b01386f7b4b8aa..67109d6d2cb4fe 100644 --- a/packages/nx/src/plugins/js/utils/register.ts +++ b/packages/nx/src/plugins/js/utils/register.ts @@ -8,6 +8,8 @@ const swcNodeInstalled = packageIsInstalled('@swc-node/register'); const tsNodeInstalled = packageIsInstalled('ts-node/register'); let ts: typeof import('typescript'); +let isTsEsmLoaderRegistered = false; + /** * Optionally, if swc-node and tsconfig-paths are available in the current workspace, apply the require * register hooks so that .ts files can be used for writing custom workspace projects. @@ -28,7 +30,7 @@ export function registerTsProject(tsConfigPath: string): () => void; * workspace path mapping will not, for example). * * @returns cleanup function - * @deprecated This signature will be removed in Nx v18. You should pass the full path to the tsconfig in the first argument. + * @deprecated This signature will be removed in Nx v19. You should pass the full path to the tsconfig in the first argument. */ export function registerTsProject(path: string, configFilename: string); export function registerTsProject( @@ -43,6 +45,19 @@ export function registerTsProject( registerTranspiler(compilerOptions), ]; + // Add ESM support for `.ts` files. + // NOTE: There is no cleanup function for this, as it's not possible to unregister the loader. + // Based on limited testing, it doesn't seem to matter if we register it multiple times, but just in + // case let's keep a flag to prevent it. + if (!isTsEsmLoaderRegistered) { + const module = require('node:module'); + if (module.register && packageIsInstalled('ts-node/esm')) { + const url = require('node:url'); + module.register(url.pathToFileURL(require.resolve('ts-node/esm'))); + } + isTsEsmLoaderRegistered = true; + } + return () => { for (const fn of cleanupFunctions) { fn(); @@ -77,6 +92,8 @@ export function getTsNodeTranspiler( const service = register({ transpileOnly: true, compilerOptions: getTsNodeCompilerOptions(compilerOptions), + // we already read and provide the compiler options, so prevent ts-node from reading them again + skipProject: true, }); const { transpiler, swc } = service.options; diff --git a/packages/nx/src/project-graph/file-utils.ts b/packages/nx/src/project-graph/file-utils.ts index 1760fdf383cacb..c07c9edfe8221f 100644 --- a/packages/nx/src/project-graph/file-utils.ts +++ b/packages/nx/src/project-graph/file-utils.ts @@ -133,7 +133,7 @@ function defaultReadFileAtRevision( } /** - * TODO(v18): Remove this function + * TODO(v19): Remove this function * @deprecated To get projects use {@link retrieveProjectConfigurations} instead */ export function readWorkspaceConfig(opts: { @@ -179,7 +179,7 @@ export { FileData }; export { readNxJson, workspaceLayout } from '../config/configuration'; /** - * TODO(v18): Remove this function. + * TODO(v19): Remove this function. */ function getProjectsSyncNoInference(root: string, nxJson: NxJsonConfiguration) { const projectFiles = retrieveProjectConfigurationPaths( diff --git a/packages/nx/src/project-graph/nx-deps-cache.ts b/packages/nx/src/project-graph/nx-deps-cache.ts index b5cfc9a7ff0625..f9fb5801a36674 100644 --- a/packages/nx/src/project-graph/nx-deps-cache.ts +++ b/packages/nx/src/project-graph/nx-deps-cache.ts @@ -116,7 +116,7 @@ export function createProjectFileMapCache( const newValue: FileMapCache = { version: '6.0', nxVersion: nxVersion, - deps: packageJsonDeps, // TODO(v18): We can remove this in favor of nxVersion + deps: packageJsonDeps, // TODO(v19): We can remove this in favor of nxVersion // compilerOptions may not exist, especially for package-based repos pathMappings: tsConfig?.compilerOptions?.paths || {}, nxJsonPlugins, diff --git a/packages/nx/src/project-graph/project-graph-builder.ts b/packages/nx/src/project-graph/project-graph-builder.ts index aa09bfb5fdb0b1..39978d05ceeeb1 100644 --- a/packages/nx/src/project-graph/project-graph-builder.ts +++ b/packages/nx/src/project-graph/project-graph-builder.ts @@ -20,7 +20,7 @@ import { getFileMap } from './build-project-graph'; /** * A class which builds up a project graph - * @deprecated The {@link ProjectGraphProcessor} has been deprecated. Use a {@link CreateNodes} and/or a {@link CreateDependencies} instead. This will be removed in Nx 18. + * @deprecated The {@link ProjectGraphProcessor} has been deprecated. Use a {@link CreateNodes} and/or a {@link CreateDependencies} instead. This will be removed in Nx 19. */ export class ProjectGraphBuilder { // TODO(FrozenPandaz): make this private diff --git a/packages/nx/src/tasks-runner/create-task-graph.ts b/packages/nx/src/tasks-runner/create-task-graph.ts index 8ed4e75c341149..41ac9c9b48fe44 100644 --- a/packages/nx/src/tasks-runner/create-task-graph.ts +++ b/packages/nx/src/tasks-runner/create-task-graph.ts @@ -345,7 +345,7 @@ export class ProcessTasks { qualifiedTarget, interpolatedOverrides ), - // TODO(v18): Remove cast here after typing is moved back onto TargetConfiguration + // TODO(v19): Remove cast here after typing is moved back onto TargetConfiguration cache: (project.data.targets[target] as any).cache, }; } diff --git a/packages/nx/src/tasks-runner/init-tasks-runner.ts b/packages/nx/src/tasks-runner/init-tasks-runner.ts index 26e9bb956ec646..68e7653ae2ab71 100644 --- a/packages/nx/src/tasks-runner/init-tasks-runner.ts +++ b/packages/nx/src/tasks-runner/init-tasks-runner.ts @@ -23,7 +23,7 @@ export async function initTasksRunner(nxArgs: NxArgs) { }): Promise<{ status: number; taskGraph: TaskGraph }> => { performance.mark('code-loading:end'); - // TODO: This polyfills the outputs if someone doesn't pass a task with outputs. Remove this in Nx 18 + // TODO: This polyfills the outputs if someone doesn't pass a task with outputs. Remove this in Nx 19 opts.tasks.forEach((t) => { if (!t.outputs) { t.outputs = getOutputs(projectGraph.nodes, t.target, t.overrides); diff --git a/packages/nx/src/tasks-runner/run-command.ts b/packages/nx/src/tasks-runner/run-command.ts index a2c2205a644577..d4968037dd6e52 100644 --- a/packages/nx/src/tasks-runner/run-command.ts +++ b/packages/nx/src/tasks-runner/run-command.ts @@ -260,7 +260,7 @@ export async function invokeTasksRunner({ title: `TaskGraph is now required as an argument to hashTask`, bodyLines: [ `The TaskGraph object can be retrieved from the context`, - 'This will result in an error in Nx 18', + 'This will result in an error in Nx 19', ], }); taskGraph_ = taskGraph; @@ -270,7 +270,7 @@ export async function invokeTasksRunner({ title: `The environment variables are now required as an argument to hashTask`, bodyLines: [ `Please pass the environment variables used when running the task`, - 'This will result in an error in Nx 18', + 'This will result in an error in Nx 19', ], }); env = process.env; @@ -287,7 +287,7 @@ export async function invokeTasksRunner({ title: `TaskGraph is now required as an argument to hashTasks`, bodyLines: [ `The TaskGraph object can be retrieved from the context`, - 'This will result in an error in Nx 18', + 'This will result in an error in Nx 19', ], }); taskGraph_ = taskGraph; @@ -297,7 +297,7 @@ export async function invokeTasksRunner({ title: `The environment variables are now required as an argument to hashTasks`, bodyLines: [ `Please pass the environment variables used when running the tasks`, - 'This will result in an error in Nx 18', + 'This will result in an error in Nx 19', ], }); env = process.env; diff --git a/packages/nx/src/tasks-runner/utils.ts b/packages/nx/src/tasks-runner/utils.ts index 955dfee1cb5ad4..8b53f765982e95 100644 --- a/packages/nx/src/tasks-runner/utils.ts +++ b/packages/nx/src/tasks-runner/utils.ts @@ -146,7 +146,7 @@ export function transformLegacyOutputs( } /** - * @deprecated Pass the target and overrides instead. This will be removed in v18. + * @deprecated Pass the target and overrides instead. This will be removed in v19. */ export function getOutputsForTargetAndConfiguration( task: Task, diff --git a/packages/nx/src/utils/nx-plugin.deprecated.ts b/packages/nx/src/utils/nx-plugin.deprecated.ts index d28a5022a4c7a2..c5c24129b964c2 100644 --- a/packages/nx/src/utils/nx-plugin.deprecated.ts +++ b/packages/nx/src/utils/nx-plugin.deprecated.ts @@ -7,37 +7,37 @@ import { getNxPackageJsonWorkspacesPlugin } from '../plugins/package-json-worksp import { LoadedNxPlugin, NxPluginV2 } from './nx-plugin'; /** - * @deprecated Add targets to the projects in a {@link CreateNodes} function instead. This will be removed in Nx 18 + * @deprecated Add targets to the projects in a {@link CreateNodes} function instead. This will be removed in Nx 19 */ export type ProjectTargetConfigurator = ( file: string ) => Record; /** - * @deprecated Use {@link NxPluginV2} instead. This will be removed in Nx 18 + * @deprecated Use {@link NxPluginV2} instead. This will be removed in Nx 19 */ export type NxPluginV1 = { name: string; /** - * @deprecated Use {@link CreateNodes} and {@link CreateDependencies} instead. This will be removed in Nx 18 + * @deprecated Use {@link CreateNodes} and {@link CreateDependencies} instead. This will be removed in Nx 19 */ processProjectGraph?: ProjectGraphProcessor; /** - * @deprecated Add targets to the projects inside of {@link CreateNodes} instead. This will be removed in Nx 18 + * @deprecated Add targets to the projects inside of {@link CreateNodes} instead. This will be removed in Nx 19 */ registerProjectTargets?: ProjectTargetConfigurator; /** * A glob pattern to search for non-standard project files. * @example: ["*.csproj", "pom.xml"] - * @deprecated Use {@link CreateNodes} instead. This will be removed in Nx 18 + * @deprecated Use {@link CreateNodes} instead. This will be removed in Nx 19 */ projectFilePatterns?: string[]; }; /** - * @todo(@agentender) v18: Remove this fn when we remove readWorkspaceConfig + * @todo(@agentender) v19: Remove this fn when we remove readWorkspaceConfig */ export function getDefaultPluginsSync(root: string): LoadedNxPlugin[] { const plugins: NxPluginV2[] = [ diff --git a/packages/nx/src/utils/typescript.ts b/packages/nx/src/utils/typescript.ts index 3f76f24ccb3a22..e22673d5cfd18d 100644 --- a/packages/nx/src/utils/typescript.ts +++ b/packages/nx/src/utils/typescript.ts @@ -1,3 +1,3 @@ -// TODO(v18): Nx Devkit 15 depends on this file. Remove this when we no longer support Nx Devkit 15 +// TODO(v19): Nx Devkit 15 depends on this file. Remove this when we no longer support Nx Devkit 15 export * from '../plugins/js/utils/typescript'; diff --git a/packages/nx/src/utils/workspace-configuration-check.ts b/packages/nx/src/utils/workspace-configuration-check.ts index 8899ea8de0fad4..e8c01dd96abd61 100644 --- a/packages/nx/src/utils/workspace-configuration-check.ts +++ b/packages/nx/src/utils/workspace-configuration-check.ts @@ -4,7 +4,7 @@ import { join } from 'path'; import { output } from './output'; import { readJsonFile } from '../utils/fileutils'; -//TODO: vsavkin remove after Nx 18 +//TODO: vsavkin remove after Nx 19 export function workspaceConfigurationCheck() { if (existsSync(join(workspaceRoot, 'workspace.json'))) { output.warn({ diff --git a/packages/playwright/migrations.json b/packages/playwright/migrations.json index 65a4590b7c5522..37537e0f433549 100644 --- a/packages/playwright/migrations.json +++ b/packages/playwright/migrations.json @@ -1,3 +1,10 @@ { - "generators": {} + "generators": { + "17-3-1-add-project-to-config": { + "cli": "nx", + "version": "17.3.1-beta.0", + "description": "Add project property to playwright config", + "implementation": "./src/migrations/update-17-3-1/add-project-to-config" + } + } } diff --git a/packages/playwright/package.json b/packages/playwright/package.json index ceb973fac9e2d7..187c437bcb0ea3 100644 --- a/packages/playwright/package.json +++ b/packages/playwright/package.json @@ -32,6 +32,7 @@ "directory": "packages/playwright" }, "dependencies": { + "@phenomnomnominal/tsquery": "~5.0.1", "@nx/devkit": "file:../devkit", "@nx/eslint": "file:../eslint", "@nx/js": "file:../js", diff --git a/packages/playwright/src/executors/playwright/schema.json b/packages/playwright/src/executors/playwright/schema.json index 4202bc111af86c..a7ee7820ef18a0 100644 --- a/packages/playwright/src/executors/playwright/schema.json +++ b/packages/playwright/src/executors/playwright/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "Playwright executor", "description": "Run Playwright tests.", diff --git a/packages/playwright/src/generators/configuration/schema.json b/packages/playwright/src/generators/configuration/schema.json index 34f1e104c05c90..1e286bee8253aa 100644 --- a/packages/playwright/src/generators/configuration/schema.json +++ b/packages/playwright/src/generators/configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxPlaywrightConfiguration", "description": "Add a Playwright configuration.", "title": "Add a Playwright configuration", diff --git a/packages/playwright/src/generators/init/schema.json b/packages/playwright/src/generators/init/schema.json index 8a8646c0c7d8a5..6b0b65b8379759 100644 --- a/packages/playwright/src/generators/init/schema.json +++ b/packages/playwright/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxPlaywrightInit", "title": "Playwright Init Generator", "description": "Initializes a Playwright project in the current workspace.", diff --git a/packages/playwright/src/migrations/update-17-3-1/__snapshots__/add-project-to-config.spec.ts.snap b/packages/playwright/src/migrations/update-17-3-1/__snapshots__/add-project-to-config.spec.ts.snap new file mode 100644 index 00000000000000..0bbbd2ca045c96 --- /dev/null +++ b/packages/playwright/src/migrations/update-17-3-1/__snapshots__/add-project-to-config.spec.ts.snap @@ -0,0 +1,55 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`update-nx-next-dependency should not update playwright.config.ts if projects is already defined 1`] = ` +"import { defineConfig } from '@playwright/test'; + import { nxE2EPreset } from '@nx/playwright/preset'; + + import { workspaceRoot } from '@nx/devkit'; + + const baseURL = process.env['BASE_URL'] || 'http://localhost:4200'; + + export default defineConfig({ + ...nxE2EPreset(__filename, { testDir: './src' }), + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + baseURL, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npx nx serve acme', + url: 'http://localhost:4200', + reuseExistingServer: !process.env.CI, + cwd: workspaceRoot, + }, + projects: [] + }); + " +`; + +exports[`update-nx-next-dependency should update playwright.config.ts 1`] = ` +"import { defineConfig, devices } from '@playwright/test'; +import { nxE2EPreset } from '@nx/playwright/preset'; +import { workspaceRoot } from '@nx/devkit'; +const baseURL = process.env['BASE_URL'] || 'http://localhost:4200'; +export default defineConfig({ ...nxE2EPreset(__filename, { testDir: './src' }), + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + baseURL, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npx nx serve acme', + url: 'http://localhost:4200', + reuseExistingServer: !process.env.CI, + cwd: workspaceRoot, + }, projects: [ + { name: "chromium", use: { ...devices["Desktop Chrome"] } }, + { name: "firefox", use: { ...devices["Desktop Firefox"] } }, + { name: "webkit", use: { ...devices["Desktop Safari"] } } + ] }); +" +`; diff --git a/packages/playwright/src/migrations/update-17-3-1/add-project-to-config.spec.ts b/packages/playwright/src/migrations/update-17-3-1/add-project-to-config.spec.ts new file mode 100644 index 00000000000000..06b01c54291753 --- /dev/null +++ b/packages/playwright/src/migrations/update-17-3-1/add-project-to-config.spec.ts @@ -0,0 +1,91 @@ +import { Tree, addProjectConfiguration } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from 'nx/src/devkit-testing-exports'; + +import update from './add-project-to-config'; + +describe('update-nx-next-dependency', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should update playwright.config.ts', async () => { + addProjectConfiguration(tree, 'acme', { + root: 'acme', + }); + + tree.write( + 'acme/playwright.config.ts', + `import { defineConfig } from '@playwright/test'; + import { nxE2EPreset } from '@nx/playwright/preset'; + + import { workspaceRoot } from '@nx/devkit'; + + const baseURL = process.env['BASE_URL'] || 'http://localhost:4200'; + + export default defineConfig({ + ...nxE2EPreset(__filename, { testDir: './src' }), + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + baseURL, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npx nx serve acme', + url: 'http://localhost:4200', + reuseExistingServer: !process.env.CI, + cwd: workspaceRoot, + } + }); + ` + ); + await update(tree); + + const content = tree.read('acme/playwright.config.ts', 'utf-8'); + expect(content).toContain('projects: ['); + expect(content).toMatchSnapshot(); + }); + + it('should not update playwright.config.ts if projects is already defined', async () => { + addProjectConfiguration(tree, 'acme', { + root: 'acme', + }); + + tree.write( + 'acme/playwright.config.ts', + `import { defineConfig } from '@playwright/test'; + import { nxE2EPreset } from '@nx/playwright/preset'; + + import { workspaceRoot } from '@nx/devkit'; + + const baseURL = process.env['BASE_URL'] || 'http://localhost:4200'; + + export default defineConfig({ + ...nxE2EPreset(__filename, { testDir: './src' }), + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + baseURL, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npx nx serve acme', + url: 'http://localhost:4200', + reuseExistingServer: !process.env.CI, + cwd: workspaceRoot, + }, + projects: [] + }); + ` + ); + await update(tree); + expect(tree.read('acme/playwright.config.ts', 'utf-8')).toContain( + 'projects: []' + ); + expect(tree.read('acme/playwright.config.ts', 'utf-8')).toMatchSnapshot(); + }); +}); diff --git a/packages/playwright/src/migrations/update-17-3-1/add-project-to-config.ts b/packages/playwright/src/migrations/update-17-3-1/add-project-to-config.ts new file mode 100644 index 00000000000000..b48ec74f1ca52e --- /dev/null +++ b/packages/playwright/src/migrations/update-17-3-1/add-project-to-config.ts @@ -0,0 +1,198 @@ +import { Tree, getProjects, joinPathFragments } from '@nx/devkit'; +import * as ts from 'typescript'; +import { tsquery } from '@phenomnomnominal/tsquery'; + +export default async function update(tree: Tree) { + const projects = getProjects(tree); + projects.forEach((project) => { + // Check if the project contains playwright config + const configPath = joinPathFragments(project.root, 'playwright.config.ts'); + if (tree.exists(configPath)) { + addProjectIfExists(tree, joinPathFragments(configPath)); + } + }); +} + +function addProjectIfExists(tree: Tree, configFilePath: string) { + const configFileContent = tree.read(configFilePath, 'utf-8'); + + const sourceFile = tsquery.ast(configFileContent); + const printer = ts.createPrinter(); + + const updatedStatements = updateOrCreateImportStatement( + sourceFile, + '@playwright/test', + ['devices'] + ); + + const exportAssignment = tsquery.query( + sourceFile, + 'ExportAssignment' + )[0] as ts.ExportAssignment; + if (!exportAssignment) { + // No export found in the file + return; + } + + const exportAssignemntObject = exportAssignment.expression; + if ( + !( + ts.isCallExpression(exportAssignemntObject) && + exportAssignemntObject.getText(sourceFile).startsWith('defineConfig') && + exportAssignemntObject.arguments.length > 0 + ) + ) { + // Export is not a call expression with defineConfig ex. export default defineConfig({ ... }) + return; + } + let firstArgument = exportAssignemntObject.arguments[0]; + if (!ts.isObjectLiteralExpression(firstArgument)) { + // First argument is not an object literal ex. defineConfig('foo') + return; + } + const projectProperty = tsquery.query( + exportAssignemntObject, + 'PropertyAssignment > Identifier[name="projects"]' + )[0] as ts.PropertyAssignment; + if (projectProperty) { + // Projects property already exists in the config + return; + } + + // Add projects property to the config + const projectsArray = ts.factory.createArrayLiteralExpression( + [ + createProperty('chromium', 'Desktop Chrome'), + createProperty('firefox', 'Desktop Firefox'), + createProperty('webkit', 'Desktop Safari'), + ], + true + ); + + const newProjectsProperty = ts.factory.createPropertyAssignment( + 'projects', + projectsArray + ); + + const newObj = ts.factory.createObjectLiteralExpression([ + ...firstArgument.properties, + newProjectsProperty, + ]); + + const newCallExpression = ts.factory.updateCallExpression( + exportAssignemntObject, + exportAssignemntObject.expression, + exportAssignemntObject.typeArguments, + [newObj] + ); + + const newExportAssignment = ts.factory.updateExportAssignment( + exportAssignment, + exportAssignment.modifiers, + newCallExpression + ); + + const transformedStatements = updatedStatements.map((statement) => { + return statement === exportAssignment ? newExportAssignment : statement; + }) as ts.Statement[]; + + const transformedSourceFile = ts.factory.updateSourceFile( + sourceFile, + transformedStatements + ); + + const updatedConfigFileContent = printer.printFile(transformedSourceFile); + tree.write(configFilePath, updatedConfigFileContent); +} + +function createProperty(name: string, device: string) { + return ts.factory.createObjectLiteralExpression([ + ts.factory.createPropertyAssignment( + 'name', + ts.factory.createStringLiteral(name) + ), + ts.factory.createPropertyAssignment( + 'use', + ts.factory.createObjectLiteralExpression([ + ts.factory.createSpreadAssignment( + ts.factory.createElementAccessExpression( + ts.factory.createIdentifier('devices'), + ts.factory.createStringLiteral(device) + ) + ), + ]) + ), + ]); +} + +function updateOrCreateImportStatement( + sourceFile: ts.SourceFile, + moduleName: string, + importNames: string[] +): ts.Statement[] { + let importDeclarationFound = false; + const newStatements = sourceFile.statements.map((statement) => { + if ( + ts.isImportDeclaration(statement) && + statement.moduleSpecifier.getText(sourceFile) === `'${moduleName}'` + ) { + importDeclarationFound = true; + const existingSpecifiers = + statement.importClause?.namedBindings && + ts.isNamedImports(statement.importClause.namedBindings) + ? statement.importClause.namedBindings.elements.map( + (e) => e.name.text + ) + : []; + // Merge with new import names, avoiding duplicates + const mergedImportNames = Array.from( + new Set([...existingSpecifiers, ...importNames]) + ); + + // Create new import specifiers + const importSpecifiers = mergedImportNames.map((name) => + ts.factory.createImportSpecifier( + false, + undefined, + ts.factory.createIdentifier(name) + ) + ); + + return ts.factory.updateImportDeclaration( + statement, + statement.modifiers, + ts.factory.createImportClause( + false, + undefined, + ts.factory.createNamedImports(importSpecifiers) + ), + statement.moduleSpecifier, + undefined + ); + } + return statement; + }); + + if (!importDeclarationFound) { + const importDeclaration = ts.factory.createImportDeclaration( + undefined, + ts.factory.createImportClause( + false, + undefined, + ts.factory.createNamedImports( + importNames.map((name) => + ts.factory.createImportSpecifier( + false, + undefined, + ts.factory.createIdentifier(name) + ) + ) + ) + ), + ts.factory.createStringLiteral(moduleName) + ); + newStatements.push(importDeclaration); + } + + return newStatements; +} diff --git a/packages/playwright/src/plugins/plugin.spec.ts b/packages/playwright/src/plugins/plugin.spec.ts index 7353f5f86abe2e..98739fb3b597f5 100644 --- a/packages/playwright/src/plugins/plugin.spec.ts +++ b/packages/playwright/src/plugins/plugin.spec.ts @@ -8,7 +8,7 @@ import { PlaywrightTestConfig } from '@playwright/test'; // we overwrite the dynamic import function to use the regular syntax, which // jest does handle. import * as lcf from '../utils/load-config-file'; -(lcf as any).dynamicImport = (m) => import(m); +(lcf as any).dynamicImport = (m) => require(m.split('?')[0]); describe('@nx/playwright/plugin', () => { let createNodesFunction = createNodes[1]; @@ -34,7 +34,7 @@ describe('@nx/playwright/plugin', () => { }); afterEach(() => { - tempFs.cleanup(); + // tempFs.cleanup(); jest.resetModules(); }); diff --git a/packages/playwright/src/utils/load-config-file.ts b/packages/playwright/src/utils/load-config-file.ts index 37a02dd9172e36..b9ecaca7937861 100644 --- a/packages/playwright/src/utils/load-config-file.ts +++ b/packages/playwright/src/utils/load-config-file.ts @@ -14,43 +14,25 @@ export async function loadPlaywrightConfig( ): Promise { { let module: any; + const configPathWithTimestamp = `${configFilePath}?t=${Date.now()}`; if (extname(configFilePath) === '.ts') { const tsConfigPath = getRootTsConfigPath(); if (tsConfigPath) { const unregisterTsProject = registerTsProject(tsConfigPath); try { - // Require's cache doesn't notice when the file is updated, and - // this function is ran during daemon operation. If the config file - // is updated, we need to read its new contents, so we need to clear the cache. - // We can't just delete the cache entry for the config file, because - // it might have imports that need to be updated as well. - clearRequireCache(); - // ts-node doesn't support dynamic import, so we need to use require - module = require(configFilePath); + module = await dynamicImport(configPathWithTimestamp); } finally { unregisterTsProject(); } } else { - module = await dynamicImport(configFilePath); + module = await dynamicImport(configPathWithTimestamp); } } else { - module = await dynamicImport(configFilePath); + module = await dynamicImport(configPathWithTimestamp); } return module.default ?? module; } } const packageInstallationDirectories = ['node_modules', '.yarn']; - -function clearRequireCache() { - Object.keys(require.cache).forEach((key: string) => { - // We don't want to clear the require cache of installed packages. - // Clearing them can cause some issues when running Nx without the daemon - // and may cause issues for other packages that use the module state - // in some to store cached information. - if (!packageInstallationDirectories.some((dir) => key.includes(dir))) { - delete require.cache[key]; - } - }); -} diff --git a/packages/plugin/executors.json b/packages/plugin/executors.json index 91bdd162fe74ff..cc20d4f0860182 100644 --- a/packages/plugin/executors.json +++ b/packages/plugin/executors.json @@ -4,7 +4,7 @@ "implementation": "./src/executors/e2e/e2e.impl", "schema": "./src/executors/e2e/schema.json", "description": "Creates and runs the E2E tests for an Nx Plugin.", - "x-deprecated": "@nx/plugin:e2e is deprecated and will be removed in Nx 18. Use @nx/jest:jest instead." + "x-deprecated": "@nx/plugin:e2e is deprecated and will be removed in Nx v19. Use @nx/jest:jest instead." } } } diff --git a/packages/plugin/src/executors/e2e/e2e.impl.ts b/packages/plugin/src/executors/e2e/e2e.impl.ts index 4428e3b968ff80..27f8f95b7a3cad 100644 --- a/packages/plugin/src/executors/e2e/e2e.impl.ts +++ b/packages/plugin/src/executors/e2e/e2e.impl.ts @@ -11,7 +11,7 @@ import { JestExecutorOptions } from '@nx/jest/src/executors/jest/schema'; import { jestExecutor } from '@nx/jest/src/executors/jest/jest.impl'; import type { NxPluginE2EExecutorOptions } from './schema'; -// TODO(v18): remove this +// TODO(v19): remove this export async function* nxPluginE2EExecutor( options: NxPluginE2EExecutorOptions, context: ExecutorContext @@ -19,7 +19,7 @@ export async function* nxPluginE2EExecutor( const { target, ...jestOptions } = options; output.warn({ - title: `"@nx/plugin:e2e" is deprecated and will be removed in Nx 18`, + title: `"@nx/plugin:e2e" is deprecated and will be removed in Nx 19`, bodyLines: [ 'Use the "@nx/jest:jest" executor instead and set the following:', `"dependsOn": ["${target}"]`, diff --git a/packages/plugin/src/generators/create-package/schema.json b/packages/plugin/src/generators/create-package/schema.json index 62b05e4b625856..8b33ac75b0a36a 100644 --- a/packages/plugin/src/generators/create-package/schema.json +++ b/packages/plugin/src/generators/create-package/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginCreatePackage", "title": "Create a framework package", diff --git a/packages/plugin/src/generators/e2e-project/schema.json b/packages/plugin/src/generators/e2e-project/schema.json index 0a66bde2c5c02c..a5de92ffdbaa24 100644 --- a/packages/plugin/src/generators/e2e-project/schema.json +++ b/packages/plugin/src/generators/e2e-project/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginE2E", "title": "Create an E2E app for a Nx Plugin", diff --git a/packages/plugin/src/generators/executor/files/executor/schema.json.template b/packages/plugin/src/generators/executor/files/executor/schema.json.template index 8b87936519db2a..806f74368dc220 100644 --- a/packages/plugin/src/generators/executor/files/executor/schema.json.template +++ b/packages/plugin/src/generators/executor/files/executor/schema.json.template @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "title": "<%= className %> executor", "description": "", diff --git a/packages/plugin/src/generators/executor/schema.d.ts b/packages/plugin/src/generators/executor/schema.d.ts index 3fea6251a93e0c..51af74fe4f9bab 100644 --- a/packages/plugin/src/generators/executor/schema.d.ts +++ b/packages/plugin/src/generators/executor/schema.d.ts @@ -11,7 +11,7 @@ export interface Schema { skipFormat?: boolean; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/plugin/src/generators/executor/schema.json b/packages/plugin/src/generators/executor/schema.json index fd473e980b3ef4..4a598499af9e63 100644 --- a/packages/plugin/src/generators/executor/schema.json +++ b/packages/plugin/src/generators/executor/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginExecutor", "title": "Create an Executor for an Nx Plugin", @@ -62,7 +62,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipFormat": { "type": "boolean", diff --git a/packages/plugin/src/generators/generator/files/generator/schema.json.template b/packages/plugin/src/generators/generator/files/generator/schema.json.template index 191f4f0c9e6dff..96fed5c0fedeec 100644 --- a/packages/plugin/src/generators/generator/files/generator/schema.json.template +++ b/packages/plugin/src/generators/generator/files/generator/schema.json.template @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "<%= className %>", "title": "", "type": "object", diff --git a/packages/plugin/src/generators/generator/schema.d.ts b/packages/plugin/src/generators/generator/schema.d.ts index cf72cc77541c38..fc88a1906baf73 100644 --- a/packages/plugin/src/generators/generator/schema.d.ts +++ b/packages/plugin/src/generators/generator/schema.d.ts @@ -10,7 +10,7 @@ export interface Schema { nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/plugin/src/generators/generator/schema.json b/packages/plugin/src/generators/generator/schema.json index a004eae6c58656..a93943342b4c3e 100644 --- a/packages/plugin/src/generators/generator/schema.json +++ b/packages/plugin/src/generators/generator/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginGenerator", "title": "Create a Generator for an Nx Plugin", @@ -51,7 +51,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "skipFormat": { "type": "boolean", diff --git a/packages/plugin/src/generators/lint-checks/schema.json b/packages/plugin/src/generators/lint-checks/schema.json index 81142fed83618b..f79ae03e2eb92a 100644 --- a/packages/plugin/src/generators/lint-checks/schema.json +++ b/packages/plugin/src/generators/lint-checks/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "PluginLint", "title": "", diff --git a/packages/plugin/src/generators/migration/schema.d.ts b/packages/plugin/src/generators/migration/schema.d.ts index e878fef87d25e5..60935922879f66 100644 --- a/packages/plugin/src/generators/migration/schema.d.ts +++ b/packages/plugin/src/generators/migration/schema.d.ts @@ -10,7 +10,7 @@ export interface Schema { nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/plugin/src/generators/migration/schema.json b/packages/plugin/src/generators/migration/schema.json index fc3f3481cf71c1..683d8e6a79951e 100644 --- a/packages/plugin/src/generators/migration/schema.json +++ b/packages/plugin/src/generators/migration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginMigration", "title": "Create a Migration for an Nx Plugin", @@ -44,7 +44,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "packageJsonUpdates": { "type": "boolean", diff --git a/packages/plugin/src/generators/plugin/schema.json b/packages/plugin/src/generators/plugin/schema.json index e9d4f42e10ef40..93312df508bdec 100644 --- a/packages/plugin/src/generators/plugin/schema.json +++ b/packages/plugin/src/generators/plugin/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginPlugin", "title": "Create a Plugin for Nx", diff --git a/packages/plugin/src/generators/preset/schema.json b/packages/plugin/src/generators/preset/schema.json index 24676350cf70cf..e4573011d1b19f 100644 --- a/packages/plugin/src/generators/preset/schema.json +++ b/packages/plugin/src/generators/preset/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxPluginPreset", "title": "Generator ran by create-nx-plugin", diff --git a/packages/react-native/.eslintrc.json b/packages/react-native/.eslintrc.json index ace2a5e1787e85..e8e9cfd950259a 100644 --- a/packages/react-native/.eslintrc.json +++ b/packages/react-native/.eslintrc.json @@ -32,7 +32,12 @@ "react-native", // These are in ensurePackage "@nx/rollup", - "@nx/storybook" + "@nx/storybook", + "@nx/vite", + "@nx/webpack", + "@nx/detox", + "@nx/cypress", + "@nx/playwright" ] } ] diff --git a/packages/react-native/executors.json b/packages/react-native/executors.json index 08be40c7d455f2..d8f2acaf333385 100644 --- a/packages/react-native/executors.json +++ b/packages/react-native/executors.json @@ -49,6 +49,11 @@ "implementation": "./src/executors/pod-install/pod-install.impl", "schema": "./src/executors/pod-install/schema.json", "description": "Run `pod install` in the `ios` directory." + }, + "upgrade": { + "implementation": "./src/executors/upgrade/upgrade.impl", + "schema": "./src/executors/upgrade/schema.json", + "description": "upgrade executor" } } } diff --git a/packages/react-native/generators.json b/packages/react-native/generators.json index 6a905b6c0980bf..8c97d1d19a9b5b 100644 --- a/packages/react-native/generators.json +++ b/packages/react-native/generators.json @@ -6,7 +6,7 @@ "init": { "factory": "./src/generators/init/init#reactNativeInitGenerator", "schema": "./src/generators/init/schema.json", - "description": "Initialize the `@nrwl/react-native` plugin.", + "description": "Initialize the `@nx/react-native` plugin.", "hidden": true }, "application": { @@ -32,26 +32,27 @@ "storybook-configuration": { "factory": "./src/generators/storybook-configuration/configuration#storybookConfigurationGenerator", "schema": "./src/generators/storybook-configuration/schema.json", - "description": "Set up Storybook for a React-native application or library.", - "hidden": false + "description": "Set up Storybook for a React Native application or library." }, "component-story": { "factory": "./src/generators/component-story/component-story#componentStoryGenerator", "schema": "./src/generators/component-story/schema.json", - "description": "Generate Storybook story for a React-native component.", - "hidden": false + "description": "Generate Storybook story for a React Native component." }, "stories": { "factory": "./src/generators/stories/stories#storiesGenerator", "schema": "./src/generators/stories/schema.json", - "description": "Create stories/specs for all components declared in an application or library.", - "hidden": false + "description": "Create stories for all components declared in an application or library." }, "upgrade-native": { "factory": "./src/generators/upgrade-native/upgrade-native#reactNativeUpgradeNativeGenerator", "schema": "./src/generators/upgrade-native/schema.json", - "description": "Destructive command to upgrade native iOS and Android code to latest.", - "hidden": false + "description": "Destructive command to upgrade native iOS and Android code to latest." + }, + "web-configuration": { + "factory": "./src/generators/web-configuration/web-configuration#webConfigurationGenerator", + "schema": "./src/generators/web-configuration/schema.json", + "description": "Set up web configuration for a React Native app" } } } diff --git a/packages/react-native/migrations.json b/packages/react-native/migrations.json index 88dd3693be4cfc..4fbaa12442e24d 100644 --- a/packages/react-native/migrations.json +++ b/packages/react-native/migrations.json @@ -41,6 +41,42 @@ "version": "16.9.0-beta.1", "description": "Remove @types/react-native from package.json", "implementation": "./src/migrations/update-16-9-0/remove-types-react-native" + }, + "update-18-0-0-add-web-configuration": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Add web configuration to react native projects", + "implementation": "./src/migrations/update-18-0-0/add-web-configuration" + }, + "update-18-0-0-change-storybook-targets": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Upgrade react native storybook target to use web", + "implementation": "./src/migrations/update-18-0-0/change-storybook-targets" + }, + "update-18-0-0-remove-block-list": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Remove blockList in metro.config.js.", + "implementation": "./src/migrations/update-18-0-0/remove-block-list" + }, + "update-18-0-0-remove-metro": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Remove metro-* and @react-native-community/cli-* from package.json devDependencies", + "implementation": "./src/migrations/update-18-0-0/remove-metro" + }, + "update-18-0-0-remove-symlink-target": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Remove ensure-symlink target", + "implementation": "./src/migrations/update-18-0-0/remove-symlink-target" + }, + "update-18-0-0-add-upgrade-target": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Add upgrade target to react native projects", + "implementation": "./src/migrations/update-18-0-0/add-upgrade-target" } }, "packageJsonUpdates": { @@ -551,7 +587,43 @@ "version": "17.3.0-beta.3", "packages": { "@types/node": { - "version": "18.16.9", + "version": "18.16.9" + } + } + }, + "18.0.0": { + "version": "18.0.0-beta.0", + "packages": { + "react-native": { + "version": "0.73.2", + "alwaysAddToPackageJson": false + }, + "@react-native/babel-preset": { + "version": "^0.73.18", + "addToPackageJson": "devDependencies" + }, + "@react-native/metro-config": { + "version": "^0.73.2", + "addToPackageJson": "devDependencies" + }, + "@types/react": { + "version": "~18.2.45", + "alwaysAddToPackageJson": false + }, + "@testing-library/react-native": { + "version": "~12.4.2", + "alwaysAddToPackageJson": false + }, + "react-native-svg-transformer": { + "version": "1.2.0", + "alwaysAddToPackageJson": false + }, + "react-native-svg": { + "version": "14.1.0", + "alwaysAddToPackageJson": false + }, + "@react-native-community/cli-platform-android": { + "version": "12.3.0", "alwaysAddToPackageJson": false } } diff --git a/packages/react-native/package.json b/packages/react-native/package.json index d76482c700b64f..391d6fb5795507 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -30,13 +30,11 @@ "fs-extra": "^11.1.0", "glob": "7.1.4", "ignore": "^5.0.4", - "metro-config": "~0.76.8", - "metro-resolver": "~0.76.8", - "minimatch": "9.0.3", + "metro-config": "~0.80.4", + "metro-resolver": "~0.80.4", "node-fetch": "^2.6.7", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", - "@nx/detox": "file:../detox", "@nx/devkit": "file:../devkit", "@nx/jest": "file:../jest", "@nx/js": "file:../js", @@ -44,9 +42,6 @@ "@nx/react": "file:../react", "@nx/workspace": "file:../workspace" }, - "peerDependencies": { - "react-native": ">= 0.72.0 < 0.73.0" - }, "executors": "./executors.json", "ng-update": { "requirements": {}, diff --git a/packages/react-native/plugins/metro-resolver.ts b/packages/react-native/plugins/metro-resolver.ts index 3e9b70a72cd973..9273b187eedce4 100644 --- a/packages/react-native/plugins/metro-resolver.ts +++ b/packages/react-native/plugins/metro-resolver.ts @@ -45,6 +45,11 @@ export function getResolveRequest(extensions: string[]) { if (resolvedPath) { return resolvedPath; } + if (debug) { + console.log( + chalk.red(`[Nx] Unable to resolve with any resolver: ${realModuleName}`) + ); + } throw new Error(`Cannot resolve ${chalk.bold(realModuleName)}`); }; } @@ -53,7 +58,7 @@ function resolveRequestFromContext( resolveRequest: Function, context: any, realModuleName: string, - platform: string, + platform: string | null, debug: boolean ) { try { @@ -75,7 +80,7 @@ function resolveRequestFromContext( function defaultMetroResolver( context: any, realModuleName: string, - platform: string, + platform: string | null, debug: boolean ) { try { @@ -130,7 +135,7 @@ function tsconfigPathsResolver( context: any, extensions: string[], realModuleName: string, - platform: string, + platform: string | null, debug: boolean ) { try { @@ -145,7 +150,7 @@ function tsconfigPathsResolver( } catch { if (debug) { console.log( - chalk.red(`[Nx] Failed to resolve ${chalk.bold(realModuleName)}`) + chalk.cyan(`[Nx] Failed to resolve ${chalk.bold(realModuleName)}`) ); console.log( chalk.cyan( diff --git a/packages/react-native/plugins/with-nx-metro.ts b/packages/react-native/plugins/with-nx-metro.ts index 2bb660b286ef62..812bb1d77526b6 100644 --- a/packages/react-native/plugins/with-nx-metro.ts +++ b/packages/react-native/plugins/with-nx-metro.ts @@ -1,7 +1,7 @@ -import { workspaceRoot } from '@nx/devkit'; +import { joinPathFragments, workspaceRoot } from '@nx/devkit'; import { mergeConfig } from 'metro-config'; import type { MetroConfig } from 'metro-config'; -import { existsSync } from 'fs-extra'; +import { existsSync, readdirSync, statSync } from 'fs-extra'; import { getResolveRequest } from './metro-resolver'; @@ -19,16 +19,26 @@ export async function withNxMetro( if (opts.debug) process.env.NX_REACT_NATIVE_DEBUG = 'true'; if (opts.extensions) extensions.push(...opts.extensions); - let watchFolders = [workspaceRoot]; + let watchFolders = readdirSync(workspaceRoot) + .filter( + (fileName) => + !['dist', 'e2e'].includes(fileName) && !fileName.startsWith('.') + ) + .map((fileName) => joinPathFragments(workspaceRoot, fileName)) + .filter((filePath) => statSync(filePath).isDirectory()); + if (opts.watchFolders?.length) { watchFolders = watchFolders.concat(opts.watchFolders); } - watchFolders = watchFolders.filter((folder) => existsSync(folder)); + watchFolders = [...new Set(watchFolders)].filter((folder) => + existsSync(folder) + ); const nxConfig: MetroConfig = { resolver: { resolveRequest: getResolveRequest(extensions), + nodeModulesPaths: [joinPathFragments(workspaceRoot, 'node_modules')], }, watchFolders, }; diff --git a/packages/react-native/src/executors/build-android/build-android.impl.ts b/packages/react-native/src/executors/build-android/build-android.impl.ts index ddec0c376aea11..a60e552a7d6b1d 100644 --- a/packages/react-native/src/executors/build-android/build-android.impl.ts +++ b/packages/react-native/src/executors/build-android/build-android.impl.ts @@ -27,13 +27,9 @@ function runCliBuild( options: ReactNativeBuildAndroidOptions ) { return new Promise((res, reject) => { - /** - * Call the react native cli with option `--no-packager` - * Not passing '--packager' due to cli will launch start command from the project root - */ const childProcess = fork( require.resolve('react-native/cli.js'), - ['build-android', ...createBuildAndroidOptions(options), '--no-packager'], + ['build-android', ...createBuildAndroidOptions(options)], { stdio: 'inherit', cwd: pathResolve(workspaceRoot, projectRoot), diff --git a/packages/react-native/src/executors/build-android/schema.json b/packages/react-native/src/executors/build-android/schema.json index 88fc39d8d186c3..ead6f8c8bb13c3 100644 --- a/packages/react-native/src/executors/build-android/schema.json +++ b/packages/react-native/src/executors/build-android/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeBuildAndroid", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Release Build for Android", "description": "Build target options for Android.", "type": "object", diff --git a/packages/react-native/src/executors/build-ios/schema.json b/packages/react-native/src/executors/build-ios/schema.json index c8b012669eb8cb..f21e24990c2a58 100644 --- a/packages/react-native/src/executors/build-ios/schema.json +++ b/packages/react-native/src/executors/build-ios/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "cli": "nx", "title": "React Native Build iOS executor", diff --git a/packages/react-native/src/executors/bundle/schema.d.ts b/packages/react-native/src/executors/bundle/schema.d.ts index 81f9cbc0bc2abe..8cb46715abc317 100644 --- a/packages/react-native/src/executors/bundle/schema.d.ts +++ b/packages/react-native/src/executors/bundle/schema.d.ts @@ -1,4 +1,4 @@ -// options form https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle +// options form https://github.com/facebook/react-native/tree/main/packages/community-cli-plugin#bundle export interface ReactNativeBundleOptions { entryFile: string; platform: string; diff --git a/packages/react-native/src/executors/bundle/schema.json b/packages/react-native/src/executors/bundle/schema.json index 3bf30ce819a34d..36c94fc8b16289 100644 --- a/packages/react-native/src/executors/bundle/schema.json +++ b/packages/react-native/src/executors/bundle/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeBundle", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Offline JS Bundle for React Native", "description": "JS Bundle target options.", "type": "object", diff --git a/packages/react-native/src/executors/ensure-symlink/ensure-symlink.impl.ts b/packages/react-native/src/executors/ensure-symlink/ensure-symlink.impl.ts index bda508e47a0dc5..c7661f0f427b3d 100644 --- a/packages/react-native/src/executors/ensure-symlink/ensure-symlink.impl.ts +++ b/packages/react-native/src/executors/ensure-symlink/ensure-symlink.impl.ts @@ -5,6 +5,10 @@ export interface ReactNativeEnsureSymlinkOutput { success: boolean; } +/** + * TODO (@xiongemi): remove this function in v19. + * @deprecated It is no longer needed for react native 73. + */ export default async function* ensureSymlinkExecutor( _, context: ExecutorContext diff --git a/packages/react-native/src/executors/ensure-symlink/schema.json b/packages/react-native/src/executors/ensure-symlink/schema.json index bc644af9701a51..6f1bf919d3ef9b 100644 --- a/packages/react-native/src/executors/ensure-symlink/schema.json +++ b/packages/react-native/src/executors/ensure-symlink/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeEnsureSymlink", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Ensure Symlink for React Native", "description": "Ensure workspace node_modules is symlink under app's node_modules folder.", "type": "object", diff --git a/packages/react-native/src/executors/pod-install/schema.json b/packages/react-native/src/executors/pod-install/schema.json index 4cd0f4628fe597..9479e3df651600 100644 --- a/packages/react-native/src/executors/pod-install/schema.json +++ b/packages/react-native/src/executors/pod-install/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativePodInstall", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run Pod Install for React Native iOS Project", "description": "Run `pod install` for React Native iOS Project.", "type": "object", diff --git a/packages/react-native/src/executors/run-android/run-android.impl.ts b/packages/react-native/src/executors/run-android/run-android.impl.ts index 6c6a0a1a515b42..61658298b037fc 100644 --- a/packages/react-native/src/executors/run-android/run-android.impl.ts +++ b/packages/react-native/src/executors/run-android/run-android.impl.ts @@ -3,7 +3,7 @@ import { join, resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; import { ReactNativeRunAndroidOptions } from './schema'; -import startExecutor from '../start/start.impl'; +import { runCliStart } from '../start/start.impl'; import { chmodAndroidGradlewFiles } from '../../utils/chmod-android-gradle-files'; import { getCliOptions } from '../../utils/get-cli-options'; @@ -21,29 +21,20 @@ export default async function* runAndroidExecutor( context.projectsConfigurations.projects[context.projectName].root; chmodAndroidGradlewFiles(join(projectRoot, 'android')); + const tasks = [runCliRunAndroid(context.root, projectRoot, options)]; + if (options.mode !== 'Release') { - const startResults = startExecutor( - { + tasks.push( + runCliStart(context.root, projectRoot, { port: options.port, resetCache: options.resetCache, interactive: true, - }, - context + }) ); - for await (const result of startResults) { - if (result.success) { - await runCliRunAndroid(context.root, projectRoot, options); - yield { - success: true, - }; - } else { - return result; - } - } - } else { - await runCliRunAndroid(context.root, projectRoot, options); } + await Promise.all(tasks); + yield { success: true }; } diff --git a/packages/react-native/src/executors/run-android/schema.json b/packages/react-native/src/executors/run-android/schema.json index da2a3cd49599ed..8a9a1a3c5c02ab 100644 --- a/packages/react-native/src/executors/run-android/schema.json +++ b/packages/react-native/src/executors/run-android/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeRunAndroid", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run Android application", "description": "Run Android target options.", "type": "object", diff --git a/packages/react-native/src/executors/run-ios/run-ios.impl.ts b/packages/react-native/src/executors/run-ios/run-ios.impl.ts index 8aa65bfcb5054d..b0ee8068e8f849 100644 --- a/packages/react-native/src/executors/run-ios/run-ios.impl.ts +++ b/packages/react-native/src/executors/run-ios/run-ios.impl.ts @@ -1,9 +1,9 @@ -import { ExecutorContext } from '@nx/devkit'; +import { ExecutorContext, GeneratorCallback, workspaceRoot } from '@nx/devkit'; import { resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; import { platform } from 'os'; -import startExecutor from '../start/start.impl'; +import { runCliStart } from '../start/start.impl'; import { getCliOptions } from '../../utils/get-cli-options'; import { ReactNativeRunIosOptions } from './schema'; @@ -21,29 +21,20 @@ export default async function* runIosExecutor( const projectRoot = context.projectsConfigurations.projects[context.projectName].root; + const tasks = [runCliRunIOS(context.root, projectRoot, options)]; + if (options.mode !== 'Release') { - const startResults = startExecutor( - { + tasks.push( + runCliStart(context.root, projectRoot, { port: options.port, resetCache: options.resetCache, interactive: true, - }, - context + }) ); - for await (const result of startResults) { - if (result.success) { - await runCliRunIOS(context.root, projectRoot, options); - yield { - success: true, - }; - } else { - return result; - } - } - } else { - await runCliRunIOS(context.root, projectRoot, options); } + await Promise.all(tasks); + yield { success: true }; } diff --git a/packages/react-native/src/executors/run-ios/schema.json b/packages/react-native/src/executors/run-ios/schema.json index 6d57f31ef458dc..50f9b385482b26 100644 --- a/packages/react-native/src/executors/run-ios/schema.json +++ b/packages/react-native/src/executors/run-ios/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeRunIos", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Run iOS application", "description": "Run iOS target options.", "type": "object", diff --git a/packages/react-native/src/executors/start/schema.d.ts b/packages/react-native/src/executors/start/schema.d.ts index 6a50e82fcdc7f0..e32a9bad2715c1 100644 --- a/packages/react-native/src/executors/start/schema.d.ts +++ b/packages/react-native/src/executors/start/schema.d.ts @@ -1,4 +1,4 @@ -// options from https://github.com/react-native-community/cli/blob/main/packages/cli-plugin-metro/src/commands/start/index.ts +// options from https://github.com/facebook/react-native/blob/main/packages/community-cli-plugin/src/commands/start/index.js export interface ReactNativeStartOptions { port: number; diff --git a/packages/react-native/src/executors/start/schema.json b/packages/react-native/src/executors/start/schema.json index 82e084b9d8675a..e05587d85bb0f2 100644 --- a/packages/react-native/src/executors/start/schema.json +++ b/packages/react-native/src/executors/start/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeStart", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Packager Server for React Native", "description": "Packager Server target options.", "type": "object", diff --git a/packages/react-native/src/executors/start/start.impl.ts b/packages/react-native/src/executors/start/start.impl.ts index 32186729f462f6..c64ae7aefb77ab 100644 --- a/packages/react-native/src/executors/start/start.impl.ts +++ b/packages/react-native/src/executors/start/start.impl.ts @@ -16,27 +16,12 @@ export default async function* startExecutor( const projectRoot = context.projectsConfigurations.projects[context.projectName].root; - const startProcess = await runCliStart(context.root, projectRoot, options); + await runCliStart(context.root, projectRoot, options); yield { port: options.port, success: true, }; - - if (!startProcess) { - return; - } - await new Promise((resolve) => { - const processExitListener = (signal?: number | NodeJS.Signals) => () => { - startProcess.kill(signal); - resolve(); - process.exit(); - }; - process.once('exit', (signal) => startProcess.kill(signal)); - process.once('SIGTERM', processExitListener); - process.once('SIGINT', processExitListener); - process.once('SIGQUIT', processExitListener); - }); } /* @@ -61,7 +46,9 @@ export async function runCliStart( return await startAsync(workspaceRoot, projectRoot, options); } catch (error) { logger.error( - `Failed to start the packager server. Error details: ${error.message}` + `Failed to start the packager server. Error details: ${ + error.message ?? error + }` ); throw error; } @@ -80,20 +67,10 @@ function startAsync( { cwd: pathResolve(workspaceRoot, projectRoot), env: process.env, - stdio: ['inherit', 'pipe', 'pipe', 'ipc'], + stdio: 'inherit', } ); - childProcess.stdout.on('data', (data) => { - process.stdout.write(data); - if (data.toString().includes('reload the app')) { - resolve(childProcess); - } - }); - childProcess.stderr.on('data', (data) => { - process.stderr.write(data); - }); - childProcess.on('error', (err) => { reject(err); }); @@ -104,6 +81,15 @@ function startAsync( reject(code); } }); + + const processExitListener = (signal?: number | NodeJS.Signals) => () => { + childProcess.kill(signal); + process.exit(); + }; + process.once('exit', (signal) => childProcess.kill(signal)); + process.once('SIGTERM', processExitListener); + process.once('SIGINT', processExitListener); + process.once('SIGQUIT', processExitListener); }); } diff --git a/packages/react-native/src/executors/storybook/storybook.impl.ts b/packages/react-native/src/executors/storybook/storybook.impl.ts index 21b48b995a45ee..070222442e26c6 100644 --- a/packages/react-native/src/executors/storybook/storybook.impl.ts +++ b/packages/react-native/src/executors/storybook/storybook.impl.ts @@ -11,6 +11,10 @@ import { } from '../sync-deps/sync-deps.impl'; import { writeFileSync } from 'fs-extra'; +/** + * TODO (@xiongemi): remove this function in v19. + * @deprecated Going to use the default react storybook target. Use @nx/react:storybook executor instead. + */ export default async function* reactNativeStorybookExecutor( options: ReactNativeStorybookOptions, context: ExecutorContext @@ -28,21 +32,15 @@ export default async function* reactNativeStorybookExecutor( if (fileExists(packageJsonPath)) displayNewlyAddedDepsMessage( context.projectName, - await syncDeps( - context.projectName, - projectRoot, - context.root, - context.projectGraph, - [ - `@storybook/react-native`, - '@storybook/addon-ondevice-actions', - '@storybook/addon-ondevice-backgrounds', - '@storybook/addon-ondevice-controls', - '@storybook/addon-ondevice-notes', - '@react-native-async-storage/async-storage', - 'react-native-safe-area-context', - ] - ) + await syncDeps(projectRoot, context.root, [ + `@storybook/react-native`, + '@storybook/addon-ondevice-actions', + '@storybook/addon-ondevice-backgrounds', + '@storybook/addon-ondevice-controls', + '@storybook/addon-ondevice-notes', + '@react-native-async-storage/async-storage', + 'react-native-safe-area-context', + ]) ); runCliStorybook(context.root, options); diff --git a/packages/react-native/src/executors/sync-deps/schema.json b/packages/react-native/src/executors/sync-deps/schema.json index cbdc0b04ad74c4..3e685663d53dba 100644 --- a/packages/react-native/src/executors/sync-deps/schema.json +++ b/packages/react-native/src/executors/sync-deps/schema.json @@ -3,7 +3,7 @@ "outputCapture": "direct-nodejs", "cli": "nx", "$id": "NxReactNativeSyncDeps", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Sync Deps for React Native", "description": "Updates `package.json` with project dependencies.", "type": "object", diff --git a/packages/react-native/src/executors/sync-deps/sync-deps.impl.ts b/packages/react-native/src/executors/sync-deps/sync-deps.impl.ts index c5a7529e348814..d6b9d531d0b174 100644 --- a/packages/react-native/src/executors/sync-deps/sync-deps.impl.ts +++ b/packages/react-native/src/executors/sync-deps/sync-deps.impl.ts @@ -3,13 +3,10 @@ import * as chalk from 'chalk'; import { ExecutorContext, logger, - ProjectGraph, readJsonFile, writeJsonFile, } from '@nx/devkit'; -import { findAllNpmDependencies } from '../../utils/find-all-npm-dependencies'; - import { ReactNativeSyncDepsOptions } from './schema'; export interface ReactNativeSyncDepsOutput { @@ -25,10 +22,8 @@ export default async function* syncDepsExecutor( displayNewlyAddedDepsMessage( context.projectName, await syncDeps( - context.projectName, projectRoot, context.root, - context.projectGraph, typeof options.include === 'string' ? options.include.split(',') : options.include, @@ -42,14 +37,16 @@ export default async function* syncDepsExecutor( } export async function syncDeps( - projectName: string, projectRoot: string, workspaceRoot: string, - projectGraph: ProjectGraph, include: string[] = [], exclude: string[] = [] ): Promise { - let npmDeps = findAllNpmDependencies(projectGraph, projectName); + const workspacePackageJsonPath = join(workspaceRoot, 'package.json'); + const workspacePackageJson = readJsonFile(workspacePackageJsonPath); + let npmDeps = Object.keys(workspacePackageJson.dependencies || {}); + let npmDevdeps = Object.keys(workspacePackageJson.devDependencies || {}); + const packageJsonPath = join(workspaceRoot, projectRoot, 'package.json'); const packageJson = readJsonFile(packageJsonPath); const newDeps = []; @@ -67,13 +64,27 @@ export async function syncDeps( npmDeps = npmDeps.filter((dep) => !exclude.includes(dep)); } + if (!packageJson.devDependencies) { + packageJson.devDependencies = {}; + } + if (!packageJson.dependencies) { + packageJson.dependencies = {}; + } + npmDeps.forEach((dep) => { - if (!packageJson.dependencies[dep]) { + if (!packageJson.dependencies[dep] && !packageJson.devDependencies[dep]) { packageJson.dependencies[dep] = '*'; newDeps.push(dep); updated = true; } }); + npmDevdeps.forEach((dep) => { + if (!packageJson.dependencies[dep] && !packageJson.devDependencies[dep]) { + packageJson.devDependencies[dep] = '*'; + newDeps.push(dep); + updated = true; + } + }); if (updated) { writeJsonFile(packageJsonPath, packageJson); diff --git a/packages/react-native/src/executors/upgrade/schema.d.ts b/packages/react-native/src/executors/upgrade/schema.d.ts new file mode 100644 index 00000000000000..5a44ba86cde0ae --- /dev/null +++ b/packages/react-native/src/executors/upgrade/schema.d.ts @@ -0,0 +1 @@ +export interface UpgradeExecutorSchema {} diff --git a/packages/react-native/src/executors/upgrade/schema.json b/packages/react-native/src/executors/upgrade/schema.json new file mode 100644 index 00000000000000..15f30c50b3ef75 --- /dev/null +++ b/packages/react-native/src/executors/upgrade/schema.json @@ -0,0 +1,11 @@ +{ + "$schema": "http://json-schema.org/schema", + "version": 2, + "cli": "nx", + "$id": "NxReactNativeUpgrade", + "title": "React Native Upgrade Executor", + "description": "Upgrade React Native code for project.", + "type": "object", + "properties": {}, + "required": [] +} diff --git a/packages/react-native/src/executors/upgrade/upgrade.impl.ts b/packages/react-native/src/executors/upgrade/upgrade.impl.ts new file mode 100644 index 00000000000000..4d76e379e4584a --- /dev/null +++ b/packages/react-native/src/executors/upgrade/upgrade.impl.ts @@ -0,0 +1,64 @@ +import { ExecutorContext } from '@nx/devkit'; +import { resolve as pathResolve } from 'path'; +import { ChildProcess, fork } from 'child_process'; + +import { UpgradeExecutorSchema } from './schema'; + +export interface ReactNativeUpgradeOutput { + success: boolean; +} + +/** + * This executor is equivalent to `npx react-native upgrade`. + * https://github.com/react-native-community/cli/blob/main/packages/cli/src/commands/upgrade/upgrade.ts + */ +export default async function* upgradeExecutor( + options: UpgradeExecutorSchema, + context: ExecutorContext +): AsyncGenerator { + const projectRoot = + context.projectsConfigurations.projects[context.projectName].root; + + await runCliUpgrade(context.root, projectRoot); + yield { success: true }; +} + +export function runCliUpgrade( + workspaceRoot: string, + projectRoot: string +): Promise { + return new Promise((resolve, reject) => { + const childProcess = fork( + require.resolve('react-native/cli.js'), + ['upgrade'], + { + stdio: 'inherit', + cwd: pathResolve(workspaceRoot, projectRoot), + env: process.env, + } + ); + + /** + * Ensure the child process is killed when the parent exits + */ + const processExitListener = (signal?: number | NodeJS.Signals) => () => { + childProcess.kill(signal); + process.exit(); + }; + process.once('exit', (signal) => childProcess.kill(signal)); + process.once('SIGTERM', processExitListener); + process.once('SIGINT', processExitListener); + process.once('SIGQUIT', processExitListener); + + childProcess.on('error', (err) => { + reject(err); + }); + childProcess.on('exit', (code) => { + if (code === 0) { + resolve(childProcess); + } else { + reject(code); + } + }); + }); +} diff --git a/packages/react-native/src/generators/application/application.spec.ts b/packages/react-native/src/generators/application/application.spec.ts index 2957492c4fa8c1..0e0eaca7bfbd3f 100644 --- a/packages/react-native/src/generators/application/application.spec.ts +++ b/packages/react-native/src/generators/application/application.spec.ts @@ -24,6 +24,8 @@ describe('app', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + unitTestRunner: 'none', + bundler: 'vite', }); const projects = getProjects(appTree); @@ -39,6 +41,8 @@ describe('app', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + unitTestRunner: 'none', + bundler: 'vite', }); const projectConfiguration = readProjectConfiguration(appTree, 'my-app'); @@ -55,6 +59,8 @@ describe('app', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + unitTestRunner: 'jest', + bundler: 'vite', }); expect(appTree.exists('my-app/src/app/App.tsx')).toBeTruthy(); expect(appTree.exists('my-app/src/main.tsx')).toBeTruthy(); @@ -74,6 +80,17 @@ describe('app', () => { moduleNameMapper: { '\\\\.svg$': '@nx/react-native/plugins/jest/svg-mock', }, + transform: { + '^.+.(js|ts|tsx)$': [ + 'babel-jest', + { + configFile: __dirname + '/.babelrc.js', + }, + ], + '^.+.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$': require.resolve( + 'react-native/jest/assetFileTransformer.js' + ), + }, coverageDirectory: '../coverage/my-app', }; " @@ -88,6 +105,8 @@ describe('app', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + unitTestRunner: 'jest', + bundler: 'vite', }); const targets = readProjectConfiguration(appTree, 'my-app').targets; expect(targets.test).toBeDefined(); @@ -103,6 +122,8 @@ describe('app', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + unitTestRunner: 'none', + bundler: 'vite', }); const tsconfig = readJson(appTree, 'my-app/tsconfig.json'); @@ -118,6 +139,8 @@ describe('app', () => { e2eTestRunner: 'detox', install: false, projectNameAndRootFormat: 'as-provided', + bundler: 'vite', + unitTestRunner: 'none', }); const projects = getProjects(appTree); @@ -168,6 +191,8 @@ describe('app', () => { e2eTestRunner: 'detox', install: false, projectNameAndRootFormat: 'as-provided', + bundler: 'vite', + unitTestRunner: 'none', }); const projects = getProjects(appTree); @@ -223,6 +248,8 @@ describe('app', () => { install: false, skipPackageJson: true, projectNameAndRootFormat: 'as-provided', + unitTestRunner: 'none', + bundler: 'webpack', }); expect(readJson(appTree, 'package.json')).toEqual(packageJsonBefore); diff --git a/packages/react-native/src/generators/application/application.ts b/packages/react-native/src/generators/application/application.ts index 6019cd12e17d8b..b33c3a2234f72f 100644 --- a/packages/react-native/src/generators/application/application.ts +++ b/packages/react-native/src/generators/application/application.ts @@ -2,24 +2,27 @@ import { formatFiles, GeneratorCallback, joinPathFragments, + output, runTasksInSerial, Tree, } from '@nx/devkit'; import { initGenerator as jsInitGenerator } from '@nx/js'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; -import { runSymlink } from '../../utils/symlink-task'; import { addLinting } from '../../utils/add-linting'; import { addJest } from '../../utils/add-jest'; import { chmodAndroidGradlewFilesTask } from '../../utils/chmod-android-gradle-files'; import { runPodInstall } from '../../utils/pod-install-task'; +import { webConfigurationGenerator } from '../web-configuration/web-configuration'; import { normalizeOptions } from './lib/normalize-options'; import initGenerator from '../init/init'; import { addProject } from './lib/add-project'; import { createApplicationFiles } from './lib/create-application-files'; -import { addDetox } from './lib/add-detox'; +import { addE2e } from './lib/add-e2e'; import { Schema } from './schema'; import { ensureDependencies } from '../../utils/ensure-dependencies'; +import { syncDeps } from '../../executors/sync-deps/sync-deps.impl'; export async function reactNativeApplicationGenerator( host: Tree, @@ -71,10 +74,17 @@ export async function reactNativeApplicationGeneratorInternal( options.skipPackageJson ); tasks.push(jestTask); - const detoxTask = await addDetox(host, options); - tasks.push(detoxTask); - const symlinkTask = runSymlink(host.root, options.appProjectRoot); - tasks.push(symlinkTask); + + const webTask = await webConfigurationGenerator(host, { + ...options, + project: options.name, + skipFormat: true, + }); + tasks.push(webTask); + + const e2eTask = await addE2e(host, options); + tasks.push(e2eTask); + const chmodTaskGradlewTask = chmodAndroidGradlewFilesTask( joinPathFragments(host.root, options.androidProjectRoot) ); @@ -84,13 +94,25 @@ export async function reactNativeApplicationGeneratorInternal( joinPathFragments(host.root, options.iosProjectRoot) ); if (options.install) { + await syncDeps(options.appProjectRoot, host.root); tasks.push(podInstallTask); + } else { + output.log({ + title: 'Skip `pod install`', + bodyLines: [ + `run 'nx run ${options.name}:pod-install' to install native modules before running iOS app`, + ], + }); } if (!options.skipFormat) { await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/react-native/src/generators/application/files/app/.babelrc.js.template b/packages/react-native/src/generators/application/files/app/.babelrc.js.template new file mode 100644 index 00000000000000..f356c489b5b0c1 --- /dev/null +++ b/packages/react-native/src/generators/application/files/app/.babelrc.js.template @@ -0,0 +1,23 @@ +module.exports = function (api) { + api.cache(true); + + if ( + process.env.NX_TASK_TARGET_TARGET === 'build' || + process.env.NX_TASK_TARGET_TARGET.includes('storybook') + ) { + return { + presets: [ + [ + '@nx/react/babel', + { + runtime: 'automatic', + }, + ], + ], + }; + } + + return { + presets: [['module:@react-native/babel-preset', { "useTransformReactJSX": true }]], + }; +}; diff --git a/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template b/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template index 1fc5a2aeb56438..b5600f3f53a878 100644 --- a/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template +++ b/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template @@ -1,4 +1,5 @@ apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" apply plugin: "com.facebook.react" /** @@ -9,12 +10,12 @@ react { /* Folders */ // The root of your project, i.e. where "package.json" lives. Default is '..' // root = file("../") - // The folder where the react-native NPM package is. Default is ../node_modules/react-native - // reactNativeDir = file("../node_modules/react-native") - // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen - // codegenDir = file("../node_modules/@react-native/codegen") - // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js - // cliFile = file("../node_modules/react-native/cli.js") + // The folder where the react-native NPM package is. Default is <%= offsetFromRoot %>../../node_modules/react-native + reactNativeDir = file("<%= offsetFromRoot %>../../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is <%= offsetFromRoot %>../../node_modules/@react-native/codegen + codegenDir = file("<%= offsetFromRoot %>../../node_modules/@react-native/codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is <%= offsetFromRoot %>../../node_modules/react-native/cli.js + cliFile = file("<%= offsetFromRoot %>../../node_modules/react-native/cli.js") /* Variants */ // The list of variants to that are debuggable. For those we're going to @@ -36,7 +37,7 @@ react { // bundleAssetName = "MyApplication.android.bundle" // // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' - // entryFile = file("../js/MyApplication.android.js") + entryFile = file("../../<%= entryFile %>") // // A list of extra flags to pass to the 'bundle' commands. // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle @@ -48,7 +49,6 @@ react { // // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" // hermesFlags = ["-O", "-output-source-map"] - entryFile = file("../../<%= entryFile %>") } /** @@ -71,8 +71,8 @@ def jscFlavor = 'org.webkit:android-jsc:+' android { ndkVersion rootProject.ext.ndkVersion - - compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion namespace "com.<%= lowerCaseName %>" defaultConfig { @@ -81,10 +81,6 @@ android { targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" - <% if (e2eTestRunner === 'detox') { %> - testBuildType System.getProperty('testBuildType', 'debug') - testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' - <% } %> } signingConfigs { debug { @@ -104,27 +100,15 @@ android { signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - <% if (e2eTestRunner === 'detox') { %> - proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro" - <% } %> } } } dependencies { - <% if (e2eTestRunner === 'detox') { %> - androidTestImplementation('com.wix:detox:+') - implementation 'androidx.appcompat:appcompat:1.1.0' - <% } %> // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") + implementation("com.facebook.react:flipper-integration") - debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") - debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { - exclude group:'com.squareup.okhttp3', module:'okhttp' - } - - debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") if (hermesEnabled.toBoolean()) { implementation("com.facebook.react:hermes-android") } else { @@ -132,4 +116,4 @@ dependencies { } } -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) +apply from: file("<%= offsetFromRoot %>../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/debug/AndroidManifest.xml.template b/packages/react-native/src/generators/application/files/app/android/app/src/debug/AndroidManifest.xml.template index 447dd46e6b9ba5..c1e2798356b7d5 100644 --- a/packages/react-native/src/generators/application/files/app/android/app/src/debug/AndroidManifest.xml.template +++ b/packages/react-native/src/generators/application/files/app/android/app/src/debug/AndroidManifest.xml.template @@ -2,13 +2,9 @@ - - - - + android:networkSecurityConfig="@xml/network_security_config" + tools:ignore="GoogleAppIndexingWarning"/> diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/debug/java/com/__lowerCaseName__/ReactNativeFlipper.java.template b/packages/react-native/src/generators/application/files/app/android/app/src/debug/java/com/__lowerCaseName__/ReactNativeFlipper.java.template deleted file mode 100644 index 98ee2683e5296a..00000000000000 --- a/packages/react-native/src/generators/application/files/app/android/app/src/debug/java/com/__lowerCaseName__/ReactNativeFlipper.java.template +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - *

This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. - */ -package com.<%= lowerCaseName %>; - -import android.content.Context; -import com.facebook.flipper.android.AndroidFlipperClient; -import com.facebook.flipper.android.utils.FlipperUtils; -import com.facebook.flipper.core.FlipperClient; -import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; -import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; -import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; -import com.facebook.flipper.plugins.inspector.DescriptorMapping; -import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; -import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; -import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; -import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; -import com.facebook.react.ReactInstanceEventListener; -import com.facebook.react.ReactInstanceManager; -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.modules.network.NetworkingModule; -import okhttp3.OkHttpClient; - -/** - * Class responsible of loading Flipper inside your React Native application. This is the debug - * flavor of it. Here you can add your own plugins and customize the Flipper setup. - */ -public class ReactNativeFlipper { - public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { - if (FlipperUtils.shouldEnableFlipper(context)) { - final FlipperClient client = AndroidFlipperClient.getInstance(context); - - client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); - client.addPlugin(new DatabasesFlipperPlugin(context)); - client.addPlugin(new SharedPreferencesFlipperPlugin(context)); - client.addPlugin(CrashReporterPlugin.getInstance()); - - NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); - NetworkingModule.setCustomClientBuilder( - new NetworkingModule.CustomClientBuilder() { - @Override - public void apply(OkHttpClient.Builder builder) { - builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); - } - }); - client.addPlugin(networkFlipperPlugin); - client.start(); - - // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized - // Hence we run if after all native modules have been initialized - ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); - if (reactContext == null) { - reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceEventListener() { - @Override - public void onReactContextInitialized(ReactContext reactContext) { - reactInstanceManager.removeReactInstanceEventListener(this); - reactContext.runOnNativeModulesQueueThread( - new Runnable() { - @Override - public void run() { - client.addPlugin(new FrescoFlipperPlugin()); - } - }); - } - }); - } else { - client.addPlugin(new FrescoFlipperPlugin()); - } - } - } -} diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template deleted file mode 100644 index 14464a3569d316..00000000000000 --- a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template +++ /dev/null @@ -1,32 +0,0 @@ -package com.<%= lowerCaseName %>; - -import com.facebook.react.ReactActivity; -import com.facebook.react.ReactActivityDelegate; -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; -import com.facebook.react.defaults.DefaultReactActivityDelegate; - -public class MainActivity extends ReactActivity { - - /** - * Returns the name of the main component registered from JavaScript. This is used to schedule - * rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "<%= className %>"; - } - - /** - * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link - * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React - * (aka React 18) with two boolean flags. - */ - @Override - protected ReactActivityDelegate createReactActivityDelegate() { - return new DefaultReactActivityDelegate( - this, - getMainComponentName(), - // If you opted-in for the New Architecture, we enable the Fabric Renderer. - DefaultNewArchitectureEntryPoint.getFabricEnabled()); - } -} diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.kt.template b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.kt.template new file mode 100644 index 00000000000000..0550ea85248bd4 --- /dev/null +++ b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.kt.template @@ -0,0 +1,22 @@ +package com.<%= lowerCaseName %> + +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +class MainActivity : ReactActivity() { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "<%= className %>" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate = + DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) +} diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.java.template b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.java.template deleted file mode 100644 index 9d9e6cb0b487d2..00000000000000 --- a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.java.template +++ /dev/null @@ -1,62 +0,0 @@ -package com.<%= lowerCaseName %>; - -import android.app.Application; -import com.facebook.react.PackageList; -import com.facebook.react.ReactApplication; -import com.facebook.react.ReactNativeHost; -import com.facebook.react.ReactPackage; -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; -import com.facebook.react.defaults.DefaultReactNativeHost; -import com.facebook.soloader.SoLoader; -import java.util.List; - -public class MainApplication extends Application implements ReactApplication { - - private final ReactNativeHost mReactNativeHost = - new DefaultReactNativeHost(this) { - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - @Override - protected List getPackages() { - @SuppressWarnings("UnnecessaryLocalVariable") - List packages = new PackageList(this).getPackages(); - // Packages that cannot be autolinked yet can be added manually here, for example: - // packages.add(new MyReactNativePackage()); - return packages; - } - - @Override - protected String getJSMainModuleName() { - return "<%= entryFile %>"; - } - - @Override - protected boolean isNewArchEnabled() { - return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; - } - - @Override - protected Boolean isHermesEnabled() { - return BuildConfig.IS_HERMES_ENABLED; - } - }; - - @Override - public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; - } - - @Override - public void onCreate() { - super.onCreate(); - SoLoader.init(this, /* native exopackage */ false); - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - DefaultNewArchitectureEntryPoint.load(); - } - ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); - } -} diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.kt.template b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.kt.template new file mode 100644 index 00000000000000..e47ff79b94bfa7 --- /dev/null +++ b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.kt.template @@ -0,0 +1,45 @@ +package com.<%= lowerCaseName %> + +import android.app.Application +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load +import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost +import com.facebook.react.defaults.DefaultReactNativeHost +import com.facebook.react.flipper.ReactNativeFlipper +import com.facebook.soloader.SoLoader + +class MainApplication : Application(), ReactApplication { + + override val reactNativeHost: ReactNativeHost = + object : DefaultReactNativeHost(this) { + override fun getPackages(): List { + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + return PackageList(this).packages + } + + override fun getJSMainModuleName(): String = "src/main" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + + override val reactHost: ReactHost + get() = getDefaultReactHost(this.applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + SoLoader.init(this, false) + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + load() + } + ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager) + } +} diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/release/java/com/__lowerCaseName__/ReactNativeFlipper.java.template b/packages/react-native/src/generators/application/files/app/android/app/src/release/java/com/__lowerCaseName__/ReactNativeFlipper.java.template deleted file mode 100644 index 1b6b639092c355..00000000000000 --- a/packages/react-native/src/generators/application/files/app/android/app/src/release/java/com/__lowerCaseName__/ReactNativeFlipper.java.template +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - *

This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. - */ -package com.<%= lowerCaseName %>; - -import android.content.Context; -import com.facebook.react.ReactInstanceManager; - -/** - * Class responsible of loading Flipper inside your React Native application. This is the release - * flavor of it so it's empty as we don't want to load Flipper. - */ -public class ReactNativeFlipper { - public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { - // Do nothing as we don't want to initialize Flipper on Release. - } -} diff --git a/packages/react-native/src/generators/application/files/app/android/build.gradle.template b/packages/react-native/src/generators/application/files/app/android/build.gradle.template index d73116028ca365..cb9d6232a7044e 100644 --- a/packages/react-native/src/generators/application/files/app/android/build.gradle.template +++ b/packages/react-native/src/generators/application/files/app/android/build.gradle.template @@ -1,15 +1,11 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { ext { - buildToolsVersion = "33.0.0" + buildToolsVersion = "34.0.0" minSdkVersion = 21 - compileSdkVersion = 33 - targetSdkVersion = 33 - kotlinVersion = "1.8.20" - - // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. - ndkVersion = "23.1.7779620" + compileSdkVersion = 34 + targetSdkVersion = 34 + ndkVersion = "25.1.8937393" + kotlinVersion = "1.8.0" } repositories { google() @@ -18,17 +14,8 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle") classpath("com.facebook.react:react-native-gradle-plugin") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") } } -allprojects { - repositories { - <% if (e2eTestRunner === 'detox') { %> - maven { - // https://wix.github.io/Detox/docs/introduction/project-setup - url("$rootDir/../node_modules/detox/Detox-android") - } - <% } %> - } -} \ No newline at end of file +apply plugin: "com.facebook.react.rootproject" diff --git a/packages/react-native/src/generators/application/files/app/android/gradle.properties b/packages/react-native/src/generators/application/files/app/android/gradle.properties index a3b2fa12490544..a46a5b90fad015 100644 --- a/packages/react-native/src/generators/application/files/app/android/gradle.properties +++ b/packages/react-native/src/generators/application/files/app/android/gradle.properties @@ -24,9 +24,6 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true -# Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.182.0 - # Use this property to specify which architecture you want to build. # You can also override it from the CLI using # ./gradlew -PreactNativeArchitectures=x86_64 diff --git a/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties b/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties index 6ec1567a0f8831..d11cdd907dd9dc 100644 --- a/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/packages/react-native/src/generators/application/files/app/android/gradlew.template b/packages/react-native/src/generators/application/files/app/android/gradlew.template index 65dcd68d65c82f..0adc8e1a53214b 100755 --- a/packages/react-native/src/generators/application/files/app/android/gradlew.template +++ b/packages/react-native/src/generators/application/files/app/android/gradlew.template @@ -83,10 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,6 +198,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in diff --git a/packages/react-native/src/generators/application/files/app/android/settings.gradle.template b/packages/react-native/src/generators/application/files/app/android/settings.gradle.template index f63882142348ae..465e513104b4a7 100644 --- a/packages/react-native/src/generators/application/files/app/android/settings.gradle.template +++ b/packages/react-native/src/generators/application/files/app/android/settings.gradle.template @@ -1,4 +1,4 @@ rootProject.name = '<%= className %>' -apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) +apply from: file("<%= offsetFromRoot %>../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' -includeBuild('../node_modules/@react-native/gradle-plugin') +includeBuild('<%= offsetFromRoot %>../node_modules/@react-native/gradle-plugin') diff --git a/packages/react-native/src/generators/application/files/app/babel.config.json.template b/packages/react-native/src/generators/application/files/app/babel.config.json.template deleted file mode 100644 index d4b74b5be7b43d..00000000000000 --- a/packages/react-native/src/generators/application/files/app/babel.config.json.template +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["module:metro-react-native-babel-preset"] -} diff --git a/packages/react-native/src/generators/application/files/app/ios/Podfile.template b/packages/react-native/src/generators/application/files/app/ios/Podfile.template index 66dbc3b75c62dc..405a51dc25c73b 100644 --- a/packages/react-native/src/generators/application/files/app/ios/Podfile.template +++ b/packages/react-native/src/generators/application/files/app/ios/Podfile.template @@ -28,14 +28,8 @@ end target '<%= className %>' do config = use_native_modules! - # Flags change depending on the env values. - flags = get_default_flags() - use_react_native!( :path => config[:reactNativePath], - # Hermes is now enabled by default. Disable by setting this flag to false. - :hermes_enabled => flags[:hermes_enabled], - :fabric_enabled => flags[:fabric_enabled], # Enables Flipper. # # Note that if you have use_frameworks! enabled, Flipper will not work and @@ -57,6 +51,5 @@ target '<%= className %>' do config[:reactNativePath], :mac_catalyst_enabled => false ) - __apply_Xcode_12_5_M1_post_install_workaround(installer) end end diff --git a/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template b/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template index f7e32c049d8f31..b8d02064bc8830 100644 --- a/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template +++ b/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template @@ -177,7 +177,6 @@ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "<%= className %>" */; buildPhases = ( C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, - FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, @@ -264,7 +263,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"<%= offsetFromRoot %>../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"<%= offsetFromRoot %>../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -378,25 +377,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-<%= className %>-<%= className %>Tests/Pods-<%= className %>-<%= className %>Tests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - FD10A7F022414F080027D42C /* Start Packager */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Start Packager"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -438,7 +418,7 @@ "$(inherited)", ); INFOPLIST_FILE = <%= className %>Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -462,7 +442,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = <%= className %>Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -536,7 +516,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -564,7 +544,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -580,7 +560,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -592,14 +572,13 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; }; name = Debug; @@ -609,7 +588,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -637,7 +616,7 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -646,7 +625,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -657,14 +636,13 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template b/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template index c9fa608d40b91e..fe50bbf45b7981 100644 --- a/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template +++ b/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template @@ -15,6 +15,11 @@ } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ + return [self getBundleURL]; +} + +- (NSURL *)getBundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"<%= entryFileIos %>"]; diff --git a/packages/react-native/src/generators/application/files/app/ios/__className__/Info.plist.template b/packages/react-native/src/generators/application/files/app/ios/__className__/Info.plist.template index 27af648595f5e2..f2bee7da03cac5 100644 --- a/packages/react-native/src/generators/application/files/app/ios/__className__/Info.plist.template +++ b/packages/react-native/src/generators/application/files/app/ios/__className__/Info.plist.template @@ -26,14 +26,11 @@ NSAppTransportSecurity - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + NSLocationWhenInUseUsageDescription diff --git a/packages/react-native/src/generators/application/files/app/metro.config.js.template b/packages/react-native/src/generators/application/files/app/metro.config.js.template index 04f62fb8d35927..6064f0dd467878 100644 --- a/packages/react-native/src/generators/application/files/app/metro.config.js.template +++ b/packages/react-native/src/generators/application/files/app/metro.config.js.template @@ -1,6 +1,5 @@ const { withNxMetro } = require('@nx/react-native'); const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); const defaultConfig = getDefaultConfig(__dirname); const { assetExts, sourceExts } = defaultConfig.resolver; @@ -18,9 +17,6 @@ const customConfig = { resolver: { assetExts: assetExts.filter((ext) => ext !== 'svg'), sourceExts: [...sourceExts, 'svg'], - blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), - // unstable_enableSymlinks: true, - // unstable_enablePackageExports: true, }, }; diff --git a/packages/react-native/src/generators/application/files/app/src/app/App.tsx.template b/packages/react-native/src/generators/application/files/app/src/app/App.tsx.template index e5cb0340647911..ca13a637a7fd3b 100644 --- a/packages/react-native/src/generators/application/files/app/src/app/App.tsx.template +++ b/packages/react-native/src/generators/application/files/app/src/app/App.tsx.template @@ -19,7 +19,10 @@ export const App = () => { return ( <> - + { scrollViewRef.current = ref; @@ -29,7 +32,7 @@ export const App = () => { > Hello there, - + Welcome <%= displayName %> 👋 diff --git a/packages/react-native/src/generators/application/lib/add-detox.ts b/packages/react-native/src/generators/application/lib/add-detox.ts deleted file mode 100644 index e3ebc558b25d16..00000000000000 --- a/packages/react-native/src/generators/application/lib/add-detox.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { detoxApplicationGenerator } from '@nx/detox'; -import { Tree } from '@nx/devkit'; -import { NormalizedSchema } from './normalize-options'; -import { Linter } from '@nx/eslint'; - -export async function addDetox(host: Tree, options: NormalizedSchema) { - if (options?.e2eTestRunner !== 'detox') { - return () => {}; - } - - return detoxApplicationGenerator(host, { - ...options, - linter: Linter.EsLint, - e2eName: `${options.projectName}-e2e`, - e2eDirectory: `${options.appProjectRoot}-e2e`, - projectNameAndRootFormat: 'as-provided', - appProject: options.projectName, - appDisplayName: options.displayName, - appName: options.name, - framework: 'react-native', - skipFormat: true, - }); -} diff --git a/packages/react-native/src/generators/application/lib/add-e2e.ts b/packages/react-native/src/generators/application/lib/add-e2e.ts new file mode 100644 index 00000000000000..3640e6c642d218 --- /dev/null +++ b/packages/react-native/src/generators/application/lib/add-e2e.ts @@ -0,0 +1,52 @@ +import { addE2e as addE2eReact } from '@nx/react/src/generators/application/lib/add-e2e'; +import { GeneratorCallback, Tree, ensurePackage } from '@nx/devkit'; + +import { nxVersion } from '../../../utils/versions'; + +import { NormalizedSchema } from './normalize-options'; + +export async function addE2e( + host: Tree, + options: NormalizedSchema +): Promise { + switch (options.e2eTestRunner) { + case 'cypress': + return addE2eReact(host, { + ...options, + e2eTestRunner: 'cypress', + style: 'none', + styledModule: null, + hasStyles: false, + unitTestRunner: 'none', + }); + case 'playwright': + return addE2eReact(host, { + ...options, + e2eTestRunner: 'playwright', + style: 'none', + styledModule: null, + hasStyles: false, + unitTestRunner: 'none', + }); + case 'detox': + case 'detox': + const { detoxApplicationGenerator } = ensurePackage< + typeof import('@nx/detox') + >('@nx/detox', nxVersion); + return detoxApplicationGenerator(host, { + ...options, + e2eName: options.e2eProjectName, + e2eDirectory: options.e2eProjectRoot, + projectNameAndRootFormat: 'as-provided', + appProject: options.projectName, + appDisplayName: options.displayName, + appName: options.name, + framework: 'react-native', + setParserOptionsProject: options.setParserOptionsProject, + skipFormat: true, + }); + case 'none': + default: + return () => {}; + } +} diff --git a/packages/react-native/src/generators/application/lib/add-project.ts b/packages/react-native/src/generators/application/lib/add-project.ts index 61cf88cb731db8..6d9563c450ba24 100644 --- a/packages/react-native/src/generators/application/lib/add-project.ts +++ b/packages/react-native/src/generators/application/lib/add-project.ts @@ -33,28 +33,21 @@ function getTargets(options: NormalizedSchema) { architect.start = { executor: '@nx/react-native:start', - dependsOn: ['ensure-symlink', 'sync-deps', 'pod-install'], + dependsOn: [], options: { port: 8081, }, }; - architect.serve = { - executor: 'nx:run-commands', - options: { - command: `nx start ${options.projectName}`, - }, - }; - architect['run-ios'] = { executor: '@nx/react-native:run-ios', - dependsOn: ['ensure-symlink', 'sync-deps', 'pod-install'], + dependsOn: [], options: {}, }; architect['bundle-ios'] = { executor: '@nx/react-native:bundle', - dependsOn: ['ensure-symlink'], + dependsOn: [], outputs: ['{options.bundleOutput}'], options: { entryFile: options.entryFile, @@ -65,7 +58,7 @@ function getTargets(options: NormalizedSchema) { architect['run-android'] = { executor: '@nx/react-native:run-android', - dependsOn: ['ensure-symlink', 'sync-deps'], + dependsOn: [], options: {}, }; @@ -75,25 +68,32 @@ function getTargets(options: NormalizedSchema) { `{projectRoot}/android/app/build/outputs/bundle`, `{projectRoot}/android/app/build/outputs/apk`, ], - dependsOn: ['ensure-symlink', 'sync-deps'], + dependsOn: [], options: {}, }; architect['build-ios'] = { executor: '@nx/react-native:build-ios', outputs: ['{projectRoot}/ios/build/Build'], - dependsOn: ['ensure-symlink', 'sync-deps', 'pod-install'], + dependsOn: [], options: {}, }; architect['pod-install'] = { executor: '@nx/react-native:pod-install', + dependsOn: ['sync-deps'], + outputs: ['{projectRoot}/ios/Pods', '{projectRoot}/ios/Podfile.lock'], + options: {}, + }; + + architect.upgrade = { + executor: '@nx/react-native:upgrade', options: {}, }; architect['bundle-android'] = { executor: '@nx/react-native:bundle', - dependsOn: ['ensure-symlink'], + dependsOn: [], outputs: ['{options.bundleOutput}'], options: { entryFile: options.entryFile, @@ -107,10 +107,5 @@ function getTargets(options: NormalizedSchema) { options: {}, }; - architect['ensure-symlink'] = { - executor: '@nx/react-native:ensure-symlink', - options: {}, - }; - return architect; } diff --git a/packages/react-native/src/generators/application/lib/normalize-options.spec.ts b/packages/react-native/src/generators/application/lib/normalize-options.spec.ts index 91be45fb38fd2c..911a4ac0d0f34d 100644 --- a/packages/react-native/src/generators/application/lib/normalize-options.spec.ts +++ b/packages/react-native/src/generators/application/lib/normalize-options.spec.ts @@ -18,11 +18,14 @@ describe('Normalize Options', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + unitTestRunner: 'none', + bundler: 'vite', }; const options = await normalizeOptions(appTree, schema); expect(options).toEqual({ androidProjectRoot: 'my-app/android', appProjectRoot: 'my-app', + fileName: 'my-app', className: 'MyApp', displayName: 'MyApp', iosProjectRoot: 'my-app/ios', @@ -34,8 +37,12 @@ describe('Normalize Options', () => { linter: Linter.EsLint, entryFile: 'src/main.tsx', e2eTestRunner: 'none', - unitTestRunner: 'jest', + unitTestRunner: 'none', install: false, + bundler: 'vite', + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'my-app-e2e', }); }); @@ -45,12 +52,16 @@ describe('Normalize Options', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + linter: Linter.None, + unitTestRunner: 'none', + bundler: 'vite', }; const options = await normalizeOptions(appTree, schema); expect(options).toEqual({ androidProjectRoot: 'myApp/android', appProjectRoot: 'myApp', className: 'MyApp', + fileName: 'my-app', displayName: 'MyApp', iosProjectRoot: 'myApp/ios', lowerCaseName: 'myapp', @@ -60,8 +71,13 @@ describe('Normalize Options', () => { projectNameAndRootFormat: 'as-provided', entryFile: 'src/main.tsx', e2eTestRunner: 'none', - unitTestRunner: 'jest', + unitTestRunner: 'none', install: false, + bundler: 'vite', + linter: Linter.None, + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'myApp-e2e', }); }); @@ -72,12 +88,16 @@ describe('Normalize Options', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + linter: Linter.None, + unitTestRunner: 'none', + bundler: 'vite', }; const options = await normalizeOptions(appTree, schema); expect(options).toEqual({ androidProjectRoot: 'directory/my-app/android', appProjectRoot: 'directory/my-app', className: 'MyApp', + fileName: 'my-app', displayName: 'MyApp', iosProjectRoot: 'directory/my-app/ios', lowerCaseName: 'myapp', @@ -88,8 +108,13 @@ describe('Normalize Options', () => { projectNameAndRootFormat: 'as-provided', entryFile: 'src/main.tsx', e2eTestRunner: 'none', - unitTestRunner: 'jest', + unitTestRunner: 'none', install: false, + bundler: 'vite', + linter: Linter.None, + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'directory/my-app-e2e', }); }); @@ -99,12 +124,16 @@ describe('Normalize Options', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + linter: Linter.None, + unitTestRunner: 'none', + bundler: 'vite', }; const options = await normalizeOptions(appTree, schema); expect(options).toEqual({ androidProjectRoot: 'directory/my-app/android', appProjectRoot: 'directory/my-app', className: 'DirectoryMyApp', + fileName: 'directory/my-app', displayName: 'DirectoryMyApp', iosProjectRoot: 'directory/my-app/ios', lowerCaseName: 'directorymyapp', @@ -114,8 +143,13 @@ describe('Normalize Options', () => { projectNameAndRootFormat: 'as-provided', entryFile: 'src/main.tsx', e2eTestRunner: 'none', - unitTestRunner: 'jest', + unitTestRunner: 'none', install: false, + bundler: 'vite', + linter: Linter.None, + rootProject: false, + e2eProjectName: 'directory/my-app-e2e', + e2eProjectRoot: 'directory/my-app-e2e', }); }); @@ -126,12 +160,16 @@ describe('Normalize Options', () => { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + linter: Linter.None, + unitTestRunner: 'none', + bundler: 'vite', }; const options = await normalizeOptions(appTree, schema); expect(options).toEqual({ androidProjectRoot: 'my-app/android', appProjectRoot: 'my-app', className: 'MyApp', + fileName: 'my-app', displayName: 'My App', iosProjectRoot: 'my-app/ios', lowerCaseName: 'myapp', @@ -141,8 +179,13 @@ describe('Normalize Options', () => { projectNameAndRootFormat: 'as-provided', entryFile: 'src/main.tsx', e2eTestRunner: 'none', - unitTestRunner: 'jest', + unitTestRunner: 'none', install: false, + bundler: 'vite', + linter: Linter.None, + rootProject: false, + e2eProjectName: 'my-app-e2e', + e2eProjectRoot: 'my-app-e2e', }); }); }); diff --git a/packages/react-native/src/generators/application/lib/normalize-options.ts b/packages/react-native/src/generators/application/lib/normalize-options.ts index 7fb1542ee07baa..83addabf9fcd69 100644 --- a/packages/react-native/src/generators/application/lib/normalize-options.ts +++ b/packages/react-native/src/generators/application/lib/normalize-options.ts @@ -3,7 +3,8 @@ import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/pr import { Schema } from '../schema'; export interface NormalizedSchema extends Schema { - className: string; // app name in class name + className: string; // app name in class case + fileName: string; // app name in file class projectName: string; // directory + app name in kebab case appProjectRoot: string; // app directory path lowerCaseName: string; // app name in lower case @@ -11,6 +12,9 @@ export interface NormalizedSchema extends Schema { androidProjectRoot: string; parsedTags: string[]; entryFile: string; + rootProject: boolean; + e2eProjectName: string; + e2eProjectRoot: string; } export async function normalizeOptions( @@ -31,9 +35,12 @@ export async function normalizeOptions( }); options.projectNameAndRootFormat = projectNameAndRootFormat; - const { className } = names(options.name); + const { className, fileName } = names(options.name); const iosProjectRoot = joinPathFragments(appProjectRoot, 'ios'); const androidProjectRoot = joinPathFragments(appProjectRoot, 'android'); + const rootProject = appProjectRoot === '.'; + const e2eProjectName = rootProject ? 'e2e' : `${fileName}-e2e`; + const e2eProjectRoot = rootProject ? 'e2e' : `${appProjectRoot}-e2e`; const parsedTags = options.tags ? options.tags.split(',').map((s) => s.trim()) @@ -43,10 +50,9 @@ export async function normalizeOptions( return { ...options, - unitTestRunner: options.unitTestRunner || 'jest', - e2eTestRunner: options.e2eTestRunner || 'detox', name: projectNames.projectSimpleName, className, + fileName, lowerCaseName: className.toLowerCase(), displayName: options.displayName || className, projectName: appProjectName, @@ -55,5 +61,8 @@ export async function normalizeOptions( androidProjectRoot, parsedTags, entryFile, + rootProject, + e2eProjectName, + e2eProjectRoot, }; } diff --git a/packages/react-native/src/generators/application/schema.d.ts b/packages/react-native/src/generators/application/schema.d.ts index 749b5897f45cb8..56ef487ee93864 100644 --- a/packages/react-native/src/generators/application/schema.d.ts +++ b/packages/react-native/src/generators/application/schema.d.ts @@ -9,13 +9,14 @@ export interface Schema { directory?: string; projectNameAndRootFormat?: ProjectNameAndRootFormat; tags?: string; - unitTestRunner?: 'jest' | 'none'; + unitTestRunner: 'jest' | 'none'; // default is jest pascalCaseFiles?: boolean; classComponent?: boolean; js?: boolean; - linter?: Linter; + linter: Linter; setParserOptionsProject?: boolean; - e2eTestRunner?: 'detox' | 'none'; + e2eTestRunner: 'cypress' | 'playwright' | 'detox' | 'none'; // default is cypress + bundler: 'webpack' | 'vite'; // default is webpack install: boolean; // default is true skipPackageJson?: boolean; //default is false } diff --git a/packages/react-native/src/generators/application/schema.json b/packages/react-native/src/generators/application/schema.json index c528bbcf6439c1..df99407ca43d5a 100644 --- a/packages/react-native/src/generators/application/schema.json +++ b/packages/react-native/src/generators/application/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxReactNativeApplication", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create a React Application for Nx", "description": "Create a React Application for Nx.", "examples": [ @@ -48,7 +48,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { @@ -75,20 +75,28 @@ "e2eTestRunner": { "description": "Adds the specified e2e test runner.", "type": "string", - "enum": ["detox", "none"], - "default": "detox" + "enum": ["cypress", "playwright", "detox", "none"], + "default": "cypress" }, "install": { "type": "boolean", "description": "Runs `pod install` for native modules before building iOS app.", - "default": true, - "x-priority": "internal" + "x-prompt": "Run 'pod install' for native modules?", + "default": true }, "skipPackageJson": { "description": "Do not add dependencies to `package.json`.", "type": "boolean", "default": false, "x-priority": "internal" + }, + "bundler": { + "description": "The bundler to use.", + "type": "string", + "enum": ["vite", "webpack"], + "x-prompt": "Which bundler do you want to use to build the application?", + "default": "webpack", + "x-priority": "important" } }, "required": [] diff --git a/packages/react-native/src/generators/component-story/component-story.spec.ts b/packages/react-native/src/generators/component-story/component-story.spec.ts deleted file mode 100644 index 937e30acd96eba..00000000000000 --- a/packages/react-native/src/generators/component-story/component-story.spec.ts +++ /dev/null @@ -1,427 +0,0 @@ -import { getProjects, Tree, updateProjectConfiguration } from '@nx/devkit'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import componentStoryGenerator from './component-story'; -import { Linter } from '@nx/eslint'; - -import { formatFile } from '../../utils/format-file'; -import libraryGenerator from '../library/library'; -import componentGenerator from '../component/component'; - -describe('react-native:component-story', () => { - let appTree: Tree; - let cmpPath = 'test-ui-lib/src/lib/test-ui-lib/test-ui-lib.tsx'; - let storyFilePath = 'test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx'; - - describe('default setup', () => { - beforeEach(async () => { - appTree = await createTestUILib('test-ui-lib'); - }); - - describe('when file does not contain a component', () => { - beforeEach(() => { - appTree.write( - cmpPath, - `export const add = (a: number, b: number) => a + b;` - ); - }); - - it('should fail with a descriptive error message', async () => { - try { - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-lib/test-ui-lib.tsx', - project: 'test-ui-lib', - }); - } catch (e) { - expect(e.message).toContain( - 'Could not find any React Native component in file test-ui-lib/src/lib/test-ui-lib/test-ui-lib.tsx' - ); - } - }); - }); - - describe('default component setup', () => { - beforeEach(async () => { - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-lib/test-ui-lib.tsx', - project: 'test-ui-lib', - }); - }); - - it('should create the story file', () => { - expect(appTree.exists(storyFilePath)).toBeTruthy(); - }); - - it('should properly set up the story', () => { - expect( - formatFile`${appTree.read(storyFilePath, 'utf-8').replace('·', '')}` - ).toContain(formatFile` - import type { Meta } from '@storybook/react-native'; - import { TestUiLib } from './test-ui-lib'; - const Story: Meta = { - component: TestUiLib, - title: 'TestUiLib', - }; - export default Story; - export const Primary = { args: {} }; - `); - }); - }); - - describe('when using plain JS components', () => { - let storyFilePathPlain = - 'test-ui-lib/src/lib/test-ui-libplain.stories.jsx'; - - beforeEach(async () => { - appTree.write( - 'test-ui-lib/src/lib/test-ui-libplain.jsx', - `import React from 'react'; - - import './test.scss'; - - export const Test = () => { - return ( -

-

Welcome to test component

-
- ); - }; - - export default Test; - ` - ); - - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-libplain.jsx', - project: 'test-ui-lib', - }); - }); - - it('should create the story file', () => { - expect(appTree.exists(storyFilePathPlain)).toBeTruthy(); - }); - - it('should properly set up the story', () => { - expect(formatFile`${appTree.read(storyFilePathPlain, 'utf-8')}`) - .toContain(formatFile` - import Test from './test-ui-libplain'; - export default { component: Test, title: 'Test' }; - export const Primary = { args: {} }; - `); - }); - }); - - describe('component without any props defined', () => { - beforeEach(async () => { - appTree.write( - cmpPath, - `import React from 'react'; - - import { View, Text } from 'react-native'; - - export function Test() { - return ( - - Welcome to test! - - ); - } - - export default Test; - ` - ); - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-lib/test-ui-lib.tsx', - project: 'test-ui-lib', - }); - }); - - it('should create a story without controls', () => { - expect(formatFile`${appTree.read(storyFilePath, 'utf-8')}`) - .toContain(formatFile` - import type { Meta } from '@storybook/react-native'; - import { Test } from './test-ui-lib'; - const Story: Meta = { component: Test, title: 'Test' }; - export default Story; - export const Primary = { args: {} }; - `); - }); - }); - - describe('component with props', () => { - beforeEach(async () => { - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-lib/test-ui-lib.tsx', - project: 'test-ui-lib', - }); - }); - - it('should setup controls based on the component props', () => { - expect( - formatFile`${appTree.read(storyFilePath, 'utf-8').replace('·', '')}` - ).toContain(formatFile` - import type { Meta } from '@storybook/react-native'; - import { TestUiLib } from './test-ui-lib'; - const Story: Meta = { - component: TestUiLib, - title: 'TestUiLib', - }; - export default Story; - export const Primary = { args: {} }; - `); - }); - }); - - describe('component with props and actions', () => { - beforeEach(async () => { - appTree.write( - cmpPath, - `import React from 'react'; - - export type ButtonStyle = 'default' | 'primary' | 'warning'; - - export interface TestProps { - name: string; - displayAge: boolean; - someAction: (e: unknown) => void; - style: ButtonStyle; - } - - export const Test = (props: TestProps) => { - return ( -
-

Welcome to test component, {props.name}

- -
- ); - }; - - export default Test; - ` - ); - - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-lib/test-ui-lib.tsx', - project: 'test-ui-lib', - }); - }); - - it('should setup controls based on the component props', () => { - expect( - formatFile`${appTree.read(storyFilePath, 'utf-8').replace('·', '')}` - ).toContain(formatFile` - import type { Meta } from '@storybook/react-native'; - import { Test } from './test-ui-lib'; - const Story: Meta = { - component: Test, - title: 'Test', - argTypes: { someAction: { action: 'someAction executed!' } }, - }; - export default Story; - export const Primary = { args: { name: '', displayAge: false } }; - `); - }); - }); - - [ - { - name: 'default export function', - src: `export default function Test(props: TestProps) { - return ( -
-

Welcome to test component, {props.name}

-
- ); - }; - `, - }, - { - name: 'function and then export', - src: ` - function Test(props: TestProps) { - return ( -
-

Welcome to test component, {props.name}

-
- ); - }; - export default Test; - `, - }, - { - name: 'arrow function', - src: ` - const Test = (props: TestProps) => { - return ( -
-

Welcome to test component, {props.name}

-
- ); - }; - export default Test; - `, - }, - { - name: 'arrow function without {..}', - src: ` - const Test = (props: TestProps) =>

Welcome to test component, {props.name}

; - export default Test - `, - }, - { - name: 'direct export of component class', - src: ` - export default class Test extends React.Component { - render() { - return

Welcome to test component, {this.props.name}

; - } - } - `, - }, - { - name: 'component class & then default export', - src: ` - class Test extends React.Component { - render() { - return

Welcome to test component, {this.props.name}

; - } - } - export default Test - `, - }, - { - name: 'PureComponent class & then default export', - src: ` - class Test extends React.PureComponent { - render() { - return

Welcome to test component, {this.props.name}

; - } - } - export default Test - `, - }, - { - name: 'direct export of component class new JSX transform', - src: ` - export default class Test extends Component { - render() { - return

Welcome to test component, {this.props.name}

; - } - } - `, - }, - { - name: 'component class & then default export new JSX transform', - src: ` - class Test extends Component { - render() { - return

Welcome to test component, {this.props.name}

; - } - } - export default Test - `, - }, - { - name: 'PureComponent class & then default export new JSX transform', - src: ` - class Test extends PureComponent { - render() { - return

Welcome to test component, {this.props.name}

; - } - } - export default Test - `, - }, - ].forEach((config) => { - describe(`React Native component defined as:${config.name}`, () => { - beforeEach(async () => { - appTree.write( - cmpPath, - `import React from 'react'; - - export interface TestProps { - name: string; - displayAge: boolean; - } - - ${config.src} - ` - ); - - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-lib/test-ui-lib.tsx', - project: 'test-ui-lib', - }); - }); - - it('should properly setup the controls based on the component props', () => { - expect( - formatFile`${appTree.read(storyFilePath, 'utf-8').replace('·', '')}` - ).toContain(formatFile` - import type { Meta } from '@storybook/react-native'; - import { Test } from './test-ui-lib'; - const Story: Meta = { component: Test, title: 'Test' }; - export default Story; - export const Primary = { args: { name: '', displayAge: false } }; - `); - }); - }); - }); - }); - - describe('using eslint', () => { - beforeEach(async () => { - appTree = await createTestUILib('test-ui-lib'); - await componentGenerator(appTree, { - name: 'test-ui-lib', - project: 'test-ui-lib', - export: true, - }); - await componentStoryGenerator(appTree, { - componentPath: 'lib/test-ui-lib/test-ui-lib.tsx', - project: 'test-ui-lib', - }); - }); - - it('should properly set up the story', () => { - expect(formatFile`${appTree.read(storyFilePath, 'utf-8')}`) - .toContain(formatFile` - import type { Meta } from '@storybook/react-native'; - import { TestUiLib } from './test-ui-lib'; - const Story: Meta = { - component: TestUiLib, - title: 'TestUiLib', - }; - export default Story; - export const Primary = { args: {} }; - `); - }); - }); -}); - -export async function createTestUILib(libName: string): Promise { - let appTree = createTreeWithEmptyWorkspace(); - appTree.write('.gitignore', ''); - - await libraryGenerator(appTree, { - name: libName, - linter: Linter.EsLint, - skipFormat: true, - skipTsConfig: false, - unitTestRunner: 'jest', - projectNameAndRootFormat: 'as-provided', - }); - - await componentGenerator(appTree, { - name: libName, - project: libName, - export: true, - }); - - const currentWorkspaceJson = getProjects(appTree); - - const projectConfig = currentWorkspaceJson.get(libName); - - updateProjectConfiguration(appTree, libName, projectConfig); - - return appTree; -} diff --git a/packages/react-native/src/generators/component-story/component-story.ts b/packages/react-native/src/generators/component-story/component-story.ts index 93c0ac8312ec22..f178bdcdb70690 100644 --- a/packages/react-native/src/generators/component-story/component-story.ts +++ b/packages/react-native/src/generators/component-story/component-story.ts @@ -1,151 +1,19 @@ -import { - formatFiles, - generateFiles, - getProjects, - joinPathFragments, - normalizePath, - Tree, -} from '@nx/devkit'; -import type * as ts from 'typescript'; -import { - findExportDeclarationsForJsx, - getComponentNode, -} from '@nx/react/src/utils/ast-utils'; -import { getDefaultsForComponent } from '@nx/react/src/utils/component-props'; -import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; - -let tsModule: typeof import('typescript'); - -export interface CreateComponentStoriesFileSchema { - project: string; - componentPath: string; - skipFormat?: boolean; -} - -export function createComponentStoriesFile( - host: Tree, - { project, componentPath }: CreateComponentStoriesFileSchema -) { - if (!tsModule) { - tsModule = ensureTypescript(); - } - const proj = getProjects(host).get(project); - const sourceRoot = proj.sourceRoot; - - const componentFilePath = joinPathFragments(sourceRoot, componentPath); - - const componentDirectory = componentFilePath.replace( - componentFilePath.slice(componentFilePath.lastIndexOf('/')), - '' - ); - - const isPlainJs = - componentFilePath.endsWith('.jsx') || componentFilePath.endsWith('.js'); - let fileExt = 'tsx'; - if (componentFilePath.endsWith('.jsx')) { - fileExt = 'jsx'; - } else if (componentFilePath.endsWith('.js')) { - fileExt = 'js'; - } - - const componentFileName = componentFilePath - .slice(componentFilePath.lastIndexOf('/') + 1) - .replace('.tsx', '') - .replace('.jsx', '') - .replace('.js', ''); - - const name = componentFileName; - - const contents = host.read(componentFilePath, 'utf-8'); - if (contents === null) { - throw new Error(`Failed to read ${componentFilePath}`); - } - - const sourceFile = tsModule.createSourceFile( - componentFilePath, - contents, - tsModule.ScriptTarget.Latest, - true - ); - - const cmpDeclaration = getComponentNode(sourceFile); - - if (!cmpDeclaration) { - const componentNodes = findExportDeclarationsForJsx(sourceFile); - if (componentNodes?.length) { - componentNodes.forEach((declaration) => { - findPropsAndGenerateFile( - host, - sourceFile, - declaration, - componentDirectory, - name, - isPlainJs, - fileExt, - componentNodes.length > 1 - ); - }); - } else { - throw new Error( - `Could not find any React Native component in file ${componentFilePath}` - ); - } - } else { - findPropsAndGenerateFile( - host, - sourceFile, - cmpDeclaration, - componentDirectory, - name, - isPlainJs, - fileExt - ); - } -} - -export function findPropsAndGenerateFile( - host: Tree, - sourceFile: ts.SourceFile, - cmpDeclaration: ts.Node, - componentDirectory: string, - name: string, - isPlainJs: boolean, - fileExt: string, - fromNodeArray?: boolean -) { - const { propsTypeName, props, argTypes } = getDefaultsForComponent( - sourceFile, - cmpDeclaration - ); - - generateFiles( - host, - joinPathFragments(__dirname, './files'), - normalizePath(componentDirectory), - { - componentFileName: fromNodeArray - ? `${name}--${(cmpDeclaration as any).name.text}` - : name, - componentImportFileName: name, - propsTypeName, - props, - argTypes, - componentName: (cmpDeclaration as any).name.text, - isPlainJs, - fileExt, - } - ); -} - +import { Tree, logger } from '@nx/devkit'; +import { componentStoryGenerator as reactComponentStoryGenerator } from '@nx/react'; +import { CreateComponentStoriesFileSchema } from './schema'; + +/** + * @deprecated This would be a direct pass through to @nx/react:component-story generator. + * TODO (@xiongemi): remove this generator for v19 + */ export async function componentStoryGenerator( host: Tree, schema: CreateComponentStoriesFileSchema ) { - createComponentStoriesFile(host, schema); - - if (!schema.skipFormat) { - await formatFiles(host); - } + logger.warn( + `Please run 'nx run @nx/react:component-story ${schema.project}' instead.` + ); + return reactComponentStoryGenerator(host, schema); } export default componentStoryGenerator; diff --git a/packages/react-native/src/generators/component-story/files/__componentFileName__.stories.__fileExt__ b/packages/react-native/src/generators/component-story/files/__componentFileName__.stories.__fileExt__ deleted file mode 100644 index b455e56f674f84..00000000000000 --- a/packages/react-native/src/generators/component-story/files/__componentFileName__.stories.__fileExt__ +++ /dev/null @@ -1,32 +0,0 @@ -<% if ( !isPlainJs ) { %>import type { Meta } from '@storybook/react-native';<% } %> -import<% if ( !isPlainJs ) { %> { <% } %> <%= componentName %> <% if ( !isPlainJs ) { %> } <% } %> from './<%= componentImportFileName %>'; - -<% if ( isPlainJs ) { %> -export default { - component: <%= componentName %>, - title: '<%= componentName %>',<% if ( argTypes && argTypes.length > 0 ) { %> - argTypes: {<% for (let argType of argTypes) { %> - <%= argType.name %>: { <%- argType.type %> : "<%- argType.actionText %>" },<% } %> -} - <% } %> -}; -<% } %> - - -<% if ( !isPlainJs ) { %> -const Story: Meta> = { - component: <%= componentName %>, - title: '<%= componentName %>',<% if ( argTypes && argTypes.length > 0 ) { %> - argTypes: {<% for (let argType of argTypes) { %> - <%= argType.name %>: { <%- argType.type %> : "<%- argType.actionText %>" },<% } %> -} - <% } %> -}; -export default Story; -<% } %> - -export const Primary = { - args: {<% for (let prop of props) { %> - <%= prop.name %>: <%- prop.defaultValue %>,<% } %> - }, -}; \ No newline at end of file diff --git a/packages/react-native/src/generators/component-story/schema.d.ts b/packages/react-native/src/generators/component-story/schema.d.ts index 7430d8c0b36517..0db6571bab401a 100644 --- a/packages/react-native/src/generators/component-story/schema.d.ts +++ b/packages/react-native/src/generators/component-story/schema.d.ts @@ -1,5 +1,6 @@ export interface CreateComponentStoriesFileSchema { project: string; componentPath: string; + interactionTests?: boolean; skipFormat?: boolean; } diff --git a/packages/react-native/src/generators/component-story/schema.json b/packages/react-native/src/generators/component-story/schema.json index 101494247b7f21..0cfbfaeb220074 100644 --- a/packages/react-native/src/generators/component-story/schema.json +++ b/packages/react-native/src/generators/component-story/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeComponentStory", "title": "React native component story", @@ -15,19 +15,27 @@ "$source": "projectName", "index": 0 }, - "x-prompt": "What's the name of the project where the component lives?" + "x-prompt": "What's name of the project where the component lives?", + "x-priority": "important" }, "componentPath": { "type": "string", "description": "Relative path to the component file from the library root.", "examples": ["lib/components"], - "x-prompt": "What's path of the component relative to the project's lib root?" + "x-prompt": "What's path of the component relative to the project's lib root?", + "x-priority": "important" }, "skipFormat": { "description": "Skip formatting files.", "type": "boolean", "default": false, "x-priority": "internal" + }, + "interactionTests": { + "type": "boolean", + "description": "Set up Storybook interaction tests.", + "default": true, + "x-priority": "important" } }, "required": ["project", "componentPath"] diff --git a/packages/react-native/src/generators/component/schema.d.ts b/packages/react-native/src/generators/component/schema.d.ts index 857e5505c4ae02..6fc205f6b1c330 100644 --- a/packages/react-native/src/generators/component/schema.d.ts +++ b/packages/react-native/src/generators/component/schema.d.ts @@ -4,20 +4,20 @@ export interface Schema { name: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project: string; skipTests?: boolean; directory?: string; export?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ pascalCaseFiles?: boolean; classComponent?: boolean; js?: boolean; /** - * @deprecated Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19. */ flat?: boolean; nameAndDirectoryFormat?: 'as-provided' | 'derived'; diff --git a/packages/react-native/src/generators/component/schema.json b/packages/react-native/src/generators/component/schema.json index ac8a09eda4963d..6688d980d7ce3f 100644 --- a/packages/react-native/src/generators/component/schema.json +++ b/packages/react-native/src/generators/component/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxReactNativeApplication", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create a React Native Component for Nx", "description": "Create a React native Component for Nx.", "type": "object", @@ -23,7 +23,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -58,7 +58,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "export": { "type": "boolean", @@ -72,7 +72,7 @@ "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "classComponent": { "type": "boolean", diff --git a/packages/react-native/src/generators/init/init.ts b/packages/react-native/src/generators/init/init.ts index bbb05726eba774..52a596eb5855ed 100644 --- a/packages/react-native/src/generators/init/init.ts +++ b/packages/react-native/src/generators/init/init.ts @@ -13,9 +13,6 @@ import { createNodes, ReactNativePluginOptions } from '../../../plugins/plugin'; import { nxVersion, reactDomVersion, - reactNativeCommunityCli, - reactNativeCommunityCliAndroid, - reactNativeCommunityCliIos, reactNativeVersion, reactVersion, } from '../../utils/versions'; @@ -56,10 +53,6 @@ export function updateDependencies(host: Tree, schema: Schema) { }, { '@nx/react-native': nxVersion, - '@react-native-community/cli': reactNativeCommunityCli, - '@react-native-community/cli-platform-android': - reactNativeCommunityCliAndroid, - '@react-native-community/cli-platform-ios': reactNativeCommunityCliIos, }, undefined, schema.keepExistingVersions diff --git a/packages/react-native/src/generators/init/schema.json b/packages/react-native/src/generators/init/schema.json index 61d5d360c3b180..d38d3890bcd5c7 100644 --- a/packages/react-native/src/generators/init/schema.json +++ b/packages/react-native/src/generators/init/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxReactNativeInit", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Add Nx React Native Schematics", "description": "Add Nx React native schematics.", "type": "object", diff --git a/packages/react-native/src/generators/library/files/lib/.babelrc.js.template b/packages/react-native/src/generators/library/files/lib/.babelrc.js.template new file mode 100644 index 00000000000000..22dabd93c9cee5 --- /dev/null +++ b/packages/react-native/src/generators/library/files/lib/.babelrc.js.template @@ -0,0 +1,21 @@ +module.exports = function (api) { + api.cache(true); + + return { + presets: [ + [ + '@nx/react/babel', + { + runtime: 'automatic', + useBuiltIns: 'usage', + }, + ], + ], + plugins: [], + env: { + test: { + presets: [['module:@react-native/babel-preset', { "useTransformReactJSX": true }]], + }, + }, + }; +}; diff --git a/packages/react-native/src/generators/library/files/lib/babel.config.json.template b/packages/react-native/src/generators/library/files/lib/babel.config.json.template deleted file mode 100644 index 34e8832831f4e8..00000000000000 --- a/packages/react-native/src/generators/library/files/lib/babel.config.json.template +++ /dev/null @@ -1,17 +0,0 @@ -{ - "presets": [ - [ - "@nx/react/babel", - { - "runtime": "automatic", - "useBuiltIns": "usage" - } - ] - ], - "plugins": [], - "env": { - "test": { - "presets": ["module:metro-react-native-babel-preset"] - } - } -} diff --git a/packages/react-native/src/generators/library/library.spec.ts b/packages/react-native/src/generators/library/library.spec.ts index b15ae95600532d..91395c27ac95a4 100644 --- a/packages/react-native/src/generators/library/library.spec.ts +++ b/packages/react-native/src/generators/library/library.spec.ts @@ -277,6 +277,17 @@ describe('lib', () => { moduleNameMapper: { '\\\\.svg$': '@nx/react-native/plugins/jest/svg-mock', }, + transform: { + '^.+.(js|ts|tsx)$': [ + 'babel-jest', + { + configFile: __dirname + '/.babelrc.js', + }, + ], + '^.+.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$': require.resolve( + 'react-native/jest/assetFileTransformer.js' + ), + }, coverageDirectory: '../coverage/my-lib', }; " diff --git a/packages/react-native/src/generators/library/library.ts b/packages/react-native/src/generators/library/library.ts index 3fb7e2db923528..49b74476bbe4ae 100644 --- a/packages/react-native/src/generators/library/library.ts +++ b/packages/react-native/src/generators/library/library.ts @@ -31,6 +31,7 @@ import { import { NormalizedSchema, normalizeOptions } from './lib/normalize-options'; import { Schema } from './schema'; import { ensureDependencies } from '../../utils/ensure-dependencies'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function reactNativeLibraryGenerator( host: Tree, @@ -111,6 +112,10 @@ export async function reactNativeLibraryGeneratorInternal( await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.name); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/react-native/src/generators/library/schema.json b/packages/react-native/src/generators/library/schema.json index 21f3961f87480a..5969155ef45368 100644 --- a/packages/react-native/src/generators/library/schema.json +++ b/packages/react-native/src/generators/library/schema.json @@ -1,7 +1,7 @@ { "cli": "nx", "$id": "NxReactNativeLibrary", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "title": "Create a React Native Library for Nx", "description": "Create a React Native Library for Nx.", "type": "object", @@ -36,7 +36,7 @@ "linter": { "description": "The tool to use for running lint checks.", "type": "string", - "enum": ["eslint"], + "enum": ["eslint", "none"], "default": "eslint" }, "unitTestRunner": { diff --git a/packages/react-native/src/generators/stories/schema.d.ts b/packages/react-native/src/generators/stories/schema.d.ts index ae586c8bc4ac7e..b74b85eb2dd7ed 100644 --- a/packages/react-native/src/generators/stories/schema.d.ts +++ b/packages/react-native/src/generators/stories/schema.d.ts @@ -1,5 +1,7 @@ export interface StorybookStoriesSchema { project: string; + interactionTests?: boolean; + js?: boolean; ignorePaths?: string[]; skipFormat?: boolean; } diff --git a/packages/react-native/src/generators/stories/schema.json b/packages/react-native/src/generators/stories/schema.json index 6a858551f27137..a45e1feb270c6e 100644 --- a/packages/react-native/src/generators/stories/schema.json +++ b/packages/react-native/src/generators/stories/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeStorybookStories", "title": "Generate React Native Storybook stories", @@ -14,7 +14,20 @@ "$source": "projectName", "index": 0 }, - "x-prompt": "For which project do you want to generate stories?" + "x-prompt": "For which project do you want to generate stories?", + "x-priority": "important" + }, + "interactionTests": { + "type": "boolean", + "description": "Set up Storybook interaction tests.", + "x-prompt": "Do you want to set up Storybook interaction tests?", + "x-priority": "important", + "default": true + }, + "js": { + "type": "boolean", + "description": "Generate JavaScript files rather than TypeScript files.", + "default": false }, "ignorePaths": { "type": "array", diff --git a/packages/react-native/src/generators/stories/stories-app.spec.ts b/packages/react-native/src/generators/stories/stories-app.spec.ts deleted file mode 100644 index 6b971efac5e3b4..00000000000000 --- a/packages/react-native/src/generators/stories/stories-app.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Tree } from '@nx/devkit'; -import storiesGenerator from './stories'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import applicationGenerator from '../application/application'; -import { Linter } from '@nx/eslint'; -import { reactNativeComponentGenerator } from '../component/component'; - -describe('react:stories for applications', () => { - let appTree: Tree; - - beforeEach(async () => { - appTree = await createTestUIApp('test-ui-app'); - }); - - it('should create the stories', async () => { - await reactNativeComponentGenerator(appTree, { - name: 'another-cmp', - project: 'test-ui-app', - }); - await storiesGenerator(appTree, { - project: 'test-ui-app', - }); - - expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy(); - expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy(); - expect( - appTree.exists('test-ui-app/src/app/another-cmp/another-cmp.stories.tsx') - ).toBeTruthy(); - }); - - it('should ignore paths', async () => { - await reactNativeComponentGenerator(appTree, { - name: 'another-cmp', - project: 'test-ui-app', - }); - await storiesGenerator(appTree, { - project: 'test-ui-app', - ignorePaths: ['test-ui-app/src/app/**'], - }); - - expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy(); - expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeFalsy(); - expect( - appTree.exists('test-ui-app/src/app/another-cmp/another-cmp.stories.tsx') - ).toBeFalsy(); - }); - - it('should ignore paths with a direct path to a component', async () => { - await reactNativeComponentGenerator(appTree, { - name: 'another-new-cmp', - project: 'test-ui-app', - }); - - await storiesGenerator(appTree, { - project: 'test-ui-app', - ignorePaths: ['test-ui-app/src/app/another-new-cmp/another-new-cmp.tsx'], - }); - - expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy(); - expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy(); - expect( - appTree.exists( - 'test-ui-app/src/app/another-new-cmp/another-new-cmp.stories.tsx' - ) - ).toBeFalsy(); - }); - - it('should ignore a path that has a nested component, but still generate nested component stories', async () => { - await reactNativeComponentGenerator(appTree, { - name: 'another-new-cmp', - project: 'test-ui-app', - }); - await reactNativeComponentGenerator(appTree, { - name: 'comp-a', - directory: 'app/another-new-cmp', - project: 'test-ui-app', - }); - await storiesGenerator(appTree, { - project: 'test-ui-app', - ignorePaths: ['test-ui-app/src/app/another-new-cmp/another-new-cmp.tsx'], - }); - - expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy(); - expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy(); - expect( - appTree.exists( - 'test-ui-app/src/app/another-new-cmp/comp-a/comp-a.stories.tsx' - ) - ).toBeTruthy(); - expect( - appTree.exists( - 'test-ui-app/src/app/another-new-cmp/another-new-cmp.stories.tsx' - ) - ).toBeFalsy(); - }); - - it('should ignore files that do not contain components', async () => { - // create another component - appTree.write( - 'test-ui-app/src/app/some-utils.js', - `export const add = (a: number, b: number) => a + b;` - ); - - await storiesGenerator(appTree, { - project: 'test-ui-app', - }); - - // should just create the story and not error, even though there's a js file - // not containing any react component - expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy(); - }); -}); - -export async function createTestUIApp(libName: string): Promise { - let appTree = createTreeWithEmptyWorkspace(); - appTree.write('.gitignore', ''); - - await applicationGenerator(appTree, { - linter: Linter.EsLint, - skipFormat: false, - style: 'css', - unitTestRunner: 'none', - name: libName, - install: false, - projectNameAndRootFormat: 'as-provided', - }); - return appTree; -} diff --git a/packages/react-native/src/generators/stories/stories-lib.spec.ts b/packages/react-native/src/generators/stories/stories-lib.spec.ts deleted file mode 100644 index d9337b4069cd82..00000000000000 --- a/packages/react-native/src/generators/stories/stories-lib.spec.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Tree } from '@nx/devkit'; -import storiesGenerator from './stories'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import applicationGenerator from '../application/application'; -import { Linter } from '@nx/eslint'; -import libraryGenerator from '../library/library'; -import reactNativeComponentGenerator from '../component/component'; - -describe('react-native:stories for libraries', () => { - let appTree: Tree; - - beforeEach(async () => { - appTree = await createTestUILib('test-ui-lib'); - }); - - it('should create the stories', async () => { - await reactNativeComponentGenerator(appTree, { - name: 'test-ui-lib', - project: 'test-ui-lib', - }); - await reactNativeComponentGenerator(appTree, { - name: 'another-cmp', - project: 'test-ui-lib', - }); - await storiesGenerator(appTree, { - project: 'test-ui-lib', - }); - - expect( - appTree.exists('test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx') - ).toBeTruthy(); - expect( - appTree.exists('test-ui-lib/src/lib/another-cmp/another-cmp.stories.tsx') - ).toBeTruthy(); - }); - - it('should ignore paths', async () => { - await reactNativeComponentGenerator(appTree, { - name: 'test-ui-lib', - project: 'test-ui-lib', - }); - await reactNativeComponentGenerator(appTree, { - name: 'another-cmp', - project: 'test-ui-lib', - }); - await storiesGenerator(appTree, { - project: 'test-ui-lib', - ignorePaths: ['test-ui-lib/src/lib/another-cmp/**'], - }); - - expect( - appTree.exists('test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx') - ).toBeTruthy(); - expect( - appTree.exists('test-ui-lib/src/lib/another-cmp/another-cmp.stories.tsx') - ).toBeFalsy(); - }); - - it('should ignore files that do not contain components', async () => { - await reactNativeComponentGenerator(appTree, { - name: 'test-ui-lib', - project: 'test-ui-lib', - }); - // create another component - appTree.write( - 'test-ui-lib/src/lib/some-command-line-utils.ts', - `export const add = (a: number, b: number) => a + b;` - ); - - await storiesGenerator(appTree, { - project: 'test-ui-lib', - }); - - // should just create the story and not error, even though there's a js file - // not containing any react component - expect( - appTree.exists('test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx') - ).toBeTruthy(); - }); -}); - -export async function createTestUILib(libName: string): Promise { - let appTree = createTreeWithEmptyWorkspace(); - appTree.write('.gitignore', ''); - - await libraryGenerator(appTree, { - linter: Linter.EsLint, - skipFormat: true, - skipTsConfig: false, - unitTestRunner: 'none', - name: libName, - projectNameAndRootFormat: 'as-provided', - }); - - await applicationGenerator(appTree, { - e2eTestRunner: 'none', - linter: Linter.EsLint, - skipFormat: false, - unitTestRunner: 'none', - name: `${libName}-e2e`, - install: false, - projectNameAndRootFormat: 'as-provided', - }); - return appTree; -} diff --git a/packages/react-native/src/generators/stories/stories.ts b/packages/react-native/src/generators/stories/stories.ts index ab964ce206d783..f22bc922960ca4 100644 --- a/packages/react-native/src/generators/stories/stories.ts +++ b/packages/react-native/src/generators/stories/stories.ts @@ -1,83 +1,16 @@ -import { - ensurePackage, - formatFiles, - getProjects, - Tree, - visitNotIgnoredFiles, -} from '@nx/devkit'; -import { join } from 'path'; -import componentStoryGenerator from '../component-story/component-story'; +import { Tree } from '@nx/devkit'; +import { storiesGenerator as reactStoriesGenerator } from '@nx/react'; import { StorybookStoriesSchema } from './schema'; -import { - containsComponentDeclaration, - projectRootPath, -} from '@nx/react/src/generators/stories/stories'; -import { minimatch } from 'minimatch'; -import { nxVersion } from '../../utils/versions'; - -export async function createAllStories( - tree: Tree, - projectName: string, - ignorePaths?: string[] -) { - ensurePackage('@nx/storybook', nxVersion); - const { isTheFileAStory } = await import('@nx/storybook/src/utils/utilities'); - - const projects = getProjects(tree); - const projectConfiguration = projects.get(projectName); - - const { sourceRoot } = projectConfiguration; - const projectPath = await projectRootPath(tree, projectConfiguration); - - let componentPaths: string[] = []; - visitNotIgnoredFiles(tree, projectPath, (path) => { - if (ignorePaths?.some((pattern) => minimatch(path, pattern))) return; - - if ( - (path.endsWith('.tsx') && !path.endsWith('.spec.tsx')) || - (path.endsWith('.js') && !path.endsWith('.spec.js')) || - (path.endsWith('.jsx') && !path.endsWith('.spec.jsx')) - ) { - // Check if file is NOT a story (either ts/tsx or js/jsx) - if (!isTheFileAStory(tree, path)) { - // Since the file is not a story - // Let's see if the .stories.* file exists - const ext = path.slice(path.lastIndexOf('.')); - const storyPath = `${path.split(ext)[0]}.stories${ext}`; - - if (!tree.exists(storyPath)) { - componentPaths.push(path); - } - } - } - }); - - await Promise.all( - componentPaths.map(async (componentPath) => { - const relativeCmpDir = componentPath.replace(join(sourceRoot, '/'), ''); - - if (!containsComponentDeclaration(tree, componentPath)) { - return; - } - - await componentStoryGenerator(tree, { - componentPath: relativeCmpDir, - project: projectName, - skipFormat: true, - }); - }) - ); -} +/** + * @deprecated This would be a direct pass through to @nx/react:stories generator. + * TODO (@xiongemi): remove this generator for v19 + */ export async function storiesGenerator( host: Tree, schema: StorybookStoriesSchema ) { - await createAllStories(host, schema.project, schema.ignorePaths); - - if (!schema.skipFormat) { - await formatFiles(host); - } + return reactStoriesGenerator(host, schema); } export default storiesGenerator; diff --git a/packages/react-native/src/generators/storybook-configuration/configuration.spec.ts b/packages/react-native/src/generators/storybook-configuration/configuration.spec.ts deleted file mode 100644 index ee57a0ac5effdb..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/configuration.spec.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { Tree } from '@nx/devkit'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { Linter } from '@nx/eslint'; -import { logger } from '@nx/devkit'; - -import libraryGenerator from '../library/library'; -import applicationGenerator from '../application/application'; -import componentGenerator from '../component/component'; -import storybookConfigurationGenerator from './configuration'; - -// nested code imports graph from the repo, which might have innacurate graph version -jest.mock('nx/src/project-graph/project-graph', () => ({ - ...jest.requireActual('nx/src/project-graph/project-graph'), - createProjectGraphAsync: jest - .fn() - .mockImplementation(async () => ({ nodes: {}, dependencies: {} })), -})); - -describe('react-native:storybook-configuration', () => { - let appTree; - - beforeEach(async () => { - jest.spyOn(logger, 'warn').mockImplementation(() => {}); - jest.spyOn(logger, 'debug').mockImplementation(() => {}); - }); - - afterEach(() => { - jest.restoreAllMocks(); - }); - - describe('should generate files for an app', () => { - it('should configure everything at once', async () => { - appTree = await createTestUILib('test-ui-lib'); - appTree.write('.gitignore', ''); - await storybookConfigurationGenerator(appTree, { - name: 'test-ui-lib', - }); - - expect(appTree.exists('test-ui-lib/.storybook/main.js')).toBeTruthy(); - expect( - appTree.exists('test-ui-lib/tsconfig.storybook.json') - ).toBeTruthy(); - }); - - it('should generate stories for components', async () => { - appTree = await createTestUILib('test-ui-lib'); - await componentGenerator(appTree, { - name: 'test-ui-lib', - project: 'test-ui-lib', - }); - await storybookConfigurationGenerator(appTree, { - name: 'test-ui-lib', - generateStories: true, - }); - - expect( - appTree.exists( - 'test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx' - ) - ).toBeTruthy(); - }); - }); - - describe('should generate files for lib', () => { - it('should configure everything at once', async () => { - appTree = await createTestAppLib('test-ui-app'); - await storybookConfigurationGenerator(appTree, { - name: 'test-ui-app', - }); - - expect(appTree.exists('test-ui-app/.storybook/main.js')).toBeTruthy(); - expect( - appTree.exists('test-ui-app/tsconfig.storybook.json') - ).toBeTruthy(); - }); - - it('should generate stories for components', async () => { - appTree = await createTestAppLib('test-ui-app'); - await storybookConfigurationGenerator(appTree, { - name: 'test-ui-app', - generateStories: true, - }); - - // Currently the auto-generate stories feature only picks up components under the 'lib' directory. - // In our 'createTestAppLib' function, we call @nx/react-native:component to generate a component - // under the specified 'lib' directory - expect( - appTree.exists( - 'test-ui-app/src/app/my-component/my-component.stories.tsx' - ) - ).toBeTruthy(); - }); - }); -}); - -export async function createTestUILib(libName: string): Promise { - let appTree = createTreeWithEmptyWorkspace(); - - await libraryGenerator(appTree, { - linter: Linter.EsLint, - skipFormat: true, - skipTsConfig: false, - unitTestRunner: 'none', - name: libName, - projectNameAndRootFormat: 'as-provided', - }); - return appTree; -} - -export async function createTestAppLib( - libName: string, - plainJS = false -): Promise { - let appTree = createTreeWithEmptyWorkspace(); - - await applicationGenerator(appTree, { - e2eTestRunner: 'none', - linter: Linter.EsLint, - skipFormat: false, - style: 'css', - unitTestRunner: 'none', - name: libName, - js: plainJS, - install: false, - projectNameAndRootFormat: 'as-provided', - }); - - await componentGenerator(appTree, { - name: 'my-component', - project: libName, - directory: 'app', - }); - - return appTree; -} diff --git a/packages/react-native/src/generators/storybook-configuration/configuration.ts b/packages/react-native/src/generators/storybook-configuration/configuration.ts index 9077d83e07d0c0..866a1cf8bcd6a7 100644 --- a/packages/react-native/src/generators/storybook-configuration/configuration.ts +++ b/packages/react-native/src/generators/storybook-configuration/configuration.ts @@ -1,88 +1,19 @@ -import { - addDependenciesToPackageJson, - ensurePackage, - formatFiles, - GeneratorCallback, - readProjectConfiguration, - runTasksInSerial, - Tree, - updateProjectConfiguration, -} from '@nx/devkit'; -import { - nxVersion, - reactNativeAsyncStorageVersion, - reactNativeSafeAreaContextVersion, -} from '../../utils/versions'; - -import storiesGenerator from '../stories/stories'; -import { addResolverMainFieldsToMetroConfig } from './lib/add-resolver-main-fields-to-metro-config'; -import { createStorybookFiles } from './lib/create-storybook-files'; -import { replaceAppImportWithStorybookToggle } from './lib/replace-app-import-with-storybook-toggle'; - +import { Tree, logger } from '@nx/devkit'; +import { storybookConfigurationGenerator as reactStorybookConfigurationGenerator } from '@nx/react'; import { StorybookConfigureSchema } from './schema'; -async function generateStories(host: Tree, schema: StorybookConfigureSchema) { - await storiesGenerator(host, { - project: schema.name, - ignorePaths: schema.ignorePaths, - skipFormat: true, - }); -} - +/** + * This would be a direct pass through to @nx/react:storybook-configuration generator. + * @TODO (@xiongemi): remove this generator for v19 + */ export async function storybookConfigurationGenerator( host: Tree, schema: StorybookConfigureSchema -): Promise { - const { configurationGenerator } = ensurePackage< - typeof import('@nx/storybook') - >('@nx/storybook', nxVersion); - - const installTask = await configurationGenerator(host, { - project: schema.name, - uiFramework: '@storybook/react-native', - configureCypress: false, - js: false, - linter: schema.linter, - standaloneConfig: schema.standaloneConfig, - tsConfiguration: schema.tsConfiguration, - skipFormat: true, - }); - - const installRequiredPackagesTask = await addDependenciesToPackageJson( - host, - {}, - { - '@react-native-async-storage/async-storage': - reactNativeAsyncStorageVersion, - 'react-native-safe-area-context': reactNativeSafeAreaContextVersion, - } +) { + logger.warn( + `Please run 'nx run @nx/react:storybook-configuration ${schema.project}' instead.` ); - - addStorybookTask(host, schema.name); - createStorybookFiles(host, schema); - replaceAppImportWithStorybookToggle(host, schema); - addResolverMainFieldsToMetroConfig(host, schema); - - if (schema.generateStories) { - await generateStories(host, schema); - } - - await formatFiles(host); - return runTasksInSerial(installTask, installRequiredPackagesTask); -} - -function addStorybookTask(host: Tree, projectName: string) { - const projectConfig = readProjectConfiguration(host, projectName); - projectConfig.targets['storybook'] = { - executor: '@nx/react-native:storybook', - options: { - searchDir: [projectConfig.sourceRoot], - outputFile: './.storybook/story-loader.js', - pattern: '**/*.stories.@(js|jsx|ts|tsx|md)', - }, - }; - - updateProjectConfiguration(host, projectName, projectConfig); + return reactStorybookConfigurationGenerator(host, schema); } export default storybookConfigurationGenerator; diff --git a/packages/react-native/src/generators/storybook-configuration/files/app/storybook.ts.template b/packages/react-native/src/generators/storybook-configuration/files/app/storybook.ts.template deleted file mode 100644 index c52e78ae8658d3..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/files/app/storybook.ts.template +++ /dev/null @@ -1,9 +0,0 @@ -import { configure, getStorybookUI } from '@storybook/react-native'; - -import { loadStories } from '<%= offsetFromRoot %>../.storybook/story-loader'; - -configure(() => loadStories(), module); - -const StorybookUIRoot = getStorybookUI({}); - -export default StorybookUIRoot; \ No newline at end of file diff --git a/packages/react-native/src/generators/storybook-configuration/files/app/toggle-storybook.tsx.template b/packages/react-native/src/generators/storybook-configuration/files/app/toggle-storybook.tsx.template deleted file mode 100644 index e78e5abe337f9e..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/files/app/toggle-storybook.tsx.template +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Toggle inspired from https://github.com/infinitered/ignite/blob/master/boilerplate/storybook/toggle-storybook.tsx - */ -import React, { useState, useEffect, useRef } from 'react'; -import { DevSettings } from 'react-native'; - -import AppRoot from '../app/App'; - -export const DEFAULT_REACTOTRON_WS_URI = 'ws://localhost:9090'; - -/** - * Toggle Storybook mode, in __DEV__ mode only. - * - * In non-__DEV__ mode, or when Storybook isn't toggled on, - * renders its children. - * - * The mode flag is persisted in async storage, which means it - * persists across reloads/restarts - this is handy when developing - * new components in Storybook. - */ -function ToggleStorybook(props) { - const [showStorybook, setShowStorybook] = useState(false); - const [StorybookUIRoot, setStorybookUIRoot] = useState(null); - const ws = useRef(new WebSocket(DEFAULT_REACTOTRON_WS_URI)); - - useEffect(() => { - if (!__DEV__) { - return undefined; - } - - if (DevSettings) { - // Add our toggle command to the menu - DevSettings.addMenuItem('Toggle Storybook', () => { - setShowStorybook((show) => { - // On toggle, flip the current value - show = !show; - - // Return it to change the local state - return show; - }); - }); - } - - // Load the storybook UI once - // eslint-disable-next-line @typescript-eslint/no-var-requires - setStorybookUIRoot(() => require('./storybook.ts').default); - - // Behave as Reactotron.storybookSwitcher(), not a HOC way. - ws.current.onmessage = (e) => { - const data = JSON.parse(e.data); - - if (data.type === 'storybook') { - setShowStorybook(data.payload); - } - }; - ws.current.onerror = (e) => { - setShowStorybook(false); - }; - }); - - if (showStorybook) { - return StorybookUIRoot ? : null; - } else { - return props.children; - } -} - -export default () => { - return ( - - - - ); -}; diff --git a/packages/react-native/src/generators/storybook-configuration/files/root/story-loader.ts.template b/packages/react-native/src/generators/storybook-configuration/files/root/story-loader.ts.template deleted file mode 100644 index e123e03487e917..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/files/root/story-loader.ts.template +++ /dev/null @@ -1,5 +0,0 @@ -// Auto-generated file created by nx -// DO NOT EDIT. -export function loadStories() { - return []; -} diff --git a/packages/react-native/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.spec.ts b/packages/react-native/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.spec.ts deleted file mode 100644 index c5ca1402b7b958..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.spec.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { addProjectConfiguration, Tree } from '@nx/devkit'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; - -import { formatFile } from '../../../utils/format-file'; - -import { addResolverMainFieldsToMetroConfig } from './add-resolver-main-fields-to-metro-config'; - -describe('addResolverMainFieldsToMetroConfig', () => { - let tree: Tree; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); - - addProjectConfiguration(tree, 'products', { - root: 'products', - sourceRoot: 'products/src', - }); - }); - - it(`should update metro.config.js and add key projectRoot`, async () => { - tree.write( - 'products/metro.config.js', - formatFile` -const { withNxMetro } = require('@nx/react-native'); -const { getDefaultConfig } = require('metro-config'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); - -module.exports = (async () => { - const { - resolver: { sourceExts, assetExts }, - } = await getDefaultConfig(); - return withNxMetro( - { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - babelTransformerPath: require.resolve('react-native-svg-transformer'), - }, - resolver: { - - assetExts: assetExts.filter((ext) => ext !== 'svg'), - sourceExts: [...sourceExts, 'svg'], - blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), - }, - } - ); -})();` - ); - addResolverMainFieldsToMetroConfig(tree, { - name: 'products', - }); - - expect( - formatFile`${tree.read('products/metro.config.js', 'utf-8')}` - ).toEqual( - formatFile` -const { withNxMetro } = require('@nx/react-native'); -const { getDefaultConfig } = require('metro-config'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); - -module.exports = (async () => { - const { - resolver: { sourceExts, assetExts }, - } = await getDefaultConfig(); - return withNxMetro( - { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - babelTransformerPath: require.resolve('react-native-svg-transformer'), - }, - resolver: { - resolverMainFields: ['sbmodern', 'browser', 'main'], - assetExts: assetExts.filter((ext) => ext !== 'svg'), - sourceExts: [...sourceExts, 'svg'], - blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), - }, - } - ); -})();` - ); - }); - - it(`should not udpate metro.config.js if projectRoot already exists`, async () => { - tree.write( - 'products/metro.config.js', - ` -const { withNxMetro } = require('@nx/react-native'); -const { getDefaultConfig } = require('metro-config'); - -module.exports = (async () => { - const { - resolver: { sourceExts, assetExts }, - } = await getDefaultConfig(); - // console.log(getModulesRunBeforeMainModule); - return withNxMetro( - { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - babelTransformerPath: require.resolve('react-native-svg-transformer'), - }, - resolver: { - resolverMainFields: ['main'], - assetExts: assetExts.filter((ext) => ext !== 'svg'), - sourceExts: [...sourceExts, 'svg'], - }, - }, - ); -})(); -` - ); - addResolverMainFieldsToMetroConfig(tree, { - name: 'products', - }); - - expect(tree.read('products/metro.config.js', 'utf-8')).toEqual( - ` -const { withNxMetro } = require('@nx/react-native'); -const { getDefaultConfig } = require('metro-config'); - -module.exports = (async () => { - const { - resolver: { sourceExts, assetExts }, - } = await getDefaultConfig(); - // console.log(getModulesRunBeforeMainModule); - return withNxMetro( - { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - babelTransformerPath: require.resolve('react-native-svg-transformer'), - }, - resolver: { - resolverMainFields: ['main'], - assetExts: assetExts.filter((ext) => ext !== 'svg'), - sourceExts: [...sourceExts, 'svg'], - }, - }, - ); -})(); -` - ); - }); -}); diff --git a/packages/react-native/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.ts b/packages/react-native/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.ts deleted file mode 100644 index 5f0f049b140888..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - logger, - readProjectConfiguration, - stripIndents, - Tree, -} from '@nx/devkit'; -import { join } from 'path'; - -import { StorybookConfigureSchema } from '../schema'; - -/** - * Add resolverMainFields in metro.config.js - */ -export function addResolverMainFieldsToMetroConfig( - host: Tree, - schema: StorybookConfigureSchema -) { - const { root } = readProjectConfiguration(host, schema.name); - - const metroConfigPath = join(root, 'metro.config.js'); - - try { - logger.debug(`Updating resolverMainFields for ${metroConfigPath}`); - const metroConfigContent = host.read(metroConfigPath, 'utf-8'); - if (metroConfigContent.includes('resolverMainFields:')) { - logger.warn(stripIndents`${metroConfigPath} is already udpated.`); - return; - } - host.write( - metroConfigPath, - metroConfigContent.replace( - /},\s+resolver: {/, - `},resolver: { resolverMainFields: ['sbmodern', 'browser', 'main'],` - ) - ); - } catch { - logger.error( - stripIndents`Unable to update ${metroConfigPath} for project ${root}.` - ); - } -} diff --git a/packages/react-native/src/generators/storybook-configuration/lib/create-storybook-files.ts b/packages/react-native/src/generators/storybook-configuration/lib/create-storybook-files.ts deleted file mode 100644 index 3c391fdfe722a6..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/lib/create-storybook-files.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - generateFiles, - logger, - offsetFromRoot, - readProjectConfiguration, - toJS, - Tree, -} from '@nx/devkit'; -import { join } from 'path'; -import * as chalk from 'chalk'; - -import { StorybookConfigureSchema } from '../schema'; - -/** - * This function generate ./storybook under project root. - */ -export async function createStorybookFiles( - host: Tree, - schema: StorybookConfigureSchema -) { - const { root, projectType, targets, sourceRoot } = readProjectConfiguration( - host, - schema.name - ); - - // do not proceed if not a react native project - if ( - targets?.start?.executor !== '@nx/react-native:start' && - targets?.start?.executor !== '@nx/expo:start' && - targets?.start?.executor !== '@nrwl/react-native:start' && - targets?.start?.executor !== '@nrwl/expo:start' - ) { - logger.error( - `Unable to add storybook to ${schema.name}. It is not a Nx React Native / Expo project.` - ); - return; - } - - const storybookUIFileName = schema.js ? 'storybook.js' : 'storybook.ts'; - const storybookUIFilePath = join(root, `./${storybookUIFileName}`); - - if (host.exists(storybookUIFilePath)) { - logger.warn( - `${storybookUIFileName} file already exists for ${projectType} ${schema.name}! Skipping generating this file.` - ); - return; - } - if (projectType !== 'application') { - logger.info( - `${chalk.bold.cyan( - 'info' - )} To see your Storybook stories on the device, you should start your mobile app for the of your choice (typically ios or android).` - ); - } - - // copy files to app's .storybook folder - generateFiles( - host, - join(__dirname, '../files/app'), - join(root, 'src', 'storybook'), - { - tmpl: '', - offsetFromRoot: offsetFromRoot(sourceRoot), - } - ); - - // copy files to workspace root's .storybook folder - generateFiles( - host, - join(__dirname, '../files/root'), - join(root, offsetFromRoot(root), '.storybook'), - { - tmpl: '', - } - ); - - if (schema.js) { - toJS(host); - } -} diff --git a/packages/react-native/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.spec.ts b/packages/react-native/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.spec.ts deleted file mode 100644 index 644e74c284ada6..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { addProjectConfiguration, Tree } from '@nx/devkit'; -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; - -import { formatFile } from '../../../utils/format-file'; - -import { replaceAppImportWithStorybookToggle } from './replace-app-import-with-storybook-toggle'; - -describe('replaceAppImportWithStorybookToggle', () => { - let tree: Tree; - - beforeEach(() => { - tree = createTreeWithEmptyWorkspace(); - - addProjectConfiguration(tree, 'products', { - root: 'products', - sourceRoot: 'products/src', - }); - }); - - it('should update the main file with import from storybook', async () => { - tree.write( - 'products/src/main.tsx', - formatFile`import { AppRegistry } from 'react-native'; - import App from './app/App'; - - AppRegistry.registerComponent('main', () => App); - ` - ); - replaceAppImportWithStorybookToggle(tree, { - name: 'products', - js: false, - }); - - const mainFile = tree.read('products/src/main.tsx', 'utf-8'); - expect(formatFile`${mainFile}`).toEqual( - formatFile`import { AppRegistry } from 'react-native'; - import App from './storybook/toggle-storybook'; - - AppRegistry.registerComponent('main', () => App);` - ); - }); - - it('should not update the main file if import is already updated', async () => { - tree.write( - 'products/src/main.tsx', - formatFile`import { AppRegistry } from 'react-native'; - import App from './app/App'; - - AppRegistry.registerComponent('main', () => App); - ` - ); - replaceAppImportWithStorybookToggle(tree, { - name: 'products', - js: false, - }); - - const mainFile = tree.read('products/src/main.tsx', 'utf-8'); - expect(formatFile`${mainFile}`).toEqual( - formatFile`import { AppRegistry } from 'react-native'; - import App from './storybook/toggle-storybook'; - - AppRegistry.registerComponent('main', () => App);` - ); - }); -}); diff --git a/packages/react-native/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.ts b/packages/react-native/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.ts deleted file mode 100644 index 9740ccc1e12335..00000000000000 --- a/packages/react-native/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - logger, - readProjectConfiguration, - stripIndents, - Tree, -} from '@nx/devkit'; -import { join } from 'path'; - -import { StorybookConfigureSchema } from '../schema'; - -/** - * To replace the import statement for storybook. - * Need to import app with storybook toggle from .storybook/toggle-storybook - */ -export function replaceAppImportWithStorybookToggle( - host: Tree, - schema: StorybookConfigureSchema -) { - const { root, sourceRoot } = readProjectConfiguration(host, schema.name); - - const mainFilePath = join(sourceRoot, schema.js ? 'main.js' : 'main.tsx'); - const appImportImport = `import App from './app/App';`; - const storybookeToggleImport = `import App from './storybook/toggle-storybook';`; - - try { - logger.debug(`Updating import for ${mainFilePath}`); - const contents = host.read(mainFilePath, 'utf-8'); - if ( - !contents.includes(appImportImport) || - contents.includes(storybookeToggleImport) - ) { - logger.warn(stripIndents`${mainFilePath} is already udpated.`); - return; - } - host.write( - mainFilePath, - contents.replace(appImportImport, storybookeToggleImport) - ); - } catch { - logger.warn( - stripIndents`Unable to update import in ${mainFilePath} for project ${root}.` - ); - } -} diff --git a/packages/react-native/src/generators/storybook-configuration/schema.d.ts b/packages/react-native/src/generators/storybook-configuration/schema.d.ts index 6df0723281297c..383a1753700cfb 100644 --- a/packages/react-native/src/generators/storybook-configuration/schema.d.ts +++ b/packages/react-native/src/generators/storybook-configuration/schema.d.ts @@ -1,11 +1,12 @@ import { Linter } from '@nx/eslint'; export interface StorybookConfigureSchema { - name: string; + project: string; + interactionTests?: boolean; generateStories?: boolean; js?: boolean; tsConfiguration?: boolean; linter?: Linter; - standaloneConfig?: boolean; ignorePaths?: string[]; + configureStaticServe?: boolean; } diff --git a/packages/react-native/src/generators/storybook-configuration/schema.json b/packages/react-native/src/generators/storybook-configuration/schema.json index c4ee5a8b06dc72..d12db951ea77b6 100644 --- a/packages/react-native/src/generators/storybook-configuration/schema.json +++ b/packages/react-native/src/generators/storybook-configuration/schema.json @@ -1,29 +1,45 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeStorybookConfigure", "title": "React native Storybook configuration", "description": "Set up Storybook for a React-Native app or library.", "type": "object", "properties": { - "name": { + "project": { "type": "string", - "aliases": ["project", "projectName"], + "aliases": ["name", "projectName"], "description": "Project for which to generate Storybook configuration.", "$default": { "$source": "argv", "index": 0 }, "x-prompt": "For which project do you want to generate Storybook configuration?", - "x-dropdown": "projects" + "x-dropdown": "projects", + "x-priority": "important" + }, + "interactionTests": { + "type": "boolean", + "description": "Set up Storybook interaction tests.", + "x-prompt": "Do you want to set up Storybook interaction tests?", + "x-priority": "important", + "alias": ["configureTestRunner"], + "default": true }, "generateStories": { "type": "boolean", - "description": "Automatically generate *.stories.ts files for components declared in this project?", + "description": "Automatically generate `*.stories.ts` files for components declared in this project?", "x-prompt": "Automatically generate *.stories.ts files for components declared in this project?", "default": true, "x-priority": "important" }, + "configureStaticServe": { + "type": "boolean", + "description": "Specifies whether to configure a static file server target for serving storybook. Helpful for speeding up CI build/test times.", + "x-prompt": "Configure a static file server for the storybook instance?", + "default": true, + "x-priority": "important" + }, "js": { "type": "boolean", "description": "Generate JavaScript story files rather than TypeScript story files.", @@ -40,12 +56,6 @@ "enum": ["eslint"], "default": "eslint" }, - "standaloneConfig": { - "description": "Split the project configuration into `/project.json` rather than including it inside `workspace.json`.", - "type": "boolean", - "default": true, - "x-deprecated": "Nx only supports standaloneConfig" - }, "ignorePaths": { "type": "array", "description": "Paths to ignore when looking for components.", @@ -65,5 +75,5 @@ ] } }, - "required": ["name"] + "required": ["project"] } diff --git a/packages/react-native/src/generators/upgrade-native/lib/normalize-options.ts b/packages/react-native/src/generators/upgrade-native/lib/normalize-options.ts index 2287aaaab0352f..a609e8ecf98842 100644 --- a/packages/react-native/src/generators/upgrade-native/lib/normalize-options.ts +++ b/packages/react-native/src/generators/upgrade-native/lib/normalize-options.ts @@ -8,7 +8,7 @@ export interface NormalizedSchema { lowerCaseName: string; entryFile: string; entryFileIos: string; - e2eTestRunner: 'detox' | 'none'; + e2eTestRunner: 'cypress' | 'playwright' | 'detox' | 'none'; offsetFromRoot: string; } diff --git a/packages/react-native/src/generators/upgrade-native/schema.d.ts b/packages/react-native/src/generators/upgrade-native/schema.d.ts index a492a56913a7db..7909a468bae8df 100644 --- a/packages/react-native/src/generators/upgrade-native/schema.d.ts +++ b/packages/react-native/src/generators/upgrade-native/schema.d.ts @@ -4,6 +4,6 @@ export interface UpgradeNativeConfigureSchema { name: string; displayName?: string; js: boolean; // default is false - e2eTestRunner: 'detox' | 'none'; // default is detox + e2eTestRunner: 'cypress' | 'playwright' | 'detox' | 'none'; // default is cypress install: boolean; // default is true } diff --git a/packages/react-native/src/generators/upgrade-native/schema.json b/packages/react-native/src/generators/upgrade-native/schema.json index e14846ad3d13e1..67b0c82a2795c8 100644 --- a/packages/react-native/src/generators/upgrade-native/schema.json +++ b/packages/react-native/src/generators/upgrade-native/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactNativeUpgradeNativeConfigure", "title": "React native upgrade native configuration", @@ -27,8 +27,8 @@ "e2eTestRunner": { "description": "Adds the specified e2e test runner.", "type": "string", - "enum": ["detox", "none"], - "default": "detox" + "enum": ["cypress", "playwright", "detox", "none"], + "default": "cypress" }, "install": { "type": "boolean", diff --git a/packages/react-native/src/generators/upgrade-native/upgrade-native.ts b/packages/react-native/src/generators/upgrade-native/upgrade-native.ts index f1c027a1f0bd31..97f4140d518995 100644 --- a/packages/react-native/src/generators/upgrade-native/upgrade-native.ts +++ b/packages/react-native/src/generators/upgrade-native/upgrade-native.ts @@ -1,4 +1,6 @@ /** + * @deprecated use `nx run @nx/react-native:upgrade` instead. + * TODO (@xiongemi): remove this generator for nx v19 * This function is a destructive command that replace React Native iOS and Android code with latest. * It would replace the Android and iOS folder entirely. */ @@ -9,6 +11,7 @@ import { readProjectConfiguration, runTasksInSerial, Tree, + logger, } from '@nx/devkit'; import { existsSync } from 'fs'; @@ -22,6 +25,9 @@ export async function reactNativeUpgradeNativeGenerator( host: Tree, schema: UpgradeNativeConfigureSchema ): Promise { + logger.warn( + `Please run 'nx run @nx/react-native:upgrade ${schema.name}' instead.` + ); const { projectType, root: appProjectRoot } = readProjectConfiguration( host, schema.name diff --git a/packages/react-native/src/generators/web-configuration/files/base-vite/.babelrc.js.template b/packages/react-native/src/generators/web-configuration/files/base-vite/.babelrc.js.template new file mode 100644 index 00000000000000..f356c489b5b0c1 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-vite/.babelrc.js.template @@ -0,0 +1,23 @@ +module.exports = function (api) { + api.cache(true); + + if ( + process.env.NX_TASK_TARGET_TARGET === 'build' || + process.env.NX_TASK_TARGET_TARGET.includes('storybook') + ) { + return { + presets: [ + [ + '@nx/react/babel', + { + runtime: 'automatic', + }, + ], + ], + }; + } + + return { + presets: [['module:@react-native/babel-preset', { "useTransformReactJSX": true }]], + }; +}; diff --git a/packages/react-native/src/generators/web-configuration/files/base-vite/index.html__tmpl__ b/packages/react-native/src/generators/web-configuration/files/base-vite/index.html__tmpl__ new file mode 100644 index 00000000000000..17a0ced688ea05 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-vite/index.html__tmpl__ @@ -0,0 +1,15 @@ + + + + + <%= className %> + + + + + + +
+ + + diff --git a/packages/react-native/src/generators/web-configuration/files/base-vite/public/favicon.ico b/packages/react-native/src/generators/web-configuration/files/base-vite/public/favicon.ico new file mode 100644 index 00000000000000..317ebcb2336e08 Binary files /dev/null and b/packages/react-native/src/generators/web-configuration/files/base-vite/public/favicon.ico differ diff --git a/packages/react-native/src/generators/web-configuration/files/base-vite/src/assets/.gitkeep b/packages/react-native/src/generators/web-configuration/files/base-vite/src/assets/.gitkeep new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/packages/react-native/src/generators/web-configuration/files/base-vite/src/main-web.tsx__tmpl__ b/packages/react-native/src/generators/web-configuration/files/base-vite/src/main-web.tsx__tmpl__ new file mode 100644 index 00000000000000..03beec2d207c15 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-vite/src/main-web.tsx__tmpl__ @@ -0,0 +1,9 @@ +import { StrictMode } from 'react'; +import * as ReactDOM from 'react-dom/client'; + +import App from './app/App'; + +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); +root.render( + +); diff --git a/packages/react-native/src/generators/web-configuration/files/base-vite/vite.config.ts__tmpl__ b/packages/react-native/src/generators/web-configuration/files/base-vite/vite.config.ts__tmpl__ new file mode 100644 index 00000000000000..87ca57cf876f48 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-vite/vite.config.ts__tmpl__ @@ -0,0 +1,82 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; +import * as esbuild from 'esbuild'; +import { readFileSync } from 'fs'; + +const extensions = [ + '.mjs', + '.web.tsx', + '.tsx', + '.web.ts', + '.ts', + '.web.jsx', + '.jsx', + '.web.js', + '.js', + '.css', + '.json', +]; + +const rollupPlugin = (matchers: RegExp[]) => ({ + name: 'js-in-jsx', + load(id: string) { + if (matchers.some((matcher) => matcher.test(id)) && id.endsWith('.js')) { + const file = readFileSync(id, { encoding: 'utf-8' }); + return esbuild.transformSync(file, { loader: 'jsx', jsx: 'automatic' }); + } + }, +}); + +export default defineConfig({ + root: __dirname, + cacheDir: '../../node_modules/.vite/<%= fileName %>', + define: { + global: 'window', + }, + + resolve: { + extensions, + alias: { + 'react-native': 'react-native-web', + }, + }, + + build: { + reportCompressedSize: true, + commonjsOptions: { transformMixedEsModules: true }, + outDir: '../../dist/apps/<%= fileName %>/web', + rollupOptions: { + plugins: [rollupPlugin([/react-native-vector-icons/])], + }, + }, + + server: { + port: 4200, + host: 'localhost', + fs: { + // Allow serving files from one level up to the project root + allow: ['..'], + }, + }, + + preview: { + port: 4300, + host: 'localhost', + }, + + optimizeDeps: { + esbuildOptions: { + resolveExtensions: extensions, + jsx: 'automatic', + loader: { '.js': 'jsx' }, + }, + }, + + plugins: [react(), nxViteTsPaths()], + + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, +}); diff --git a/packages/react-native/src/generators/web-configuration/files/base-webpack/.babelrc.js.template b/packages/react-native/src/generators/web-configuration/files/base-webpack/.babelrc.js.template new file mode 100644 index 00000000000000..f356c489b5b0c1 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-webpack/.babelrc.js.template @@ -0,0 +1,23 @@ +module.exports = function (api) { + api.cache(true); + + if ( + process.env.NX_TASK_TARGET_TARGET === 'build' || + process.env.NX_TASK_TARGET_TARGET.includes('storybook') + ) { + return { + presets: [ + [ + '@nx/react/babel', + { + runtime: 'automatic', + }, + ], + ], + }; + } + + return { + presets: [['module:@react-native/babel-preset', { "useTransformReactJSX": true }]], + }; +}; diff --git a/packages/react-native/src/generators/web-configuration/files/base-webpack/src/assets/.gitkeep b/packages/react-native/src/generators/web-configuration/files/base-webpack/src/assets/.gitkeep new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/packages/react-native/src/generators/web-configuration/files/base-webpack/src/favicon.ico b/packages/react-native/src/generators/web-configuration/files/base-webpack/src/favicon.ico new file mode 100644 index 00000000000000..317ebcb2336e08 Binary files /dev/null and b/packages/react-native/src/generators/web-configuration/files/base-webpack/src/favicon.ico differ diff --git a/packages/react-native/src/generators/web-configuration/files/base-webpack/src/index.html__tmpl__ b/packages/react-native/src/generators/web-configuration/files/base-webpack/src/index.html__tmpl__ new file mode 100644 index 00000000000000..4aa6fb888f4eef --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-webpack/src/index.html__tmpl__ @@ -0,0 +1,14 @@ + + + + + <%= className %> + + + + + + +
+ + diff --git a/packages/react-native/src/generators/web-configuration/files/base-webpack/src/main-web.tsx__tmpl__ b/packages/react-native/src/generators/web-configuration/files/base-webpack/src/main-web.tsx__tmpl__ new file mode 100644 index 00000000000000..03beec2d207c15 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-webpack/src/main-web.tsx__tmpl__ @@ -0,0 +1,9 @@ +import { StrictMode } from 'react'; +import * as ReactDOM from 'react-dom/client'; + +import App from './app/App'; + +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); +root.render( + +); diff --git a/packages/react-native/src/generators/web-configuration/files/base-webpack/webpack.config.js__tmpl__ b/packages/react-native/src/generators/web-configuration/files/base-webpack/webpack.config.js__tmpl__ new file mode 100644 index 00000000000000..fcf8fdbb363f66 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/files/base-webpack/webpack.config.js__tmpl__ @@ -0,0 +1,77 @@ +<% if (webpackPluginOptions) { %> +const { NxWebpackPlugin } = require('@nx/webpack'); +const { NxReactWebpackPlugin } = require('@nx/react'); + +module.exports = { + resolve: { + alias: { + 'react-native$': 'react-native-web', + }, + extensions: ['.web.tsx', '.web.ts', '.web.jsx', '.web.js'] + }, + devServer: { + port: 4200 + }, + plugins: [ + new NxWebpackPlugin({ + tsConfig: '<%= webpackPluginOptions.tsConfig %>', + compiler: '<%= webpackPluginOptions.compiler %>', + main: '<%= webpackPluginOptions.main %>', + index: '<%= webpackPluginOptions.index %>', + outputPath: '<%= webpackPluginOptions.outputPath %>', + baseHref: '<%= webpackPluginOptions.baseHref %>', + assets: <%- JSON.stringify(webpackPluginOptions.assets) %>, + styles: <%- JSON.stringify(webpackPluginOptions.styles) %>, + outputHashing: process.env['NODE_ENV'] === 'production' ? 'all' : 'none', + optimization: process.env['NODE_ENV'] === 'production', + }), + new NxReactWebpackPlugin({ + // Uncomment this line if you don't want to use SVGR + // See: https://react-svgr.com/ + // svgr: false + }), + ], +}; +<% } else { %> +const { composePlugins, withNx } = require('@nx/webpack'); +const { withReact } = require('@nx/react'); + +// Nx plugins for webpack. +module.exports = composePlugins( + withNx(), + withReact({ + // Uncomment this line if you don't want to use SVGR + // See: https://react-svgr.com/ + // svgr: false + }), + (config) => { + // Update the webpack config as needed here. + // e.g. `config.plugins.push(new MyPlugin())` + + config.resolve.alias = { + ...config.resolve.alias ?? {}, + 'react-native$': 'react-native-web', + }; + config.resolve.extensions = [ + '.web.tsx', + '.web.ts', + '.web.jsx', + '.web.js', + ...config.resolve.extensions, + ]; + config.module.rules.push({ + test: /\.(js|jsx)$/, + include: /react-native-vector-icons/, + loader: 'babel-loader', + options: { + presets: [ + '@babel/preset-env', + ['@babel/preset-react', { runtime: 'automatic' }], + ], + }, + }); + + return config; + } +); +<% } %> diff --git a/packages/react-native/src/generators/web-configuration/lib/normalize-schema.ts b/packages/react-native/src/generators/web-configuration/lib/normalize-schema.ts new file mode 100644 index 00000000000000..549972388d3276 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/lib/normalize-schema.ts @@ -0,0 +1,23 @@ +import { Tree, getProjects, names, offsetFromRoot } from '@nx/devkit'; +import { WebConfigurationGeneratorSchema } from '../schema'; + +export interface NormalizedSchema extends WebConfigurationGeneratorSchema { + projectRoot: string; + fileName: string; + className: string; +} + +export function normalizeSchema( + tree: Tree, + schema: WebConfigurationGeneratorSchema +) { + const project = getProjects(tree).get(schema.project); + const { fileName, className } = names(schema.project); + return { + ...schema, + projectRoot: project.root, + offsetFromRoot: offsetFromRoot(project.root), + fileName, + className, + }; +} diff --git a/packages/react-native/src/generators/web-configuration/lib/webpack-targets.ts b/packages/react-native/src/generators/web-configuration/lib/webpack-targets.ts new file mode 100644 index 00000000000000..8039c708d1fa75 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/lib/webpack-targets.ts @@ -0,0 +1,92 @@ +import { TargetConfiguration, joinPathFragments } from '@nx/devkit'; +import type { WithReactOptions } from '@nx/react'; +import type { WithNxOptions } from '@nx/webpack'; + +import { NormalizedSchema } from './normalize-schema'; + +export function createBuildTarget( + options: NormalizedSchema +): TargetConfiguration { + return { + executor: '@nx/webpack:webpack', + outputs: ['{options.outputPath}'], + defaultConfiguration: 'production', + options: { + compiler: 'babel', + outputPath: joinPathFragments( + 'dist', + options.projectRoot != '.' ? options.projectRoot : options.project, + 'web' + ), + index: joinPathFragments(options.projectRoot, 'src/index.html'), + baseHref: '/', + main: joinPathFragments(options.projectRoot, `src/main-web.tsx`), + tsConfig: joinPathFragments(options.projectRoot, 'tsconfig.app.json'), + assets: [ + joinPathFragments(options.projectRoot, 'src/favicon.ico'), + joinPathFragments(options.projectRoot, 'src/assets'), + ], + webpackConfig: joinPathFragments( + options.projectRoot, + 'webpack.config.js' + ), + }, + configurations: { + development: { + extractLicenses: false, + optimization: false, + sourceMap: true, + vendorChunk: true, + }, + production: { + optimization: true, + outputHashing: 'all', + sourceMap: false, + namedChunks: false, + extractLicenses: true, + vendorChunk: false, + }, + }, + }; +} + +export function createServeTarget( + options: NormalizedSchema +): TargetConfiguration { + return { + executor: '@nx/webpack:dev-server', + defaultConfiguration: 'development', + options: { + buildTarget: `${options.project}:build`, + hmr: true, + }, + configurations: { + development: { + buildTarget: `${options.project}:build:development`, + }, + production: { + buildTarget: `${options.project}:build:production`, + hmr: false, + }, + }, + }; +} + +export function createNxWebpackPluginOptions( + options: NormalizedSchema +): WithNxOptions & WithReactOptions { + return { + target: 'web', + compiler: 'babel', + outputPath: joinPathFragments( + 'dist', + options.projectRoot != '.' ? options.projectRoot : options.project + ), + index: './src/index.html', + baseHref: '/', + main: `./src/main-web.tsx`, + tsConfig: './tsconfig.app.json', + assets: ['./src/favicon.ico', './src/assets'], + styles: [], + }; +} diff --git a/packages/react-native/src/generators/web-configuration/schema.d.ts b/packages/react-native/src/generators/web-configuration/schema.d.ts new file mode 100644 index 00000000000000..7ad1fbcd162e21 --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/schema.d.ts @@ -0,0 +1,6 @@ +export interface WebConfigurationGeneratorSchema { + project: string; + bundler: 'vite' | 'webpack'; + skipFormat?: boolean; + skipPackageJson?: boolean; //default is false +} diff --git a/packages/react-native/src/generators/web-configuration/schema.json b/packages/react-native/src/generators/web-configuration/schema.json new file mode 100644 index 00000000000000..a355fef9044b0b --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "NxReactNativeWebConfiguration", + "description": "Setup web configuration to React Native apps using react-native-web.", + "title": "Nx React Native Web configuration", + "type": "object", + "properties": { + "project": { + "type": "string", + "aliases": ["name", "projectName"], + "description": "Project for which to generate web configuration.", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "For which project do you want to generate web configuration?", + "x-dropdown": "projects", + "x-priority": "important" + }, + "skipFormat": { + "description": "Skip formatting files.", + "type": "boolean", + "default": false, + "x-priority": "internal" + }, + "skipPackageJson": { + "description": "Do not add dependencies to `package.json`.", + "type": "boolean", + "default": false, + "x-priority": "internal" + }, + "bundler": { + "description": "The bundler to use.", + "type": "string", + "enum": ["vite", "webpack"], + "x-prompt": "Which bundler do you want to use to build the application?", + "default": "webpack", + "x-priority": "important" + } + }, + "required": ["project", "bundler"] +} diff --git a/packages/react-native/src/generators/web-configuration/web-configuration.ts b/packages/react-native/src/generators/web-configuration/web-configuration.ts new file mode 100644 index 00000000000000..59ae399da106db --- /dev/null +++ b/packages/react-native/src/generators/web-configuration/web-configuration.ts @@ -0,0 +1,139 @@ +import { + addDependenciesToPackageJson, + updateProjectConfiguration, + ensurePackage, + formatFiles, + generateFiles, + GeneratorCallback, + joinPathFragments, + readProjectConfiguration, + runTasksInSerial, + Tree, +} from '@nx/devkit'; +import { hasWebpackPlugin } from '@nx/react/src/utils/has-webpack-plugin'; + +import { nxVersion, reactNativeWebVersion } from '../../utils/versions'; +import { NormalizedSchema, normalizeSchema } from './lib/normalize-schema'; +import { + createBuildTarget, + createNxWebpackPluginOptions, + createServeTarget, +} from './lib/webpack-targets'; + +import { WebConfigurationGeneratorSchema } from './schema'; + +/** + * This function sets web configuration for react native apps with react-native-web. + * 1. install react-native-web + * 2. apply webpack or vite init generator + * 3. create files for webpack or vite config, index.html, assets folder, babel.config.js + * @param tree + * @param options + */ +export async function webConfigurationGenerator( + tree: Tree, + options: WebConfigurationGeneratorSchema +) { + const normalizedSchema = normalizeSchema(tree, options); + + const tasks: GeneratorCallback[] = []; + + // install react-native-web + if (!options.skipPackageJson) { + const installTask = addDependenciesToPackageJson( + tree, + {}, + { + 'react-native-web': reactNativeWebVersion, + } + ); + tasks.push(installTask); + } + + // apply webpack or vite init generator + const bundlerTask = await addBundlerConfiguration(tree, normalizedSchema); + tasks.push(bundlerTask); + + // create files for webpack and vite config, index.html + if (normalizedSchema.bundler === 'vite') { + generateFiles( + tree, + joinPathFragments(__dirname, './files/base-vite'), + normalizedSchema.projectRoot, + { ...normalizedSchema, tmpl: '' } + ); + } else { + generateFiles( + tree, + joinPathFragments(__dirname, './files/base-webpack'), + normalizedSchema.projectRoot, + { + ...normalizedSchema, + tmpl: '', + webpackPluginOptions: hasWebpackPlugin(tree) + ? createNxWebpackPluginOptions(normalizedSchema) + : null, + } + ); + } + + if (!options.skipFormat) { + await formatFiles(tree); + } + + return runTasksInSerial(...tasks); +} + +/** + * Add bundler configuration + * - for vite, viteConfigurationGenerator contains logics to add build and serve target + * - for webpack, need to explict add the build and serve target + */ +async function addBundlerConfiguration( + tree: Tree, + normalizedSchema: NormalizedSchema +) { + if (normalizedSchema.bundler === 'vite') { + const { viteConfigurationGenerator } = ensurePackage< + typeof import('@nx/vite') + >('@nx/vite', nxVersion); + const viteTask = await viteConfigurationGenerator(tree, { + uiFramework: 'react', + project: normalizedSchema.project, + newProject: true, + includeVitest: false, + compiler: 'babel', + skipFormat: true, + }); + return viteTask; + } else { + const { webpackInitGenerator } = ensurePackage< + typeof import('@nx/webpack') + >('@nx/webpack', nxVersion); + const webpackInitTask = await webpackInitGenerator(tree, { + skipFormat: true, + skipPackageJson: normalizedSchema.skipPackageJson, + }); + + if (!hasWebpackPlugin(tree)) { + const projectConfiguration = readProjectConfiguration( + tree, + normalizedSchema.project + ); + projectConfiguration.targets = { + ...projectConfiguration.targets, + build: createBuildTarget(normalizedSchema), + serve: createServeTarget(normalizedSchema), + }; + updateProjectConfiguration( + tree, + normalizedSchema.project, + projectConfiguration + ); + } + + return webpackInitTask; + } +} + +export default webConfigurationGenerator; diff --git a/packages/react-native/src/migrations/update-16-6-0/update-metro-config.ts b/packages/react-native/src/migrations/update-16-6-0/update-metro-config.ts index f44285a623d43e..0b32312e6d71e3 100644 --- a/packages/react-native/src/migrations/update-16-6-0/update-metro-config.ts +++ b/packages/react-native/src/migrations/update-16-6-0/update-metro-config.ts @@ -35,7 +35,6 @@ const oldConfigComment = `/** const content = ` const { withNxMetro } = require('@nx/react-native'); const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); const defaultConfig = getDefaultConfig(__dirname); const { assetExts, sourceExts } = defaultConfig.resolver; @@ -53,9 +52,6 @@ const customConfig = { resolver: { assetExts: assetExts.filter((ext) => ext !== 'svg'), sourceExts: [...sourceExts, 'cjs', 'mjs', 'svg'], - blockList: exclusionList([/^(?!.*node_modules).*\\/dist\\/.*/]), - unstable_enableSymlinks: true, - unstable_enablePackageExports: true, }, }; diff --git a/packages/react-native/src/migrations/update-16-9-0/remove-types-react-native.ts b/packages/react-native/src/migrations/update-16-9-0/remove-types-react-native.ts index e3a2030698c29a..a2a9daabb16909 100644 --- a/packages/react-native/src/migrations/update-16-9-0/remove-types-react-native.ts +++ b/packages/react-native/src/migrations/update-16-9-0/remove-types-react-native.ts @@ -1,4 +1,8 @@ -import { readJson, Tree, updateJson } from '@nx/devkit'; +import { + formatFiles, + removeDependenciesFromPackageJson, + Tree, +} from '@nx/devkit'; /** * Remove @types/react-native package since it is no longer required. It would be a part of react native package. @@ -6,17 +10,6 @@ import { readJson, Tree, updateJson } from '@nx/devkit'; * @returns */ export default async function update(tree: Tree) { - const packageJson = readJson(tree, 'package.json'); - - if ( - !packageJson.devDependencies['@types/react-native'] || - !packageJson.dependencies['react-native'] - ) { - return; - } - - updateJson(tree, 'package.json', (packageJson) => { - delete packageJson.devDependencies['@types/react-native']; - return packageJson; - }); + removeDependenciesFromPackageJson(tree, [], ['@types/react-native']); + await formatFiles(tree); } diff --git a/packages/react-native/src/migrations/update-18-0-0/add-upgrade-target.ts b/packages/react-native/src/migrations/update-18-0-0/add-upgrade-target.ts new file mode 100644 index 00000000000000..9c6f18d3af712f --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/add-upgrade-target.ts @@ -0,0 +1,44 @@ +import { + Tree, + formatFiles, + getProjects, + updateProjectConfiguration, + workspaceRoot, +} from '@nx/devkit'; + +import { runCliUpgrade } from '../../executors/upgrade/upgrade.impl'; + +/** + * Add target upgrade for react native apps + * Remove pod-install from dependsOn for all targets, it does pod-install when creating the app + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + for (const [name, config] of projects.entries()) { + if (config.targets?.['start']?.executor === '@nx/react-native:start') { + if (!config.targets['upgrade']) { + config.targets.upgrade = { + executor: '@nx/react-native:upgrade', + options: {}, + }; + await runCliUpgrade(workspaceRoot, config.root); + } + if ( + config.targets?.['pod-install']?.executor === + '@nx/react-native:pod-install' + ) { + for (const targetName in config.targets) { + if (config.targets[targetName]?.dependsOn?.length) { + config.targets[targetName].dependsOn = config.targets[ + targetName + ].dependsOn.filter((dependsOn) => dependsOn !== 'pod-install'); + } + } + } + updateProjectConfiguration(tree, name, config); + } + } + + await formatFiles(tree); +} diff --git a/packages/react-native/src/migrations/update-18-0-0/add-web-configuration.spec.ts b/packages/react-native/src/migrations/update-18-0-0/add-web-configuration.spec.ts new file mode 100644 index 00000000000000..d21016a8a45376 --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/add-web-configuration.spec.ts @@ -0,0 +1,39 @@ +import { addProjectConfiguration, getProjects, Tree } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import update from './add-web-configuration'; + +describe('add-web-configuration', () => { + let tree: Tree; + + beforeEach(async () => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + addProjectConfiguration(tree, 'product', { + root: 'apps/product', + sourceRoot: 'apps/product/src', + targets: { + start: { + executor: '@nx/react-native:start', + options: {}, + }, + serve: { + executor: 'nx:run-commands', + options: { + command: 'nx start product', + }, + }, + }, + }); + }); + + it(`should add web configuration`, async () => { + await update(tree); + + tree.exists('apps/product/webpack.config.js'); + getProjects(tree).forEach((project) => { + expect(project.targets['build'].executor).toEqual('@nx/webpack:webpack'); + expect(project.targets['serve'].executor).toEqual( + '@nx/webpack:dev-server' + ); + }); + }); +}); diff --git a/packages/react-native/src/migrations/update-18-0-0/add-web-configuration.ts b/packages/react-native/src/migrations/update-18-0-0/add-web-configuration.ts new file mode 100644 index 00000000000000..836e6d5a78d0b8 --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/add-web-configuration.ts @@ -0,0 +1,48 @@ +import { + GeneratorCallback, + Tree, + getProjects, + joinPathFragments, + runTasksInSerial, + updateProjectConfiguration, +} from '@nx/devkit'; +import webConfigurationGenerator from '../../generators/web-configuration/web-configuration'; + +/** + * Add web configuration to react native projects + * - delete the current serve target which is just a pass-through to start target + * - rename the babel.config.json to to babel-v72.config.json + * - add web confiugration, it will add .babelrc.js + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + const tasks: GeneratorCallback[] = []; + for (const [projectName, config] of projects.entries()) { + if (config.targets?.['start']?.executor === '@nx/react-native:start') { + if ( + config.targets['serve'] && + config.targets['serve'].executor === 'nx:run-commands' && + config.targets['serve'].options?.command?.startsWith('nx start') + ) { + delete config.targets['serve']; + updateProjectConfiguration(tree, projectName, config); + } + + if (tree.exists(joinPathFragments(config.root, 'babel.config.json'))) { + tree.rename( + joinPathFragments(config.root, 'babel.config.json'), + joinPathFragments(config.root, 'babel-v72.config.json') + ); + } + + tasks.push( + await webConfigurationGenerator(tree, { + project: config.name, + bundler: 'webpack', + }) + ); + } + } + return runTasksInSerial(...tasks); +} diff --git a/packages/react-native/src/migrations/update-18-0-0/change-storybook-targets.ts b/packages/react-native/src/migrations/update-18-0-0/change-storybook-targets.ts new file mode 100644 index 00000000000000..3ec82e91a6498d --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/change-storybook-targets.ts @@ -0,0 +1,77 @@ +import { + GeneratorCallback, + Tree, + getProjects, + removeDependenciesFromPackageJson, + runTasksInSerial, + updateProjectConfiguration, +} from '@nx/devkit'; +import { output } from 'nx/src/utils/output'; +import migrate7Generator from '@nx/storybook/src/generators/migrate-7/migrate-7'; +import { storybookMajorVersion } from '@nx/storybook/src/utils/utilities'; +import storybookConfigurationGenerator from '@nx/react/src/generators/storybook-configuration/configuration'; + +/** + * Upgrade react native storybook target to use web + */ +export default async function changeStorybookTargets(tree: Tree) { + const tasks: GeneratorCallback[] = []; + + // update the storybook target + const projects = getProjects(tree); + let hasStorybookTarget = false; + for (const [projectName, config] of projects.entries()) { + if ( + config.targets?.['storybook']?.executor === '@nx/react-native:storybook' + ) { + hasStorybookTarget = true; + + delete config.targets['storybook']; + updateProjectConfiguration(tree, projectName, config); + + tasks.push( + await storybookConfigurationGenerator(tree, { + project: projectName, + }) + ); + } + } + + /** + * This just checks if Storybook is installed in the workspace. + * The thing here is that during the previous step of the migration, + * during packageJsonUpdates, Nx has already set Storybook + * to version 7, if Storybook exists in the workspace. + * So, it makes no sense here to check if the version is + * 7, because it will always be. + */ + const storybookVersion = storybookMajorVersion(); + if (!hasStorybookTarget || !storybookVersion) { + return; + } + output.log({ + title: 'Migrating Storybook to v7', + bodyLines: [ + `🚀 This migration will update your Storybook configuration to v7.`, + `It will call the @nx/storybook:migrate-7 generator for you.`, + `You can read more about the migration and how this generator works here:`, + `https://nx.dev/packages/storybook/generators/migrate-7`, + ], + }); + tasks.push(await migrate7Generator(tree, { autoAcceptAllPrompts: true })); + tasks.push( + removeDependenciesFromPackageJson( + tree, + [], + [ + '@storybook/react-native', + '@storybook/addon-ondevice-actions', + '@storybook/addon-ondevice-backgrounds', + '@storybook/addon-ondevice-controls', + '@storybook/addon-ondevice-notes', + ] + ) + ); + + return runTasksInSerial(...tasks); +} diff --git a/packages/react-native/src/migrations/update-18-0-0/remove-block-list.spec.ts b/packages/react-native/src/migrations/update-18-0-0/remove-block-list.spec.ts new file mode 100644 index 00000000000000..0c35d6dba3bf23 --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/remove-block-list.spec.ts @@ -0,0 +1,68 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, addProjectConfiguration } from '@nx/devkit'; +import update from './remove-block-list'; + +describe('remove-block-list', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + addProjectConfiguration(tree, 'product', { + root: 'apps/product', + targets: { + start: { + executor: '@nx/react-native:start', + }, + }, + }); + tree.write( + 'apps/product/metro.config.js', + ` +const { withNxMetro } = require('@nx/expo'); +const { getDefaultConfig } = require('@expo/metro-config'); +const { mergeConfig } = require('metro-config'); +const exclusionList = require('metro-config/src/defaults/exclusionList'); + +const defaultConfig = getDefaultConfig(__dirname); +const { assetExts, sourceExts } = defaultConfig.resolver; + +/** + * Metro configuration + * https://facebook.github.io/metro/docs/configuration + * + * @type {import('metro-config').MetroConfig} + */ +const customConfig = { + transformer: { + babelTransformerPath: require.resolve('react-native-svg-transformer'), + }, + resolver: { + assetExts: assetExts.filter((ext) => ext !== 'svg'), + sourceExts: [...sourceExts, 'svg'], + blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), + unstable_enableSymlinks: true, + unstable_enablePackageExports: true, + }, +}; + + +module.exports = withNxMetro(mergeConfig(defaultConfig, customConfig), { + // Change this to true to see debugging info. + // Useful if you have issues resolving modules + debug: false, + // all the file extensions used for imports other than 'ts', 'tsx', 'js', 'jsx', 'json' + extensions: [], + // Specify folders to watch, in addition to Nx defaults (workspace libraries and node_modules) + watchFolders: [], +});` + ); + }); + + it('should remove blockList', async () => { + await update(tree); + const metroConfig = tree.read(`apps/product/metro.config.js`).toString(); + expect(metroConfig).not.toContain('blockList'); + expect(metroConfig).not.toContain('unstable_enableSymlinks'); + expect(metroConfig).not.toContain('unstable_enablePackageExports'); + }); +}); diff --git a/packages/react-native/src/migrations/update-18-0-0/remove-block-list.ts b/packages/react-native/src/migrations/update-18-0-0/remove-block-list.ts new file mode 100644 index 00000000000000..8418072bef5e63 --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/remove-block-list.ts @@ -0,0 +1,32 @@ +import { Tree, formatFiles, getProjects, joinPathFragments } from '@nx/devkit'; + +/** + * This migration removes blockList in metro.config.js. + * It is now excluding dist folder in watchFolders in withNxMetro. + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + for (const [_, config] of projects.entries()) { + if (config.targets?.['start']?.executor === '@nx/react-native:start') { + if (tree.exists(joinPathFragments(config.root, 'metro.config.js'))) { + let content = tree + .read(joinPathFragments(config.root, 'metro.config.js')) + .toString(); + content = content.replace( + `blockList: exclusionList([/^(?!.*node_modules).*/dist/.*/]),`, + '' + ); + content = content.replace('unstable_enableSymlinks: true,', ''); + content = content.replace('unstable_enablePackageExports: true,', ''); + content = content.replace( + `const exclusionList = require('metro-config/src/defaults/exclusionList');`, + '' + ); + + tree.write(joinPathFragments(config.root, 'metro.config.js'), content); + await formatFiles(tree); + } + } + } +} diff --git a/packages/react-native/src/migrations/update-18-0-0/remove-metro.ts b/packages/react-native/src/migrations/update-18-0-0/remove-metro.ts new file mode 100644 index 00000000000000..c5906dcad1979c --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/remove-metro.ts @@ -0,0 +1,35 @@ +import { + formatFiles, + removeDependenciesFromPackageJson, + Tree, +} from '@nx/devkit'; + +/** + * Remove metro-* package since it is no longer explicity required in package.json. + * react-native has dependency of @react-native/community-cli-plugin + * @react-native/community-cli-plugin has dependency of metro + * + * Also remove @react-native-community/cli-* since it is a dependency of react-native. + * (excpet reactNativeCommunityCliPlatformAndroidVersion because android files refer it by path) + * + * https://react-native-community.github.io/upgrade-helper/?from=0.72.6&to=0.73.1#RnDiffApp-package.json + * @param tree + * @returns + */ +export default async function update(tree: Tree) { + removeDependenciesFromPackageJson( + tree, + [], + [ + 'metro', + 'metro-resolver', + 'metro-config', + 'metro-react-native-babel-preset', + 'metro-babel-register', + 'metro-react-native-babel-transformer', + '@react-native-community/cli', + '@react-native-community/cli-platform-ios', + ] + ); + await formatFiles(tree); +} diff --git a/packages/react-native/src/migrations/update-18-0-0/remove-symlink-target.spec.ts b/packages/react-native/src/migrations/update-18-0-0/remove-symlink-target.spec.ts new file mode 100644 index 00000000000000..8fefd26cbf0a80 --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/remove-symlink-target.spec.ts @@ -0,0 +1,40 @@ +import { addProjectConfiguration, getProjects, Tree } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import update from './remove-symlink-target'; + +describe('remove-symlink-target', () => { + let tree: Tree; + + beforeEach(async () => { + tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + addProjectConfiguration(tree, 'product', { + root: 'apps/product', + sourceRoot: 'apps/product/src', + targets: { + 'ensure-symlink': { + executor: '@nx/react-native:ensure-symlink', + options: {}, + }, + 'bundle-android': { + executor: '@nx/react-native:bundle', + dependsOn: ['ensure-symlink'], + outputs: ['{options.bundleOutput}'], + options: { + entryFile: 'src/main.tsx', + platform: 'android', + bundleOutput: 'dist/apps/techy-jokes/android/main.jsbundle', + }, + }, + }, + }); + }); + + it(`should remove ensure-symlink target from project.json`, async () => { + await update(tree); + + getProjects(tree).forEach((project) => { + expect(project.targets['ensure-symlink']).toBeUndefined(); + expect(project.targets['bundle-android'].dependsOn).toEqual([]); + }); + }); +}); diff --git a/packages/react-native/src/migrations/update-18-0-0/remove-symlink-target.ts b/packages/react-native/src/migrations/update-18-0-0/remove-symlink-target.ts new file mode 100644 index 00000000000000..e204d4913f2ff4 --- /dev/null +++ b/packages/react-native/src/migrations/update-18-0-0/remove-symlink-target.ts @@ -0,0 +1,44 @@ +import { + TargetConfiguration, + Tree, + getProjects, + updateProjectConfiguration, +} from '@nx/devkit'; +import { removeSync } from 'fs-extra'; + +/** + * Remove ensure-symlink target. + * It is going to be supported by react-native version 0.73 by default. + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + for (const [projectName, config] of projects.entries()) { + if ( + config.targets?.['ensure-symlink']?.executor === + '@nx/react-native:ensure-symlink' + ) { + removeTargets(config.targets, 'ensure-symlink'); + updateProjectConfiguration(tree, projectName, config); + removeSync(`${config.root}/node_modules`); + } + } +} + +function removeTargets( + targets: { + [targetName: string]: TargetConfiguration; + }, + targetNameToRemove: string +) { + for (const targetName in targets) { + if (targetName === targetNameToRemove) { + delete targets[targetName]; + } + if (targets[targetName]?.dependsOn?.length) { + targets[targetName].dependsOn = targets[targetName].dependsOn.filter( + (dependsOn) => dependsOn !== targetNameToRemove + ); + } + } +} diff --git a/packages/react-native/src/utils/add-jest.ts b/packages/react-native/src/utils/add-jest.ts index 3a363006162ab8..ce2ddd2cb6581a 100644 --- a/packages/react-native/src/utils/add-jest.ts +++ b/packages/react-native/src/utils/add-jest.ts @@ -35,6 +35,17 @@ export async function addJest( moduleNameMapper: { '\\\\.svg$': '@nx/react-native/plugins/jest/svg-mock' }, + transform: { + '^.+\\.(js|ts|tsx)$': [ + 'babel-jest', + { + configFile: __dirname + '/.babelrc.js', + }, + ], + '^.+\\.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$': require.resolve( + 'react-native/jest/assetFileTransformer.js' + ), + }, coverageDirectory: '${offsetFromRoot( appProjectRoot )}coverage/${appProjectRoot}' diff --git a/packages/react-native/src/utils/ensure-dependencies.ts b/packages/react-native/src/utils/ensure-dependencies.ts index f2156801ae7860..59d26acd9361a3 100644 --- a/packages/react-native/src/utils/ensure-dependencies.ts +++ b/packages/react-native/src/utils/ensure-dependencies.ts @@ -11,7 +11,8 @@ import { import { babelRuntimeVersion, jestReactNativeVersion, - metroVersion, + reactNativeBabelPresetVersion, + reactNativeCommunityCliPlatformAndroidVersion, reactNativeMetroConfigVersion, reactNativeSvgTransformerVersion, reactNativeSvgVersion, @@ -31,16 +32,13 @@ export function ensureDependencies(tree: Tree): GeneratorCallback { { '@types/node': typesNodeVersion, '@types/react': typesReactVersion, + '@react-native/babel-preset': reactNativeBabelPresetVersion, '@react-native/metro-config': reactNativeMetroConfigVersion, '@testing-library/react-native': testingLibraryReactNativeVersion, '@testing-library/jest-native': testingLibraryJestNativeVersion, + '@react-native-community/cli-platform-android': + reactNativeCommunityCliPlatformAndroidVersion, 'jest-react-native': jestReactNativeVersion, - metro: metroVersion, - 'metro-config': metroVersion, - 'metro-resolver': metroVersion, - 'metro-babel-register': metroVersion, - 'metro-react-native-babel-preset': metroVersion, - 'metro-react-native-babel-transformer': metroVersion, 'react-test-renderer': reactTestRendererVersion, 'react-native-svg-transformer': reactNativeSvgTransformerVersion, 'react-native-svg': reactNativeSvgVersion, diff --git a/packages/react-native/src/utils/find-all-npm-dependencies.spec.ts b/packages/react-native/src/utils/find-all-npm-dependencies.spec.ts deleted file mode 100644 index e7ecf1955b8e32..00000000000000 --- a/packages/react-native/src/utils/find-all-npm-dependencies.spec.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { findAllNpmDependencies } from './find-all-npm-dependencies'; -import { ProjectGraph } from '@nx/devkit'; - -test('findAllNpmDependencies', () => { - const graph: ProjectGraph = { - nodes: { - myapp: { - type: 'app', - name: 'myapp', - data: { files: [] }, - }, - lib1: { - type: 'lib', - name: 'lib1', - data: { files: [] }, - }, - lib2: { - type: 'lib', - name: 'lib2', - data: { files: [] }, - }, - lib3: { - type: 'lib', - name: 'lib3', - data: { files: [] }, - }, - } as any, - externalNodes: { - 'npm:react-native-image-picker': { - type: 'npm', - name: 'npm:react-native-image-picker', - data: { - version: '1', - packageName: 'react-native-image-picker', - }, - }, - 'npm:react-native-dialog': { - type: 'npm', - name: 'npm:react-native-dialog', - data: { - version: '1', - packageName: 'react-native-dialog', - }, - }, - 'npm:react-native-snackbar': { - type: 'npm', - name: 'npm:react-native-snackbar', - data: { - version: '1', - packageName: 'react-native-snackbar', - }, - }, - 'npm:@nx/react-native': { - type: 'npm', - name: 'npm:@nx/react-native', - data: { - version: '1', - packageName: '@nx/react-native', - }, - }, - }, - dependencies: { - myapp: [ - { type: 'static', source: 'myapp', target: 'lib1' }, - { type: 'static', source: 'myapp', target: 'lib2' }, - { - type: 'static', - source: 'myapp', - target: 'npm:react-native-image-picker', - }, - { - type: 'static', - source: 'myapp', - target: 'npm:@nx/react-native', - }, - ], - lib1: [ - { type: 'static', source: 'lib1', target: 'lib2' }, - { type: 'static', source: 'lib3', target: 'npm:react-native-snackbar' }, - ], - lib2: [{ type: 'static', source: 'lib2', target: 'lib3' }], - lib3: [ - { type: 'static', source: 'lib3', target: 'npm:react-native-dialog' }, - ], - }, - }; - - const result = findAllNpmDependencies(graph, 'myapp'); - - expect(result).toEqual([ - 'react-native-dialog', - 'react-native-snackbar', - 'react-native-image-picker', - ]); -}); diff --git a/packages/react-native/src/utils/find-all-npm-dependencies.ts b/packages/react-native/src/utils/find-all-npm-dependencies.ts deleted file mode 100644 index c8136ce96f9270..00000000000000 --- a/packages/react-native/src/utils/find-all-npm-dependencies.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ProjectGraph } from '@nx/devkit'; - -export function findAllNpmDependencies( - graph: ProjectGraph, - projectName: string, - list: string[] = [], - seen = new Set() -) { - // In case of bad circular dependencies - if (seen.has(projectName)) { - return list; - } - seen.add(projectName); - - const node = graph.externalNodes[projectName]; - - // Don't want to include '@nx/react-native' because React Native - // autolink will warn that the package has no podspec file for iOS. - if (node) { - if ( - node.name !== 'npm:@nx/react-native' && - node.name !== 'npm:@nrwl/react-native' - ) { - list.push(node.data.packageName); - } - } else { - // it's workspace project, search for it's dependencies - graph.dependencies[projectName]?.forEach((dep) => - findAllNpmDependencies(graph, dep.target, list, seen) - ); - } - return list; -} diff --git a/packages/react-native/src/utils/symlink-task.ts b/packages/react-native/src/utils/symlink-task.ts deleted file mode 100644 index 08bc05949c7a19..00000000000000 --- a/packages/react-native/src/utils/symlink-task.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ensureNodeModulesSymlink } from './ensure-node-modules-symlink'; -import * as chalk from 'chalk'; -import { GeneratorCallback, logger } from '@nx/devkit'; - -export function runSymlink( - workspaceRoot: string, - projectRoot: string -): GeneratorCallback { - return () => { - logger.info(`creating symlinks for ${chalk.bold(projectRoot)}`); - try { - ensureNodeModulesSymlink(workspaceRoot, projectRoot); - } catch { - throw new Error( - `Failed to create symlinks for ${chalk.bold(projectRoot)}` - ); - } - }; -} diff --git a/packages/react-native/src/utils/testing-generators.ts b/packages/react-native/src/utils/testing-generators.ts index 883bfeca750d01..7592008601ca6b 100644 --- a/packages/react-native/src/utils/testing-generators.ts +++ b/packages/react-native/src/utils/testing-generators.ts @@ -12,6 +12,7 @@ export async function createApp(tree: Tree, appName: string): Promise { e2eTestRunner: 'none', install: false, projectNameAndRootFormat: 'as-provided', + bundler: 'webpack', }); } diff --git a/packages/react-native/src/utils/versions.ts b/packages/react-native/src/utils/versions.ts index 46a6d8de95cb5f..21e83e7a925d37 100644 --- a/packages/react-native/src/utils/versions.ts +++ b/packages/react-native/src/utils/versions.ts @@ -1,30 +1,26 @@ export const nxVersion = require('../../package.json').version; -export const reactNativeVersion = '0.72.6'; +export const reactNativeVersion = '0.73.2'; export const typesNodeVersion = '18.16.9'; -export const metroVersion = '0.76.8'; -export const reactNativeMetroConfigVersion = '^0.72.11'; +export const reactNativeCommunityCliPlatformAndroidVersion = '12.3.0'; // anddroid refers files from this package -export const reactNativeCommunityCli = '11.3.7'; -export const reactNativeCommunityCliIos = '11.3.7'; -export const reactNativeCommunityCliAndroid = '11.3.7'; +export const reactNativeBabelPresetVersion = '^0.73.18'; +export const reactNativeMetroConfigVersion = '^0.73.2'; +export const reactNativeWebVersion = '^0.19.9'; export const reactVersion = '18.2.0'; export const reactDomVersion = '18.2.0'; export const reactTestRendererVersion = '18.2.0'; -export const typesReactVersion = '18.0.28'; +export const typesReactVersion = '~18.2.45'; -export const testingLibraryReactNativeVersion = '~12.3.0'; +export const testingLibraryReactNativeVersion = '~12.4.2'; export const testingLibraryJestNativeVersion = '~5.4.3'; export const jestReactNativeVersion = '18.0.0'; -export const reactNativeSvgTransformerVersion = '1.0.0'; -export const reactNativeSvgVersion = '13.9.0'; +export const reactNativeSvgTransformerVersion = '1.2.0'; +export const reactNativeSvgVersion = '14.1.0'; export const babelRuntimeVersion = '7.22.6'; - -export const reactNativeAsyncStorageVersion = '~1.19.3'; -export const reactNativeSafeAreaContextVersion = '~4.7.2'; diff --git a/packages/react-native/tsconfig.lib.json b/packages/react-native/tsconfig.lib.json index 5c589aef9e7c76..865f1bda76b83d 100644 --- a/packages/react-native/tsconfig.lib.json +++ b/packages/react-native/tsconfig.lib.json @@ -2,7 +2,6 @@ "extends": "./tsconfig.json", "compilerOptions": { "module": "commonjs", - "outDir": "../../dist/out-tsc", "declaration": true, "types": ["node"] }, diff --git a/packages/react-native/tsconfig.spec.json b/packages/react-native/tsconfig.spec.json index 46f9467f3bd81c..cd50f90b45f192 100644 --- a/packages/react-native/tsconfig.spec.json +++ b/packages/react-native/tsconfig.spec.json @@ -1,7 +1,6 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "../../dist/out-tsc", "module": "commonjs", "types": ["jest", "node"] }, diff --git a/packages/react/docs/cypress-component-configuration-examples.md b/packages/react/docs/cypress-component-configuration-examples.md index 29445395d9856d..7e8672bda235af 100644 --- a/packages/react/docs/cypress-component-configuration-examples.md +++ b/packages/react/docs/cypress-component-configuration-examples.md @@ -5,7 +5,7 @@ You can migrate with to v10 via the [migrate-to-cypress-10 generator](/packages/ This generator is for Cypress based component testing. -If you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 18. +If you want to test components via Storybook with Cypress, then check out the [storybook-configuration generator docs](/nx-api/react/generators/storybook-configuration). However, this functionality is deprecated, and will be removed on Nx version 19. {% /callout %} This generator is designed to get your React project up and running with Cypress Component Testing. diff --git a/packages/react/migrations.json b/packages/react/migrations.json index 2ebf56caa96071..7cc691b277542a 100644 --- a/packages/react/migrations.json +++ b/packages/react/migrations.json @@ -47,6 +47,12 @@ "version": "16.7.0-beta.2", "description": "Add @nx/react types to tsconfig types array", "implementation": "./src/migrations/update-16-7-0-add-typings/update-16-7-0-add-typings" + }, + "add-module-federation-env-var-to-target-defaults": { + "cli": "nx", + "version": "18.0.0-beta.0", + "description": "Add NX_MF_DEV_SERVER_STATIC_REMOTES to inputs for task hashing when '@nx/webpack:webpack' is used for Module Federation.", + "factory": "./src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults" } }, "packageJsonUpdates": { diff --git a/packages/react/plugins/component-testing/index.ts b/packages/react/plugins/component-testing/index.ts index 4dc7c45b3f22c0..d8664b5f622020 100644 --- a/packages/react/plugins/component-testing/index.ts +++ b/packages/react/plugins/component-testing/index.ts @@ -259,7 +259,7 @@ function buildTargetWebpack( return async () => { customWebpack = await customWebpack; - // TODO(v18): Once webpackConfig is always set in @nx/webpack:webpack and isolatedConfig is removed, we no longer need this default. + // TODO(v19): Once webpackConfig is always set in @nx/webpack:webpack and isolatedConfig is removed, we no longer need this default. const configure = composePluginsSync(withNx(), withWeb()); const defaultWebpack = configure( {}, diff --git a/packages/react/src/generators/application/application.ts b/packages/react/src/generators/application/application.ts index 4ea0da0db7678c..4e9ec604763afa 100644 --- a/packages/react/src/generators/application/application.ts +++ b/packages/react/src/generators/application/application.ts @@ -38,6 +38,7 @@ import { isEslintConfigSupported, } from '@nx/eslint/src/generators/utils/eslint-file'; import { initGenerator as jsInitGenerator } from '@nx/js'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; async function addLinting(host: Tree, options: NormalizedSchema) { const tasks: GeneratorCallback[] = []; @@ -304,6 +305,10 @@ export async function applicationGeneratorInternal( await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/react/src/generators/application/schema.json b/packages/react/src/generators/application/schema.json index 71ac77d1141fe5..29c9dde97d74cd 100644 --- a/packages/react/src/generators/application/schema.json +++ b/packages/react/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactApp", "title": "Create a React Application", @@ -56,11 +56,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/packages/react/src/generators/component-cypress-spec/schema.json b/packages/react/src/generators/component-cypress-spec/schema.json index 3b38a9d073be9b..24cb93fee8e75b 100644 --- a/packages/react/src/generators/component-cypress-spec/schema.json +++ b/packages/react/src/generators/component-cypress-spec/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactComponentCypressSpec", "title": "Create component Cypress spec", diff --git a/packages/react/src/generators/component-story/schema.json b/packages/react/src/generators/component-story/schema.json index d7e48a93d92c4e..83f3a8ab614bbe 100644 --- a/packages/react/src/generators/component-story/schema.json +++ b/packages/react/src/generators/component-story/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactComponentStory", "title": "Create component story", diff --git a/packages/react/src/generators/component-test/schema.json b/packages/react/src/generators/component-test/schema.json index 7d569dc2b66984..8435cc9886e343 100644 --- a/packages/react/src/generators/component-test/schema.json +++ b/packages/react/src/generators/component-test/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactCypressComponentTest", "title": "Add Cypress component test", diff --git a/packages/react/src/generators/component/schema.d.ts b/packages/react/src/generators/component/schema.d.ts index 9c7ba27ed7f4cc..f13493cef3107e 100644 --- a/packages/react/src/generators/component/schema.d.ts +++ b/packages/react/src/generators/component/schema.d.ts @@ -3,7 +3,7 @@ import { SupportedStyles } from '../../../typings/style'; export interface Schema { name: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; style: SupportedStyles; @@ -11,18 +11,18 @@ export interface Schema { directory?: string; export?: boolean; /** - * @deprecated Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19. */ pascalCaseFiles?: boolean; /** - * @deprecated Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19. */ pascalCaseDirectory?: boolean; classComponent?: boolean; routing?: boolean; js?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ flat?: boolean; globalCss?: boolean; diff --git a/packages/react/src/generators/component/schema.json b/packages/react/src/generators/component/schema.json index 985f215756ce9e..11ef1ba471fc59 100644 --- a/packages/react/src/generators/component/schema.json +++ b/packages/react/src/generators/component/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactComponent", "title": "Create a React Component", @@ -13,7 +13,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -40,11 +40,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", @@ -91,7 +91,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19." }, "export": { "type": "boolean", @@ -105,14 +105,14 @@ "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `App/App.tsx`).", "alias": "R", "default": false, - "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "classComponent": { "type": "boolean", diff --git a/packages/react/src/generators/federate-module/schema.json b/packages/react/src/generators/federate-module/schema.json index fc151d98caecbb..74025490ee77b2 100644 --- a/packages/react/src/generators/federate-module/schema.json +++ b/packages/react/src/generators/federate-module/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", diff --git a/packages/react/src/generators/hook/schema.d.ts b/packages/react/src/generators/hook/schema.d.ts index 07bda20c4ee368..c857d6ae742ed6 100644 --- a/packages/react/src/generators/hook/schema.d.ts +++ b/packages/react/src/generators/hook/schema.d.ts @@ -1,22 +1,22 @@ export interface Schema { name: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project: string; skipTests?: boolean; directory?: string; export?: boolean; /** - * @deprecated Provide the `name` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `name` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ pascalCaseFiles?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ pascalCaseDirectory?: boolean; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. This option will be removed in Nx v19. */ flat?: boolean; js?: boolean; diff --git a/packages/react/src/generators/hook/schema.json b/packages/react/src/generators/hook/schema.json index 672f39dff3a488..a0c5901aeb49c6 100644 --- a/packages/react/src/generators/hook/schema.json +++ b/packages/react/src/generators/hook/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactHook", "title": "Create a React Hook for Nx", @@ -19,7 +19,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -56,7 +56,7 @@ "type": "boolean", "description": "Create hook at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "export": { "type": "boolean", @@ -70,14 +70,14 @@ "description": "Use pascal case hook file name (e.g. `useHook.ts`).", "alias": "P", "default": false, - "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `name` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `useHook/useHook.ts`).", "alias": "R", "default": false, - "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v18." + "x-deprecated": "Provide the `directory` in pascal-case and use the `as-provided` format. This option will be removed in Nx v19." } }, "required": ["name"] diff --git a/packages/react/src/generators/host/host.ts b/packages/react/src/generators/host/host.ts index 61142d20bbe8f4..76610d8d937ac7 100644 --- a/packages/react/src/generators/host/host.ts +++ b/packages/react/src/generators/host/host.ts @@ -20,6 +20,7 @@ import { import { setupSsrForHost } from './lib/setup-ssr-for-host'; import { updateModuleFederationE2eProject } from './lib/update-module-federation-e2e-project'; import { NormalizedSchema, Schema } from './schema'; +import { addMfEnvToTargetDefaultInputs } from '../../utils/add-mf-env-to-inputs'; export async function hostGenerator( host: Tree, @@ -114,6 +115,8 @@ export async function hostGeneratorInternal( ); } + addMfEnvToTargetDefaultInputs(host); + if (!options.skipFormat) { await formatFiles(host); } diff --git a/packages/react/src/generators/host/schema.d.ts b/packages/react/src/generators/host/schema.d.ts index cad6df70c20a80..8629ba96d8d912 100644 --- a/packages/react/src/generators/host/schema.d.ts +++ b/packages/react/src/generators/host/schema.d.ts @@ -1,6 +1,6 @@ import type { ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils'; import type { Linter } from '@nx/eslint'; -import type { SupportedStyles } from '../../../typings'; +import type { SupportedStyles } from '../../../typings/style'; export interface Schema { classComponent?: boolean; diff --git a/packages/react/src/generators/host/schema.json b/packages/react/src/generators/host/schema.json index 513365d6a35ccf..7fa5d6d169378e 100644 --- a/packages/react/src/generators/host/schema.json +++ b/packages/react/src/generators/host/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactHost", "cli": "nx", "title": "Generate Module Federation Setup for React Host App", @@ -43,11 +43,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/packages/react/src/generators/init/schema.json b/packages/react/src/generators/init/schema.json index 31a6011f3ad096..316846a149e3ec 100644 --- a/packages/react/src/generators/init/schema.json +++ b/packages/react/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxReactNgInit", "title": "Init React Plugin", "description": "Initialize a React Plugin.", diff --git a/packages/react/src/generators/library/library.ts b/packages/react/src/generators/library/library.ts index db5d1c66261d97..27674303988abc 100644 --- a/packages/react/src/generators/library/library.ts +++ b/packages/react/src/generators/library/library.ts @@ -26,6 +26,7 @@ import { extractTsConfigBase } from '../../utils/create-ts-config'; import { installCommonDependencies } from './lib/install-common-dependencies'; import { setDefaults } from './lib/set-defaults'; import { relative } from 'path'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function libraryGenerator(host: Tree, schema: Schema) { return await libraryGeneratorInternal(host, { @@ -235,6 +236,10 @@ export async function libraryGeneratorInternal(host: Tree, schema: Schema) { await formatFiles(host); } + tasks.push(() => { + logShowProjectCommand(options.name); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/react/src/generators/library/schema.json b/packages/react/src/generators/library/schema.json index 5627c044c6a04e..6b800996861d35 100644 --- a/packages/react/src/generators/library/schema.json +++ b/packages/react/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactLibrary", "title": "Create a React Library", @@ -50,11 +50,11 @@ { "value": "css", "label": "CSS" }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/packages/react/src/generators/redux/schema.d.ts b/packages/react/src/generators/redux/schema.d.ts index 789812a2e5515b..7852968726bc54 100644 --- a/packages/react/src/generators/redux/schema.d.ts +++ b/packages/react/src/generators/redux/schema.d.ts @@ -1,7 +1,7 @@ export interface Schema { name: string; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; directory?: string; diff --git a/packages/react/src/generators/redux/schema.json b/packages/react/src/generators/redux/schema.json index 4ca676293773dd..aec773e83231f8 100644 --- a/packages/react/src/generators/redux/schema.json +++ b/packages/react/src/generators/redux/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "redux", "title": "Create Redux state", @@ -22,7 +22,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "directory": { "type": "string", diff --git a/packages/react/src/generators/remote/remote.ts b/packages/react/src/generators/remote/remote.ts index 338e125d2a46b8..be01dc26700a36 100644 --- a/packages/react/src/generators/remote/remote.ts +++ b/packages/react/src/generators/remote/remote.ts @@ -21,6 +21,7 @@ import setupSsrGenerator from '../setup-ssr/setup-ssr'; import { setupSsrForRemote } from './lib/setup-ssr-for-remote'; import { setupTspathForRemote } from './lib/setup-tspath-for-remote'; import { addRemoteToDynamicHost } from './lib/add-remote-to-dynamic-host'; +import { addMfEnvToTargetDefaultInputs } from '../../utils/add-mf-env-to-inputs'; export function addModuleFederationFiles( host: Tree, @@ -141,6 +142,8 @@ export async function remoteGeneratorInternal(host: Tree, schema: Schema) { ); } + addMfEnvToTargetDefaultInputs(host); + if (!options.skipFormat) { await formatFiles(host); } diff --git a/packages/react/src/generators/remote/schema.d.ts b/packages/react/src/generators/remote/schema.d.ts index 2b6eab87396506..8256e7abfafe8d 100644 --- a/packages/react/src/generators/remote/schema.d.ts +++ b/packages/react/src/generators/remote/schema.d.ts @@ -1,6 +1,6 @@ import type { ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils'; import type { Linter } from '@nx/eslint'; -import type { SupportedStyles } from '../../../typings'; +import type { SupportedStyles } from '../../../typings/style'; import type { NormalizedSchema as ApplicationNormalizedSchema } from '../application/schema'; export interface Schema { diff --git a/packages/react/src/generators/remote/schema.json b/packages/react/src/generators/remote/schema.json index bc1fad5fce547e..41f1498e2b465b 100644 --- a/packages/react/src/generators/remote/schema.json +++ b/packages/react/src/generators/remote/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactRemote", "cli": "nx", "title": "Generate Module Federation Setup for React Remote App", @@ -49,11 +49,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "styled-components", diff --git a/packages/react/src/generators/setup-ssr/schema.json b/packages/react/src/generators/setup-ssr/schema.json index 741a7fb677ac06..877fcba8cc1242 100644 --- a/packages/react/src/generators/setup-ssr/schema.json +++ b/packages/react/src/generators/setup-ssr/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactSSRSetup", "cli": "nx", "title": "Generate SSR setup for a React app", diff --git a/packages/react/src/generators/setup-tailwind/schema.json b/packages/react/src/generators/setup-tailwind/schema.json index c0caaccbd79ff3..d863a8e925f066 100644 --- a/packages/react/src/generators/setup-tailwind/schema.json +++ b/packages/react/src/generators/setup-tailwind/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactTailwindSetupGenerator", "title": "Configures Tailwind CSS for an application or a buildable/publishable library.", diff --git a/packages/react/src/generators/stories/schema.json b/packages/react/src/generators/stories/schema.json index c3cb50f7f6ca05..dd26ad2f3bc713 100644 --- a/packages/react/src/generators/stories/schema.json +++ b/packages/react/src/generators/stories/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactStorybookStories", "title": "Generate React Storybook stories", diff --git a/packages/react/src/generators/storybook-configuration/configuration.spec.ts b/packages/react/src/generators/storybook-configuration/configuration.spec.ts index 4981a6cd658f30..a09afbdbec6123 100644 --- a/packages/react/src/generators/storybook-configuration/configuration.spec.ts +++ b/packages/react/src/generators/storybook-configuration/configuration.spec.ts @@ -1,4 +1,4 @@ -// TODO(katerina): Nx 18 -> remove Cypress +// TODO(katerina): Nx 19 -> remove Cypress import { installedCypressVersion } from '@nx/cypress/src/utils/cypress-version'; import { logger, Tree } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; diff --git a/packages/react/src/generators/storybook-configuration/configuration.ts b/packages/react/src/generators/storybook-configuration/configuration.ts index de5dd7f3d8e032..ca8edb6ae076ef 100644 --- a/packages/react/src/generators/storybook-configuration/configuration.ts +++ b/packages/react/src/generators/storybook-configuration/configuration.ts @@ -10,7 +10,7 @@ import { import { nxVersion } from '../../utils/versions'; async function generateStories(host: Tree, schema: StorybookConfigureSchema) { - // TODO(katerina): Nx 18 -> remove Cypress + // TODO(katerina): Nx 19 -> remove Cypress ensurePackage('@nx/cypress', nxVersion); const { getE2eProjectName } = await import( '@nx/cypress/src/utils/project-name' @@ -47,7 +47,8 @@ export async function storybookConfigurationGenerator( if ( findWebpackConfig(host, projectConfig.root) || projectConfig.targets['build']?.executor === '@nx/rollup:rollup' || - projectConfig.targets['build']?.executor === '@nrwl/rollup:rollup' + projectConfig.targets['build']?.executor === '@nrwl/rollup:rollup' || + projectConfig.targets['build']?.executor === '@nx/expo:build' ) { uiFramework = '@storybook/react-webpack5'; } diff --git a/packages/react/src/generators/storybook-configuration/schema.json b/packages/react/src/generators/storybook-configuration/schema.json index c4d0b5bf9cd3f2..cb6695fc3f1bd6 100644 --- a/packages/react/src/generators/storybook-configuration/schema.json +++ b/packages/react/src/generators/storybook-configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxReactStorybookConfigure", "title": "React Storybook Configure", @@ -29,7 +29,7 @@ "configureCypress": { "type": "boolean", "description": "Run the cypress-configure generator.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "generateStories": { "type": "boolean", @@ -41,7 +41,7 @@ "generateCypressSpecs": { "type": "boolean", "description": "Automatically generate test files in the Cypress E2E app generated by the `cypress-configure` generator.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "configureStaticServe": { "type": "boolean", @@ -53,7 +53,7 @@ "cypressDirectory": { "type": "string", "description": "A directory where the Cypress project will be placed. Placed at the root by default.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "js": { "type": "boolean", diff --git a/packages/react/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.spec.ts b/packages/react/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.spec.ts new file mode 100644 index 00000000000000..bd594493e69c86 --- /dev/null +++ b/packages/react/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.spec.ts @@ -0,0 +1,123 @@ +import addMfEnvVarToTargetDefaults from './add-mf-env-var-to-target-defaults'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { addProjectConfiguration, readNxJson, updateNxJson } from '@nx/devkit'; + +describe('addMfEnvVarToTargetDefaults', () => { + it('should add the executor and input when it does not exist', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'test', { + root: '', + targets: { + build: { + executor: '@nx/webpack:webpack', + }, + }, + }); + tree.write('module-federation.config.ts', ''); + + // ACT + await addMfEnvVarToTargetDefaults(tree); + + // ASSERT + const nxJson = readNxJson(tree); + expect(nxJson.targetDefaults).toMatchInlineSnapshot(` + { + "@nx/webpack:webpack": { + "inputs": [ + { + "env": "NX_MF_DEV_SERVER_STATIC_REMOTES", + }, + ], + }, + "build": { + "cache": true, + }, + "lint": { + "cache": true, + }, + } + `); + }); + + it('should not add the executor and input when no project uses it', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'test', { + root: '', + targets: { + build: { + executor: '@nx/angular:module-federation-dev-server', + }, + }, + }); + + // ACT + await addMfEnvVarToTargetDefaults(tree); + + // ASSERT + const nxJson = readNxJson(tree); + expect(nxJson.targetDefaults).toMatchInlineSnapshot(` + { + "build": { + "cache": true, + }, + "lint": { + "cache": true, + }, + } + `); + }); + + it('should update the executor and input target default when it already exists', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'test', { + root: '', + targets: { + build: { + executor: '@nx/webpack:webpack', + }, + }, + }); + + tree.write('module-federation.config.ts', ''); + + let nxJson = readNxJson(tree); + nxJson = { + ...nxJson, + targetDefaults: { + ...nxJson.targetDefaults, + ['@nx/webpack:webpack']: { + inputs: ['^build'], + }, + }, + }; + + updateNxJson(tree, nxJson); + + // ACT + await addMfEnvVarToTargetDefaults(tree); + + // ASSERT + nxJson = readNxJson(tree); + expect(nxJson.targetDefaults).toMatchInlineSnapshot(` + { + "@nx/webpack:webpack": { + "inputs": [ + "^build", + { + "env": "NX_MF_DEV_SERVER_STATIC_REMOTES", + }, + ], + }, + "build": { + "cache": true, + }, + "lint": { + "cache": true, + }, + } + `); + }); +}); diff --git a/packages/react/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.ts b/packages/react/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.ts new file mode 100644 index 00000000000000..0e40ca3de0bc6b --- /dev/null +++ b/packages/react/src/migrations/update-18-0-0/add-mf-env-var-to-target-defaults.ts @@ -0,0 +1,38 @@ +import { + getProjects, + type Tree, + type ProjectConfiguration, + joinPathFragments, + formatFiles, +} from '@nx/devkit'; +import { addMfEnvToTargetDefaultInputs } from '../../utils/add-mf-env-to-inputs'; + +export default async function (tree: Tree) { + if (!hasModuleFederationProject(tree)) { + return; + } + addMfEnvToTargetDefaultInputs(tree); + + await formatFiles(tree); +} + +function hasModuleFederationProject(tree: Tree) { + const projects = getProjects(tree); + for (const project of projects.values()) { + const targets = project.targets; + for (const [_, target] of Object.entries(targets)) { + if ( + target.executor === '@nx/webpack:webpack' && + (tree.exists( + joinPathFragments(project.root, 'module-federation.config.ts') + ) || + tree.exists( + joinPathFragments(project.root, 'module-federation.config.js') + )) + ) { + return true; + } + } + } + return false; +} diff --git a/packages/react/src/utils/add-mf-env-to-inputs.ts b/packages/react/src/utils/add-mf-env-to-inputs.ts new file mode 100644 index 00000000000000..6786fb628289fc --- /dev/null +++ b/packages/react/src/utils/add-mf-env-to-inputs.ts @@ -0,0 +1,23 @@ +import { type Tree, readNxJson, updateNxJson } from '@nx/devkit'; + +export function addMfEnvToTargetDefaultInputs(tree: Tree) { + const nxJson = readNxJson(tree); + const webpackExecutor = '@nx/webpack:webpack'; + const mfEnvVar = 'NX_MF_DEV_SERVER_STATIC_REMOTES'; + + nxJson.targetDefaults ??= {}; + nxJson.targetDefaults[webpackExecutor] ??= {}; + nxJson.targetDefaults[webpackExecutor].inputs ??= []; + + let mfEnvVarExists = false; + for (const input of nxJson.targetDefaults[webpackExecutor].inputs) { + if (typeof input === 'object' && input['env'] === mfEnvVar) { + mfEnvVarExists = true; + break; + } + } + if (!mfEnvVarExists) { + nxJson.targetDefaults[webpackExecutor].inputs.push({ env: mfEnvVar }); + updateNxJson(tree, nxJson); + } +} diff --git a/packages/remix/generators.json b/packages/remix/generators.json index a4aa8dbf7be25d..5135e5b6c4d002 100644 --- a/packages/remix/generators.json +++ b/packages/remix/generators.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "name": "NxRemix", "version": "0.0.1", "extends": ["@nx/react"], diff --git a/packages/remix/src/executors/build/schema.json b/packages/remix/src/executors/build/schema.json index cd9e3c6bb71c8f..ded20b1c21ed8e 100644 --- a/packages/remix/src/executors/build/schema.json +++ b/packages/remix/src/executors/build/schema.json @@ -1,7 +1,7 @@ { "version": 2, "outputCapture": "pipe", - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "title": "Remix Build", "description": "Build a Remix app.", diff --git a/packages/remix/src/generators/action/schema.d.ts b/packages/remix/src/generators/action/schema.d.ts index 9315409e926eeb..592d42f708d5e9 100644 --- a/packages/remix/src/generators/action/schema.d.ts +++ b/packages/remix/src/generators/action/schema.d.ts @@ -4,7 +4,7 @@ export interface LoaderSchema { path: string; nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v18. + * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/remix/src/generators/action/schema.json b/packages/remix/src/generators/action/schema.json index b93c6b51a40712..30efa8c45ec33d 100644 --- a/packages/remix/src/generators/action/schema.json +++ b/packages/remix/src/generators/action/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "action", "type": "object", "description": "Generate an action for a given route.", @@ -22,7 +22,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"] diff --git a/packages/remix/src/generators/application/application.impl.ts b/packages/remix/src/generators/application/application.impl.ts index 85d236b6bf23d9..e3900e0d58266f 100644 --- a/packages/remix/src/generators/application/application.impl.ts +++ b/packages/remix/src/generators/application/application.impl.ts @@ -37,6 +37,7 @@ import { updateDependencies } from '../utils/update-dependencies'; import initGenerator from '../init/init'; import { initGenerator as jsInitGenerator } from '@nx/js'; import { addBuildTargetDefaults } from '@nx/devkit/src/generators/add-build-target-defaults'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export default async function (tree: Tree, _options: NxRemixGeneratorSchema) { const options = await normalizeOptions(tree, _options); @@ -267,6 +268,10 @@ export default async function (tree: Tree, _options: NxRemixGeneratorSchema) { await formatFiles(tree); } + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/remix/src/generators/application/schema.json b/packages/remix/src/generators/application/schema.json index 8d1acb4bf14b39..8ead343cd4a334 100644 --- a/packages/remix/src/generators/application/schema.json +++ b/packages/remix/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixApplication", "title": "Create an Application", "description": "Generate a new Remix application.", diff --git a/packages/remix/src/generators/cypress/schema.json b/packages/remix/src/generators/cypress/schema.json index 0dced5cdd1c296..f805d911091da6 100644 --- a/packages/remix/src/generators/cypress/schema.json +++ b/packages/remix/src/generators/cypress/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixCypress", "title": "", "type": "object", diff --git a/packages/remix/src/generators/error-boundary/schema.d.ts b/packages/remix/src/generators/error-boundary/schema.d.ts index 9c4893aa6208e1..e9516147a56554 100644 --- a/packages/remix/src/generators/error-boundary/schema.d.ts +++ b/packages/remix/src/generators/error-boundary/schema.d.ts @@ -5,7 +5,7 @@ export interface ErrorBoundarySchema { skipFormat?: false; nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v18. + * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/remix/src/generators/error-boundary/schema.json b/packages/remix/src/generators/error-boundary/schema.json index 2d4e769ea3dc3d..c0049aeae341aa 100644 --- a/packages/remix/src/generators/error-boundary/schema.json +++ b/packages/remix/src/generators/error-boundary/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixErrorBoundary", "title": "Create an ErrorBoundary for a Route", "description": "Generate an ErrorBoundary for a given route.", @@ -24,7 +24,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." }, "skipFormat": { "type": "boolean", diff --git a/packages/remix/src/generators/init/schema.json b/packages/remix/src/generators/init/schema.json index bc463e1171510d..732d65ab6b1799 100644 --- a/packages/remix/src/generators/init/schema.json +++ b/packages/remix/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixInit", "title": "Init Remix Plugin", "description": "Initialize the Remix Plugin.", diff --git a/packages/remix/src/generators/library/schema.json b/packages/remix/src/generators/library/schema.json index a4fb026cd63f8c..feb6c1f686ef21 100644 --- a/packages/remix/src/generators/library/schema.json +++ b/packages/remix/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixLibrary", "title": "Create a Library", "description": "Generate a Remix library to help structure workspace and application.", diff --git a/packages/remix/src/generators/loader/schema.d.ts b/packages/remix/src/generators/loader/schema.d.ts index 9315409e926eeb..592d42f708d5e9 100644 --- a/packages/remix/src/generators/loader/schema.d.ts +++ b/packages/remix/src/generators/loader/schema.d.ts @@ -4,7 +4,7 @@ export interface LoaderSchema { path: string; nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v18. + * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/remix/src/generators/loader/schema.json b/packages/remix/src/generators/loader/schema.json index 4a64720b70f6c5..90de328524eaa1 100644 --- a/packages/remix/src/generators/loader/schema.json +++ b/packages/remix/src/generators/loader/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "data-loader", "type": "object", "description": "Generate an loader for a given route.", @@ -22,7 +22,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"] diff --git a/packages/remix/src/generators/meta/schema.d.ts b/packages/remix/src/generators/meta/schema.d.ts index c81caf4076eda2..f1d60f0ec75625 100644 --- a/packages/remix/src/generators/meta/schema.d.ts +++ b/packages/remix/src/generators/meta/schema.d.ts @@ -4,7 +4,7 @@ export interface MetaSchema { path: string; nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v18. + * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/remix/src/generators/meta/schema.json b/packages/remix/src/generators/meta/schema.json index d69531512e451c..9e6b3e3916b25c 100644 --- a/packages/remix/src/generators/meta/schema.json +++ b/packages/remix/src/generators/meta/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "meta", "type": "object", "description": "Generate a meta function for a given route.", @@ -22,7 +22,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"] diff --git a/packages/remix/src/generators/preset/schema.json b/packages/remix/src/generators/preset/schema.json index 776b067e94fc6f..a679bf2f62689b 100644 --- a/packages/remix/src/generators/preset/schema.json +++ b/packages/remix/src/generators/preset/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "Remix", "title": "", "type": "object", diff --git a/packages/remix/src/generators/resource-route/schema.d.ts b/packages/remix/src/generators/resource-route/schema.d.ts index 2512f88757da8c..c26cc7ffa8be2e 100644 --- a/packages/remix/src/generators/resource-route/schema.d.ts +++ b/packages/remix/src/generators/resource-route/schema.d.ts @@ -7,7 +7,7 @@ export interface RemixRouteSchema { loader: boolean; skipChecks: boolean; /** - * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v18. + * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/remix/src/generators/resource-route/schema.json b/packages/remix/src/generators/resource-route/schema.json index 22e5e0a49532ca..a9435772c12787 100644 --- a/packages/remix/src/generators/resource-route/schema.json +++ b/packages/remix/src/generators/resource-route/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixResourceRoute", "title": "Create a Resource Route", "type": "object", @@ -29,7 +29,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." }, "action": { "type": "boolean", diff --git a/packages/remix/src/generators/route/schema.d.ts b/packages/remix/src/generators/route/schema.d.ts index b94691c6bda849..ca8b81dce28921 100644 --- a/packages/remix/src/generators/route/schema.d.ts +++ b/packages/remix/src/generators/route/schema.d.ts @@ -9,7 +9,7 @@ export interface RemixRouteSchema { loader: boolean; skipChecks: boolean; /** - * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v18. + * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/remix/src/generators/route/schema.json b/packages/remix/src/generators/route/schema.json index f9c4f4bac2f904..4c967eb7db48b4 100644 --- a/packages/remix/src/generators/route/schema.json +++ b/packages/remix/src/generators/route/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixRoute", "title": "Create a Route", "description": "Generate a route.", @@ -29,7 +29,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." }, "style": { "type": "string", diff --git a/packages/remix/src/generators/setup-tailwind/schema.json b/packages/remix/src/generators/setup-tailwind/schema.json index 33ca126e0496db..01827985c55315 100644 --- a/packages/remix/src/generators/setup-tailwind/schema.json +++ b/packages/remix/src/generators/setup-tailwind/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixTailwind", "title": "Add TailwindCSS to a Remix App", "description": "Setup tailwindcss for a given project.", diff --git a/packages/remix/src/generators/setup/schema.json b/packages/remix/src/generators/setup/schema.json index 14d6d7e89a8d98..6ac05860c929ed 100644 --- a/packages/remix/src/generators/setup/schema.json +++ b/packages/remix/src/generators/setup/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixSetup", "title": "", "type": "object", diff --git a/packages/remix/src/generators/storybook-configuration/schema.json b/packages/remix/src/generators/storybook-configuration/schema.json index f976dbcb9bacda..e9b26c00dad217 100644 --- a/packages/remix/src/generators/storybook-configuration/schema.json +++ b/packages/remix/src/generators/storybook-configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxRemixStorybookConfigure", "title": "Remix Storybook Configuration", diff --git a/packages/remix/src/generators/style/schema.d.ts b/packages/remix/src/generators/style/schema.d.ts index b0bb7d20a86abb..940f8686e14c46 100644 --- a/packages/remix/src/generators/style/schema.d.ts +++ b/packages/remix/src/generators/style/schema.d.ts @@ -4,7 +4,7 @@ export interface RemixStyleSchema { path: string; nameAndDirectoryFormat?: NameAndDirectoryFormat; /** - * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v18. + * @deprecated Provide the `path` option instead. The project will be determined from the path provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/remix/src/generators/style/schema.json b/packages/remix/src/generators/style/schema.json index 61a4964eb77d7c..fe449dce402475 100644 --- a/packages/remix/src/generators/style/schema.json +++ b/packages/remix/src/generators/style/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRemixRouteStyle", "title": "Add style import to a route", "description": "Generate a style import and file for a given route.", @@ -29,7 +29,7 @@ "type": "string", "description": "The name of the project.", "pattern": "^[a-zA-Z].*$", - "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `path` option instead and use the `as-provided` format. The project will be determined from the path provided. It will be removed in Nx v19." } }, "required": ["path"] diff --git a/packages/rollup/package.json b/packages/rollup/package.json index 2c92b54193c7c8..76fb3834ae20a4 100644 --- a/packages/rollup/package.json +++ b/packages/rollup/package.json @@ -37,7 +37,6 @@ "autoprefixer": "^10.4.9", "babel-plugin-transform-async-to-promises": "^0.8.15", "chalk": "^4.1.0", - "fast-glob": "^3.2.7", "postcss": "^8.4.14", "rollup": "^2.56.2", "rollup-plugin-copy": "^3.4.0", diff --git a/packages/rollup/src/executors/rollup/lib/normalize.ts b/packages/rollup/src/executors/rollup/lib/normalize.ts index 7abc2f2dd4203c..a406db8d1272f9 100644 --- a/packages/rollup/src/executors/rollup/lib/normalize.ts +++ b/packages/rollup/src/executors/rollup/lib/normalize.ts @@ -1,5 +1,4 @@ import { basename, dirname, join, relative, resolve } from 'path'; -import { sync as globSync } from 'fast-glob'; import { statSync } from 'fs'; import { ExecutorContext, normalizePath } from '@nx/devkit'; diff --git a/packages/rollup/src/generators/configuration/schema.json b/packages/rollup/src/generators/configuration/schema.json index c12857e6da8eeb..1b417f4311e1cc 100644 --- a/packages/rollup/src/generators/configuration/schema.json +++ b/packages/rollup/src/generators/configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxRollupProject", "cli": "nx", "title": "Add Rollup Configuration to a project", diff --git a/packages/rollup/src/generators/init/schema.json b/packages/rollup/src/generators/init/schema.json index a0f1bb670f18a0..09f322bd1c35be 100644 --- a/packages/rollup/src/generators/init/schema.json +++ b/packages/rollup/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebpackInit", "cli": "nx", "title": "Init Webpack Plugin", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index 0609aaa549fcad..004a1f3eae5dbc 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -32,7 +32,7 @@ "dependencies": { "@nx/devkit": "file:../devkit", "@phenomnomnominal/tsquery": "~5.0.1", - "semver": "7.5.3", + "semver": "^7.5.3", "tslib": "^2.3.0", "@nx/cypress": "file:../cypress", "@nx/js": "file:../js", diff --git a/packages/storybook/src/generators/configuration/configuration.ts b/packages/storybook/src/generators/configuration/configuration.ts index dd39566a109b0f..63bdf4d74a0c09 100644 --- a/packages/storybook/src/generators/configuration/configuration.ts +++ b/packages/storybook/src/generators/configuration/configuration.ts @@ -26,6 +26,7 @@ import { createProjectStorybookDir, createStorybookTsconfigFile, editTsconfigBaseJson, + findMetroConfig, findNextConfig, findViteConfig, getE2EProjectName, @@ -71,6 +72,7 @@ export async function configurationGenerator( const viteConfigFilePath = viteConfig?.fullConfigPath; const viteConfigFileName = viteConfig?.viteConfigFileName; const nextConfigFilePath = findNextConfig(tree, root); + const metroConfigFilePath = findMetroConfig(tree, root); if (viteConfigFilePath) { if (schema.uiFramework === '@storybook/react-webpack5') { @@ -118,6 +120,7 @@ export async function configurationGenerator( const usesVite = !!viteConfigFilePath || schema.uiFramework?.endsWith('-vite'); + const useReactNative = !!metroConfigFilePath; createProjectStorybookDir( tree, @@ -135,7 +138,8 @@ export async function configurationGenerator( usesVite, viteConfigFilePath, hasPlugin, - viteConfigFileName + viteConfigFileName, + useReactNative ); if (schema.uiFramework !== '@storybook/angular') { @@ -178,7 +182,7 @@ export async function configurationGenerator( devDeps['storybook'] = storybookVersion; } - // TODO(katerina): Nx 18 -> remove Cypress + // TODO(katerina): Nx 19 -> remove Cypress if (schema.configureCypress) { const e2eProject = await getE2EProjectName(tree, schema.project); if (!e2eProject) { diff --git a/packages/storybook/src/generators/configuration/lib/ensure-dependencies.ts b/packages/storybook/src/generators/configuration/lib/ensure-dependencies.ts index fbb4b8a33ee516..66c0dbbc33a1f6 100644 --- a/packages/storybook/src/generators/configuration/lib/ensure-dependencies.ts +++ b/packages/storybook/src/generators/configuration/lib/ensure-dependencies.ts @@ -12,7 +12,6 @@ import { import { litVersion, reactVersion, - storybookReactNativeVersion, storybookVersion, viteVersion, } from '../../../utils/versions'; @@ -61,20 +60,15 @@ export function ensureDependencies( } if (options.uiFramework) { - if (options.uiFramework === '@storybook/react-native') { - devDependencies['@storybook/react-native'] = storybookReactNativeVersion; - } else { - devDependencies[options.uiFramework] = storybook7VersionToInstall; - const isPnpm = detectPackageManager(tree.root) === 'pnpm'; - if (isPnpm) { - // If it's pnpm, it needs the framework without the builder - // as a dependency too (eg. @storybook/react) - const matchResult = options.uiFramework?.match(/^@storybook\/(\w+)/); - const uiFrameworkWithoutBuilder = matchResult ? matchResult[0] : null; - if (uiFrameworkWithoutBuilder) { - devDependencies[uiFrameworkWithoutBuilder] = - storybook7VersionToInstall; - } + devDependencies[options.uiFramework] = storybook7VersionToInstall; + const isPnpm = detectPackageManager(tree.root) === 'pnpm'; + if (isPnpm) { + // If it's pnpm, it needs the framework without the builder + // as a dependency too (eg. @storybook/react) + const matchResult = options.uiFramework?.match(/^@storybook\/(\w+)/); + const uiFrameworkWithoutBuilder = matchResult ? matchResult[0] : null; + if (uiFrameworkWithoutBuilder) { + devDependencies[uiFrameworkWithoutBuilder] = storybook7VersionToInstall; } } @@ -103,17 +97,6 @@ export function ensureDependencies( devDependencies['lit'] = litVersion; } - if (options.uiFramework === '@storybook/react-native') { - devDependencies['@storybook/addon-ondevice-actions'] = - storybookReactNativeVersion; - devDependencies['@storybook/addon-ondevice-backgrounds'] = - storybookReactNativeVersion; - devDependencies['@storybook/addon-ondevice-controls'] = - storybookReactNativeVersion; - devDependencies['@storybook/addon-ondevice-notes'] = - storybookReactNativeVersion; - } - if (options.uiFramework.endsWith('-vite')) { if ( !packageJson.dependencies['vite'] && diff --git a/packages/storybook/src/generators/configuration/lib/util-functions.ts b/packages/storybook/src/generators/configuration/lib/util-functions.ts index 170142c63f95f2..6765ef793327fa 100644 --- a/packages/storybook/src/generators/configuration/lib/util-functions.ts +++ b/packages/storybook/src/generators/configuration/lib/util-functions.ts @@ -39,9 +39,6 @@ export function addStorybookTarget( uiFramework: UiFramework, interactionTests: boolean ) { - if (uiFramework === '@storybook/react-native') { - return; - } const projectConfig = readProjectConfiguration(tree, projectName); projectConfig.targets['storybook'] = { executor: '@nx/storybook:storybook', @@ -239,10 +236,6 @@ export function createStorybookTsconfigFile( '.storybook/*.ts', ]; - if (uiFramework === '@storybook/react-native') { - include.push('*.ts', '*.tsx'); - } - const storybookTsConfig: TsConfig = { extends: './tsconfig.json', compilerOptions: { @@ -309,8 +302,7 @@ export function configureTsProjectConfig( ...(tsConfigContent.exclude || []), '**/*.stories.ts', '**/*.stories.js', - ...(schema.uiFramework === '@storybook/react-native' || - schema.uiFramework?.startsWith('@storybook/react') + ...(schema.uiFramework?.startsWith('@storybook/react') ? ['**/*.stories.jsx', '**/*.stories.tsx'] : []), ]; @@ -546,7 +538,8 @@ export function createProjectStorybookDir( usesVite?: boolean, viteConfigFilePath?: string, hasPlugin?: boolean, - viteConfigFileName?: string + viteConfigFileName?: string, + useReactNative?: boolean ) { let projectDirectory = projectType === 'application' @@ -591,6 +584,7 @@ export function createProjectStorybookDir( viteConfigFilePath, hasPlugin, viteConfigFileName, + useReactNative, }); if (js) { @@ -742,6 +736,16 @@ export function findNextConfig( } } +export function findMetroConfig( + tree: Tree, + projectRoot: string +): string | undefined { + const nextConfigPath = joinPathFragments(projectRoot, `metro.config.js`); + if (tree.exists(nextConfigPath)) { + return nextConfigPath; + } +} + export function renameAndMoveOldTsConfig( projectRoot: string, pathToStorybookConfigFile: string, diff --git a/packages/storybook/src/generators/configuration/project-files-ts/.storybook/main.ts__tmpl__ b/packages/storybook/src/generators/configuration/project-files-ts/.storybook/main.ts__tmpl__ index 85923ed6b0f3cf..31f1a0d3361dcf 100644 --- a/packages/storybook/src/generators/configuration/project-files-ts/.storybook/main.ts__tmpl__ +++ b/packages/storybook/src/generators/configuration/project-files-ts/.storybook/main.ts__tmpl__ @@ -10,7 +10,7 @@ const config: StorybookConfig = { '../**/*.stories.@(js|jsx|ts|tsx|mdx)' <% } else { %> '../<%= projectDirectory %>/**/*.stories.@(js|jsx|ts|tsx|mdx)' <% } %>], - addons: ['@storybook/addon-essentials' <% if(interactionTests) { %>, '@storybook/addon-interactions' <% } %><% if(uiFramework === '@storybook/react-webpack5') { %>, '@nx/react/plugins/storybook' <% } %><% if(uiFramework === '@storybook/react-native') { %>, '@storybook/addon-ondevice-actions', '@storybook/addon-ondevice-backgrounds', '@storybook/addon-ondevice-controls', '@storybook/addon-ondevice-notes' <% } %>], + addons: ['@storybook/addon-essentials' <% if(interactionTests) { %>, '@storybook/addon-interactions' <% } %><% if(uiFramework === '@storybook/react-webpack5') { %>, '@nx/react/plugins/storybook' <% } %>], framework: { name: '<%= uiFramework %>', options: { @@ -25,7 +25,22 @@ const config: StorybookConfig = { <% } %> }, }, - <% if (usesVite && !viteConfigFilePath) { %> + <% if (useReactNative && uiFramework === '@storybook/react-webpack5') { %>webpackFinal: async (config) => { + if (config.resolve) { + config.resolve.alias = { + ...config.resolve.alias, + 'react-native$': 'react-native-web', + }; + config.resolve.extensions = [ + '.web.tsx', + '.web.ts', + '.web.jsx', + '.web.js', + ...(config.resolve.extensions ?? []), + ]; + } + return config; + },<% } %><% if (usesVite && !viteConfigFilePath) { %> viteFinal: async (config) => mergeConfig(config, { plugins: [nxViteTsPaths()], diff --git a/packages/storybook/src/generators/configuration/project-files/.storybook/main.js__tmpl__ b/packages/storybook/src/generators/configuration/project-files/.storybook/main.js__tmpl__ index 203e6843cce2c7..f68b4ea6d51418 100644 --- a/packages/storybook/src/generators/configuration/project-files/.storybook/main.js__tmpl__ +++ b/packages/storybook/src/generators/configuration/project-files/.storybook/main.js__tmpl__ @@ -9,7 +9,7 @@ const config = { '../**/*.stories.@(js|jsx|ts|tsx|mdx)' <% } else { %> '../<%= projectDirectory %>/**/*.stories.@(js|jsx|ts|tsx|mdx)' <% } %>], - addons: ['@storybook/addon-essentials' <% if(interactionTests) { %>, '@storybook/addon-interactions' <% } %><% if(uiFramework === '@storybook/react-webpack5') { %>, '@nx/react/plugins/storybook' <% } %><% if(uiFramework === '@storybook/react-native') { %>, '@storybook/addon-ondevice-actions', '@storybook/addon-ondevice-backgrounds', '@storybook/addon-ondevice-controls', '@storybook/addon-ondevice-notes' <% } %>], + addons: ['@storybook/addon-essentials' <% if(interactionTests) { %>, '@storybook/addon-interactions' <% } %><% if(uiFramework === '@storybook/react-webpack5') { %>, '@nx/react/plugins/storybook' <% } %>], framework: { name: '<%= uiFramework %>', options: { @@ -25,7 +25,22 @@ const config = { <% } %> }, }, - <% if (usesVite && !viteConfigFilePath) { %> + <% if (useReactNative && uiFramework === '@storybook/react-webpack5') { %>webpackFinal: async (config) => { + if (config.resolve) { + config.resolve.alias = { + ...config.resolve.alias, + 'react-native$': 'react-native-web', + }; + config.resolve.extensions = [ + '.web.tsx', + '.web.ts', + '.web.jsx', + '.web.js', + ...(config.resolve.extensions ?? []), + ]; + } + return config; + },<% } %><% if (usesVite && !viteConfigFilePath) { %> viteFinal: async (config) => mergeConfig(config, { plugins: [nxViteTsPaths()], diff --git a/packages/storybook/src/generators/configuration/schema.d.ts b/packages/storybook/src/generators/configuration/schema.d.ts index 13b3264b0e611a..f263b7debea174 100644 --- a/packages/storybook/src/generators/configuration/schema.d.ts +++ b/packages/storybook/src/generators/configuration/schema.d.ts @@ -12,11 +12,11 @@ export interface StorybookConfigureSchema { configureStaticServe?: boolean; skipFormat?: boolean; /** - * @deprecated Use interactionTests instead. This option will be removed in v18. + * @deprecated Use interactionTests instead. This option will be removed in v19. */ configureCypress?: boolean; /** - * @deprecated Use interactionTests instead. This option will be removed in v18. + * @deprecated Use interactionTests instead. This option will be removed in v19. */ cypressDirectory?: string; } diff --git a/packages/storybook/src/generators/configuration/schema.json b/packages/storybook/src/generators/configuration/schema.json index 58b8ad35b55338..d0a25baca8296a 100644 --- a/packages/storybook/src/generators/configuration/schema.json +++ b/packages/storybook/src/generators/configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxStorybookConfigure", "title": "Storybook Configuration", @@ -28,12 +28,12 @@ "configureCypress": { "type": "boolean", "description": "Run the cypress-configure generator.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "cypressDirectory": { "type": "string", "description": "A directory where the Cypress project will be placed. Added at root by default.", - "x-deprecated": "Use interactionTests instead. This option will be removed in v18." + "x-deprecated": "Use interactionTests instead. This option will be removed in v19." }, "linter": { "description": "The tool to use for running lint checks.", @@ -63,13 +63,6 @@ "description": "Add a static-storybook to serve the static storybook built files.", "default": false }, - "bundler": { - "description": "The Storybook builder to use.", - "type": "string", - "enum": ["vite", "webpack"], - "default": "webpack", - "x-priority": "important" - }, "uiFramework": { "type": "string", "description": "Storybook UI Framework to use.", diff --git a/packages/storybook/src/generators/cypress-project/schema.json b/packages/storybook/src/generators/cypress-project/schema.json index 15a6bb70c94cd6..b9255fa84e8b04 100644 --- a/packages/storybook/src/generators/cypress-project/schema.json +++ b/packages/storybook/src/generators/cypress-project/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "cypress-configure", "title": "Cypress Configuration", diff --git a/packages/storybook/src/utils/models.ts b/packages/storybook/src/utils/models.ts index b97202698203b5..a97be782919153 100644 --- a/packages/storybook/src/utils/models.ts +++ b/packages/storybook/src/utils/models.ts @@ -14,5 +14,4 @@ export type UiFramework = | '@storybook/vue3-webpack5' | '@storybook/vue3-vite' | '@storybook/web-components-webpack5' - | '@storybook/web-components-vite' - | '@storybook/react-native'; + | '@storybook/web-components-vite'; diff --git a/packages/storybook/src/utils/utilities.ts b/packages/storybook/src/utils/utilities.ts index 762fe336257ac4..ef5680332522fa 100644 --- a/packages/storybook/src/utils/utilities.ts +++ b/packages/storybook/src/utils/utilities.ts @@ -136,9 +136,6 @@ export function findStorybookAndBuildTargetsAndCompiler(targets: { '@nx/angular:webpack-browser', '@nx/esbuild:esbuild', '@nx/next:build', - '@nx/react-native:bundle', - '@nx/react-native:build-android', - '@nx/react-native:bundle', '@nrwl/js:babel', '@nrwl/js:swc', '@nrwl/js:tsc', @@ -151,9 +148,6 @@ export function findStorybookAndBuildTargetsAndCompiler(targets: { '@nrwl/angular:webpack-browser', '@nrwl/esbuild:esbuild', '@nrwl/next:build', - '@nrwl/react-native:bundle', - '@nrwl/react-native:build-android', - '@nrwl/react-native:bundle', '@nxext/vite:build', '@angular-devkit/build-angular:browser', ]; diff --git a/packages/storybook/src/utils/versions.ts b/packages/storybook/src/utils/versions.ts index 2980fa4e65f943..6a85ff3066983e 100644 --- a/packages/storybook/src/utils/versions.ts +++ b/packages/storybook/src/utils/versions.ts @@ -1,6 +1,4 @@ export const nxVersion = require('../../package.json').version; -export const storybookReactNativeVersion = '^6.5.3'; -export const reactNativeStorybookLoader = '^2.0.5'; export const storybookTestRunnerVersion = '^0.13.0'; export const storybookTestingLibraryVersion = '^0.2.2'; export const storybookJestVersion = '^0.2.3'; diff --git a/packages/tao/README.md b/packages/tao/README.md index 8979e55bac377b..0141d135177f2e 100644 --- a/packages/tao/README.md +++ b/packages/tao/README.md @@ -4,7 +4,7 @@ [Read more here](https://nx.dev/recipes/other/rescope) -@nrwl/tao will no longer be published in Nx v18. +@nrwl/tao will no longer be published in Nx v19.

diff --git a/packages/vite/plugins/nx-tsconfig-paths.plugin.ts b/packages/vite/plugins/nx-tsconfig-paths.plugin.ts index 987b2995b0ba63..39565cfe4a7741 100644 --- a/packages/vite/plugins/nx-tsconfig-paths.plugin.ts +++ b/packages/vite/plugins/nx-tsconfig-paths.plugin.ts @@ -163,9 +163,14 @@ There should at least be a tsconfig.base.json or tsconfig.json in the root of th function findFile(path: string): string { for (const ext of options.extensions) { - const r = resolve(path + ext); - if (existsSync(r)) { - return r; + const resolvedPath = resolve(path + ext); + if (existsSync(resolvedPath)) { + return resolvedPath; + } + + const resolvedIndexPath = resolve(path, `index${ext}`); + if (existsSync(resolvedIndexPath)) { + return resolvedIndexPath; } } } diff --git a/packages/vite/src/executors/build/build.impl.ts b/packages/vite/src/executors/build/build.impl.ts index 91b17617ad22bf..bed5368df94c52 100644 --- a/packages/vite/src/executors/build/build.impl.ts +++ b/packages/vite/src/executors/build/build.impl.ts @@ -83,7 +83,7 @@ export async function* viteBuildExecutor( await validateTypes({ workspaceRoot: context.root, projectRoot: projectRoot, - tsconfig: getProjectTsConfigPath(projectRoot), + tsconfig: options.tsConfig ?? getProjectTsConfigPath(projectRoot), }); } @@ -142,6 +142,7 @@ export async function* viteBuildExecutor( } // For buildable libs, copy package.json if it exists. else if ( + options.generatePackageJson !== false && !existsSync(distPackageJson) && existsSync(libraryPackageJson) && rootPackageJson !== libraryPackageJson diff --git a/packages/vite/src/executors/build/schema.d.ts b/packages/vite/src/executors/build/schema.d.ts index 84b85f34af0487..bb3b6f656efa13 100644 --- a/packages/vite/src/executors/build/schema.d.ts +++ b/packages/vite/src/executors/build/schema.d.ts @@ -6,4 +6,5 @@ export interface ViteBuildExecutorOptions { watch?: boolean; generatePackageJson?: boolean; includeDevDependenciesInPackageJson?: boolean; + tsConfig?: string; } diff --git a/packages/vite/src/executors/build/schema.json b/packages/vite/src/executors/build/schema.json index 9d360a7cd6f179..8b5f971fc1010d 100644 --- a/packages/vite/src/executors/build/schema.json +++ b/packages/vite/src/executors/build/schema.json @@ -28,6 +28,12 @@ "description": "Skip type-checking via TypeScript. Skipping type-checking speeds up the build but type errors are not caught.", "default": false }, + "tsConfig": { + "type": "string", + "description": "The path to custom tsconfig file for type-checking when skipTypeCheck is false. Required when tsconfig file is not at the projectRoot level.", + "x-completion-type": "file", + "x-completion-glob": "tsconfig.*.json" + }, "configFile": { "type": "string", "description": "The name of the Vite.js configuration file.", diff --git a/packages/vite/src/executors/preview-server/preview-server.impl.ts b/packages/vite/src/executors/preview-server/preview-server.impl.ts index c6957cf47196a4..5ff7a56a8067a2 100644 --- a/packages/vite/src/executors/preview-server/preview-server.impl.ts +++ b/packages/vite/src/executors/preview-server/preview-server.impl.ts @@ -183,7 +183,7 @@ function closeServer(server?: Record): Promise { const { httpServer } = server; if (httpServer['closeAllConnections']) { // https://github.com/vitejs/vite/pull/14834 - // closeAllConnections was added in Node v18.2.0 + // closeAllConnections was added in Node v19.2.0 // typically is "as http.Server" but no reason // to import http just for this (httpServer as any).closeAllConnections(); diff --git a/packages/vite/src/executors/preview-server/schema.json b/packages/vite/src/executors/preview-server/schema.json index f4f6e1270a06f1..c519fd277af4ac 100644 --- a/packages/vite/src/executors/preview-server/schema.json +++ b/packages/vite/src/executors/preview-server/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "cli": "nx", "title": "Vite Preview Server", diff --git a/packages/vite/src/executors/test/schema.json b/packages/vite/src/executors/test/schema.json index 099111069750f8..b57afb5badd06d 100644 --- a/packages/vite/src/executors/test/schema.json +++ b/packages/vite/src/executors/test/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "version": 2, "cli": "nx", "title": "Vitest executor", diff --git a/packages/vite/src/generators/vitest/schema.json b/packages/vite/src/generators/vitest/schema.json index fe3eb795b622a2..7cc029137358be 100644 --- a/packages/vite/src/generators/vitest/schema.json +++ b/packages/vite/src/generators/vitest/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "Vitest", "title": "Vitest", diff --git a/packages/vue/src/generators/application/application.ts b/packages/vue/src/generators/application/application.ts index 2357603df45687..3cb596052f1322 100644 --- a/packages/vue/src/generators/application/application.ts +++ b/packages/vue/src/generators/application/application.ts @@ -17,6 +17,7 @@ import { createApplicationFiles } from './lib/create-application-files'; import { addVite } from './lib/add-vite'; import { extractTsConfigBase } from '../../utils/create-ts-config'; import { ensureDependencies } from '../../utils/ensure-dependencies'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function applicationGenerator( tree: Tree, @@ -81,6 +82,10 @@ export async function applicationGenerator( if (!options.skipFormat) await formatFiles(tree); + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/vue/src/generators/application/schema.json b/packages/vue/src/generators/application/schema.json index 91c74b92d5908c..c77030db0bc703 100644 --- a/packages/vue/src/generators/application/schema.json +++ b/packages/vue/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueApp", "title": "Create a Vue Application", @@ -52,11 +52,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" }, { "value": "none", diff --git a/packages/vue/src/generators/component/schema.d.ts b/packages/vue/src/generators/component/schema.d.ts index 03438e235b99f0..ff584f0f620188 100644 --- a/packages/vue/src/generators/component/schema.d.ts +++ b/packages/vue/src/generators/component/schema.d.ts @@ -11,19 +11,19 @@ export interface ComponentGeneratorSchema { nameAndDirectoryFormat?: 'as-provided' | 'derived'; /** - * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ flat?: boolean; /** - * @deprecated Provide the desired `directory` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the desired `directory` option instead and use the `as-provided` format. It will be removed in Nx v19. */ pascalCaseDirectory?: boolean; /** - * @deprecated Provide the desired `name` option instead and use the `as-provided` format. It will be removed in Nx v18. + * @deprecated Provide the desired `name` option instead and use the `as-provided` format. It will be removed in Nx v19. */ pascalCaseFiles?: boolean; /** - * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v18. + * @deprecated Provide the `directory` option instead. The project will be determined from the directory provided. It will be removed in Nx v19. */ project?: string; } diff --git a/packages/vue/src/generators/component/schema.json b/packages/vue/src/generators/component/schema.json index a074e3841f3c8c..371978a2f5e53d 100644 --- a/packages/vue/src/generators/component/schema.json +++ b/packages/vue/src/generators/component/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueComponent", "title": "Create a Vue Component", @@ -19,7 +19,7 @@ "$default": { "$source": "projectName" }, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. The project will be determined from the directory provided. It will be removed in Nx v19." }, "name": { "type": "string", @@ -57,7 +57,7 @@ "type": "boolean", "description": "Create component at the source root rather than its own directory.", "default": false, - "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "export": { "type": "boolean", @@ -71,14 +71,14 @@ "description": "Use pascal case component file name (e.g. `App.tsx`).", "alias": "P", "default": false, - "x-deprecated": "Provide the desired `name` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the desired `name` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "pascalCaseDirectory": { "type": "boolean", "description": "Use pascal case directory name (e.g. `App/App.tsx`).", "alias": "R", "default": false, - "x-deprecated": "Provide the desired `directory` option instead and use the `as-provided` format. It will be removed in Nx v18." + "x-deprecated": "Provide the desired `directory` option instead and use the `as-provided` format. It will be removed in Nx v19." }, "routing": { "type": "boolean", diff --git a/packages/vue/src/generators/init/schema.json b/packages/vue/src/generators/init/schema.json index 17cf2d62ca0802..883b824df9f035 100644 --- a/packages/vue/src/generators/init/schema.json +++ b/packages/vue/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxVueInit", "title": "Init Vue Plugin", "description": "Initialize a Vue Plugin.", 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 236670071e4c46..72039abfcaf16a 100644 --- a/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap +++ b/packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap @@ -120,7 +120,6 @@ exports[`lib should add vue, vite and vitest to package.json 1`] = ` "@vue/eslint-config-prettier": "7.1.0", "@vue/eslint-config-typescript": "^11.0.3", "@vue/test-utils": "^2.4.1", - "@vue/tsconfig": "^0.4.0", "eslint": "~8.48.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-vue": "^9.16.1", diff --git a/packages/vue/src/generators/library/library.ts b/packages/vue/src/generators/library/library.ts index 49dcdf40b652a6..3c25c833576219 100644 --- a/packages/vue/src/generators/library/library.ts +++ b/packages/vue/src/generators/library/library.ts @@ -18,6 +18,7 @@ import { extractTsConfigBase } from '../../utils/create-ts-config'; import componentGenerator from '../component/component'; import { addVite } from './lib/add-vite'; import { ensureDependencies } from '../../utils/ensure-dependencies'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; export async function libraryGenerator(tree: Tree, schema: Schema) { const tasks: GeneratorCallback[] = []; @@ -94,6 +95,10 @@ export async function libraryGenerator(tree: Tree, schema: Schema) { if (!options.skipFormat) await formatFiles(tree); + tasks.push(() => { + logShowProjectCommand(options.name); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/vue/src/generators/library/schema.json b/packages/vue/src/generators/library/schema.json index 577e8293f265b1..d5b5c32e43816a 100644 --- a/packages/vue/src/generators/library/schema.json +++ b/packages/vue/src/generators/library/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueLibrary", "title": "Create a Vue Library", diff --git a/packages/vue/src/generators/setup-tailwind/schema.json b/packages/vue/src/generators/setup-tailwind/schema.json index bc56696ac858c3..8f4044a6f81454 100644 --- a/packages/vue/src/generators/setup-tailwind/schema.json +++ b/packages/vue/src/generators/setup-tailwind/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueTailwindSetupGenerator", "title": "Configures Tailwind CSS for an application or a library.", diff --git a/packages/vue/src/generators/stories/schema.json b/packages/vue/src/generators/stories/schema.json index 5702c102964893..fcb76b969af025 100644 --- a/packages/vue/src/generators/stories/schema.json +++ b/packages/vue/src/generators/stories/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueStorybookStories", "title": "Generate Vue Storybook stories", diff --git a/packages/vue/src/generators/storybook-configuration/schema.json b/packages/vue/src/generators/storybook-configuration/schema.json index f304f9859ee478..7d0d168544676c 100644 --- a/packages/vue/src/generators/storybook-configuration/schema.json +++ b/packages/vue/src/generators/storybook-configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxVueStorybookConfigure", "title": "Vue Storybook Configure", diff --git a/packages/vue/src/utils/ensure-dependencies.ts b/packages/vue/src/utils/ensure-dependencies.ts index 1904203b9d1d77..c5b71e38b78ae3 100644 --- a/packages/vue/src/utils/ensure-dependencies.ts +++ b/packages/vue/src/utils/ensure-dependencies.ts @@ -10,7 +10,6 @@ import { vueRouterVersion, vueTestUtilsVersion, vueTscVersion, - vueTsconfigVersion, } from './versions'; export type EnsureDependenciesOptions = { @@ -24,7 +23,6 @@ export function ensureDependencies( ): GeneratorCallback { const dependencies: Record = {}; const devDependencies: Record = { - '@vue/tsconfig': vueTsconfigVersion, '@vue/test-utils': vueTestUtilsVersion, '@vitejs/plugin-vue': vitePluginVueVersion, 'vue-tsc': vueTscVersion, diff --git a/packages/vue/src/utils/versions.ts b/packages/vue/src/utils/versions.ts index af9b60da866d02..df3ad4d5f69e16 100644 --- a/packages/vue/src/utils/versions.ts +++ b/packages/vue/src/utils/versions.ts @@ -5,9 +5,6 @@ export const vueVersion = '^3.3.4'; export const vueTscVersion = '^1.8.8'; export const vueRouterVersion = '^4.2.4'; -// build deps -export const vueTsconfigVersion = '^0.4.0'; - // test deps export const vueTestUtilsVersion = '^2.4.1'; export const vitePluginVueVersion = '^4.5.0'; diff --git a/packages/web/src/generators/application/application.ts b/packages/web/src/generators/application/application.ts index 6f7f74d56eda64..8490b12e89e354 100644 --- a/packages/web/src/generators/application/application.ts +++ b/packages/web/src/generators/application/application.ts @@ -37,6 +37,7 @@ import { Schema } from './schema'; import { getNpmScope } from '@nx/js/src/utils/package-json/get-npm-scope'; import { hasWebpackPlugin } from '../../utils/has-webpack-plugin'; import { addBuildTargetDefaults } from '@nx/devkit/src/generators/add-build-target-defaults'; +import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-command'; interface NormalizedSchema extends Schema { projectName: string; @@ -431,6 +432,11 @@ export async function applicationGeneratorInternal(host: Tree, schema: Schema) { if (!schema.skipFormat) { await formatFiles(host); } + + tasks.push(() => { + logShowProjectCommand(options.projectName); + }); + return runTasksInSerial(...tasks); } diff --git a/packages/web/src/generators/application/schema.json b/packages/web/src/generators/application/schema.json index e53e263a9547e8..53bdc5d18444c1 100644 --- a/packages/web/src/generators/application/schema.json +++ b/packages/web/src/generators/application/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "NxWebApp", "title": "Create a Web Application for Nx", @@ -39,11 +39,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/packages/web/src/generators/init/schema.json b/packages/web/src/generators/init/schema.json index 0b8e1500d698f2..951e1ea86cc6ea 100644 --- a/packages/web/src/generators/init/schema.json +++ b/packages/web/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebInit", "cli": "nx", "title": "Init Web Plugin", diff --git a/packages/web/src/generators/static-serve/schema.json b/packages/web/src/generators/static-serve/schema.json index c6c709092494c2..ca14f8a4068296 100644 --- a/packages/web/src/generators/static-serve/schema.json +++ b/packages/web/src/generators/static-serve/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebStaticServe", "cli": "nx", "title": "Static Serve Configuration", diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 5537da4831dccf..516156015f52b0 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -29,7 +29,7 @@ "migrations": "./migrations.json" }, "dependencies": { - "@babel/core": "^7.22.9", + "@babel/core": "^7.23.2", "autoprefixer": "^10.4.9", "babel-loader": "^9.1.2", "browserslist": "^4.21.4", diff --git a/packages/webpack/src/executors/webpack/schema.d.ts b/packages/webpack/src/executors/webpack/schema.d.ts index 1bed74dd8aa69d..4f9bbb390d884a 100644 --- a/packages/webpack/src/executors/webpack/schema.d.ts +++ b/packages/webpack/src/executors/webpack/schema.d.ts @@ -47,7 +47,7 @@ export interface WebpackExecutorOptions { extractLicenses?: boolean; fileReplacements?: FileReplacement[]; generatePackageJson?: boolean; - // TODO(v18): Remove this option + // TODO(v19): Remove this option /** @deprecated set webpackConfig and provide an explicit webpack.config.js file (See: https://nx.dev/recipes/webpack/webpack-config-setup) */ isolatedConfig?: boolean; standardWebpackConfigFunction?: boolean; diff --git a/packages/webpack/src/executors/webpack/schema.json b/packages/webpack/src/executors/webpack/schema.json index 9182d4e5b080f4..dc575323f90b25 100644 --- a/packages/webpack/src/executors/webpack/schema.json +++ b/packages/webpack/src/executors/webpack/schema.json @@ -235,7 +235,7 @@ "type": "boolean", "description": "Do not apply Nx webpack plugins automatically. Plugins need to be applied in the project's webpack.config.js file (e.g. withNx, withReact, etc.).", "default": true, - "x-deprecated": "Automatic configuration of Webpack is deprecated in favor of an explicit 'webpack.config.js' file. This option will be removed in Nx 18. See https://nx.dev/recipes/webpack/webpack-config-setup." + "x-deprecated": "Automatic configuration of Webpack is deprecated in favor of an explicit 'webpack.config.js' file. This option will be removed in Nx 19. See https://nx.dev/recipes/webpack/webpack-config-setup." }, "standardWebpackConfigFunction": { "type": "boolean", diff --git a/packages/webpack/src/generators/configuration/schema.json b/packages/webpack/src/generators/configuration/schema.json index fe5083865e71d5..2917743e96730f 100644 --- a/packages/webpack/src/generators/configuration/schema.json +++ b/packages/webpack/src/generators/configuration/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebpackProject", "cli": "nx", "title": "Add Webpack Configuration to a project", diff --git a/packages/webpack/src/generators/init/schema.json b/packages/webpack/src/generators/init/schema.json index 4ca7c87ef9083d..107405647bc3cc 100644 --- a/packages/webpack/src/generators/init/schema.json +++ b/packages/webpack/src/generators/init/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWebpackInit", "cli": "nx", "title": "Init Webpack Plugin", diff --git a/packages/webpack/src/utils/module-federation/secondary-entry-points.ts b/packages/webpack/src/utils/module-federation/secondary-entry-points.ts index 0cb16e24f24302..9f22f09e185cdc 100644 --- a/packages/webpack/src/utils/module-federation/secondary-entry-points.ts +++ b/packages/webpack/src/utils/module-federation/secondary-entry-points.ts @@ -8,7 +8,7 @@ import { requireNx } from '@nx/devkit/nx'; let { readModulePackageJson } = requireNx(); -// TODO: Remove this in Nx 18 when Nx 16.7.0 is no longer supported +// TODO: Remove this in Nx 19 when Nx 16.7.0 is no longer supported readModulePackageJson = readModulePackageJson ?? require('nx/src/utils/package-json').readModulePackageJson; diff --git a/packages/webpack/src/utils/module-federation/typescript.ts b/packages/webpack/src/utils/module-federation/typescript.ts index 866169f5ed02da..0a3d8171b7fb65 100644 --- a/packages/webpack/src/utils/module-federation/typescript.ts +++ b/packages/webpack/src/utils/module-federation/typescript.ts @@ -3,23 +3,31 @@ import { ParsedCommandLine } from 'typescript'; import { dirname, join } from 'path'; import { workspaceRoot } from '@nx/devkit'; -let tsConfig: ParsedCommandLine; -let tsPathMappings: ParsedCommandLine['options']['paths']; +let tsConfig: Map = new Map(); +let tsPathMappings: Map = + new Map(); export function readTsPathMappings( tsConfigPath: string = process.env.NX_TSCONFIG_PATH ?? getRootTsConfigPath() ): ParsedCommandLine['options']['paths'] { - if (tsPathMappings) { - return tsPathMappings; + if (tsPathMappings.has(tsConfigPath)) { + return tsPathMappings.get(tsConfigPath); } - tsConfig ??= readTsConfiguration(tsConfigPath); - tsPathMappings = {}; - Object.entries(tsConfig.options?.paths ?? {}).forEach(([alias, paths]) => { - tsPathMappings[alias] = paths.map((path) => path.replace(/^\.\//, '')); - }); + if (!tsConfig.has(tsConfigPath)) { + tsConfig.set(tsConfigPath, readTsConfiguration(tsConfigPath)); + } + tsPathMappings.set(tsConfigPath, {}); + Object.entries(tsConfig.get(tsConfigPath).options?.paths ?? {}).forEach( + ([alias, paths]) => { + tsPathMappings.set(tsConfigPath, { + ...tsPathMappings.get(tsConfigPath), + [alias]: paths.map((path) => path.replace(/^\.\//, '')), + }); + } + ); - return tsPathMappings; + return tsPathMappings.get(tsConfigPath); } function readTsConfiguration(tsConfigPath: string): ParsedCommandLine { diff --git a/packages/webpack/src/utils/webpack/deprecated-stylus-loader.ts b/packages/webpack/src/utils/webpack/deprecated-stylus-loader.ts index 7804c8de1e499c..76b64b95f22ec7 100644 --- a/packages/webpack/src/utils/webpack/deprecated-stylus-loader.ts +++ b/packages/webpack/src/utils/webpack/deprecated-stylus-loader.ts @@ -1,10 +1,10 @@ import { logger } from '@nx/devkit'; // @ts-ignore import * as stylusLoader from 'stylus-loader'; -// TOOD(v18): Remove this file and stylus support. +// TOOD(v19): Remove this file and stylus support. export default function (source: string): string { logger.warn( - `Stylus is support is deprecated and will be removed in Nx 18. We recommend that you migrate to Sass by renaming \`.styl\` files to \`.scss\` and ensuring that the content is valid Sass.` + `Stylus is support is deprecated and will be removed in Nx 19. We recommend that you migrate to Sass by renaming \`.styl\` files to \`.scss\` and ensuring that the content is valid Sass.` ); return stylusLoader.call(this, source); } diff --git a/packages/webpack/src/utils/webpack/plugins/postcss-cli-resources.ts b/packages/webpack/src/utils/webpack/plugins/postcss-cli-resources.ts index 66eb97ddb878bf..adab906ba5b35d 100644 --- a/packages/webpack/src/utils/webpack/plugins/postcss-cli-resources.ts +++ b/packages/webpack/src/utils/webpack/plugins/postcss-cli-resources.ts @@ -152,7 +152,7 @@ export function PostcssCliResources(options: PostcssCliResourcesOptions) { return Promise.all( urlDeclarations.map(async (decl) => { const value = decl.value; - const urlRegex = /url\(\s*(?:"([^"]+)"|'([^']+)'|(.+?))\s*\)/g; + const urlRegex = /url(?:\(\s*['"]?)(.*?)(?:['"]?\s*\))/g; const segments: string[] = []; let match; let lastIndex = 0; @@ -162,7 +162,7 @@ export function PostcssCliResources(options: PostcssCliResourcesOptions) { const context = (inputFile && path.dirname(inputFile)) || loader.context; while ((match = urlRegex.exec(value))) { - const originalUrl = match[1] || match[2] || match[3]; + const originalUrl = match[1]; let processedUrl; try { processedUrl = await process(originalUrl, context, resourceCache); diff --git a/packages/workspace/src/generators/ci-workflow/schema.json b/packages/workspace/src/generators/ci-workflow/schema.json index f1060142d9f95e..f2e1325672e6c4 100644 --- a/packages/workspace/src/generators/ci-workflow/schema.json +++ b/packages/workspace/src/generators/ci-workflow/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceCIWorkflow", "title": "Generate a CI workflow.", "description": "Generate a CI workflow.", diff --git a/packages/workspace/src/generators/convert-to-monorepo/schema.json b/packages/workspace/src/generators/convert-to-monorepo/schema.json index cd574c4528cebe..9f815737e2595a 100644 --- a/packages/workspace/src/generators/convert-to-monorepo/schema.json +++ b/packages/workspace/src/generators/convert-to-monorepo/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceConvertToMonorepo", "cli": "nx", "title": "Nx Convert to Monorepo", diff --git a/packages/workspace/src/generators/convert-to-nx-project/schema.json b/packages/workspace/src/generators/convert-to-nx-project/schema.json index 65ecdfc82ed30d..75685eb170a267 100644 --- a/packages/workspace/src/generators/convert-to-nx-project/schema.json +++ b/packages/workspace/src/generators/convert-to-nx-project/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SchematicsConvertToNxProject", "title": "@nx/workspace:fix-configuration", "description": "Migrates v1 config to v2 standalone configuration.", diff --git a/packages/workspace/src/generators/move/lib/normalize-schema.ts b/packages/workspace/src/generators/move/lib/normalize-schema.ts index b843a765e93ec7..18c20749edf4a5 100644 --- a/packages/workspace/src/generators/move/lib/normalize-schema.ts +++ b/packages/workspace/src/generators/move/lib/normalize-schema.ts @@ -240,7 +240,7 @@ function logDeprecationMessage( logger.warn( stripIndents` - In Nx 18, the project name and destination will no longer be derived. + In Nx 19, the project name and destination will no longer be derived. Please provide the exact new project name and destination in the future. Example: nx g ${callingGenerator} --projectName ${options.projectName} --destination ${formats['derived'].destination}` + (options.projectName !== formats['derived'].newProjectName diff --git a/packages/workspace/src/generators/move/schema.json b/packages/workspace/src/generators/move/schema.json index e148886bcfcb7d..e67c483887195e 100644 --- a/packages/workspace/src/generators/move/schema.json +++ b/packages/workspace/src/generators/move/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceMove", "cli": "nx", "title": "Nx Move", diff --git a/packages/workspace/src/generators/new/__snapshots__/new.spec.ts.snap b/packages/workspace/src/generators/new/__snapshots__/new.spec.ts.snap index bd36babcb5ed13..765ee0258fbd27 100644 --- a/packages/workspace/src/generators/new/__snapshots__/new.spec.ts.snap +++ b/packages/workspace/src/generators/new/__snapshots__/new.spec.ts.snap @@ -46,3 +46,34 @@ exports[`new should generate an empty nx.json 1`] = ` }, } `; + +exports[`new should skip install 1`] = ` +{ + "$schema": "./node_modules/nx/schemas/nx-schema.json", + "namedInputs": { + "default": [ + "{projectRoot}/**/*", + "sharedGlobals", + ], + "production": [ + "default", + ], + "sharedGlobals": [], + }, + "targetDefaults": { + "build": { + "cache": true, + "dependsOn": [ + "^build", + ], + "inputs": [ + "production", + "^production", + ], + }, + "lint": { + "cache": true, + }, + }, +} +`; diff --git a/packages/workspace/src/generators/new/new.spec.ts b/packages/workspace/src/generators/new/new.spec.ts index 38cfdb33bcd691..fdd83c475d84b7 100644 --- a/packages/workspace/src/generators/new/new.spec.ts +++ b/packages/workspace/src/generators/new/new.spec.ts @@ -1,4 +1,5 @@ import { readJson, Tree, writeJson } from '@nx/devkit'; +import * as devkit from '@nx/devkit'; import { createTree } from '@nx/devkit/testing'; import { Linter } from '../../utils/lint'; import { @@ -8,14 +9,10 @@ import { } from '../../utils/versions'; import { Preset } from '../utils/presets'; import { newGenerator, NormalizedSchema } from './new'; +import * as getNpmPackageVersion from './../utils/get-npm-package-version'; +import * as generatePreset from './generate-preset'; const DEFAULT_PACKAGE_VERSION = '1.0.0'; -jest.mock('./../utils/get-npm-package-version', () => ({ - ...jest.requireActual('./../utils/get-npm-package-version'), - getNpmPackageVersion: jest - .fn() - .mockImplementation((name, version) => version ?? DEFAULT_PACKAGE_VERSION), -})); const defaultOptions: Omit< NormalizedSchema, @@ -29,21 +26,61 @@ const defaultOptions: Omit< describe('new', () => { let tree: Tree; + let installPackagesTaskSpy: jest.SpyInstance; + let generatePresetSpy: jest.SpyInstance; + let getNpmPackageVersionSpy: jest.SpyInstance; beforeEach(() => { tree = createTree(); // we need an actual path for the package manager version check tree.root = process.cwd(); + + installPackagesTaskSpy = jest + .spyOn(devkit, 'installPackagesTask') + .mockImplementation(() => undefined); + + generatePresetSpy = jest + .spyOn(generatePreset, 'generatePreset') + .mockImplementation(async () => undefined); + + getNpmPackageVersionSpy = jest + .spyOn(getNpmPackageVersion, 'getNpmPackageVersion') + .mockImplementation( + (name, version) => version ?? DEFAULT_PACKAGE_VERSION + ); + }); + + afterEach(() => { + jest.resetAllMocks(); }); it('should generate an empty nx.json', async () => { - await newGenerator(tree, { - ...defaultOptions, - name: 'my-workspace', - directory: 'my-workspace', - appName: 'app', - }); + await ( + await newGenerator(tree, { + ...defaultOptions, + name: 'my-workspace', + directory: 'my-workspace', + appName: 'app', + }) + )(); + expect(readJson(tree, 'my-workspace/nx.json')).toMatchSnapshot(); + expect(installPackagesTaskSpy).toHaveBeenCalled(); + expect(generatePresetSpy).toHaveBeenCalled(); + }); + + it('should skip install', async () => { + await ( + await newGenerator(tree, { + ...defaultOptions, + name: 'my-workspace', + directory: 'my-workspace', + appName: 'app', + skipInstall: true, + }) + )(); expect(readJson(tree, 'my-workspace/nx.json')).toMatchSnapshot(); + expect(installPackagesTaskSpy).not.toHaveBeenCalled(); + expect(generatePresetSpy).toHaveBeenCalled(); }); describe('--preset', () => { diff --git a/packages/workspace/src/generators/new/new.ts b/packages/workspace/src/generators/new/new.ts index 77f9b425f19425..ae64f1671ee56c 100644 --- a/packages/workspace/src/generators/new/new.ts +++ b/packages/workspace/src/generators/new/new.ts @@ -50,14 +50,22 @@ export async function newGenerator(tree: Tree, opts: Schema) { addPresetDependencies(tree, options); return async () => { - const pmc = getPackageManagerCommand(options.packageManager); - if (pmc.preInstall) { - execSync(pmc.preInstall, { - cwd: joinPathFragments(tree.root, options.directory), - stdio: process.env.NX_GENERATE_QUIET === 'true' ? 'ignore' : 'inherit', - }); + if (!options.skipInstall) { + const pmc = getPackageManagerCommand(options.packageManager); + if (pmc.preInstall) { + execSync(pmc.preInstall, { + cwd: joinPathFragments(tree.root, options.directory), + stdio: + process.env.NX_GENERATE_QUIET === 'true' ? 'ignore' : 'inherit', + }); + } + installPackagesTask( + tree, + false, + options.directory, + options.packageManager + ); } - installPackagesTask(tree, false, options.directory, options.packageManager); // TODO: move all of these into create-nx-workspace if (options.preset !== Preset.NPM && !options.isCustomPreset) { await generatePreset(tree, options); diff --git a/packages/workspace/src/generators/new/schema.json b/packages/workspace/src/generators/new/schema.json index 59ba64cf25ba6f..000d0fa460d441 100644 --- a/packages/workspace/src/generators/new/schema.json +++ b/packages/workspace/src/generators/new/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceNew", "title": "Create an empty workspace", "description": "Create an empty workspace.", diff --git a/packages/workspace/src/generators/npm-package/schema.json b/packages/workspace/src/generators/npm-package/schema.json index 241cf815a3ae24..70437019d348f8 100644 --- a/packages/workspace/src/generators/npm-package/schema.json +++ b/packages/workspace/src/generators/npm-package/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceNpmPackage", "title": "Add a minimal npm package", "description": "Add a minimal npm package.", diff --git a/packages/workspace/src/generators/preset/schema.json b/packages/workspace/src/generators/preset/schema.json index 8c556d53212d10..1426b4947e4892 100644 --- a/packages/workspace/src/generators/preset/schema.json +++ b/packages/workspace/src/generators/preset/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspacePreset", "cli": "nx", "title": "Creates applications in a new workspace", @@ -39,11 +39,11 @@ }, { "value": "scss", - "label": "SASS(.scss) [ http://sass-lang.com ]" + "label": "SASS(.scss) [ https://sass-lang.com ]" }, { "value": "less", - "label": "LESS [ http://lesscss.org ]" + "label": "LESS [ https://lesscss.org ]" } ] } diff --git a/packages/workspace/src/generators/remove/schema.json b/packages/workspace/src/generators/remove/schema.json index e593f9904a61bd..1743fa9eb6a1ad 100644 --- a/packages/workspace/src/generators/remove/schema.json +++ b/packages/workspace/src/generators/remove/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "NxWorkspaceRemove", "cli": "nx", "title": "Nx Remove", diff --git a/packages/workspace/src/generators/run-commands/schema.json b/packages/workspace/src/generators/run-commands/schema.json index c4e0f3aff57f5c..c3d8faa9098eb7 100644 --- a/packages/workspace/src/generators/run-commands/schema.json +++ b/packages/workspace/src/generators/run-commands/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "SchematicsRunCommands", "title": "Create a custom target to run any command", "description": "Create a custom target to run any command.", diff --git a/packages/workspace/src/generators/utils/presets.ts b/packages/workspace/src/generators/utils/presets.ts index af482e900aa5f6..be82ad7a1d9c66 100644 --- a/packages/workspace/src/generators/utils/presets.ts +++ b/packages/workspace/src/generators/utils/presets.ts @@ -1,6 +1,6 @@ export enum Preset { Apps = 'apps', - // TODO(v18): Remove Empty and Core presets + // TODO(v19): Remove Empty and Core presets /** @deprecated Use Apps instead */ Empty = 'empty', diff --git a/packages/workspace/src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin.spec.ts b/packages/workspace/src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin.spec.ts index cdfd06758586e9..257557f92472c7 100644 --- a/packages/workspace/src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin.spec.ts +++ b/packages/workspace/src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin.spec.ts @@ -185,7 +185,7 @@ async function workspaceGeneratorGenerator( host.write( joinPathFragments(outputDirectory, 'schema.json'), stripIndents`{ - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "cli": "nx", "$id": "<%= name %>", "type": "object", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0396e6765f6748..54ea684fd226b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,8 +58,8 @@ dependencies: specifier: 0.0.6 version: 0.0.6 axios: - specifier: ^1.5.1 - version: 1.5.1 + specifier: ^1.6.0 + version: 1.6.2 classnames: specifier: ^2.3.1 version: 2.3.2 @@ -94,11 +94,11 @@ dependencies: specifier: ^25.0.1 version: 25.0.1 next: - specifier: 13.3.4 - version: 13.3.4(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) + specifier: 14.0.4 + version: 14.0.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) next-seo: specifier: ^5.13.0 - version: 5.13.0(next@13.3.4)(react-dom@18.2.0)(react@18.2.0) + version: 5.13.0(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) node-machine-id: specifier: 1.1.12 version: 1.1.12 @@ -192,20 +192,20 @@ devDependencies: specifier: ~17.1.0 version: 17.1.0(@angular/common@17.1.0)(@angular/core@17.1.0)(@angular/platform-browser@17.1.0)(rxjs@7.8.1) '@babel/core': - specifier: ^7.22.9 - version: 7.22.9 + specifier: ^7.23.2 + version: 7.23.2 '@babel/helper-create-regexp-features-plugin': specifier: ^7.22.9 - version: 7.22.9(@babel/core@7.22.9) + version: 7.22.9(@babel/core@7.23.2) '@babel/plugin-transform-runtime': - specifier: ^7.22.9 - version: 7.22.9(@babel/core@7.22.9) + specifier: ^7.23.2 + version: 7.23.2(@babel/core@7.23.2) '@babel/preset-react': specifier: ^7.22.5 - version: 7.22.5(@babel/core@7.22.9) + version: 7.22.5(@babel/core@7.23.2) '@babel/preset-typescript': specifier: ^7.22.5 - version: 7.22.5(@babel/core@7.22.9) + version: 7.22.5(@babel/core@7.23.2) '@babel/runtime': specifier: ^7.22.6 version: 7.22.6 @@ -295,7 +295,7 @@ devDependencies: version: 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4) '@nx/next': specifier: 17.3.0-rc.1 - version: 17.3.0-rc.1(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@13.3.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0) + version: 17.3.0-rc.1(@babel/core@7.23.2)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@14.0.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0) '@nx/playwright': specifier: 17.3.0-rc.1 version: 17.3.0-rc.1(@playwright/test@1.36.1)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(js-yaml@4.1.0)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4) @@ -337,7 +337,7 @@ devDependencies: version: 2.3.0(typescript@5.3.3) '@rollup/plugin-babel': specifier: ^5.3.0 - version: 5.3.1(@babel/core@7.22.9)(rollup@2.79.0) + version: 5.3.1(@babel/core@7.23.2)(rollup@2.79.0) '@rollup/plugin-commonjs': specifier: ^20.0.0 version: 20.0.0(rollup@2.79.0) @@ -373,7 +373,7 @@ devDependencies: version: 7.5.3(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.0)(typescript@5.3.3)(vite@5.0.8) '@storybook/react-webpack5': specifier: 7.5.3 - version: 7.5.3(@babel/core@7.22.9)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack-dev-server@4.11.1) + version: 7.5.3(@babel/core@7.23.2)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack-dev-server@4.11.1) '@storybook/types': specifier: ^7.1.1 version: 7.1.1 @@ -382,10 +382,10 @@ devDependencies: version: 2.26.0 '@svgr/rollup': specifier: ^8.0.1 - version: 8.0.1(rollup@2.79.0) + version: 8.0.1(rollup@2.79.0)(typescript@5.3.3) '@svgr/webpack': specifier: ^8.0.1 - version: 8.0.1 + version: 8.0.1(typescript@5.3.3) '@swc-node/register': specifier: 1.6.8 version: 1.6.8(@swc/core@1.3.86)(typescript@5.3.3) @@ -502,10 +502,10 @@ devDependencies: version: 10.4.13(postcss@8.4.19) babel-jest: specifier: 29.4.3 - version: 29.4.3(@babel/core@7.22.9) + version: 29.4.3(@babel/core@7.23.2) babel-loader: specifier: ^9.1.2 - version: 9.1.2(@babel/core@7.22.9)(webpack@5.88.0) + version: 9.1.2(@babel/core@7.23.2)(webpack@5.88.0) babel-plugin-transform-async-to-promises: specifier: ^0.8.15 version: 0.8.18 @@ -579,8 +579,8 @@ devDependencies: specifier: 8.48.0 version: 8.48.0 eslint-config-next: - specifier: 13.1.1 - version: 13.1.1(eslint@8.48.0)(typescript@5.3.3) + specifier: 14.0.4 + version: 14.0.4(eslint@8.48.0)(typescript@5.3.3) eslint-config-prettier: specifier: 9.0.0 version: 9.0.0(eslint@8.48.0) @@ -747,11 +747,11 @@ devDependencies: specifier: ^3.0.1 version: 3.4.7 metro-config: - specifier: 0.76.8 - version: 0.76.8 + specifier: ~0.80.4 + version: 0.80.5 metro-resolver: - specifier: 0.76.8 - version: 0.76.8 + specifier: ~0.80.4 + version: 0.80.5 mini-css-extract-plugin: specifier: ~2.4.7 version: 2.4.7(webpack@5.88.0) @@ -760,7 +760,7 @@ devDependencies: version: 9.0.3 next-sitemap: specifier: ^3.1.10 - version: 3.1.29(@next/env@14.0.4)(next@13.3.4) + version: 3.1.29(@next/env@14.0.4)(next@14.0.4) ng-packagr: specifier: ~17.1.0 version: 17.1.1(@angular/compiler-cli@17.1.0)(tailwindcss@3.2.4)(tslib@2.4.0)(typescript@5.3.3) @@ -864,7 +864,7 @@ devDependencies: specifier: ^12.2.0 version: 12.6.0(sass@1.55.0)(webpack@5.88.0) semver: - specifier: 7.5.3 + specifier: ^7.5.3 version: 7.5.3 source-map: specifier: 0.7.3 @@ -904,7 +904,7 @@ 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.3.3) + version: 29.1.0(@babel/core@7.23.2)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.19.5)(jest@29.4.3)(typescript@5.3.3) ts-loader: specifier: ^9.3.1 version: 9.4.1(typescript@5.3.3)(webpack@5.88.0) @@ -1632,12 +1632,6 @@ packages: 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'} - dependencies: - '@babel/highlight': 7.22.5 - /@babel/code-frame@7.23.5: resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -1650,56 +1644,24 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - - /@babel/compat-data@7.23.2: - resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.22.9: - resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} - 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.9) - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@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 - convert-source-map: 1.9.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 /@babel/core@7.23.2: resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} dependencies: '@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/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helpers': 7.23.8 + '@babel/parser': 7.23.6 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 @@ -1707,7 +1669,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/core@7.23.7: resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} @@ -1732,29 +1693,11 @@ packages: - 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.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.21 - jsesc: 2.5.2 - - /@babel/generator@7.22.9: - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@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 + '@babel/types': 7.23.6 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 @@ -1768,7 +1711,6 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.21 jsesc: 2.5.2 - dev: true /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} @@ -1791,44 +1733,20 @@ packages: '@babel/types': 7.23.6 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): + /@babel/helper-compilation-targets@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 - lru-cache: 5.1.1 - semver: 6.3.1 - /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} @@ -1838,25 +1756,6 @@ packages: browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 - dev: true - - /@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==} @@ -1894,24 +1793,6 @@ packages: 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'} - 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.9(@babel/core@7.23.2): resolution: {integrity: sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==} engines: {node: '>=6.9.0'} @@ -1960,18 +1841,6 @@ packages: 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'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - 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'} @@ -1996,13 +1865,13 @@ packages: semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.22.9): + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.23.7): 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.15 + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 @@ -2012,13 +1881,13 @@ packages: - supports-color dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.9): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.2): + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 @@ -2027,13 +1896,13 @@ packages: - supports-color dev: true - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): - resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7): + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} 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/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 @@ -2042,13 +1911,13 @@ packages: - supports-color dev: true - /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7): - resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.2): + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 @@ -2063,7 +1932,7 @@ packages: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.23.7 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 @@ -2075,18 +1944,6 @@ packages: /@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'} - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -2094,7 +1951,6 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.6 - dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} @@ -2121,20 +1977,20 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.6 - dev: true /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-module-transforms@7.22.5: resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.5 + '@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 @@ -2145,35 +2001,8 @@ packages: - supports-color 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'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - - /@babel/helper-module-transforms@7.23.0(@babel/core@7.22.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==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -2184,7 +2013,6 @@ packages: '@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.3(@babel/core@7.23.7): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -2212,30 +2040,6 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@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.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-remap-async-to-generator@7.22.20(@babel/core@7.23.7): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -2248,13 +2052,13 @@ packages: '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.22.9): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -2272,18 +2076,6 @@ packages: '@babel/helper-optimise-call-expression': 7.22.5 dev: true - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} - 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-member-expression-to-functions': 7.23.0 - '@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'} @@ -2330,6 +2122,7 @@ packages: /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} @@ -2342,20 +2135,16 @@ packages: /@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'} + dev: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-wrap-function@7.22.20: resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} @@ -2366,27 +2155,6 @@ packages: '@babel/types': 7.23.6 dev: true - /@babel/helpers@7.22.6: - resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - - /@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.6 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helpers@7.23.8: resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} engines: {node: '>=6.9.0'} @@ -2396,7 +2164,6 @@ packages: '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color - dev: true /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} @@ -2407,14 +2174,6 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} @@ -2423,13 +2182,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.5 - /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} @@ -2445,13 +2197,13 @@ packages: dependencies: '@babel/types': 7.23.6 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.9): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2465,16 +2217,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.9): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@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.22.9) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.7) dev: true /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7): @@ -2500,80 +2252,55 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.9): + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.7): 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.22.9 + '@babel/core': 7.23.7 '@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.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) 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==} + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.7): + 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-environment-visitor': 7.22.20 + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@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): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.23.7): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} 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 + '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + /@babel/plugin-proposal-decorators@7.22.7(@babel/core@7.23.2): + resolution: {integrity: sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==} 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 - - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.22.9): - resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) - dev: true - - /@babel/plugin-proposal-decorators@7.22.7(@babel/core@7.22.9): - resolution: {integrity: sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.9) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-decorators@7.22.7(@babel/core@7.23.7): @@ -2590,201 +2317,131 @@ packages: '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.22.9): + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.23.7): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) - dev: true - - /@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.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.9): + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.23.7): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.22.9): + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.23.7): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.22.9): + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.23.7): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.7): 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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.7): 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.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.2): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.7): 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): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.7): 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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.7): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@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) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.9): + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.7): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.22.9): + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.23.7): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) dev: true /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7): @@ -2796,23 +2453,14 @@ packages: '@babel/core': 7.23.7 dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.9): + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.23.7): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2834,15 +2482,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -2861,15 +2500,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -2888,16 +2518,6 @@ packages: '@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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -2908,16 +2528,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.22.9): - resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} - 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-syntax-decorators@7.23.3(@babel/core@7.23.2): resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} @@ -2938,24 +2548,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@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-dynamic-import@7.8.3(@babel/core@7.23.7): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -2965,25 +2557,6 @@ packages: '@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.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -2993,16 +2566,6 @@ packages: '@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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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'} @@ -3013,13 +2576,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.9): + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3043,15 +2606,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -3070,15 +2624,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -3097,16 +2642,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - 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-syntax-jsx@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -3137,15 +2672,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -3164,15 +2690,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -3191,15 +2708,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -3218,15 +2726,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -3245,15 +2744,6 @@ packages: '@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: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -3272,15 +2762,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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: @@ -3299,16 +2780,6 @@ packages: '@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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -3319,16 +2790,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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'} @@ -3349,16 +2810,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-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'} @@ -3379,16 +2830,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.2): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} - 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.23.3(@babel/core@7.23.7): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} @@ -3410,23 +2851,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3453,28 +2884,16 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@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.22.9) - dev: true - - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 '@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) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) dev: true /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7): @@ -3489,23 +2908,13 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.7): 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.22.9 - '@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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3519,33 +2928,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.23.7): 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.22.9 - '@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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3582,38 +2971,20 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) 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): + /@babel/plugin-transform-classes@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.7) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true @@ -3635,24 +3006,13 @@ packages: globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - dev: true - - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 dev: true @@ -3668,33 +3028,13 @@ packages: '@babel/template': 7.22.15 dev: true - /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} 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-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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3708,14 +3048,14 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.7): 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.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3730,13 +3070,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3761,13 +3101,13 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3794,17 +3134,6 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.9): - 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.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@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'} @@ -3816,23 +3145,13 @@ packages: '@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): + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3847,26 +3166,14 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@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/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3894,23 +3201,13 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - 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-literals@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3935,23 +3232,13 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} 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-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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3965,14 +3252,14 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3987,20 +3274,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} engines: {node: '>=6.9.0'} @@ -4029,18 +3302,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: true - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} @@ -4053,15 +3314,15 @@ packages: '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 dev: true @@ -4079,47 +3340,25 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) '@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==} + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@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/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4134,13 +3373,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.7): 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.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4190,26 +3429,15 @@ packages: '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.9) - dev: true - - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.7) dev: true /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7): @@ -4234,16 +3462,16 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.22.9): + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.7): resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) dev: true /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7): @@ -4258,43 +3486,23 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) 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): + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.7): 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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4332,28 +3540,28 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@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==} + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.23.7): + resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4362,118 +3570,118 @@ packages: '@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==} + /@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.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@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==} + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} 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-transform-react-jsx': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.9): + /@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.22.9 + '@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.22.9) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/types': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 '@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/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.7) '@babel/types': 7.22.5 dev: true - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4483,18 +3691,19 @@ packages: regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4503,21 +3712,14 @@ packages: '@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==} + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-imports': 7.22.5 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 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) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): @@ -4529,9 +3731,9 @@ packages: '@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) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.2) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -4554,23 +3756,13 @@ packages: - 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'} - 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-shorthand-properties@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4584,24 +3776,13 @@ packages: '@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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true @@ -4617,23 +3798,13 @@ packages: '@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'} - 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-sticky-regex@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4647,23 +3818,13 @@ packages: '@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'} - 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-template-literals@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4677,13 +3838,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4697,19 +3858,6 @@ packages: '@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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - 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-plugin-utils': 7.22.5 - '@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'} @@ -4736,13 +3884,13 @@ packages: '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.7) dev: true - /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.22.9): + /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.23.7): resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4767,25 +3915,14 @@ packages: '@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'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.7): 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/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4811,86 +3948,86 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.21.4(@babel/core@7.22.9): + /@babel/preset-env@7.21.4(@babel/core@7.23.7): resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.23.7) '@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-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-class-static-block': 7.21.0(@babel/core@7.22.9) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.22.9) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@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-proposal-private-methods': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.22.9) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@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-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-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-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.5(@babel/core@7.22.9) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-exponentiation-operator': 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-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-object-super': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) - '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.7) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.23.7) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.23.7) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.23.7) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.7) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.7) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.23.7) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.7) + '@babel/preset-modules': 0.1.5(@babel/core@7.23.7) '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.22.9) + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.23.7) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.23.7) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.23.7) core-js-compat: 3.30.2 semver: 6.3.1 transitivePeerDependencies: @@ -4988,27 +4125,27 @@ packages: - supports-color dev: true - /@babel/preset-flow@7.22.5(@babel/core@7.22.9): + /@babel/preset-flow@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.9) + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.22.9): + /@babel/preset-modules@0.1.5(@babel/core@7.23.7): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@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/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.7) '@babel/types': 7.23.6 esutils: 2.0.3 dev: true @@ -5024,35 +4161,34 @@ packages: esutils: 2.0.3 dev: true - /@babel/preset-react@7.22.5(@babel/core@7.22.9): + /@babel/preset-react@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 - '@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-development': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.22.9) + '@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-development': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/preset-typescript@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} + /@babel/preset-react@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-typescript': 7.22.9(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.7) dev: true /@babel/preset-typescript@7.22.5(@babel/core@7.23.2): @@ -5124,14 +4260,6 @@ packages: '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - /@babel/traverse@7.21.4(supports-color@5.5.0): resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} @@ -5150,29 +4278,12 @@ packages: - supports-color dev: true - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@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 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 - debug: 4.3.4(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.0 + '@babel/generator': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 @@ -5201,7 +4312,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} @@ -5210,6 +4320,7 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} @@ -6765,7 +5876,7 @@ packages: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 @@ -7345,85 +6456,81 @@ packages: tslib: 2.4.0 dev: true - /@next/env@13.3.4: - resolution: {integrity: sha512-oTK/wRV2qga86m/4VdrR1+/56UA6U1Qv3sIgowB+bZjahniZLEG5BmmQjfoGv7ZuLXBZ8Eec6hkL9BqJcrEL2g==} - /@next/env@14.0.4: resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} - dev: true - /@next/eslint-plugin-next@13.1.1: - resolution: {integrity: sha512-SBrOFS8PC3nQ5aeZmawJkjKkWjwK9RoxvBSv/86nZp0ubdoVQoko8r8htALd9ufp16NhacCdqhu9bzZLDWtALQ==} + /@next/eslint-plugin-next@14.0.4: + resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} dependencies: glob: 7.1.7 dev: true - /@next/swc-darwin-arm64@13.3.4: - resolution: {integrity: sha512-vux7RWfzxy1lD21CMwZsy9Ej+0+LZdIIj1gEhVmzOQqQZ5N56h8JamrjIVCfDL+Lpj8KwOmFZbPHE8qaYnL2pg==} + /@next/swc-darwin-arm64@14.0.4: + resolution: {integrity: sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@next/swc-darwin-x64@13.3.4: - resolution: {integrity: sha512-1tb+6JT98+t7UIhVQpKL7zegKnCs9RKU6cKNyj+DYKuC/NVl49/JaIlmwCwK8Ibl+RXxJrK7uSXSIO71feXsgw==} + /@next/swc-darwin-x64@14.0.4: + resolution: {integrity: sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@next/swc-linux-arm64-gnu@13.3.4: - resolution: {integrity: sha512-UqcKkYTKslf5YAJNtZ5XV1D5MQJIkVtDHL8OehDZERHzqOe7jvy41HFto33IDPPU8gJiP5eJb3V9U26uifqHjw==} + /@next/swc-linux-arm64-gnu@14.0.4: + resolution: {integrity: sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@next/swc-linux-arm64-musl@13.3.4: - resolution: {integrity: sha512-HE/FmE8VvstAfehyo/XsrhGgz97cEr7uf9IfkgJ/unqSXE0CDshDn/4as6rRid74eDR8/exi7c2tdo49Tuqxrw==} + /@next/swc-linux-arm64-musl@14.0.4: + resolution: {integrity: sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@next/swc-linux-x64-gnu@13.3.4: - resolution: {integrity: sha512-xU+ugaupGA4SL5aK1ZYEqVHrW3TPOhxVcpaJLfpANm2443J4GfxCmOacu9XcSgy5c51Mq7C9uZ1LODKHfZosRQ==} + /@next/swc-linux-x64-gnu@14.0.4: + resolution: {integrity: sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@next/swc-linux-x64-musl@13.3.4: - resolution: {integrity: sha512-cZvmf5KcYeTfIK6bCypfmxGUjme53Ep7hx94JJtGrYgCA1VwEuYdh+KouubJaQCH3aqnNE7+zGnVEupEKfoaaA==} + /@next/swc-linux-x64-musl@14.0.4: + resolution: {integrity: sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@next/swc-win32-arm64-msvc@13.3.4: - resolution: {integrity: sha512-7dL+CAUAjmgnVbjXPIpdj7/AQKFqEUL3bKtaOIE1JzJ5UMHHAXCPwzQtibrsvQpf9MwcAmiv8aburD3xH1xf8w==} + /@next/swc-win32-arm64-msvc@14.0.4: + resolution: {integrity: sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@next/swc-win32-ia32-msvc@13.3.4: - resolution: {integrity: sha512-qplTyzEl1vPkS+/DRK3pKSL0HeXrPHkYsV7U6gboHYpfqoHY+bcLUj3gwVUa9PEHRIoq4vXvPzx/WtzE6q52ng==} + /@next/swc-win32-ia32-msvc@14.0.4: + resolution: {integrity: sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@next/swc-win32-x64-msvc@13.3.4: - resolution: {integrity: sha512-usdvZT7JHrTuXC+4OKN5mCzUkviFkCyJJTkEz8jhBpucg+T7s83e7owm3oNFzmj5iKfvxU2St6VkcnSgpFvEYA==} + /@next/swc-win32-x64-msvc@14.0.4: + resolution: {integrity: sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -7807,10 +6914,10 @@ packages: - verdaccio dev: true - /@nrwl/next@17.3.0-rc.1(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@13.3.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0): + /@nrwl/next@17.3.0-rc.1(@babel/core@7.23.2)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@14.0.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0): resolution: {integrity: sha512-kS7kt3l7LU383xLY/9PNOUjDirhFKW0AzVApInaPHCsHypL2MBGHHXh7MMa1r5iwRbsKD6A5wOlrHK4n1fuNMw==} dependencies: - '@nx/next': 17.3.0-rc.1(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@13.3.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0) + '@nx/next': 17.3.0-rc.1(@babel/core@7.23.2)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@14.0.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0) transitivePeerDependencies: - '@babel/core' - '@babel/traverse' @@ -8426,25 +7533,25 @@ packages: - verdaccio dev: true - /@nx/next@17.3.0-rc.1(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@13.3.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0): + /@nx/next@17.3.0-rc.1(@babel/core@7.23.2)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@14.0.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0): resolution: {integrity: sha512-kG3nE5MqyWLBHfz+smw8Ut1wIHGMjJ0s2WVZVLODEE+hgRVcjDMrImusXs5UHtoXMw88ZvHhzzdFTe+dI4vhUA==} peerDependencies: next: '>=13.0.0' dependencies: - '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.22.9) - '@nrwl/next': 17.3.0-rc.1(@babel/core@7.22.9)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@13.3.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0) + '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.23.2) + '@nrwl/next': 17.3.0-rc.1(@babel/core@7.23.2)(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(file-loader@6.2.0)(js-yaml@4.1.0)(next@14.0.4)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0) '@nx/devkit': 17.3.0-rc.1(nx@17.3.0-rc.1) '@nx/eslint': 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(js-yaml@4.1.0)(nx@17.3.0-rc.1)(verdaccio@5.15.4) '@nx/js': 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4) '@nx/react': 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(eslint@8.48.0)(js-yaml@4.1.0)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4)(webpack@5.88.0) '@nx/web': 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4) '@nx/workspace': 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86) - '@svgr/webpack': 8.0.1 + '@svgr/webpack': 8.0.1(typescript@5.3.3) chalk: 4.1.2 copy-webpack-plugin: 10.2.4(webpack@5.88.0) fs-extra: 11.1.1 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) + next: 14.0.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) semver: 7.5.3 tslib: 2.6.2 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.0) @@ -8685,7 +7792,7 @@ packages: '@nx/js': 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4) '@nx/web': 17.3.0-rc.1(@swc-node/register@1.6.8)(@swc/core@1.3.86)(@types/node@18.19.8)(nx@17.3.0-rc.1)(typescript@5.3.3)(verdaccio@5.15.4) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.3.3) - '@svgr/webpack': 8.0.1 + '@svgr/webpack': 8.0.1(typescript@5.3.3) chalk: 4.1.2 file-loader: 6.2.0(webpack@5.88.0) minimatch: 9.0.3 @@ -9285,13 +8392,13 @@ packages: /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: true /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: true /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): @@ -9307,7 +8414,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.33 '@types/react-dom': 18.2.14 @@ -9328,7 +8435,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) @@ -9348,7 +8455,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -9362,7 +8469,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -9376,7 +8483,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -9394,7 +8501,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) @@ -9415,7 +8522,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -9433,7 +8540,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) @@ -9452,7 +8559,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@types/react': 18.2.33 react: 18.2.0 @@ -9471,7 +8578,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@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.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) @@ -9501,7 +8608,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.33 '@types/react-dom': 18.2.14 @@ -9522,7 +8629,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) '@types/react': 18.2.33 '@types/react-dom': 18.2.14 @@ -9543,7 +8650,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) @@ -9572,7 +8679,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) @@ -9613,7 +8720,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.33 '@types/react-dom': 18.2.14 @@ -9630,7 +8737,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@types/react': 18.2.33 react: 18.2.0 @@ -9649,7 +8756,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) @@ -9676,7 +8783,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) @@ -9699,7 +8806,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) @@ -9722,7 +8829,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -9736,7 +8843,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@types/react': 18.2.33 react: 18.2.0 @@ -9751,7 +8858,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@types/react': 18.2.33 react: 18.2.0 @@ -9766,7 +8873,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -9780,7 +8887,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -9794,7 +8901,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/rect': 1.0.1 '@types/react': 18.2.33 react: 18.2.0 @@ -9809,7 +8916,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@types/react': 18.2.33 react: 18.2.0 @@ -9828,7 +8935,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.33 '@types/react-dom': 18.2.14 @@ -9839,7 +8946,7 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: true /@reduxjs/toolkit@1.9.0(react-redux@8.0.5)(react@18.2.0): @@ -9877,12 +8984,12 @@ packages: vite: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/generator': 7.23.0 '@babel/parser': 7.23.0 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.2) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/preset-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.7) + '@babel/preset-typescript': 7.22.5(@babel/core@7.23.7) '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 '@mdx-js/mdx': 2.3.0 @@ -10043,7 +9150,7 @@ packages: web-streams-polyfill: 3.2.1 dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.22.9)(rollup@2.79.0): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.2)(rollup@2.79.0): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -10054,7 +9161,7 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@babel/helper-module-imports': 7.21.4 '@rollup/pluginutils': 3.1.0(rollup@2.79.0) rollup: 2.79.0 @@ -10429,8 +9536,8 @@ packages: fsevents: 2.3.3 dev: true - /@rushstack/eslint-patch@1.2.0: - resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} + /@rushstack/eslint-patch@1.7.2: + resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} dev: true /@schematics/angular@17.1.0: @@ -10932,7 +10039,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@storybook/channels': 7.5.3 '@storybook/client-logger': 7.5.3 '@storybook/core-common': 7.5.3 @@ -10944,7 +10051,7 @@ packages: '@swc/core': 1.3.86(@swc/helpers@0.5.3) '@types/node': 18.19.8 '@types/semver': 7.5.2 - babel-loader: 9.1.3(@babel/core@7.23.2)(webpack@5.88.0) + babel-loader: 9.1.3(@babel/core@7.23.7)(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 @@ -11319,7 +10426,7 @@ packages: resolution: {integrity: sha512-r+H3xGMu2A9yOSsygc3bDFhku8wpOZF3SqO19B7eAML12viHwUtYfyGL74svw4TMcKukyQ+KPn5QsSG+4bjZMg==} dev: true - /@storybook/preset-react-webpack@7.5.3(@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.3.3)(webpack-dev-server@4.11.1): + /@storybook/preset-react-webpack@7.5.3(@babel/core@7.23.2)(@swc/core@1.3.86)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-/3Zsh97KpMLsx3lkkQ9LAlEVWwBGbAJTwE+ueVxVnAJgwiDCVe95IN7sVpKuwN/PVStnMRwDADUvZPfmw4m3Sg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -11333,9 +10440,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.9 - '@babel/preset-flow': 7.22.5(@babel/core@7.22.9) - '@babel/preset-react': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.2 + '@babel/preset-flow': 7.22.5(@babel/core@7.23.2) + '@babel/preset-react': 7.22.5(@babel/core@7.23.2) '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.11.1)(webpack@5.88.0) '@storybook/core-webpack': 7.5.3 '@storybook/docs-tools': 7.5.3 @@ -11467,7 +10574,7 @@ packages: - vite-plugin-glimmerx dev: true - /@storybook/react-webpack5@7.5.3(@babel/core@7.22.9)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack-dev-server@4.11.1): + /@storybook/react-webpack5@7.5.3(@babel/core@7.23.2)(@swc/core@1.3.86)(@swc/helpers@0.5.3)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-+sjYMrvmpvztdDkRE1/EkcNNxTTdDdBoXUGrGyE0ig6qEwSewRld0H8ng1jlNQ8treocy7036TXJF+qHZEz/FQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -11481,9 +10588,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@storybook/builder-webpack5': 7.5.3(@swc/helpers@0.5.3)(esbuild@0.19.5)(typescript@5.3.3) - '@storybook/preset-react-webpack': 7.5.3(@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.3.3)(webpack-dev-server@4.11.1) + '@storybook/preset-react-webpack': 7.5.3(@babel/core@7.23.2)(@swc/core@1.3.86)(esbuild@0.19.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack-dev-server@4.11.1) '@storybook/react': 7.5.3(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@types/node': 18.19.8 react: 18.2.0 @@ -11698,106 +10805,107 @@ packages: - supports-color dev: true - /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-plugin-transform-react-native-svg@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-transform-react-native-svg@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.22.9): + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 dev: true - /@svgr/babel-preset@8.0.0(@babel/core@7.22.9): + /@svgr/babel-preset@8.0.0(@babel/core@7.23.7): resolution: {integrity: sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.22.9) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.22.9) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.22.9) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.22.9) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.22.9) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.22.9) - '@svgr/babel-plugin-transform-react-native-svg': 8.0.0(@babel/core@7.22.9) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.7) dev: true - /@svgr/core@8.0.0: + /@svgr/core@8.0.0(typescript@5.3.3): resolution: {integrity: sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==} engines: {node: '>=14'} dependencies: - '@babel/core': 7.22.9 - '@svgr/babel-preset': 8.0.0(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@svgr/babel-preset': 8.0.0(@babel/core@7.23.7) camelcase: 6.3.0 - cosmiconfig: 8.1.3 + cosmiconfig: 8.3.6(typescript@5.3.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color + - typescript dev: true /@svgr/hast-util-to-babel-ast@8.0.0: @@ -11814,59 +10922,63 @@ packages: peerDependencies: '@svgr/core': '*' dependencies: - '@babel/core': 7.22.9 - '@svgr/babel-preset': 8.0.0(@babel/core@7.22.9) - '@svgr/core': 8.0.0 + '@babel/core': 7.23.7 + '@svgr/babel-preset': 8.0.0(@babel/core@7.23.7) + '@svgr/core': 8.0.0(typescript@5.3.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color dev: true - /@svgr/plugin-svgo@8.0.1(@svgr/core@8.0.0): + /@svgr/plugin-svgo@8.0.1(@svgr/core@8.0.0)(typescript@5.3.3): resolution: {integrity: sha512-29OJ1QmJgnohQHDAgAuY2h21xWD6TZiXji+hnx+W635RiXTAlHTbjrZDktfqzkN0bOeQEtNe+xgq73/XeWFfSg==} engines: {node: '>=14'} peerDependencies: '@svgr/core': '*' dependencies: - '@svgr/core': 8.0.0 - cosmiconfig: 8.1.3 + '@svgr/core': 8.0.0(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.3.3) deepmerge: 4.3.1 svgo: 3.0.2 + transitivePeerDependencies: + - typescript dev: true - /@svgr/rollup@8.0.1(rollup@2.79.0): + /@svgr/rollup@8.0.1(rollup@2.79.0)(typescript@5.3.3): resolution: {integrity: sha512-nNy1M0jX7br4D9iUDQZWY0Jh6U4iWlsmvEWXgcLF2eizAADze9Ia5WAoI4ZeswJNKD1Hll8D7h4xk7amqPOhtQ==} engines: {node: '>=14'} dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.22.9) - '@babel/preset-env': 7.21.4(@babel/core@7.22.9) - '@babel/preset-react': 7.22.5(@babel/core@7.22.9) - '@babel/preset-typescript': 7.22.5(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.23.7) + '@babel/preset-env': 7.21.4(@babel/core@7.23.7) + '@babel/preset-react': 7.22.5(@babel/core@7.23.7) + '@babel/preset-typescript': 7.22.5(@babel/core@7.23.7) '@rollup/pluginutils': 5.0.2(rollup@2.79.0) - '@svgr/core': 8.0.0 + '@svgr/core': 8.0.0(typescript@5.3.3) '@svgr/plugin-jsx': 8.0.1(@svgr/core@8.0.0) - '@svgr/plugin-svgo': 8.0.1(@svgr/core@8.0.0) + '@svgr/plugin-svgo': 8.0.1(@svgr/core@8.0.0)(typescript@5.3.3) transitivePeerDependencies: - rollup - supports-color + - typescript dev: true - /@svgr/webpack@8.0.1: + /@svgr/webpack@8.0.1(typescript@5.3.3): resolution: {integrity: sha512-zSoeKcbCmfMXjA11uDuCJb+1LWNb3vy6Qw/VHj0Nfcl3UuqwuoZWknHsBIhCWvi4wU9vPui3aq054qjVyZqY4A==} engines: {node: '>=14'} dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.22.9) - '@babel/preset-env': 7.21.4(@babel/core@7.22.9) - '@babel/preset-react': 7.22.5(@babel/core@7.22.9) - '@babel/preset-typescript': 7.22.5(@babel/core@7.22.9) - '@svgr/core': 8.0.0 + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.23.7) + '@babel/preset-env': 7.21.4(@babel/core@7.23.7) + '@babel/preset-react': 7.22.5(@babel/core@7.23.7) + '@babel/preset-typescript': 7.22.5(@babel/core@7.23.7) + '@svgr/core': 8.0.0(typescript@5.3.3) '@svgr/plugin-jsx': 8.0.1(@svgr/core@8.0.0) - '@svgr/plugin-svgo': 8.0.1(@svgr/core@8.0.0) + '@svgr/plugin-svgo': 8.0.1(@svgr/core@8.0.0)(typescript@5.3.3) transitivePeerDependencies: - supports-color + - typescript dev: true /@swc-node/core@1.10.6(@swc/core@1.3.86): @@ -12027,8 +11139,8 @@ packages: '@swc/core-win32-ia32-msvc': 1.3.86 '@swc/core-win32-x64-msvc': 1.3.86 - /@swc/helpers@0.5.1: - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: tslib: 2.6.2 @@ -12824,26 +11936,6 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.3.3): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.48.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@6.18.1(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -13093,7 +12185,7 @@ packages: /@vanilla-extract/babel-plugin-debug-ids@1.0.3: resolution: {integrity: sha512-vm4jYu1xhSa6ofQ9AhIpR3DkAp4c+eoR1Rpm8/TQI4DmWbmGbOjYRcqV0aWsfaIlNhN4kFuxFMKBNN9oG6iRzA==} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 transitivePeerDependencies: - supports-color dev: true @@ -13117,8 +12209,8 @@ packages: /@vanilla-extract/integration@6.2.4(@types/node@18.19.8)(less@4.1.3)(sass@1.55.0)(stylus@0.59.0): resolution: {integrity: sha512-+AfymNMVq9sEUe0OJpdCokmPZg4Zi6CqKaW/PnUOfDwEn53ighHOMOBl5hAgxYR8Kiz9NG43Bn00mkjWlFi+ng==} dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.2) + '@babel/core': 7.23.7 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) '@vanilla-extract/babel-plugin-debug-ids': 1.0.3 '@vanilla-extract/css': 1.14.0 esbuild: 0.17.6 @@ -13213,9 +12305,9 @@ packages: peerDependencies: vite: ^4.1.0-beta.0 dependencies: - '@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/core': 7.23.7 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.7) magic-string: 0.27.0 react-refresh: 0.14.0 vite: 5.0.8(@types/node@18.19.8)(less@4.1.3)(sass@1.55.0)(stylus@0.59.0) @@ -14114,10 +13206,21 @@ packages: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 es-abstract: 1.20.4 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-string: 1.0.7 dev: true @@ -14135,13 +13238,34 @@ packages: engines: {node: '>=12'} dev: true + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.2 + dev: true + /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 - es-abstract: 1.20.4 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.0 dev: true @@ -14149,20 +13273,43 @@ packages: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 es-abstract: 1.20.4 es-shim-unscopables: 1.0.0 dev: true + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.0 + dev: true + /array.prototype.tosorted@1.1.1: resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 es-abstract: 1.20.4 es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 dev: true /arrify@1.0.1: @@ -14241,6 +13388,12 @@ packages: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -14308,8 +13461,8 @@ packages: engines: {node: '>=4'} dev: true - /axios@1.5.1: - resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} dependencies: follow-redirects: 1.15.2 form-data: 4.0.0 @@ -14329,17 +13482,17 @@ packages: dequal: 2.0.3 dev: true - /babel-jest@29.4.3(@babel/core@7.22.9): + /babel-jest@29.4.3(@babel/core@7.23.2): resolution: {integrity: sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@jest/transform': 29.5.0 '@types/babel__core': 7.1.20 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.22.9) + babel-preset-jest: 29.5.0(@babel/core@7.23.2) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -14347,17 +13500,17 @@ packages: - supports-color dev: true - /babel-jest@29.5.0(@babel/core@7.22.9): + /babel-jest@29.5.0(@babel/core@7.23.7): resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@jest/transform': 29.5.0 '@types/babel__core': 7.1.20 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.22.9) + babel-preset-jest: 29.5.0(@babel/core@7.23.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -14365,32 +13518,19 @@ packages: - supports-color dev: true - /babel-loader@9.1.2(@babel/core@7.22.9)(webpack@5.88.0): + /babel-loader@9.1.2(@babel/core@7.23.2)(webpack@5.88.0): resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} 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: 3.3.2 schema-utils: 4.0.0 webpack: 5.88.0(@swc/core@1.3.86)(esbuild@0.19.5) dev: true - /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.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.23.7)(webpack@5.88.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} @@ -14469,40 +13609,27 @@ packages: resolution: {integrity: sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==} dev: true - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.22.9): + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.23.7): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@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 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.9): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.7) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): - resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.2): + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.23.2 + '@babel/compat-data': 7.23.5 '@babel/core': 7.23.2 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.2) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -14513,7 +13640,7 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.23.2 + '@babel/compat-data': 7.23.5 '@babel/core': 7.23.7 '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.7) semver: 6.3.1 @@ -14521,38 +13648,26 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.22.9): + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.23.7): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.9) - core-js-compat: 3.31.1 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) - core-js-compat: 3.31.1 + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.7) + core-js-compat: 3.35.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.2): - resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.2): + resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} 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 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.2) + core-js-compat: 3.35.1 transitivePeerDependencies: - supports-color dev: true @@ -14569,35 +13684,24 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.22.9): + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.23.7): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.9): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.7) transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): - resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.2): + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} 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) + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.2) transitivePeerDependencies: - supports-color dev: true @@ -14640,22 +13744,10 @@ packages: resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} dev: true - /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: - resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - dev: true - /babel-plugin-transform-async-to-promises@0.8.18: resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} dev: true - /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.23.2) - transitivePeerDependencies: - - '@babel/core' - dev: true - /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.23.7): resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} peerDependencies: @@ -14669,26 +13761,6 @@ packages: '@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: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@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-top-level-await': 7.14.5(@babel/core@7.22.9) - dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -14729,50 +13801,26 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) dev: true - /babel-preset-fbjs@3.4.0(@babel/core@7.23.2): - resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} + /babel-preset-jest@29.5.0(@babel/core@7.23.2): + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@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 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) dev: true - /babel-preset-jest@29.5.0(@babel/core@7.22.9): + /babel-preset-jest@29.5.0(@babel/core@7.23.7): resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 babel-plugin-jest-hoist: 29.5.0 - 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.7) dev: true /bail@2.0.2: @@ -14999,7 +14047,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001517 + caniuse-lite: 1.0.30001579 electron-to-chromium: 1.4.470 node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.5) @@ -15010,22 +14058,12 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001492 + caniuse-lite: 1.0.30001579 electron-to-chromium: 1.4.417 node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.7) dev: true - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - 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.9) - /browserslist@4.22.1: resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -15046,7 +14084,6 @@ packages: electron-to-chromium: 1.4.640 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: true /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -15256,13 +14293,6 @@ packages: engines: {node: '>=6'} dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.0 - dev: true - /call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: @@ -15336,29 +14366,22 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001550 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001579 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true /caniuse-lite@1.0.30001480: resolution: {integrity: sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ==} - - /caniuse-lite@1.0.30001492: - resolution: {integrity: sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==} dev: true - /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 /caniuse-lite@1.0.30001579: resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} - dev: true /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -15741,10 +14764,6 @@ packages: engines: {node: '>=16'} dev: true - /commander@2.13.0: - resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} - dev: true - /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -16040,10 +15059,10 @@ packages: /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -16112,19 +15131,13 @@ packages: /core-js-compat@3.30.2: resolution: {integrity: sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==} dependencies: - browserslist: 4.22.1 - dev: true - - /core-js-compat@3.31.1: - resolution: {integrity: sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==} - dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 dev: true /core-js-compat@3.33.0: resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 dev: true /core-js-compat@3.35.1: @@ -16196,16 +15209,6 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig@8.1.3: - resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} - engines: {node: '>=14'} - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - /cosmiconfig@8.3.6(typescript@5.3.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -16952,7 +15955,16 @@ packages: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 dev: true @@ -17048,7 +16060,7 @@ packages: dependencies: acorn-node: 1.8.2 defined: 1.0.1 - minimist: 1.2.7 + minimist: 1.2.8 /dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -17279,6 +16291,7 @@ packages: /electron-to-chromium@1.4.470: resolution: {integrity: sha512-zZM48Lmy2FKWgqyvsX9XK+J6FfP7aCDUFLmgooLJzA7v1agCs/sxSoBpTIwDLhmbhpx9yJIxj2INig/ncjJRqg==} + dev: true /electron-to-chromium@1.4.557: resolution: {integrity: sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw==} @@ -17286,7 +16299,6 @@ packages: /electron-to-chromium@1.4.640: resolution: {integrity: sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==} - dev: true /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -17415,14 +16427,14 @@ packages: resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 es-to-primitive: 1.2.1 - function-bind: 1.1.1 + function-bind: 1.1.2 function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 get-symbol-description: 1.0.0 has: 1.0.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 is-callable: 1.2.7 @@ -17434,13 +16446,58 @@ packages: object-inspect: 1.12.2 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 + regexp.prototype.flags: 1.5.1 safe-regex-test: 1.0.0 string.prototype.trimend: 1.0.5 string.prototype.trimstart: 1.0.5 unbox-primitive: 1.0.2 dev: true + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: @@ -17455,6 +16512,25 @@ packages: stop-iteration-iterator: 1.0.0 dev: true + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.0 + dev: true + /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: true @@ -17467,6 +16543,15 @@ packages: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} dev: true + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -17727,8 +16812,8 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-next@13.1.1(eslint@8.48.0)(typescript@5.3.3): - resolution: {integrity: sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==} + /eslint-config-next@14.0.4(eslint@8.48.0)(typescript@5.3.3): + resolution: {integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -17736,15 +16821,15 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.1.1 - '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) + '@next/eslint-plugin-next': 14.0.4 + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/parser': 6.18.1(eslint@8.48.0)(typescript@5.3.3) eslint: 8.48.0 - eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.27.5)(eslint@8.48.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.29.1)(eslint@8.48.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) - eslint-plugin-react: 7.32.2(eslint@8.48.0) + eslint-plugin-react: 7.33.2(eslint@8.48.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) typescript: 5.3.3 transitivePeerDependencies: @@ -17780,7 +16865,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.5.2(eslint-plugin-import@2.27.5)(eslint@8.48.0): + /eslint-import-resolver-typescript@3.5.2(eslint-plugin-import@2.29.1)(eslint@8.48.0): resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -17790,17 +16875,17 @@ packages: debug: 4.3.4(supports-color@5.5.0) enhanced-resolve: 5.15.0 eslint: 8.48.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0) get-tsconfig: 4.3.0 globby: 13.2.2 - is-core-module: 2.11.0 + is-core-module: 2.13.0 is-glob: 4.0.3 synckit: 0.8.4 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0): + /eslint-module-utils@2.7.4(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -17821,17 +16906,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.18.1(eslint@8.48.0)(typescript@5.3.3) debug: 3.2.7(supports-color@8.1.1) eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.27.5)(eslint@8.48.0) transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -17855,6 +16939,7 @@ packages: debug: 3.2.7(supports-color@8.1.1) eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.29.1)(eslint@8.48.0) transitivePeerDependencies: - supports-color dev: true @@ -17868,7 +16953,7 @@ packages: globals: 13.21.0 dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.18.1)(eslint@8.48.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -17878,7 +16963,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.18.1(eslint@8.48.0)(typescript@5.3.3) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -17886,7 +16971,7 @@ packages: doctrine: 2.1.0 eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -17901,8 +16986,8 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.18.1)(eslint@8.48.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -17912,22 +16997,24 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 6.18.1(eslint@8.48.0)(typescript@5.3.3) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) - has: 1.0.3 - is-core-module: 2.13.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.2)(eslint@8.48.0) + hasown: 2.0.0 + is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.8 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 - tsconfig-paths: 3.14.1 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -18004,6 +17091,31 @@ packages: string.prototype.matchall: 4.0.8 dev: true + /eslint-plugin-react@7.33.2(eslint@8.48.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 + eslint: 8.48.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: true + /eslint-plugin-storybook@0.6.12(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-XbIvrq6hNVG6rpdBr+eBw63QhOMLpZneQVSooEDow8aQCWGCk/5vqtap1yxpVydNfSxi3S/3mBBRLQqKUqQRww==} engines: {node: 12.x || 14.x || >= 16} @@ -18150,7 +17262,7 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.23.2 + '@babel/traverse': 7.23.7 '@babel/types': 7.23.6 c8: 7.13.0 transitivePeerDependencies: @@ -19088,20 +18200,26 @@ packages: rimraf: 2.7.1 dev: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.20.4 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 functions-have-names: 1.2.3 dev: true @@ -19142,14 +18260,6 @@ packages: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - /get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: @@ -19216,8 +18326,8 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /get-symbol-from-current-process-h@1.0.2: @@ -19342,7 +18452,6 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true /glob@10.2.2: resolution: {integrity: sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==} @@ -19426,6 +18535,13 @@ packages: type-fest: 0.20.2 dev: true + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + /globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: true @@ -19594,12 +18710,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.0 - dev: true - /has-property-descriptors@1.0.1: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: @@ -19631,7 +18741,7 @@ packages: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 /hash-sum@2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} @@ -19705,14 +18815,14 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true - /hermes-estree@0.12.0: - resolution: {integrity: sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==} + /hermes-estree@0.18.2: + resolution: {integrity: sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==} dev: true - /hermes-parser@0.12.0: - resolution: {integrity: sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==} + /hermes-parser@0.18.2: + resolution: {integrity: sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==} dependencies: - hermes-estree: 0.12.0 + hermes-estree: 0.18.2 dev: true /hey-listen@1.0.8: @@ -20312,7 +19422,7 @@ packages: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -20378,7 +19488,7 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -20394,6 +19504,13 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -20410,7 +19527,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -20459,6 +19576,12 @@ packages: dependencies: has: 1.0.3 + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -20493,6 +19616,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.5 + dev: true + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -20558,7 +19687,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /is-negative-zero@2.0.2: @@ -20648,7 +19777,7 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -20659,7 +19788,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-stream@1.1.0: @@ -20710,8 +19839,8 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-abstract: 1.20.4 + call-bind: 1.0.5 + es-abstract: 1.22.3 for-each: 0.3.3 has-tostringtag: 1.0.0 dev: true @@ -20741,7 +19870,7 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-weakset@2.0.2: @@ -20811,7 +19940,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -20853,6 +19982,16 @@ packages: engines: {node: '>=6'} dev: true + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + /jackspeak@2.1.5: resolution: {integrity: sha512-NeK3mbF9vwNS3SjhzlEfO6WREJqoKtCwLoUPoUVtGJrpecxN3ZxlDuF22MzNSbOk/AA/VFWi+nFMV89xkXh2og==} engines: {node: '>=14'} @@ -20963,11 +20102,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.7 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.19.8 - babel-jest: 29.5.0(@babel/core@7.22.9) + babel-jest: 29.5.0(@babel/core@7.23.7) chalk: 4.1.2 ci-info: 3.5.0 deepmerge: 4.2.2 @@ -21212,11 +20351,6 @@ packages: jest-resolve: 29.7.0 dev: true - /jest-regex-util@27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - /jest-regex-util@29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -21360,18 +20494,18 @@ packages: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.2) - '@babel/traverse': 7.23.2 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/traverse': 7.23.7 '@babel/types': 7.23.6 '@jest/expect-utils': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.6.3 '@types/babel__traverse': 7.18.2 '@types/prettier': 2.7.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.7) chalk: 4.1.2 expect: 29.5.0 graceful-fs: 4.2.11 @@ -21415,18 +20549,6 @@ packages: - supports-color dev: true - /jest-util@27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.19.8 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - /jest-util@29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -21731,8 +20853,8 @@ packages: /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - /json5@1.0.1: - resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: minimist: 1.2.8 @@ -21831,7 +20953,7 @@ packages: resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 + array-includes: 3.1.7 object.assign: 4.1.4 dev: true @@ -22713,7 +21835,7 @@ packages: /media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: true /media-typer@0.3.0: @@ -22787,41 +21909,41 @@ packages: engines: {node: '>= 0.6'} dev: true - /metro-babel-transformer@0.76.8: - resolution: {integrity: sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA==} - engines: {node: '>=16'} + /metro-babel-transformer@0.80.5: + resolution: {integrity: sha512-sxH6hcWCorhTbk4kaShCWsadzu99WBL4Nvq4m/sDTbp32//iGuxtAnUK+ZV+6IEygr2u9Z0/4XoZ8Sbcl71MpA==} + engines: {node: '>=18'} dependencies: - '@babel/core': 7.23.2 - hermes-parser: 0.12.0 + '@babel/core': 7.23.7 + hermes-parser: 0.18.2 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color dev: true - /metro-cache-key@0.76.8: - resolution: {integrity: sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw==} - engines: {node: '>=16'} + /metro-cache-key@0.80.5: + resolution: {integrity: sha512-fr3QLZUarsB3tRbVcmr34kCBsTHk0Sh9JXGvBY/w3b2lbre+Lq5gtgLyFElHPecGF7o4z1eK9r3ubxtScHWcbA==} + engines: {node: '>=18'} dev: true - /metro-cache@0.76.8: - resolution: {integrity: sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ==} - engines: {node: '>=16'} + /metro-cache@0.80.5: + resolution: {integrity: sha512-2u+dQ4PZwmC7eZo9uMBNhQQMig9f+w4QWBZwXCdVy/RYOHM0eObgGdMEOwODo73uxie82T9lWzxr3aZOZ+Nqtw==} + engines: {node: '>=18'} dependencies: - metro-core: 0.76.8 + metro-core: 0.80.5 rimraf: 3.0.2 dev: true - /metro-config@0.76.8: - resolution: {integrity: sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==} - engines: {node: '>=16'} + /metro-config@0.80.5: + resolution: {integrity: sha512-elqo/lwvF+VjZ1OPyvmW/9hSiGlmcqu+rQvDKw5F5WMX48ZC+ySTD1WcaD7e97pkgAlJHVYqZ98FCjRAYOAFRQ==} + engines: {node: '>=18'} dependencies: connect: 3.6.6 cosmiconfig: 5.2.1 - jest-validate: 29.5.0 - metro: 0.76.8 - metro-cache: 0.76.8 - metro-core: 0.76.8 - metro-runtime: 0.76.8 + jest-validate: 29.7.0 + metro: 0.80.5 + metro-cache: 0.80.5 + metro-core: 0.80.5 + metro-runtime: 0.80.5 transitivePeerDependencies: - bufferutil - encoding @@ -22829,26 +21951,24 @@ packages: - utf-8-validate dev: true - /metro-core@0.76.8: - resolution: {integrity: sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==} - engines: {node: '>=16'} + /metro-core@0.80.5: + resolution: {integrity: sha512-vkLuaBhnZxTVpaZO8ZJVEHzjaqSXpOdpAiztSZ+NDaYM6jEFgle3/XIbLW91jTSf2+T8Pj5yB1G7KuOX+BcVwg==} + engines: {node: '>=18'} dependencies: lodash.throttle: 4.1.1 - metro-resolver: 0.76.8 + metro-resolver: 0.80.5 dev: true - /metro-file-map@0.76.8: - resolution: {integrity: sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw==} - engines: {node: '>=16'} + /metro-file-map@0.80.5: + resolution: {integrity: sha512-bKCvJ05drjq6QhQxnDUt3I8x7bTcHo3IIKVobEr14BK++nmxFGn/BmFLRzVBlghM6an3gqwpNEYxS5qNc+VKcg==} + engines: {node: '>=18'} dependencies: anymatch: 3.1.3 debug: 2.6.9 fb-watchman: 2.0.2 graceful-fs: 4.2.11 invariant: 2.2.4 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 + jest-worker: 29.7.0 micromatch: 4.0.5 node-abort-controller: 3.1.1 nullthrows: 1.1.1 @@ -22859,122 +21979,48 @@ packages: - supports-color dev: true - /metro-inspector-proxy@0.76.8: - resolution: {integrity: sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw==} - engines: {node: '>=16'} - hasBin: true - dependencies: - connect: 3.6.6 - debug: 2.6.9 - node-fetch: 2.6.12 - ws: 7.5.9 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /metro-minify-terser@0.76.8: - resolution: {integrity: sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==} - engines: {node: '>=16'} - dependencies: - terser: 5.24.0 - dev: true - - /metro-minify-uglify@0.76.8: - resolution: {integrity: sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ==} - engines: {node: '>=16'} - dependencies: - uglify-es: 3.3.9 - dev: true - - /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.2): - resolution: {integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==} - engines: {node: '>=16'} - peerDependencies: - '@babel/core': '*' + /metro-minify-terser@0.80.5: + resolution: {integrity: sha512-S7oZLLcab6YXUT6jYFX/ZDMN7Fq6xBGGAG8liMFU1UljX6cTcEC2u+UIafYgCLrdVexp/+ClxrIetVPZ5LtL/g==} + engines: {node: '>=18'} dependencies: - '@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.15 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.2) - react-refresh: 0.4.3 - transitivePeerDependencies: - - supports-color + terser: 5.26.0 dev: true - /metro-resolver@0.76.8: - resolution: {integrity: sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ==} - engines: {node: '>=16'} + /metro-resolver@0.80.5: + resolution: {integrity: sha512-haJ/Hveio3zv/Fr4eXVdKzjUeHHDogYok7OpRqPSXGhTXisNXB+sLN7CpcUrCddFRUDLnVaqQOYwhYsFndgUwA==} + engines: {node: '>=18'} dev: true - /metro-runtime@0.76.8: - resolution: {integrity: sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==} - engines: {node: '>=16'} + /metro-runtime@0.80.5: + resolution: {integrity: sha512-L0syTWJUdWzfUmKgkScr6fSBVTh6QDr8eKEkRtn40OBd8LPagrJGySBboWSgbyn9eIb4ayW3Y347HxgXBSAjmg==} + engines: {node: '>=18'} dependencies: - '@babel/runtime': 7.23.2 - react-refresh: 0.4.3 + '@babel/runtime': 7.23.7 dev: true - /metro-source-map@0.76.8: - resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} - engines: {node: '>=16'} + /metro-source-map@0.80.5: + resolution: {integrity: sha512-DwSF4l03mKPNqCtyQ6K23I43qzU1BViAXnuH81eYWdHglP+sDlPpY+/7rUahXEo6qXEHXfAJgVoo1sirbXbmsQ==} + engines: {node: '>=18'} dependencies: - '@babel/traverse': 7.23.2 + '@babel/traverse': 7.23.7 '@babel/types': 7.23.6 invariant: 2.2.4 - metro-symbolicate: 0.76.8 + metro-symbolicate: 0.80.5 nullthrows: 1.1.1 - ob1: 0.76.8 + ob1: 0.80.5 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color dev: true - /metro-symbolicate@0.76.8: - resolution: {integrity: sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==} - engines: {node: '>=16'} + /metro-symbolicate@0.80.5: + resolution: {integrity: sha512-IsM4mTYvmo9JvIqwEkCZ5+YeDVPST78Q17ZgljfLdHLSpIivOHp9oVoiwQ/YGbLx0xRHRIS/tKiXueWBnj3UWA==} + engines: {node: '>=18'} hasBin: true dependencies: invariant: 2.2.4 - metro-source-map: 0.76.8 + metro-source-map: 0.80.5 nullthrows: 1.1.1 source-map: 0.5.7 through2: 2.0.5 @@ -22983,34 +22029,34 @@ packages: - supports-color dev: true - /metro-transform-plugins@0.76.8: - resolution: {integrity: sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==} - engines: {node: '>=16'} + /metro-transform-plugins@0.80.5: + resolution: {integrity: sha512-7IdlTqK/k5+qE3RvIU5QdCJUPk4tHWEqgVuYZu8exeW+s6qOJ66hGIJjXY/P7ccucqF+D4nsbAAW5unkoUdS6g==} + engines: {node: '>=18'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/generator': 7.23.6 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 + '@babel/traverse': 7.23.7 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color dev: true - /metro-transform-worker@0.76.8: - resolution: {integrity: sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==} - engines: {node: '>=16'} + /metro-transform-worker@0.80.5: + resolution: {integrity: sha512-Q1oM7hfP+RBgAtzRFBDjPhArELUJF8iRCZ8OidqCpYzQJVGuJZ7InSnIf3hn1JyqiUQwv2f1LXBO78i2rAjzyA==} + engines: {node: '>=18'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/generator': 7.23.6 '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - 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 - metro-cache-key: 0.76.8 - metro-source-map: 0.76.8 - metro-transform-plugins: 0.76.8 + metro: 0.80.5 + metro-babel-transformer: 0.80.5 + metro-cache: 0.80.5 + metro-cache-key: 0.80.5 + metro-minify-terser: 0.80.5 + metro-source-map: 0.80.5 + metro-transform-plugins: 0.80.5 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil @@ -23019,20 +22065,19 @@ packages: - utf-8-validate dev: true - /metro@0.76.8: - resolution: {integrity: sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==} - engines: {node: '>=16'} + /metro@0.80.5: + resolution: {integrity: sha512-OE/CGbOgbi8BlTN1QqJgKOBaC27dS0JBQw473JcivrpgVnqIsluROA7AavEaTVUrB9wPUZvoNVDROn5uiM2jfw==} + engines: {node: '>=18'} hasBin: true dependencies: '@babel/code-frame': 7.23.5 - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/generator': 7.23.6 - '@babel/parser': 7.23.0 + '@babel/parser': 7.23.6 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 + '@babel/traverse': 7.23.7 '@babel/types': 7.23.6 accepts: 1.3.8 - async: 3.2.4 chalk: 4.1.2 ci-info: 2.0.0 connect: 3.6.6 @@ -23040,28 +22085,24 @@ packages: denodeify: 1.2.1 error-stack-parser: 2.1.4 graceful-fs: 4.2.11 - hermes-parser: 0.12.0 + hermes-parser: 0.18.2 image-size: 1.0.2 invariant: 2.2.4 - jest-worker: 27.5.1 + jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.76.8 - metro-cache: 0.76.8 - metro-cache-key: 0.76.8 - metro-config: 0.76.8 - metro-core: 0.76.8 - metro-file-map: 0.76.8 - 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.23.2) - metro-resolver: 0.76.8 - metro-runtime: 0.76.8 - metro-source-map: 0.76.8 - metro-symbolicate: 0.76.8 - metro-transform-plugins: 0.76.8 - metro-transform-worker: 0.76.8 + metro-babel-transformer: 0.80.5 + metro-cache: 0.80.5 + metro-cache-key: 0.80.5 + metro-config: 0.80.5 + metro-core: 0.80.5 + metro-file-map: 0.80.5 + metro-resolver: 0.80.5 + metro-runtime: 0.80.5 + metro-source-map: 0.80.5 + metro-symbolicate: 0.80.5 + metro-transform-plugins: 0.80.5 + metro-transform-worker: 0.80.5 mime-types: 2.1.35 node-fetch: 2.6.12 nullthrows: 1.1.1 @@ -23495,7 +22536,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} @@ -23592,7 +22632,7 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: - minimist: 1.2.7 + minimist: 1.2.8 /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} @@ -23746,19 +22786,19 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /next-seo@5.13.0(next@13.3.4)(react-dom@18.2.0)(react@18.2.0): + /next-seo@5.13.0(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3n6cOjXydxXlrbMIWcU+D6TllKj72C2rg7IdgoxoKOnfC8ah3U0VUIGRApKXK0wi5ME1m+TBq9isAFFbFdbWXQ==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - next: 13.3.4(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) + next: 14.0.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /next-sitemap@3.1.29(@next/env@14.0.4)(next@13.3.4): + /next-sitemap@3.1.29(@next/env@14.0.4)(next@14.0.4): resolution: {integrity: sha512-7UQyfpI7obOdB11aCswWYfqRn5CR0YSmWHo1r/uarrFfZD5PyyAWtQlgP6jNqDW0eX1ZJWERBwmJ2dLjl4nT8Q==} engines: {node: '>=14.18'} hasBin: true @@ -23769,52 +22809,48 @@ packages: '@corex/deepmerge': 4.0.29 '@next/env': 14.0.4 minimist: 1.2.7 - next: 13.3.4(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) + next: 14.0.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0) dev: true /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next@13.3.4(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0): - resolution: {integrity: sha512-sod7HeokBSvH5QV0KB+pXeLfcXUlLrGnVUXxHpmhilQ+nQYT3Im2O8DswD5e4uqbR8Pvdu9pcWgb1CbXZQZlmQ==} - engines: {node: '>=16.8.0'} + /next@14.0.4(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.55.0): + resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==} + engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - fibers: '>= 3.1.0' - node-sass: ^6.0.0 || ^7.0.0 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true - fibers: - optional: true - node-sass: - optional: true sass: optional: true dependencies: - '@next/env': 13.3.4 - '@swc/helpers': 0.5.1 + '@next/env': 14.0.4 + '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001480 - postcss: 8.4.14 + caniuse-lite: 1.0.30001579 + graceful-fs: 4.2.11 + postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) sass: 1.55.0 - styled-jsx: 5.1.1(@babel/core@7.22.9)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0) + watchpack: 2.4.0 optionalDependencies: - '@next/swc-darwin-arm64': 13.3.4 - '@next/swc-darwin-x64': 13.3.4 - '@next/swc-linux-arm64-gnu': 13.3.4 - '@next/swc-linux-arm64-musl': 13.3.4 - '@next/swc-linux-x64-gnu': 13.3.4 - '@next/swc-linux-x64-musl': 13.3.4 - '@next/swc-win32-arm64-msvc': 13.3.4 - '@next/swc-win32-ia32-msvc': 13.3.4 - '@next/swc-win32-x64-msvc': 13.3.4 + '@next/swc-darwin-arm64': 14.0.4 + '@next/swc-darwin-x64': 14.0.4 + '@next/swc-linux-arm64-gnu': 14.0.4 + '@next/swc-linux-arm64-musl': 14.0.4 + '@next/swc-linux-x64-gnu': 14.0.4 + '@next/swc-linux-x64-musl': 14.0.4 + '@next/swc-win32-arm64-msvc': 14.0.4 + '@next/swc-win32-ia32-msvc': 14.0.4 + '@next/swc-win32-x64-msvc': 14.0.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -23979,6 +23015,7 @@ packages: /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + dev: true /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} @@ -23986,7 +23023,6 @@ packages: /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true /nopt@4.0.3: resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==} @@ -24017,7 +23053,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.13.0 + is-core-module: 2.13.1 semver: 7.5.3 validate-npm-package-license: 3.0.4 dev: true @@ -24027,7 +23063,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: hosted-git-info: 6.1.1 - is-core-module: 2.13.0 + is-core-module: 2.13.1 semver: 7.5.3 validate-npm-package-license: 3.0.4 dev: true @@ -24037,7 +23073,7 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} dependencies: hosted-git-info: 7.0.0 - is-core-module: 2.13.0 + is-core-module: 2.13.1 semver: 7.5.3 validate-npm-package-license: 3.0.4 dev: true @@ -24216,7 +23252,7 @@ packages: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 - axios: 1.5.1 + axios: 1.6.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -24281,7 +23317,7 @@ packages: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 - axios: 1.5.1 + axios: 1.6.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -24330,9 +23366,9 @@ packages: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true - /ob1@0.76.8: - resolution: {integrity: sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==} - engines: {node: '>=16'} + /ob1@0.80.5: + resolution: {integrity: sha512-zYDMnnNrFi/1Tqh0vo3PE4p97Tpl9/4MP2k2ECvkbLOZzQuAYZJLTUYVLZb7hJhbhjT+JJxAwBGS8iu5hCSd1w==} + engines: {node: '>=18'} dev: true /object-assign@4.1.1: @@ -24347,12 +23383,16 @@ packages: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: true + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /object-keys@1.1.1: @@ -24364,8 +23404,8 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.5 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -24374,34 +23414,61 @@ packages: resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 - es-abstract: 1.20.4 + es-abstract: 1.22.3 dev: true /object.fromentries@2.0.6: resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 - es-abstract: 1.20.4 + es-abstract: 1.22.3 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 dev: true /object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: define-properties: 1.2.0 - es-abstract: 1.20.4 + es-abstract: 1.22.3 dev: true /object.values@1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 - es-abstract: 1.20.4 + es-abstract: 1.22.3 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 dev: true /objectorarray@1.0.5: @@ -25131,7 +24198,7 @@ packages: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: true /popmotion@9.3.6: @@ -25231,7 +24298,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.19 @@ -25244,7 +24311,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.23 @@ -25257,7 +24324,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.19 postcss-value-parser: 4.2.0 dev: true @@ -25268,7 +24335,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.23 postcss-value-parser: 4.2.0 dev: true @@ -25603,7 +24670,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.19) postcss: 8.4.19 @@ -25616,7 +24683,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 cssnano-utils: 4.0.0(postcss@8.4.23) postcss: 8.4.23 @@ -25673,7 +24740,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 cssnano-utils: 3.1.0(postcss@8.4.19) postcss: 8.4.19 postcss-value-parser: 4.2.0 @@ -25685,7 +24752,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 cssnano-utils: 4.0.0(postcss@8.4.23) postcss: 8.4.23 postcss-value-parser: 4.2.0 @@ -25969,7 +25036,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.19 postcss-value-parser: 4.2.0 dev: true @@ -25980,7 +25047,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.23 postcss-value-parser: 4.2.0 dev: true @@ -26151,7 +25218,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 postcss: 8.4.19 dev: true @@ -26162,7 +25229,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 postcss: 8.4.23 dev: true @@ -26277,14 +25344,6 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - /postcss@8.4.19: resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} engines: {node: ^10 || ^12 || >=14} @@ -26302,6 +25361,14 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + /postcss@8.4.32: resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} engines: {node: ^10 || ^12 || >=14} @@ -26700,9 +25767,9 @@ packages: engines: {node: '>=8.10.0'} hasBin: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/generator': 7.23.6 - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -26718,7 +25785,7 @@ packages: resolution: {integrity: sha512-gF+p+1ZwC2eO66bt763Tepmh5q9kDiFIrqW3YjUV/a+L96h0m5+/wSFQoOHL2cffyrPMZMxP03IgbggJ11QbOw==} engines: {node: '>=14.18.0'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/traverse': 7.23.2 '@babel/types': 7.23.6 '@types/babel__core': 7.20.1 @@ -26861,11 +25928,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-refresh@0.4.3: - resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} - engines: {node: '>=0.10.0'} - dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} @@ -27143,6 +26205,18 @@ packages: resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} dev: true + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + /refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} dependencies: @@ -27176,28 +26250,19 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.7 dev: true /regex-parser@2.2.11: resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} dev: true - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true - /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 set-function-name: 2.0.1 dev: true @@ -27441,7 +26506,7 @@ packages: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -27658,6 +26723,16 @@ packages: mri: 1.2.0 dev: true + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -27673,8 +26748,8 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-regex: 1.1.4 dev: true @@ -28014,7 +27089,7 @@ packages: dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 dev: true /setimmediate-napi@1.0.6: @@ -28105,8 +27180,8 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 object-inspect: 1.12.2 dev: true @@ -28596,30 +27671,55 @@ packages: /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.0 - es-abstract: 1.20.4 - get-intrinsic: 1.2.0 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 internal-slot: 1.0.5 - regexp.prototype.flags: 1.4.3 + regexp.prototype.flags: 1.5.1 side-channel: 1.0.4 dev: true + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + /string.prototype.trimend@1.0.5: resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.20.4 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true /string.prototype.trimstart@1.0.5: resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.20.4 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true /string_decoder@1.1.1: @@ -28788,7 +27888,7 @@ packages: supports-color: 5.5.0 dev: true - /styled-jsx@5.1.1(@babel/core@7.22.9)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.23.2)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -28801,7 +27901,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 client-only: 0.0.1 react: 18.2.0 @@ -28811,7 +27911,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.19 postcss-selector-parser: 6.0.11 dev: true @@ -28822,7 +27922,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.23 postcss-selector-parser: 6.0.11 dev: true @@ -29488,7 +28588,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.3.3): + /ts-jest@29.1.0(@babel/core@7.23.2)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.19.5)(jest@29.4.3)(typescript@5.3.3): resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -29509,9 +28609,9 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.23.2 '@jest/types': 29.5.0 - babel-jest: 29.4.3(@babel/core@7.22.9) + babel-jest: 29.4.3(@babel/core@7.23.2) bs-logger: 0.2.6 esbuild: 0.19.5 fast-json-stable-stringify: 2.1.0 @@ -29584,7 +28684,16 @@ packages: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: '@types/json5': 0.0.29 - json5: 1.0.1 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 dev: true @@ -29594,7 +28703,7 @@ packages: engines: {node: '>=6'} dependencies: json5: 2.2.3 - minimist: 1.2.7 + minimist: 1.2.8 strip-bom: 3.0.0 dev: true @@ -29734,6 +28843,44 @@ packages: /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + /typed-assert@1.0.9: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} dev: true @@ -29786,16 +28933,6 @@ packages: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} dev: true - /uglify-es@3.3.9: - resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} - engines: {node: '>=0.8.0'} - deprecated: support for ECMAScript is superseded by `uglify-js` as of v3.13.0 - hasBin: true - dependencies: - commander: 2.13.0 - source-map: 0.6.1 - dev: true - /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -29807,7 +28944,7 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -30063,7 +29200,7 @@ packages: resolution: {integrity: sha512-Egkr/s4zcMTEuulcIb7dgURS6QpN7DyqQYdf+jBtiaJvQ+eRsrtWUoX84SbvQWuLkXsOjM+8sJC9u6KoMK/U7Q==} hasBin: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.7 '@babel/standalone': 7.23.3 '@babel/types': 7.23.0 defu: 6.1.3 @@ -30122,16 +29259,6 @@ packages: picocolors: 1.0.0 dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.9 - 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 @@ -30152,7 +29279,6 @@ packages: browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -30561,7 +29687,7 @@ packages: '@types/node': 18.19.8 esbuild: 0.18.17 less: 4.1.3 - postcss: 8.4.32 + postcss: 8.4.33 rollup: 3.28.0 sass: 1.55.0 stylus: 0.59.0 @@ -30766,7 +29892,6 @@ packages: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} @@ -31124,7 +30249,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.10.0 acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.22.1 + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 0.9.3 @@ -31311,6 +30436,24 @@ packages: is-symbol: 1.0.4 dev: true + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: @@ -31336,11 +30479,11 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-abstract: 1.20.4 + call-bind: 1.0.5 + es-abstract: 1.22.3 for-each: 0.3.3 has-tostringtag: 1.0.0 - is-typed-array: 1.1.9 + is-typed-array: 1.1.12 dev: true /which@1.3.1: diff --git a/tools/workspace-plugin/src/generators/create-nodes-plugin/schema.json b/tools/workspace-plugin/src/generators/create-nodes-plugin/schema.json index ef32dc0b8577d5..8802ea1fc57e85 100644 --- a/tools/workspace-plugin/src/generators/create-nodes-plugin/schema.json +++ b/tools/workspace-plugin/src/generators/create-nodes-plugin/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "Generator", "title": "", "type": "object", diff --git a/tools/workspace-plugin/src/generators/remove-migrations/schema.json b/tools/workspace-plugin/src/generators/remove-migrations/schema.json index ea8a1777676ff2..893266c8d1ddf6 100644 --- a/tools/workspace-plugin/src/generators/remove-migrations/schema.json +++ b/tools/workspace-plugin/src/generators/remove-migrations/schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/schema", + "$schema": "https://json-schema.org/schema", "$id": "RemoveMigrations", "title": "", "type": "object",