diff --git a/.circleci/config.yml b/.circleci/config.yml index 24225eca40..bad7df2821 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,6 +61,7 @@ commands: name: Install Dependencies command: | pnpm install --frozen-lockfile + pnpm playwright install --with-deps firefox webkit chrome - save_cache: name: Save pnpm Package Cache key: node-deps-{{ arch }}-v3-{{ checksum "pnpm-lock.yaml" }} diff --git a/docs/nx-cloud/private/auth-saml.md b/docs/nx-cloud/private/auth-saml.md index 22e6a1ddf6..dfba392516 100644 --- a/docs/nx-cloud/private/auth-saml.md +++ b/docs/nx-cloud/private/auth-saml.md @@ -134,7 +134,7 @@ if you are interested. 1. `SAML_CERT=` 2. `SAML_ENTRY_POINT=` -# Helm config +## Helm config If you are using [Helm to deploy NxCloud](https://github.com/nrwl/nx-cloud-helm) you will need to configure the below two values, as well as make the `SAML_CERT` and `SAML_ENTRY_POINT` diff --git a/docs/nx-cloud/reference/release-notes.md b/docs/nx-cloud/reference/release-notes.md index 390d5159c4..9d406ccb2d 100644 --- a/docs/nx-cloud/reference/release-notes.md +++ b/docs/nx-cloud/reference/release-notes.md @@ -1,137 +1,139 @@ # `nx-cloud` - Release notes +## Nx Cloud package + {% callout type="check" title="@nrwl/nx-cloud was changed to nx-cloud" %} [Read more about the rescope ≫](/recipes/other/rescope) {% /callout %} -## 14.3.0 +### 14.3.0 - Fix: Resolve issue where sometimes cache hits would be reported as misses when paired with Nx 13.0-13.5 - Fix: Correctly infer NX_BRANCH while running in Gitlab CI -## 14.2.0 +### 14.2.0 - Feat: Add `NX_CLOUD_SILENT_RECORD` environment variable for use with `nx-cloud record` - Feat: Add `NX_CLOUD_AGENT_TIMEOUT_MS` environment variable to configure task timeouts -## 14.1.2 +### 14.1.2 - Fix: Provider nicer failure message when version of Nx is incompatible with `@nx/nx-cloud` - Fix: Use Nx task graph if provided -## 14.1.1 +### 14.1.1 - Fix: Handle **overrides_unparsed** property for nx:run-commands executor -## 14.1.0 +### 14.1.0 - Fix: Gracefully handle errors with corrupted tarballs - Fix: Resolve issue where tasks run with read-only DTE would cause 404s on artifact retrieval - Feat: Allow specifying Nx Cloud installation source through generator -## 14.0.5 +### 14.0.5 - Fix: Workspace name for new Nx Cloud workspaces is pulled from `package.json` instead of `nx.json` - Fix: `@nx/nx-cloud` can be run from directories other than workspace root - Fix: Correctly infer `NX_BRANCH` and `NX_RUN_GROUP` from Jenkins - Fix: Ignore errors related to excess whitespace in tarballs -## 14.0.3 +### 14.0.3 - Fix: Enable caching for all inner commands -## 14.0.2 +### 14.0.2 - Fix: Remove dependency on `@nx/devkit` for init generator -## 14.0.1 +### 14.0.1 - Fix: Correctly infer `NX_BRANCH` and `NX_RUN_GROUP` from Vercel -## 14.0.0 +### 14.0.0 - Feat: Nx 14 Compatibility - Fix: Exit with status code of child process when recording commands with `nx-cloud record` -## 13.3.1 +### 13.3.1 - Feat: Store output for non-Nx commands in Nx Cloud. Check out https://nx.dev/nx-cloud/set-up/record-commands for more information. -## 13.2.1 +### 13.2.1 - Fix: Newer version of chalk was required, so the package didn't work with older versions of Nx. - Feat: Prepare the package to work with Nx 13.10.0 -## 13.0.3 +### 13.0.3 Cleanup: Handle issues with the network and the api in a consistent fashion. -## 13.0.1 +### 13.0.1 - Fix: Print detailed errors when an agent is not able to upload file artifacts. -## 13.0.0 +### 13.0.0 - Feat: Support Nx 13.3 new life cycle API -## 12.5.2 +### 12.5.2 - Feat: GitHub Actions handle DTE reruns without requiring `npx nx-cloud start-ci-run` -## 12.5.1 +### 12.5.1 - Fix: DTE main job properly copies files after DTE is finished - Fix: Increased Node version compatibility for DTE Agents -## 12.5.0 +### 12.5.0 - Fix: Correctly print unexpected exceptions - Fix: Gracefully handle the case when tasks-hashes are missing - Fix: Agents should wait for the main job to start a rerun of a run group - Fix: Retry requests if we receive a 503 -## 12.3.13 +### 12.3.13 - Fix: DTE could get stuck when trying to execute tasks with different configurations -# Docker Containers +## Docker Containers -## 2306.01.2.patch4 +### 2306.01.2.patch4 - Fixes an issue with new licenses expiring sooner than original end date -## 2306.01.2.patch3 +### 2306.01.2.patch3 - Fixes an issue with multiple admin organizations being created on new installations - Fixes an issue where Enterprise licenses could not be applied on some new orgs -## 2306.01.2.patch2 +### 2306.01.2.patch2 - Fixes an issue with the `single-image` container where the aggregation would block the API from starting up -## 2306.01.2.patch1 +### 2306.01.2.patch1 - Fixes an issue where admin users were not being created on new installations. -## 2306.01.2 +### 2306.01.2 This is one of our biggest NxCloud On-Prem releases. It also marks a change in our release process which will be explained at the end. -#### Brand new UI +##### Brand new UI A few months ago we announced a complete re-design of the NxCloud UI! It's faster, easier to use and pleasant to look at! We're now bringing this to On-Prem users as well: You can read more about it in our [announcement blog post](https://blog.nrwl.io/nx-cloud-3-0-faster-more-efficient-modernized-36ac5ae33b86). -#### Pricing updates +##### Pricing updates While before we provided you with a separate coupon for each workspace, we have now changed to "organization-wide licenses": you receive a single coupon for your whole organization, that gives you unlimited access for the agreed number of workspaces. You are then free to delete, create and re-shuffle your workspaces as often as you want without requiring new coupons for us (as long as you stay within your limit of workspaces). You will see some updates in the UI to reflect this, however, **you don't need to do anything once you update your images!** We'll automatically migrate you to this, based on your current number of enabled workspaces! -#### Proxy updates +##### Proxy updates One of the features of NxCloud is its integrations with your repository hosting solution. When you open up a Pull Request, you can configure NxCloud to post a comment to it once your CI has finished running, with a summary of all the tasks that succeeded and failed on that code change, and a link to your branch on NxCloud so you can further analyse your run. Your developers save time, and allows them to skip digging through long CI logs. @@ -141,7 +143,7 @@ Before, if you had a self-hosted instance of Github, Gitlab or Bitbucket, calls [We've also made updates to the runner, to support any internal proxies you might have within your intranet.](https://github.com/nrwl/nx-cloud-helm/blob/main/PROXY-GUIDE.md#supporting-self-signed-ssl-certificates) -#### DTE performance +##### DTE performance We completely re-wrote our Task Distribution engine, which should result in much fewer errors due to agent timeouts, increased performance and more deterministic task distribution. @@ -149,18 +151,18 @@ We've also added a new internal task queueing system, which should further impro You can read more about the recent DTE improvements in our [NxCloud 3.0 blog post](https://blog.nrwl.io/nx-cloud-3-0-faster-more-efficient-modernized-36ac5ae33b86). -#### Misc updates +##### Misc updates - We have fixed issues related to OpenShift deployments. [Special thanks to minijus](https://github.com/nrwl/nx-cloud-helm/pull/32) for his work on the Helm charts and helping us test the changes. -#### Breaking changes +##### Breaking changes NxCloud 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. 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). -##### Migration from Community Edition to Enterprise +###### Migration from Community Edition to Enterprise On May 16th, 2023 we announced our plans to sunset the Community Edition of NxCloud On-Prem to align with our new pricing plans. If you are on the Community Edition, please follow these steps to migrate: @@ -168,7 +170,7 @@ On May 16th, 2023 we announced our plans to sunset the Community Edition of NxCl 2. Switch to private Enterprise by setting `NX_CLOUD_MODE=private-enterprise` (or `mode: 'private-enterprise'` if using Helm). 3. Reach out to us at [cloud-support@nrwl.io](mailto:cloud-support@nrwl.io). You will get a FREE, unlimited-use coupon for the next 3 months so you can trial Nx Enterprise. -#### New release process +##### New release process With this update, we are also changing our release process: @@ -179,39 +181,39 @@ With this update, we are also changing our release process: Any questions at all or to report issues with the new release [please get in touch!](mailto:cloud-support@nrwl.io) -## 13-02-2023T23-45-24 +### 13-02-2023T23-45-24 - Feat: Targettable agents for DTE. You can now ask specific agents to pick up specific tasks (via `--targets - Fix: DTE fixes for 404 not found artefacts errors - Fix: issue when using Github integration with self-hosted Github instances -## 26-01-2023T21-22-48 +### 26-01-2023T21-22-48 - Misc: Fixes to the Gitlab integration -## 05-01-2023T17-53-45 +### 05-01-2023T17-53-45 - Misc: This release contains small bug fixes and UI improvements. -## 14-12-2022T19-43-44 +### 14-12-2022T19-43-44 - Feat: IAM Role Auth. We have now deprecated "aws_access_key_id" and "aws_access_key_secret" in favor of service accounts and IAM roles for accessing AWS resources. See the [new guide here](https://github.com/nrwl/nx-cloud-helm/blob/main/aws-guide/AWS-GUIDE.md) for details. -## 13-10-2022T16-45-30 +### 13-10-2022T16-45-30 - Misc: This release mostly contains improvements that apply to the Public SASS version of NxCloud. No significant changes for the On-Prem version. -## 13-10-2022T16-45-30 +### 13-10-2022T16-45-30 - Feat: Private Cloud now runs completely as Kubernetes cluster. See the [Helm example repo](https://github.com/nrwl/nx-cloud-helm) for more details -## 05-08-2022T15-42-20 +### 05-08-2022T15-42-20 - Fix: issue with retrieving hashes during reads - Feat: added route to display container version at `/version` - Misc: forward api errors to stderr so k8s clusters can process them better -## 02-08-2022T16-11-36 +### 02-08-2022T16-11-36 - Note: The version naming scheme for the containers was changed to better track date/time of releases and to support embedding of the version inside the web UI - Feat: view the container version under the `/errors` route @@ -219,20 +221,20 @@ Any questions at all or to report issues with the new release [please get in tou - Feat: New system-ui font scheme - Fix: branch screen sorting performance improvements -## 2.4.11 +### 2.4.11 - Fixes an intermittent container start-up issue when running a self-contained Mongo instance - Fixes an issue with the self-hosted file-server where it would fail to create the initial directories -## 2.4.10 +### 2.4.10 - Fix an issue with the admin password not being set correctly -## 2.4.9 +### 2.4.9 - Align all NxCloud images to this version. No new fixes or features included. -## 2.4.8 +### 2.4.8 {% callout type="caution" title="IMPORTANT" %} The default container mode has changed from `COMMUNITY` to `ENTERPRISE`. If you are running a Community version of the container, you will need to make sure the `NX_CLOUD_MODE=private-community` is explicitly set (otherwise your container will fail to start-up). @@ -243,44 +245,44 @@ The default container mode has changed from `COMMUNITY` to `ENTERPRISE`. If you - Fix: issue with billing page when multiple access tokens were attached to the same org - Fix: multiple Mongo DBs used to be created if a default DB was not provided in the connection string. Now it always defaults to the provided `NX_CLOUD_MONGO_DB_NAME` -## 2.4.7 +### 2.4.7 - Misc: performance improvements to DB indexes - Misc: improvements to hash differ to use regex - Misc: export more collections for debug purposes (workspaces and organizations) -## 2.4.6 +### 2.4.6 - Fix: issue with navigating to organizations/workspaces in the web app -## 2.4.5 +### 2.4.5 - Feat: filters to branch and run list pages - Fix: improved `MD5` cache artifact archiving - Misc: various UI and UX improvements to the NxCloud dashboards -## 2.4.4 +### 2.4.4 - Fix: Missing artefact retrieval error when using read-tokens - Fix: Performance improvements to the branch page and run groups sorting - Fix: better handling of artefact `.tar` archiving -## 2.4.3 +### 2.4.3 - Feat: Billing page messaging improvements - Fix: runs sorting on branch page -## 2.4.2 +### 2.4.2 - Feat: DTE post-run report - Feat: Hash Detail tool flow improvements -## 2.4.1 +### 2.4.1 - Feat: Admins can now easily export debug info for error investigation - Fix: branch screen run group sorting -## 2.4.0 +### 2.4.0 - Feat: [GitLab Auth Support](https://nx.app/docs/private-cloud-gitlab-auth)/private-cloud-gitlab-auth - Feat: Hash diffing tool improvements @@ -292,57 +294,57 @@ The default container mode has changed from `COMMUNITY` to `ENTERPRISE`. If you - Fix: handle DTEs with no tasks - Fix: await process checkout sessions -## 2.3.1 +### 2.3.1 - Feat: Increase file-server default cached artifact limit. If you are not using an external file storage (such as S3), then the cached assets will now be kept by default from 2 weeks to 4 weeks, increasing the chance of cache hits. - Feat: "Download cache usage" data from the "Time saved" workspace page -## 2.3.0 +### 2.3.0 - Feat: GitHub Integration - no token is now necessary in "`nx.json`" for the GitHub integration to work (you still need to provide as an env var for caching to work). To connect your workspace to GitHub without an access token in "`nx.json`" just pass in the "`NX_CLOUD_INTEGRATION_DEFAULT_WORKSPACE_ID=`" env var - Misc: better error handling (report less false positives) - Fix: Scheduled tasks locking -## 2.2.16 +### 2.2.16 - Misc: DB performance improvements (old records clean-up aggregator, indexes etc.) -## 2.2.15 +### 2.2.15 - Feat: Add options to control database load - Fix: Better exception handling in the API -## 2.2.14 +### 2.2.14 - Feat: Optimize event processing to increase the throughput of workspaces with a very high number of agents. - Fix: Gracefully recover when stats aggregation fails -## 2.2.13 +### 2.2.13 - Feat: Hash diffing tool enhancements -## 2.2.12 +### 2.2.12 - Feat: DTE visualisation improvements for larger workspaces - Fix: billing page not displaying subscriptions for Private Community -## 2.2.11 +### 2.2.11 - Feat: Better error handling for scheduled tasks - Fix: branch screen not loading -## 2.2.10 +### 2.2.10 - Feat: Various UI improvements to the NxCloud screens - Feat: Hash detail diff tool - Feat: GitHub app comment revamp - Feat: DTE visualisation -## 2.2.9 +### 2.2.9 - Fix: DTE bug fixes caused by incorrectly batched tasks -## 2.2.8 +### 2.2.8 - Fix: various DTE bug fixes - Feat: Add `NX_CLOUD_DISTRIBUTED_EXECUTION_AGENT_COUNT` env var for more explicitly optimising DTEs @@ -354,20 +356,20 @@ The default container mode has changed from `COMMUNITY` to `ENTERPRISE`. If you - Feat: billing estimator (on billing page) - Fix: ignore ending slash on `NX_CLOUD_APP_URL` (in case it's added by mistake) -## 2.2.7 +### 2.2.7 - Feat: `VERBOSE=1` env variable option to output extra information during container initialisation - Feat: `MONGO_REPAIR=1` env variable option to trigger a [Mongo Repair](https://docs.mongodb.com/manual/tutorial/recover-data-following-unexpected-shutdown/) if the container data gets corrupted -## 2.2.3 +### 2.2.3 - Fix: Reset the memory limits to best work on an instance with 8GB of RAM. - Fix: Set the default `NX_CLOUD_MODE` to "community". -## 2.2 +### 2.2 - [Nx Cloud 2.2](https://blog.nrwl.io/%EF%B8%8F-nx-cloud-2-2-%EF%B8%8F-b7656ed5ce7c) -## 2.0 +### 2.0 - [Overview of Nx Cloud 2.0](https://blog.nrwl.io/introducing-nx-cloud-2-0-f1e5c2002a65) diff --git a/nx-dev/nx-dev-e2e/.eslintrc.json b/nx-dev/nx-dev-e2e/.eslintrc.json index 696cb8b121..c1ece1052b 100644 --- a/nx-dev/nx-dev-e2e/.eslintrc.json +++ b/nx-dev/nx-dev-e2e/.eslintrc.json @@ -1,9 +1,9 @@ { - "extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], + "extends": ["plugin:playwright/recommended", "../../.eslintrc.json"], "ignorePatterns": ["!**/*"], "overrides": [ { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "files": ["src/**/*.{ts,js,tsx,jsx}"], "rules": {} } ] diff --git a/nx-dev/nx-dev-e2e/cypress.config.ts b/nx-dev/nx-dev-e2e/cypress.config.ts deleted file mode 100644 index 28ccd0f90d..0000000000 --- a/nx-dev/nx-dev-e2e/cypress.config.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { nxE2EPreset } from '@nx/cypress/plugins/cypress-preset'; -import { defineConfig } from 'cypress'; - -const cypressJsonConfig = { - fileServerFolder: '.', - fixturesFolder: './src/fixtures', - video: true, - videosFolder: '../../dist/cypress/apps/nx-dev-e2e/videos', - screenshotsFolder: '../../dist/cypress/apps/nx-dev-e2e/screenshots', - chromeWebSecurity: false, - specPattern: 'src/e2e/**/*.cy.{js,jsx,ts,tsx}', - supportFile: 'src/support/e2e.ts', -}; -export default defineConfig({ - e2e: { - ...nxE2EPreset(__dirname), - ...cypressJsonConfig, - /** - * TODO(@nx/cypress): In Cypress v12,the testIsolation option is turned on by default. - * This can cause tests to start breaking where not indended. - * You should consider enabling this once you verify tests do not depend on each other - * More Info: https://docs.cypress.io/guides/references/migration-guide#Test-Isolation - **/ - testIsolation: false, - }, -}); diff --git a/nx-dev/nx-dev-e2e/playwright.config.ts b/nx-dev/nx-dev-e2e/playwright.config.ts new file mode 100644 index 0000000000..2599f5064d --- /dev/null +++ b/nx-dev/nx-dev-e2e/playwright.config.ts @@ -0,0 +1,40 @@ +import { defineConfig } from '@playwright/test'; +import { nxE2EPreset } from '@nx/playwright/preset'; +import { workspaceRoot } from '@nx/devkit'; + +// For CI, you may want to set BASE_URL to the deployed application. +const baseURL = process.env['BASE_URL'] || 'http://localhost:4200'; + +const preset = nxE2EPreset(__filename, { testDir: './src' }); +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + ...preset, + // CI default is 'dot', which doesn't show error output in CI. + // use list so errors are visible in CI logs + reporter: process.env.CI ? 'list' : preset.reporter, + // how long the entire suite can run, prevent CI from timing out + globalTimeout: process.env.CI ? 1_800_000 : undefined, + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + baseURL, + // how long each page.goto can take before timing out + navigationTimeout: process.env.CI ? 30_000 : undefined, + /* 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: 'pnpm exec nx run nx-dev:serve:production', + url: 'http://localhost:4200', + reuseExistingServer: !process.env.CI, + cwd: workspaceRoot, + }, +}); diff --git a/nx-dev/nx-dev-e2e/project.json b/nx-dev/nx-dev-e2e/project.json index 7764ca9d3c..6c7f296efc 100644 --- a/nx-dev/nx-dev-e2e/project.json +++ b/nx-dev/nx-dev-e2e/project.json @@ -4,6 +4,7 @@ "sourceRoot": "nx-dev/nx-dev-e2e/src", "projectType": "application", "targets": { + "lint": {}, "e2e": { "dependsOn": [ { @@ -11,14 +12,12 @@ "dependencies": true } ], - "executor": "@nx/cypress:cypress", + "executor": "@nx/playwright:playwright", + "outputs": ["{workspaceRoot}/dist/.playwright/nx-dev/nx-dev-e2e"], "options": { - "cypressConfig": "nx-dev/nx-dev-e2e/cypress.config.ts", - "devServerTarget": "nx-dev:serve:production", - "testingType": "e2e" + "config": "nx-dev/nx-dev-e2e/playwright.config.ts" } - }, - "lint": {} + } }, "tags": ["scope:nx-dev", "type:e2e"], "implicitDependencies": ["nx-dev"] diff --git a/nx-dev/nx-dev-e2e/src/additional-api-references.spec.ts b/nx-dev/nx-dev-e2e/src/additional-api-references.spec.ts new file mode 100644 index 0000000000..234683aee2 --- /dev/null +++ b/nx-dev/nx-dev-e2e/src/additional-api-references.spec.ts @@ -0,0 +1,61 @@ +import { assertTextOnPage } from './helpers'; +import { Page, test, expect } from '@playwright/test'; + +const pages: Array<{ title: string; path: string }> = [ + { title: 'create-nx-workspace', path: '/cli/create-nx-workspace' }, + { title: 'generate', path: '/cli/generate' }, + { title: 'run', path: '/cli/run' }, + { title: 'daemon', path: '/cli/daemon' }, + { title: 'graph', path: '/cli/dep-graph' }, + { title: 'run-many', path: '/cli/run-many' }, + { title: 'affected', path: '/cli/affected' }, + { title: 'affected:graph', path: '/cli/affected-dep-graph' }, + { title: 'print-affected', path: '/cli/print-affected' }, + { title: 'format:check', path: '/cli/format-check' }, + { title: 'format:write', path: '/cli/format-write' }, + { title: 'migrate', path: '/cli/migrate' }, + { title: 'report', path: '/cli/report' }, + { title: 'list', path: '/cli/list' }, + { title: 'workspace-lint', path: '/cli/workspace-lint' }, + { title: 'workspace-generator', path: '/cli/workspace-generator' }, + { title: 'connect', path: '/cli/connect-to-nx-cloud' }, + { title: 'reset', path: '/cli/reset' }, + { title: 'Storybook', path: '/storybook/overview-react' }, + { title: 'Storybook', path: '/storybook/overview-angular' }, + { + title: 'Nx React Storybook Addon', + path: '/storybook/migrate-webpack-final-react', + }, + { + title: 'Storybook Migration to webpackFinal', + path: '/storybook/migrate-webpack-final-angular', + }, + { + title: 'Upgrading to Storybook 6 (and Nx versions >10.1.x and <14.0.0)', + path: '/storybook/upgrade-storybook-v6-react', + }, + { + title: 'Upgrading to Storybook 6 (and Nx versions >10.1.x and <14.0.0)', + path: '/storybook/upgrade-storybook-v6-angular', + }, + { + title: 'Setting up Storybook Composition with Nx', + path: '/storybook/storybook-composition-setup', + }, + { + title: '@nx/devkit', + path: '/devkit/index', + }, + { + title: '@nx/devkit', + path: '/devkit/ngcli_adapter', + }, +]; + +/** + * Asserting all the additional API references pages are accounted for and accessible. + * Generation of the pages is manual since we want to make sure the change is intended. + */ +test.describe('nx-dev: Additional API references section', () => { + pages.forEach((page) => assertTextOnPage(page.path, page.title)); +}); diff --git a/nx-dev/nx-dev-e2e/src/app.spec.ts b/nx-dev/nx-dev-e2e/src/app.spec.ts new file mode 100644 index 0000000000..92d0622af1 --- /dev/null +++ b/nx-dev/nx-dev-e2e/src/app.spec.ts @@ -0,0 +1,7 @@ +import { test, expect } from '@playwright/test'; + +test('should display the primary heading', async ({ page }) => { + await page.goto('/'); + const heading = page.locator('[data-cy="primary-heading"]'); + await expect(heading).toContainText('Smart, FastExtensibleBuild System'); +}); diff --git a/nx-dev/nx-dev-e2e/src/e2e/additional-api-references.cy.ts b/nx-dev/nx-dev-e2e/src/e2e/additional-api-references.cy.ts deleted file mode 100644 index 60fab63766..0000000000 --- a/nx-dev/nx-dev-e2e/src/e2e/additional-api-references.cy.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { assertTextOnPage } from './helpers'; - -/** - * Asserting all the additional API references pages are accounted for and accessible. - * Generation of the pages is manual since we want to make sure the change is intended. - */ -describe('nx-dev: Additional API references section', () => { - (<{ title: string; path: string }[]>[ - { title: 'create-nx-workspace', path: '/cli/create-nx-workspace' }, - { title: 'generate', path: '/cli/generate' }, - { title: 'run', path: '/cli/run' }, - { title: 'daemon', path: '/cli/daemon' }, - { title: 'graph', path: '/cli/dep-graph' }, - { title: 'run-many', path: '/cli/run-many' }, - { title: 'affected', path: '/cli/affected' }, - { title: 'affected:graph', path: '/cli/affected-dep-graph' }, - { title: 'print-affected', path: '/cli/print-affected' }, - { title: 'format:check', path: '/cli/format-check' }, - { title: 'format:write', path: '/cli/format-write' }, - { title: 'migrate', path: '/cli/migrate' }, - { title: 'report', path: '/cli/report' }, - { title: 'list', path: '/cli/list' }, - { title: 'workspace-lint', path: '/cli/workspace-lint' }, - { title: 'workspace-generator', path: '/cli/workspace-generator' }, - { title: 'connect', path: '/cli/connect-to-nx-cloud' }, - { title: 'reset', path: '/cli/reset' }, - { title: 'Storybook', path: '/storybook/overview-react' }, - { title: 'Storybook', path: '/storybook/overview-angular' }, - { - title: 'Nx React Storybook Addon', - path: '/storybook/migrate-webpack-final-react', - }, - { - title: 'Storybook Migration to webpackFinal', - path: '/storybook/migrate-webpack-final-angular', - }, - { - title: 'Upgrading to Storybook 6 (and Nx versions >10.1.x and <14.0.0)', - path: '/storybook/upgrade-storybook-v6-react', - }, - { - title: 'Upgrading to Storybook 6 (and Nx versions >10.1.x and <14.0.0)', - path: '/storybook/upgrade-storybook-v6-angular', - }, - { - title: 'Setting up Storybook Composition with Nx', - path: '/storybook/storybook-composition-setup', - }, - { - title: '@nx/devkit', - path: '/devkit/index', - }, - { - title: '@nx/devkit', - path: '/devkit/ngcli_adapter', - }, - ]).forEach((page) => assertTextOnPage(page.path, page.title)); -}); diff --git a/nx-dev/nx-dev-e2e/src/e2e/app.cy.ts b/nx-dev/nx-dev-e2e/src/e2e/app.cy.ts deleted file mode 100644 index 0819cad794..0000000000 --- a/nx-dev/nx-dev-e2e/src/e2e/app.cy.ts +++ /dev/null @@ -1,10 +0,0 @@ -describe('nx-dev', () => { - beforeEach(() => cy.visit('/')); - - it('should display the primary heading', () => { - cy.get('[data-cy="primary-heading"]').should( - 'contain', - 'Smart, FastExtensibleBuild System' - ); - }); -}); diff --git a/nx-dev/nx-dev-e2e/src/e2e/helpers.ts b/nx-dev/nx-dev-e2e/src/e2e/helpers.ts deleted file mode 100644 index 8bfd629226..0000000000 --- a/nx-dev/nx-dev-e2e/src/e2e/helpers.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Assert a text is present on the visited page. - * @param path - * @param title - * @param selector - */ -export function assertTextOnPage( - path: string, - title: string, - selector: string = 'h1' -): void { - describe(path, () => - it(`should display "${title}"`, () => { - cy.visit(path); - cy.get(selector).should('contain.text', title); - }) - ); -} diff --git a/nx-dev/nx-dev-e2e/src/e2e/nx-cloud-documentation.cy.ts b/nx-dev/nx-dev-e2e/src/e2e/nx-cloud-documentation.cy.ts deleted file mode 100644 index 4a49688215..0000000000 --- a/nx-dev/nx-dev-e2e/src/e2e/nx-cloud-documentation.cy.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { assertTextOnPage } from './helpers'; - -/** - * Asserting all the additional API references pages are accounted for and accessible. - * Generation of the pages is manual since we want to make sure the change is intended. - */ -describe('nx-dev: Nx Cloud section', () => { - (<{ title: string; path: string }[]>[ - { title: 'What is Nx Cloud?', path: '/nx-cloud/intro/what-is-nx-cloud' }, - { - title: 'Recording Non-Nx Commands', - path: '/nx-cloud/set-up/record-commands', - }, - { - title: 'Enable GitHub PR Integration', - path: '/nx-cloud/set-up/github', - }, - { - title: 'User Management', - path: '/nx-cloud/account/users', - }, - { - title: 'Connecting Nx Cloud to your existing Google identity provider', - path: '/nx-cloud/account/google-auth', - }, - { - title: 'Access Tokens', - path: '/nx-cloud/account/access-tokens', - }, - { - title: 'Security Scenarios', - path: '/nx-cloud/account/scenarios', - }, - { - title: 'End to End Encryption', - path: '/nx-cloud/account/encryption', - }, - { - title: 'Running Nx Cloud Enterprise', - path: '/nx-cloud/private-cloud/get-started', - }, - { - title: 'Auth (Basic)', - path: '/nx-cloud/private-cloud/auth-single-admin', - }, - { - title: 'GitHub Auth', - path: '/nx-cloud/private-cloud/auth-github', - }, - { - title: 'GitLab Auth', - path: '/nx-cloud/private-cloud/auth-gitlab', - }, - { - title: 'Setting up a dedicated NxCloud VM', - path: '/nx-cloud/private-cloud/ami-setup', - }, - { - title: 'BitBucket Auth', - path: '/nx-cloud/private-cloud/auth-bitbucket', - }, - { - title: 'SAML Auth', - path: '/nx-cloud/private-cloud/auth-saml', - }, - { - title: 'Advanced Configuration', - path: '/nx-cloud/private-cloud/advanced-config', - }, - { - title: 'Configuring the Cloud Runner / Nx CLI', - path: '/nx-cloud/reference/config', - }, - { - title: 'Environment Variables', - path: '/nx-cloud/reference/env-vars', - }, - { - title: 'Nx Cloud Server API Reference', - path: '/nx-cloud/reference/server-api', - }, - { - title: 'nx-cloud - Release notes', - path: '/nx-cloud/reference/release-notes', - }, - ]).forEach((page) => assertTextOnPage(page.path, page.title)); -}); diff --git a/nx-dev/nx-dev-e2e/src/e2e/packages.cy.ts b/nx-dev/nx-dev-e2e/src/e2e/packages.cy.ts deleted file mode 100644 index e3cccf8da9..0000000000 --- a/nx-dev/nx-dev-e2e/src/e2e/packages.cy.ts +++ /dev/null @@ -1,475 +0,0 @@ -import { assertTextOnPage } from './helpers'; - -/** - * Asserting all the packages pages are accounted for and accessible. - * Generation of the pages is manual since we want to make sure the change is intended. - */ -describe('nx-dev: Packages Section', () => { - (<{ title: string; path: string }[]>[ - { title: '@nx/angular', path: '/packages/angular' }, - { - title: '@nx/angular:add-linting', - path: '/packages/angular/generators/add-linting', - }, - { - title: '@nx/angular:application', - path: '/packages/angular/generators/application', - }, - { - title: '@nx/angular:component', - path: '/packages/angular/generators/component', - }, - { - title: '@nx/angular:component-cypress-spec', - path: '/packages/angular/generators/component-cypress-spec', - }, - { - title: '@nx/angular:component-story', - path: '/packages/angular/generators/component-story', - }, - { - title: '@nx/angular:convert-tslint-to-eslint', - path: '/packages/angular/generators/convert-tslint-to-eslint', - }, - { title: '@nx/angular:init', path: '/packages/angular/generators/init' }, - { - title: '@nx/angular:library', - path: '/packages/angular/generators/library', - }, - { - title: '@nx/angular:library-secondary-entry-point', - path: '/packages/angular/generators/library-secondary-entry-point', - }, - { - title: '@nx/angular:remote', - path: '/packages/angular/generators/remote', - }, - { title: '@nx/angular:move', path: '/packages/angular/generators/move' }, - { - title: '@nx/angular:convert-to-with-mf', - path: '/packages/angular/generators/convert-to-with-mf', - }, - { title: '@nx/angular:host', path: '/packages/angular/generators/host' }, - { - title: '@nx/angular:ng-add', - path: '/packages/angular/generators/ng-add', - }, - { title: '@nx/angular:ngrx', path: '/packages/angular/generators/ngrx' }, - { title: '@nx/angular:scam', path: '/packages/angular/generators/scam' }, - { - title: '@nx/angular:scam-directive', - path: '/packages/angular/generators/scam-directive', - }, - { - title: '@nx/angular:scam-pipe', - path: '/packages/angular/generators/scam-pipe', - }, - { - title: '@nx/angular:setup-mf', - path: '/packages/angular/generators/setup-mf', - }, - { - title: '@nx/angular:setup-tailwind', - path: '/packages/angular/generators/setup-tailwind', - }, - { - title: '@nx/angular:stories', - path: '/packages/angular/generators/stories', - }, - { - title: '@nx/', - path: '/packages/angular/generators/storybook-configuration', - }, - { - title: '@nx/angular:web-worker', - path: '/packages/angular/generators/web-worker', - }, - { - title: '@nx/angular:delegate-build', - path: '/packages/angular/executors/delegate-build', - }, - { - title: '@nx/angular:ng-packagr-lite', - path: '/packages/angular/executors/ng-packagr-lite', - }, - { - title: '@nx/angular:package', - path: '/packages/angular/executors/package', - }, - { title: 'create-nx-plugin', path: '/packages/create-nx-plugin' }, - { - title: 'create-nx-workspace', - path: '/packages/create-nx-workspace', - }, - { title: '@nx/cypress', path: '/packages/cypress' }, - { title: '@nx/cypress:init', path: '/packages/cypress/generators/init' }, - { - title: '@nx/cypress:cypress-project', - path: '/packages/cypress/generators/cypress-project', - }, - { - title: '@nx/cypress:cypress', - path: '/packages/cypress/executors/cypress', - }, - { title: '@nx/detox', path: '/packages/detox' }, - { title: '@nx/detox:init', path: '/packages/detox/generators/init' }, - { - title: '@nx/detox:application', - path: '/packages/detox/generators/application', - }, - { title: '@nx/detox:build', path: '/packages/detox/executors/build' }, - { title: '@nx/detox:test', path: '/packages/detox/executors/test' }, - { title: '@nx/devkit', path: '/packages/devkit' }, - { title: '@nx/esbuild', path: '/packages/esbuild' }, - { - title: '@nx/esbuild:esbuild', - path: '/packages/esbuild/executors/esbuild', - }, - { title: '@nx/eslint-plugin', path: '/packages/eslint-plugin' }, - { title: '@nx/expo', path: '/packages/expo' }, - { - title: '@nx/expo:init', - path: '/packages/expo/generators/init', - }, - { - title: '@nx/expo:application', - path: '/packages/expo/generators/application', - }, - { - title: '@nx/expo:library', - path: '/packages/expo/generators/library', - }, - { - title: '@nx/expo:component', - path: '/packages/expo/generators/component', - }, - { - title: '@nx/expo:start', - path: '/packages/expo/executors/start', - }, - { - title: '@nx/expo:sync-deps', - path: '/packages/expo/executors/sync-deps', - }, - { - title: '@nx/expo:ensure-symlink', - path: '/packages/expo/executors/ensure-symlink', - }, - { title: '@nx/express', path: '/packages/express' }, - { title: '@nx/express:init', path: '/packages/express/generators/init' }, - { - title: '@nx/express:application', - path: '/packages/express/generators/application', - }, - { title: '@nx/jest', path: '/packages/jest' }, - { title: '@nx/jest:init', path: '/packages/jest/generators/init' }, - { - title: '@nx/jest:configuration', - path: '/packages/jest/generators/configuration', - }, - { title: '@nx/jest', path: '/packages/jest/executors/jest' }, - { title: '@nx/js', path: '/packages/js' }, - { title: '@nx/js:library', path: '/packages/js/generators/library' }, - { title: '@nx/js:init', path: '/packages/js/generators/init' }, - { - title: '@nx/js:convert-to-swc', - path: '/packages/js/generators/convert-to-swc', - }, - { title: '@nx/js:tsc', path: '/packages/js/executors/tsc' }, - { title: '@nx/js:swc', path: '/packages/js/executors/swc' }, - { title: '@nx/linter', path: '/packages/linter' }, - { - title: '@nx/linter:workspace-rules-project', - path: '/packages/linter/generators/workspace-rules-project', - }, - { - title: '@nx/linter', - path: '/packages/linter/generators/workspace-rule', - }, - { title: '@nx/linter', path: '/packages/linter/executors/eslint' }, - { title: '@nx/nest', path: '/packages/nest' }, - { - title: '@nx/nest:application', - path: '/packages/nest/generators/application', - }, - { - title: '@nx/nest:convert-tslint-to-eslint', - path: '/packages/nest/generators/convert-tslint-to-eslint', - }, - { title: '@nx/nest:init', path: '/packages/nest/generators/init' }, - { title: '@nx/nest:library', path: '/packages/nest/generators/library' }, - { title: '@nx/nest:class', path: '/packages/nest/generators/class' }, - { - title: '@nx/nest:controller', - path: '/packages/nest/generators/controller', - }, - { - title: '@nx/nest:decorator', - path: '/packages/nest/generators/decorator', - }, - { title: '@nx/nest:filter', path: '/packages/nest/generators/filter' }, - { title: '@nx/nest:gateway', path: '/packages/nest/generators/gateway' }, - { title: '@nx/nest:guard', path: '/packages/nest/generators/guard' }, - { - title: '@nx/nest:interceptor', - path: '/packages/nest/generators/interceptor', - }, - { - title: '@nx/nest:interface', - path: '/packages/nest/generators/interface', - }, - { - title: '@nx/nest:middleware', - path: '/packages/nest/generators/middleware', - }, - { title: '@nx/nest:module', path: '/packages/nest/generators/module' }, - { title: '@nx/nest:pipe', path: '/packages/nest/generators/pipe' }, - { - title: '@nx/nest:provider', - path: '/packages/nest/generators/provider', - }, - { - title: '@nx/nest:resolver', - path: '/packages/nest/generators/resolver', - }, - { - title: '@nx/nest:resource', - path: '/packages/nest/generators/resource', - }, - { title: '@nx/nest:service', path: '/packages/nest/generators/service' }, - { title: '@nx/next', path: '/packages/next' }, - { title: '@nx/next:init', path: '/packages/next/generators/init' }, - { - title: '@nx/next:application', - path: '/packages/next/generators/application', - }, - { title: '@nx/next:page', path: '/packages/next/generators/page' }, - { - title: '@nx/next:component', - path: '/packages/next/generators/component', - }, - { title: '@nx/next:library', path: '/packages/next/generators/library' }, - { title: '@nx/next:build', path: '/packages/next/executors/build' }, - { title: '@nx/next:server', path: '/packages/next/executors/server' }, - { title: '@nx/next:export', path: '/packages/next/executors/export' }, - { title: '@nx/node', path: '/packages/node' }, - { title: '@nx/node:init', path: '/packages/node/generators/init' }, - { - title: '@nx/node:application', - path: '/packages/node/generators/application', - }, - { title: '@nx/node:library', path: '/packages/node/generators/library' }, - { title: 'nx', path: '/packages/nx' }, - { title: 'nx:noop', path: '/packages/nx/executors/noop' }, - { - title: 'nx:run-commands', - path: '/packages/nx/executors/run-commands', - }, - { title: 'nx:run-script', path: '/packages/nx/executors/run-script' }, - { title: 'plugin', path: '/packages/plugin' }, - { - title: '@nx/plugin:plugin', - path: '/packages/plugin/generators/plugin', - }, - { - title: '@nx/plugin:e2e-project', - path: '/packages/plugin/generators/e2e-project', - }, - { - title: '@nx/plugin:migration', - path: '/packages/plugin/generators/migration', - }, - { - title: '@nx/plugin:generator', - path: '/packages/plugin/generators/generator', - }, - { - title: '@nx/plugin:executor', - path: '/packages/plugin/generators/executor', - }, - { title: '@nx/plugin:e2e', path: '/packages/plugin/executors/e2e' }, - { title: '@nx/react', path: '/packages/react' }, - { title: '@nx/react:init', path: '/packages/react/generators/init' }, - { - title: '@nx/react:application', - path: '/packages/react/generators/application', - }, - { - title: '@nx/react:library', - path: '/packages/react/generators/library', - }, - { - title: '@nx/react:component', - path: '/packages/react/generators/component', - }, - { title: '@nx/react:redux', path: '/packages/react/generators/redux' }, - { - title: '@nx/react:storybook-configuration', - path: '/packages/react/generators/storybook-configuration', - }, - { - title: '@nx/react:component-story', - path: '/packages/react/generators/component-story', - }, - { - title: '@nx/react:stories', - path: '/packages/react/generators/stories', - }, - { - title: '@nx/react:component-cypress-spec', - path: '/packages/react/generators/component-cypress-spec', - }, - { title: '@nx/react:hook', path: '/packages/react/generators/hook' }, - { title: '@nx/react:host', path: '/packages/react/generators/host' }, - { title: '@nx/react:remote', path: '/packages/react/generators/remote' }, - { - title: '@nx/react:module-federation-dev-server', - path: '/packages/react/executors/module-federation-dev-server', - }, - { title: '@nx/react-native', path: '/packages/react-native' }, - { - title: '@nx/react-native:init', - path: '/packages/react-native/generators/init', - }, - { - title: '@nx/react-native:application', - path: '/packages/react-native/generators/application', - }, - { - title: '@nx/react-native:library', - path: '/packages/react-native/generators/library', - }, - { - title: '@nx/react-native:component', - path: '/packages/react-native/generators/component', - }, - { - title: '@nx/', - path: '/packages/react-native/generators/storybook-configuration', - }, - { - title: '@nx/react-native:component-story', - path: '/packages/react-native/generators/component-story', - }, - { - title: '@nx/react-native:stories', - path: '/packages/react-native/generators/stories', - }, - { - title: '@nx/react-native:upgrade-native', - path: '/packages/react-native/generators/upgrade-native', - }, - { - title: '@nx/react-native:run-android', - path: '/packages/react-native/executors/run-android', - }, - { - title: '@nx/react-native:run-ios', - path: '/packages/react-native/executors/run-ios', - }, - { - title: '@nx/react-native:bundle', - path: '/packages/react-native/executors/bundle', - }, - { - title: '@nx/react-native:build-android', - path: '/packages/react-native/executors/build-android', - }, - { - title: '@nx/react-native:start', - path: '/packages/react-native/executors/start', - }, - { - title: '@nx/react-native:sync-deps', - path: '/packages/react-native/executors/sync-deps', - }, - { - title: '@nx/react-native:ensure-symlink', - path: '/packages/react-native/executors/ensure-symlink', - }, - { - title: '@nx/react-native:storybook', - path: '/packages/react-native/executors/storybook', - }, - { title: '@nx/storybook', path: '/packages/storybook' }, - { - title: '@nx/storybook:init', - path: '/packages/storybook/generators/init', - }, - { - title: '@nx/storybook:configuration', - path: '/packages/storybook/generators/configuration', - }, - { - title: '@nx/storybook:cypress-project', - path: '/packages/storybook/generators/cypress-project', - }, - { - title: '@nx/storybook:storybook', - path: '/packages/storybook/executors/storybook', - }, - { - title: '@nx/storybook:build', - path: '/packages/storybook/executors/build', - }, - { title: '@nx/web', path: '/packages/web' }, - { title: '@nx/web:init', path: '/packages/web/generators/init' }, - { - title: '@nx/web:application', - path: '/packages/web/generators/application', - }, - { - title: '@nx/webpack:webpack', - path: '/packages/webpack/executors/webpack', - }, - { title: '@nx/rollup:rollup', path: '/packages/rollup/executors/rollup' }, - { - title: '@nx/webpack:dev-server', - path: '/packages/webpack/executors/dev-server', - }, - { - title: '@nx/web:file-server', - path: '/packages/web/executors/file-server', - }, - { - title: '@nx/workspace:preset', - path: '/packages/workspace/generators/preset', - }, - { - title: '@nx/workspace:move', - path: '/packages/workspace/generators/move', - }, - { - title: '@nx/workspace:remove', - path: '/packages/workspace/generators/remove', - }, - { - title: '@nx/workspace:new', - path: '/packages/workspace/generators/new', - }, - { - title: '@nx/workspace:workspace-generator', - path: '/packages/workspace/generators/workspace-generator', - }, - { - title: '@nx/workspace:run-command', - path: '/packages/workspace/generators/run-commands', - }, - { - title: '@nx/workspace:fix-configuration', - path: '/packages/workspace/generators/fix-configuration', - }, - { - title: '@nx/workspace:npm-package', - path: '/packages/workspace/generators/npm-package', - }, - { - title: '@nx/workspace:ci-workflow', - path: '/packages/workspace/generators/ci-workflow', - }, - { - title: '@nx/workspace:counter', - path: '/packages/workspace/executors/counter', - }, - ]).forEach((page) => assertTextOnPage(page.path, page.title)); -}); diff --git a/nx-dev/nx-dev-e2e/src/e2e/recipes.cy.ts b/nx-dev/nx-dev-e2e/src/e2e/recipes.cy.ts deleted file mode 100644 index 15e3357de5..0000000000 --- a/nx-dev/nx-dev-e2e/src/e2e/recipes.cy.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { uniq } from '@nx/e2e/utils'; - -describe('nx-dev: Recipes pages', () => { - it('should list related recipes based on tags', () => { - const { map, uniq } = Cypress._; - - cy.visit('/recipes/other/deno-deploy'); - - // All text content has to be different - cy.get('[data-document="related"] > article > ul > li').should(($list) => { - const values = map($list, 'innerText'); - const distinct = uniq(values); - expect(distinct, 'all strings are different').to.have.length( - values.length - ); - }); - }); -}); diff --git a/nx-dev/nx-dev-e2e/src/fixtures/.gitkeep b/nx-dev/nx-dev-e2e/src/fixtures/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/nx-dev/nx-dev-e2e/src/helpers.ts b/nx-dev/nx-dev-e2e/src/helpers.ts new file mode 100644 index 0000000000..44584f2f74 --- /dev/null +++ b/nx-dev/nx-dev-e2e/src/helpers.ts @@ -0,0 +1,21 @@ +import { Page, test, expect } from '@playwright/test'; +/** + * Assert a text is present on the visited page. + * @param page + * @param path + * @param title + * @param selector + */ +export function assertTextOnPage( + path: string, + title: string, + selector: string = 'h1' +): void { + test.describe(path, () => + test(`should display "${title}"`, async ({ page }) => { + await page.goto(path); + const locator = page.locator(selector); + await expect(locator).toContainText(title); + }) + ); +} diff --git a/nx-dev/nx-dev-e2e/src/nx-cloud-documentation.spec.ts b/nx-dev/nx-dev-e2e/src/nx-cloud-documentation.spec.ts new file mode 100644 index 0000000000..70db34d92d --- /dev/null +++ b/nx-dev/nx-dev-e2e/src/nx-cloud-documentation.spec.ts @@ -0,0 +1,90 @@ +import { assertTextOnPage } from './helpers'; +import { test, expect } from '@playwright/test'; + +const pages: Array<{ title: string; path: string }> = [ + { title: 'What is Nx Cloud?', path: '/nx-cloud/intro/what-is-nx-cloud' }, + { + title: 'Recording Non-Nx Commands', + path: '/nx-cloud/set-up/record-commands', + }, + { + title: 'Enable GitHub PR Integration', + path: '/nx-cloud/set-up/github', + }, + { + title: 'User Management', + path: '/nx-cloud/account/users', + }, + { + title: 'Connecting Nx Cloud to your existing Google identity provider', + path: '/nx-cloud/account/google-auth', + }, + { + title: 'Access Tokens', + path: '/nx-cloud/account/access-tokens', + }, + { + title: 'Security Scenarios', + path: '/nx-cloud/account/scenarios', + }, + { + title: 'End to End Encryption', + path: '/nx-cloud/account/encryption', + }, + { + title: 'Running Nx Cloud Enterprise', + path: '/nx-cloud/private-cloud/get-started', + }, + { + title: 'Auth (Basic)', + path: '/nx-cloud/private-cloud/auth-single-admin', + }, + { + title: 'GitHub Auth', + path: '/nx-cloud/private-cloud/auth-github', + }, + { + title: 'GitLab Auth', + path: '/nx-cloud/private-cloud/auth-gitlab', + }, + { + title: 'Setting up a dedicated NxCloud VM', + path: '/nx-cloud/private-cloud/ami-setup', + }, + { + title: 'BitBucket Auth', + path: '/nx-cloud/private-cloud/auth-bitbucket', + }, + { + title: 'SAML Auth', + path: '/nx-cloud/private-cloud/auth-saml', + }, + { + title: 'Advanced Configuration', + path: '/nx-cloud/private-cloud/advanced-config', + }, + { + title: 'Configuring the Cloud Runner / Nx CLI', + path: '/nx-cloud/reference/config', + }, + { + title: 'Environment Variables', + path: '/nx-cloud/reference/env-vars', + }, + { + title: 'Nx Cloud Server API Reference', + path: '/nx-cloud/reference/server-api', + }, + { + title: 'nx-cloud - Release notes', + path: '/nx-cloud/reference/release-notes', + }, +]; + +/** + * Asserting all the additional API references pages are accounted for and accessible. + * Generation of the pages is manual since we want to make sure the change is intended. + */ +test.describe('nx-dev: Nx Cloud section', () => { + pages.forEach((page) => assertTextOnPage(page.path, page.title)); +}); diff --git a/nx-dev/nx-dev-e2e/src/packages.spec.ts b/nx-dev/nx-dev-e2e/src/packages.spec.ts new file mode 100644 index 0000000000..811de22293 --- /dev/null +++ b/nx-dev/nx-dev-e2e/src/packages.spec.ts @@ -0,0 +1,477 @@ +import { assertTextOnPage } from './helpers'; +import { test } from '@playwright/test'; + +const pages: Array<{ title: string; path: string }> = [ + { title: '@nx/angular', path: '/packages/angular' }, + { + title: '@nx/angular:add-linting', + path: '/packages/angular/generators/add-linting', + }, + { + title: '@nx/angular:application', + path: '/packages/angular/generators/application', + }, + { + title: '@nx/angular:component', + path: '/packages/angular/generators/component', + }, + { + title: '@nx/angular:component-cypress-spec', + path: '/packages/angular/generators/component-cypress-spec', + }, + { + title: '@nx/angular:component-story', + path: '/packages/angular/generators/component-story', + }, + { + title: '@nx/angular:convert-tslint-to-eslint', + path: '/packages/angular/generators/convert-tslint-to-eslint', + }, + { title: '@nx/angular:init', path: '/packages/angular/generators/init' }, + { + title: '@nx/angular:library', + path: '/packages/angular/generators/library', + }, + { + title: '@nx/angular:library-secondary-entry-point', + path: '/packages/angular/generators/library-secondary-entry-point', + }, + { + title: '@nx/angular:remote', + path: '/packages/angular/generators/remote', + }, + { title: '@nx/angular:move', path: '/packages/angular/generators/move' }, + { + title: '@nx/angular:convert-to-with-mf', + path: '/packages/angular/generators/convert-to-with-mf', + }, + { title: '@nx/angular:host', path: '/packages/angular/generators/host' }, + { + title: '@nx/angular:ng-add', + path: '/packages/angular/generators/ng-add', + }, + { title: '@nx/angular:ngrx', path: '/packages/angular/generators/ngrx' }, + { title: '@nx/angular:scam', path: '/packages/angular/generators/scam' }, + { + title: '@nx/angular:scam-directive', + path: '/packages/angular/generators/scam-directive', + }, + { + title: '@nx/angular:scam-pipe', + path: '/packages/angular/generators/scam-pipe', + }, + { + title: '@nx/angular:setup-mf', + path: '/packages/angular/generators/setup-mf', + }, + { + title: '@nx/angular:setup-tailwind', + path: '/packages/angular/generators/setup-tailwind', + }, + { + title: '@nx/angular:stories', + path: '/packages/angular/generators/stories', + }, + { + title: '@nx/', + path: '/packages/angular/generators/storybook-configuration', + }, + { + title: '@nx/angular:web-worker', + path: '/packages/angular/generators/web-worker', + }, + { + title: '@nx/angular:delegate-build', + path: '/packages/angular/executors/delegate-build', + }, + { + title: '@nx/angular:ng-packagr-lite', + path: '/packages/angular/executors/ng-packagr-lite', + }, + { + title: '@nx/angular:package', + path: '/packages/angular/executors/package', + }, + { title: 'create-nx-plugin', path: '/packages/create-nx-plugin' }, + { + title: 'create-nx-workspace', + path: '/packages/create-nx-workspace', + }, + { title: '@nx/cypress', path: '/packages/cypress' }, + { title: '@nx/cypress:init', path: '/packages/cypress/generators/init' }, + { + title: '@nx/cypress:cypress-project', + path: '/packages/cypress/generators/cypress-project', + }, + { + title: '@nx/cypress:cypress', + path: '/packages/cypress/executors/cypress', + }, + { title: '@nx/detox', path: '/packages/detox' }, + { title: '@nx/detox:init', path: '/packages/detox/generators/init' }, + { + title: '@nx/detox:application', + path: '/packages/detox/generators/application', + }, + { title: '@nx/detox:build', path: '/packages/detox/executors/build' }, + { title: '@nx/detox:test', path: '/packages/detox/executors/test' }, + { title: '@nx/devkit', path: '/packages/devkit' }, + { title: '@nx/esbuild', path: '/packages/esbuild' }, + { + title: '@nx/esbuild:esbuild', + path: '/packages/esbuild/executors/esbuild', + }, + { title: '@nx/eslint-plugin', path: '/packages/eslint-plugin' }, + { title: '@nx/expo', path: '/packages/expo' }, + { + title: '@nx/expo:init', + path: '/packages/expo/generators/init', + }, + { + title: '@nx/expo:application', + path: '/packages/expo/generators/application', + }, + { + title: '@nx/expo:library', + path: '/packages/expo/generators/library', + }, + { + title: '@nx/expo:component', + path: '/packages/expo/generators/component', + }, + { + title: '@nx/expo:start', + path: '/packages/expo/executors/start', + }, + { + title: '@nx/expo:sync-deps', + path: '/packages/expo/executors/sync-deps', + }, + { + title: '@nx/expo:ensure-symlink', + path: '/packages/expo/executors/ensure-symlink', + }, + { title: '@nx/express', path: '/packages/express' }, + { title: '@nx/express:init', path: '/packages/express/generators/init' }, + { + title: '@nx/express:application', + path: '/packages/express/generators/application', + }, + { title: '@nx/jest', path: '/packages/jest' }, + { title: '@nx/jest:init', path: '/packages/jest/generators/init' }, + { + title: '@nx/jest:configuration', + path: '/packages/jest/generators/configuration', + }, + { title: '@nx/jest', path: '/packages/jest/executors/jest' }, + { title: '@nx/js', path: '/packages/js' }, + { title: '@nx/js:library', path: '/packages/js/generators/library' }, + { title: '@nx/js:init', path: '/packages/js/generators/init' }, + { + title: '@nx/js:convert-to-swc', + path: '/packages/js/generators/convert-to-swc', + }, + { title: '@nx/js:tsc', path: '/packages/js/executors/tsc' }, + { title: '@nx/js:swc', path: '/packages/js/executors/swc' }, + { title: '@nx/linter', path: '/packages/linter' }, + { + title: '@nx/linter:workspace-rules-project', + path: '/packages/linter/generators/workspace-rules-project', + }, + { + title: '@nx/linter', + path: '/packages/linter/generators/workspace-rule', + }, + { title: '@nx/linter', path: '/packages/linter/executors/eslint' }, + { title: '@nx/nest', path: '/packages/nest' }, + { + title: '@nx/nest:application', + path: '/packages/nest/generators/application', + }, + { + title: '@nx/nest:convert-tslint-to-eslint', + path: '/packages/nest/generators/convert-tslint-to-eslint', + }, + { title: '@nx/nest:init', path: '/packages/nest/generators/init' }, + { title: '@nx/nest:library', path: '/packages/nest/generators/library' }, + { title: '@nx/nest:class', path: '/packages/nest/generators/class' }, + { + title: '@nx/nest:controller', + path: '/packages/nest/generators/controller', + }, + { + title: '@nx/nest:decorator', + path: '/packages/nest/generators/decorator', + }, + { title: '@nx/nest:filter', path: '/packages/nest/generators/filter' }, + { title: '@nx/nest:gateway', path: '/packages/nest/generators/gateway' }, + { title: '@nx/nest:guard', path: '/packages/nest/generators/guard' }, + { + title: '@nx/nest:interceptor', + path: '/packages/nest/generators/interceptor', + }, + { + title: '@nx/nest:interface', + path: '/packages/nest/generators/interface', + }, + { + title: '@nx/nest:middleware', + path: '/packages/nest/generators/middleware', + }, + { title: '@nx/nest:module', path: '/packages/nest/generators/module' }, + { title: '@nx/nest:pipe', path: '/packages/nest/generators/pipe' }, + { + title: '@nx/nest:provider', + path: '/packages/nest/generators/provider', + }, + { + title: '@nx/nest:resolver', + path: '/packages/nest/generators/resolver', + }, + { + title: '@nx/nest:resource', + path: '/packages/nest/generators/resource', + }, + { title: '@nx/nest:service', path: '/packages/nest/generators/service' }, + { title: '@nx/next', path: '/packages/next' }, + { title: '@nx/next:init', path: '/packages/next/generators/init' }, + { + title: '@nx/next:application', + path: '/packages/next/generators/application', + }, + { title: '@nx/next:page', path: '/packages/next/generators/page' }, + { + title: '@nx/next:component', + path: '/packages/next/generators/component', + }, + { title: '@nx/next:library', path: '/packages/next/generators/library' }, + { title: '@nx/next:build', path: '/packages/next/executors/build' }, + { title: '@nx/next:server', path: '/packages/next/executors/server' }, + { title: '@nx/next:export', path: '/packages/next/executors/export' }, + { title: '@nx/node', path: '/packages/node' }, + { title: '@nx/node:init', path: '/packages/node/generators/init' }, + { + title: '@nx/node:application', + path: '/packages/node/generators/application', + }, + { title: '@nx/node:library', path: '/packages/node/generators/library' }, + { title: 'nx', path: '/packages/nx' }, + { title: 'nx:noop', path: '/packages/nx/executors/noop' }, + { + title: 'nx:run-commands', + path: '/packages/nx/executors/run-commands', + }, + { title: 'nx:run-script', path: '/packages/nx/executors/run-script' }, + { title: 'plugin', path: '/packages/plugin' }, + { + title: '@nx/plugin:plugin', + path: '/packages/plugin/generators/plugin', + }, + { + title: '@nx/plugin:e2e-project', + path: '/packages/plugin/generators/e2e-project', + }, + { + title: '@nx/plugin:migration', + path: '/packages/plugin/generators/migration', + }, + { + title: '@nx/plugin:generator', + path: '/packages/plugin/generators/generator', + }, + { + title: '@nx/plugin:executor', + path: '/packages/plugin/generators/executor', + }, + { title: '@nx/plugin:e2e', path: '/packages/plugin/executors/e2e' }, + { title: '@nx/react', path: '/packages/react' }, + { title: '@nx/react:init', path: '/packages/react/generators/init' }, + { + title: '@nx/react:application', + path: '/packages/react/generators/application', + }, + { + title: '@nx/react:library', + path: '/packages/react/generators/library', + }, + { + title: '@nx/react:component', + path: '/packages/react/generators/component', + }, + { title: '@nx/react:redux', path: '/packages/react/generators/redux' }, + { + title: '@nx/react:storybook-configuration', + path: '/packages/react/generators/storybook-configuration', + }, + { + title: '@nx/react:component-story', + path: '/packages/react/generators/component-story', + }, + { + title: '@nx/react:stories', + path: '/packages/react/generators/stories', + }, + { + title: '@nx/react:component-cypress-spec', + path: '/packages/react/generators/component-cypress-spec', + }, + { title: '@nx/react:hook', path: '/packages/react/generators/hook' }, + { title: '@nx/react:host', path: '/packages/react/generators/host' }, + { title: '@nx/react:remote', path: '/packages/react/generators/remote' }, + { + title: '@nx/react:module-federation-dev-server', + path: '/packages/react/executors/module-federation-dev-server', + }, + { title: '@nx/react-native', path: '/packages/react-native' }, + { + title: '@nx/react-native:init', + path: '/packages/react-native/generators/init', + }, + { + title: '@nx/react-native:application', + path: '/packages/react-native/generators/application', + }, + { + title: '@nx/react-native:library', + path: '/packages/react-native/generators/library', + }, + { + title: '@nx/react-native:component', + path: '/packages/react-native/generators/component', + }, + { + title: '@nx/', + path: '/packages/react-native/generators/storybook-configuration', + }, + { + title: '@nx/react-native:component-story', + path: '/packages/react-native/generators/component-story', + }, + { + title: '@nx/react-native:stories', + path: '/packages/react-native/generators/stories', + }, + { + title: '@nx/react-native:upgrade-native', + path: '/packages/react-native/generators/upgrade-native', + }, + { + title: '@nx/react-native:run-android', + path: '/packages/react-native/executors/run-android', + }, + { + title: '@nx/react-native:run-ios', + path: '/packages/react-native/executors/run-ios', + }, + { + title: '@nx/react-native:bundle', + path: '/packages/react-native/executors/bundle', + }, + { + title: '@nx/react-native:build-android', + path: '/packages/react-native/executors/build-android', + }, + { + title: '@nx/react-native:start', + path: '/packages/react-native/executors/start', + }, + { + title: '@nx/react-native:sync-deps', + path: '/packages/react-native/executors/sync-deps', + }, + { + title: '@nx/react-native:ensure-symlink', + path: '/packages/react-native/executors/ensure-symlink', + }, + { + title: '@nx/react-native:storybook', + path: '/packages/react-native/executors/storybook', + }, + { title: '@nx/storybook', path: '/packages/storybook' }, + { + title: '@nx/storybook:init', + path: '/packages/storybook/generators/init', + }, + { + title: '@nx/storybook:configuration', + path: '/packages/storybook/generators/configuration', + }, + { + title: '@nx/storybook:cypress-project', + path: '/packages/storybook/generators/cypress-project', + }, + { + title: '@nx/storybook:storybook', + path: '/packages/storybook/executors/storybook', + }, + { + title: '@nx/storybook:build', + path: '/packages/storybook/executors/build', + }, + { title: '@nx/web', path: '/packages/web' }, + { title: '@nx/web:init', path: '/packages/web/generators/init' }, + { + title: '@nx/web:application', + path: '/packages/web/generators/application', + }, + { + title: '@nx/webpack:webpack', + path: '/packages/webpack/executors/webpack', + }, + { title: '@nx/rollup:rollup', path: '/packages/rollup/executors/rollup' }, + { + title: '@nx/webpack:dev-server', + path: '/packages/webpack/executors/dev-server', + }, + { + title: '@nx/web:file-server', + path: '/packages/web/executors/file-server', + }, + { + title: '@nx/workspace:preset', + path: '/packages/workspace/generators/preset', + }, + { + title: '@nx/workspace:move', + path: '/packages/workspace/generators/move', + }, + { + title: '@nx/workspace:remove', + path: '/packages/workspace/generators/remove', + }, + { + title: '@nx/workspace:new', + path: '/packages/workspace/generators/new', + }, + { + title: '@nx/workspace:workspace-generator', + path: '/packages/workspace/generators/workspace-generator', + }, + { + title: '@nx/workspace:run-command', + path: '/packages/workspace/generators/run-commands', + }, + { + title: '@nx/workspace:fix-configuration', + path: '/packages/workspace/generators/fix-configuration', + }, + { + title: '@nx/workspace:npm-package', + path: '/packages/workspace/generators/npm-package', + }, + { + title: '@nx/workspace:ci-workflow', + path: '/packages/workspace/generators/ci-workflow', + }, + { + title: '@nx/workspace:counter', + path: '/packages/workspace/executors/counter', + }, +]; +/** + * Asserting all the packages pages are accounted for and accessible. + * Generation of the pages is manual since we want to make sure the change is intended. + */ +test.describe('nx-dev: Packages Section', () => { + pages.forEach((page) => assertTextOnPage(page.path, page.title)); +}); diff --git a/nx-dev/nx-dev-e2e/src/recipes.spec.ts b/nx-dev/nx-dev-e2e/src/recipes.spec.ts new file mode 100644 index 0000000000..d31c200670 --- /dev/null +++ b/nx-dev/nx-dev-e2e/src/recipes.spec.ts @@ -0,0 +1,18 @@ +import { test, expect } from '@playwright/test'; + +test.describe('nx-dev: Recipes pages', () => { + test('should list related recipes based on tags', async ({ page }) => { + await page.goto('/recipes/other/deno-deploy'); + const relatedDocs = page.locator( + '[data-document="related"] > article > ul > li' + ); + const relatedDocsText = await relatedDocs.allInnerTexts(); + expect(relatedDocsText.length, 'has related docs').toBeGreaterThan(0); + + // All text content has to be different + const distinct = new Set(relatedDocsText); + expect(distinct.size, 'all strings are different').toBe( + relatedDocsText.length + ); + }); +}); diff --git a/nx-dev/nx-dev-e2e/src/support/commands.ts b/nx-dev/nx-dev-e2e/src/support/commands.ts deleted file mode 100644 index 11e5f772fa..0000000000 --- a/nx-dev/nx-dev-e2e/src/support/commands.ts +++ /dev/null @@ -1,8 +0,0 @@ -// *********************************************** -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** - -// eslint-disable-next-line @typescript-eslint/no-namespace -declare namespace Cypress {} diff --git a/nx-dev/nx-dev-e2e/src/support/e2e.ts b/nx-dev/nx-dev-e2e/src/support/e2e.ts deleted file mode 100644 index 3d469a6b6c..0000000000 --- a/nx-dev/nx-dev-e2e/src/support/e2e.ts +++ /dev/null @@ -1,17 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands'; diff --git a/nx-dev/nx-dev-e2e/tsconfig.json b/nx-dev/nx-dev-e2e/tsconfig.json deleted file mode 100644 index b578da517a..0000000000 --- a/nx-dev/nx-dev-e2e/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "sourceMap": false, - "outDir": "../dist/out-tsc", - "allowJs": true, - "types": ["cypress", "node"] - }, - "include": ["src/**/*.ts", "src/**/*.js", "cypress.config.ts"] -} diff --git a/nx-dev/nx-dev/project.json b/nx-dev/nx-dev/project.json index f4cabe57ca..3da429313b 100644 --- a/nx-dev/nx-dev/project.json +++ b/nx-dev/nx-dev/project.json @@ -22,9 +22,8 @@ }, "sitemap": { "executor": "nx:run-commands", - "outputs": ["{options.outputPath}"], + "outputs": ["{workspaceRoot}/dist/nx-dev/nx-dev/public"], "options": { - "outputPath": "dist/nx-dev/nx-dev/public", "command": "pnpm next-sitemap --config ./nx-dev/nx-dev/next-sitemap.config.js" } }, diff --git a/package.json b/package.json index af24cde847..2dd0623902 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "@nx/js": "16.7.0-rc.1", "@nx/linter": "16.7.0-rc.1", "@nx/next": "16.7.0-rc.1", + "@nx/playwright": "16.7.0-rc.1", "@nx/react": "16.7.0-rc.1", "@nx/storybook": "16.7.0-rc.1", "@nx/web": "16.7.0-rc.1", @@ -166,6 +167,7 @@ "eslint-plugin-cypress": "2.14.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-jsx-a11y": "6.6.1", + "eslint-plugin-playwright": "^0.15.3", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-storybook": "^0.6.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd2aa0b9dd..c2d5bd34c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: minimist: ^1.2.6 underscore: ^1.12.1 @@ -301,6 +297,9 @@ devDependencies: '@nx/next': specifier: 16.7.0-rc.1 version: 16.7.0-rc.1(@babel/core@7.22.9)(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(eslint@8.46.0)(file-loader@6.2.0)(next@13.3.4)(nx@16.7.0-rc.1)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) + '@nx/playwright': + specifier: 16.7.0-rc.1 + version: 16.7.0-rc.1(@playwright/test@1.36.1)(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(eslint@8.46.0)(nx@16.7.0-rc.1)(typescript@5.1.3)(verdaccio@5.15.4) '@nx/react': specifier: 16.7.0-rc.1 version: 16.7.0-rc.1(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(eslint@8.46.0)(nx@16.7.0-rc.1)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0) @@ -577,6 +576,9 @@ devDependencies: eslint-plugin-jsx-a11y: specifier: 6.6.1 version: 6.6.1(eslint@8.46.0) + eslint-plugin-playwright: + specifier: ^0.15.3 + version: 0.15.3(eslint@8.46.0) eslint-plugin-react: specifier: 7.31.11 version: 7.31.11(eslint@8.46.0) @@ -3527,7 +3529,6 @@ packages: /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - requiresBuild: true dev: false optional: true @@ -6110,42 +6111,6 @@ packages: - typescript dev: true - /@nrwl/js@15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(nx@15.8.0)(prettier@2.7.1)(typescript@5.1.3): - resolution: {integrity: sha512-l2Q7oFpzx6ul7G0nKpMkrvnIEaOY+X8fc2g2Db5WqpnnBdfkrtWXZPg/O4DQ1p9O6BXrZ+Q2AK9bfgnliiwyEg==} - dependencies: - '@babel/core': 7.22.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.22.9) - '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) - '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/preset-typescript': 7.22.5(@babel/core@7.22.9) - '@babel/runtime': 7.22.6 - '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.1.3) - '@nrwl/workspace': 15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(eslint@8.46.0)(prettier@2.7.1)(typescript@5.1.3) - '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) - babel-plugin-const-enum: 1.2.0(@babel/core@7.22.9) - babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.22.9) - chalk: 4.1.2 - fast-glob: 3.2.7 - fs-extra: 11.1.1 - ignore: 5.2.0 - js-tokens: 4.0.0 - minimatch: 3.0.5 - source-map-support: 0.5.19 - tree-kill: 1.2.2 - tslib: 2.6.1 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - prettier - - supports-color - - typescript - dev: true - /@nrwl/js@16.7.0-rc.1(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(nx@16.7.0-rc.1)(typescript@5.1.3)(verdaccio@5.15.4): resolution: {integrity: sha512-lEHp1o1KRfXWwK8SVRvCVHU6Am58UXb8XqgOvx/wO/0CHUqTg9JopZ0zlF6+58eeRubVZCEVsZDUeQwAFVMq8w==} dependencies: @@ -6172,7 +6137,7 @@ packages: optional: true dependencies: '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.1.3) - '@nrwl/js': 15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(nx@15.8.0)(prettier@2.7.1)(typescript@5.1.3) + '@nrwl/js': 15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(eslint@8.46.0)(nx@16.7.0-rc.1)(prettier@2.7.1)(typescript@5.1.3) '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) eslint: 8.46.0 tmp: 0.2.1 @@ -7005,6 +6970,32 @@ packages: dev: true optional: true + /@nx/playwright@16.7.0-rc.1(@playwright/test@1.36.1)(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(eslint@8.46.0)(nx@16.7.0-rc.1)(typescript@5.1.3)(verdaccio@5.15.4): + resolution: {integrity: sha512-k8IV2/GyvWNuWnHNE9e4r57N2oxk7ZlnlZUg7x/xBSxghQh1WLlk+Qes1jnD3QLnZyC7BR61sF1RF8E4+ZkHjg==} + peerDependencies: + '@playwright/test': ^1.36.0 + peerDependenciesMeta: + '@playwright/test': + optional: true + dependencies: + '@nx/devkit': 16.7.0-rc.1(nx@16.7.0-rc.1) + '@nx/linter': 16.7.0-rc.1(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(eslint@8.46.0)(nx@16.7.0-rc.1)(typescript@5.1.3)(verdaccio@5.15.4) + '@playwright/test': 1.36.1 + tslib: 2.6.1 + transitivePeerDependencies: + - '@babel/traverse' + - '@swc-node/register' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - debug + - eslint + - nx + - supports-color + - typescript + - verdaccio + dev: true + /@nx/react@16.7.0-rc.1(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(eslint@8.46.0)(nx@16.7.0-rc.1)(typescript@5.1.3)(verdaccio@5.15.4)(webpack@5.88.0): resolution: {integrity: sha512-NdHFv1+w/B7+6hGX+ZVyjdy6MVYrPapfb+Va6iarPZLfkzsvSJWR9jAJEHU9PCKOucJ+OS1yZaa67EVwYpy35w==} dependencies: @@ -10295,7 +10286,6 @@ packages: /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} - requiresBuild: true dev: false optional: true @@ -10327,7 +10317,6 @@ packages: /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} - requiresBuild: true dev: false optional: true @@ -15551,6 +15540,18 @@ packages: semver: 6.3.0 dev: true + /eslint-plugin-playwright@0.15.3(eslint@8.46.0): + resolution: {integrity: sha512-LQMW5y0DLK5Fnpya7JR1oAYL2/7Y9wDiYw6VZqlKqcRGSgjbVKNqxraphk7ra1U3Bb5EK444xMgUlQPbMg2M1g==} + peerDependencies: + eslint: '>=7' + eslint-plugin-jest: '>=25' + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + dependencies: + eslint: 8.46.0 + dev: true + /eslint-plugin-react-hooks@4.6.0(eslint@8.46.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -23766,7 +23767,6 @@ packages: /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true optional: true /pseudomap@1.0.2: @@ -28854,3 +28854,7 @@ packages: name: tiny-invariant version: 1.3.1 dev: true + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false