Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 315c766466 | |||
| d96ce5bf89 | |||
| 4a1737b237 | |||
| 5da14f4dc4 | |||
| a4f7b96708 | |||
| 7c72733c8c | |||
| e194a00bd3 | |||
| 5336aa0725 | |||
| b50c8dbe8c | |||
| 7aca936f40 | |||
| aa3d1d821f | |||
| 7284babfcb | |||
| ed350a4088 | |||
| c8620d1853 | |||
| b61be19477 | |||
| 7e326e5352 | |||
| 7f69f278d8 | |||
| c5f658b95d | |||
| 8fac5d79da | |||
| c3ed7f9f5d | |||
| e337cb6de7 | |||
| d082cd1610 | |||
| fef174f509 | |||
| a6a81cfc33 | |||
| a45cdd6f55 | |||
| c0da413fb8 | |||
| 7fc8a62880 | |||
| 88c2529dbc | |||
| c41de4b383 | |||
| 84ed1d728e | |||
| f371a6e217 | |||
| 8d0f277520 | |||
| 6cb2af4e6f | |||
| f808ea86b0 | |||
| a714301ad0 | |||
| d59e8cc6af | |||
| 10405bcfe9 | |||
| 07c07e4e86 | |||
| 7325b9ce28 | |||
| c83dd29c3c | |||
| 399ee5b3bd | |||
| 6f9e1477d4 | |||
| 1e39ba671f | |||
| 7ead9a022f | |||
| 99cfc14893 | |||
| aa7b2b011d | |||
| 245bed7a07 | |||
| e47b45b958 | |||
| 69ec3796fe | |||
| 145fe01e3d | |||
| afe0cecb1e | |||
| 485090572c | |||
| e8ce99d234 | |||
| 46eac466de | |||
| c006e90f97 | |||
| c3f401ceda | |||
| 85bed15280 | |||
| 74777a1754 | |||
| 11fe2a700e | |||
| 926ade4270 | |||
| 7231561c92 | |||
| e458ecf2b1 | |||
| 371d20446f | |||
| 392d72e00d |
@@ -1,6 +1,7 @@
|
||||
name: 🐞 Bug Report
|
||||
description: This form is to report unexpected behavior in Nx.
|
||||
labels: ["type: bug"]
|
||||
type: Bug
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
|
||||
@@ -8,25 +8,21 @@ on:
|
||||
permissions: {}
|
||||
jobs:
|
||||
audit:
|
||||
if: ${{ github.repository_owner == 'nrwl' }}
|
||||
permissions:
|
||||
contents: read # to fetch code (actions/checkout)
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install PNPM
|
||||
run: |
|
||||
npm install -g @pnpm/exe@8
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 9.8.0 # Aligned with root package.json (pnpm/action-setup will helpfully error if out of sync)
|
||||
|
||||
- name: Run a security audit
|
||||
run: pnpm dlx audit-ci --critical --report-type summary
|
||||
|
||||
# - name: Run Dependency confusion supply chain check
|
||||
# run: npx snync -d .
|
||||
|
||||
report:
|
||||
if: ${{ always() && github.repository_owner == 'nrwl' && github.event_name != 'workflow_dispatch' }}
|
||||
needs: audit
|
||||
|
||||
@@ -79,12 +79,14 @@ rust-toolchain @nrwl/nx-native-reviewers
|
||||
/docs/generated/packages/js/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/generated/packages/web/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/generated/packages/webpack/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/generated/packages/rspack/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/generated/packages/esbuild/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/generated/packages/rollup/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/generated/packages/vite/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/shared/packages/js/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/shared/packages/web/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/shared/packages/webpack/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/shared/packages/rspack/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/shared/packages/esbuild/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/docs/shared/packages/vite/** @nrwl/nx-js-reviewers @nrwl/nx-docs-reviewers
|
||||
/packages/js/** @nrwl/nx-js-reviewers
|
||||
@@ -94,6 +96,9 @@ rust-toolchain @nrwl/nx-native-reviewers
|
||||
/packages/webpack/** @nrwl/nx-js-reviewers
|
||||
/packages/webpack/src/utils/module-federation @jaysoo @Coly010
|
||||
/e2e/webpack/** @nrwl/nx-js-reviewers
|
||||
/packages/rspack/** @nrwl/nx-js-reviewers
|
||||
/packages/rspack/src/utils/module-federation @jaysoo @Coly010
|
||||
/e2e/rspack/** @nrwl/nx-js-reviewers
|
||||
/packages/esbuild/** @nrwl/nx-js-reviewers
|
||||
/e2e/esbuild/** @nrwl/nx-js-reviewers
|
||||
/packages/rollup/** @nrwl/nx-js-reviewers
|
||||
|
||||
@@ -290,6 +290,15 @@ version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "ci_info"
|
||||
version = "0.14.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "840dbb7bdd1f2c4d434d6b08420ef204e0bfad0ab31a07a80a1248d24cc6e38b"
|
||||
dependencies = [
|
||||
"envmnt",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clang-sys"
|
||||
version = "1.8.1"
|
||||
@@ -460,6 +469,16 @@ version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
|
||||
|
||||
[[package]]
|
||||
name = "envmnt"
|
||||
version = "0.10.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d73999a2b8871e74c8b8bc23759ee9f3d85011b24fafc91a4b3b5c8cc8185501"
|
||||
dependencies = [
|
||||
"fsio",
|
||||
"indexmap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.8"
|
||||
@@ -545,6 +564,16 @@ dependencies = [
|
||||
"syn 2.0.53",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fs4"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec6fcfb3c0c1d71612528825042261419d5dade9678c39a781e05b63677d9b32"
|
||||
dependencies = [
|
||||
"rustix",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fs_extra"
|
||||
version = "1.3.0"
|
||||
@@ -560,6 +589,15 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fsio"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dad0ce30be0cc441b325c5d705c8b613a0ca0d92b6a8953d41bd236dc09a36d0"
|
||||
dependencies = [
|
||||
"dunce",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "funty"
|
||||
version = "2.0.0"
|
||||
@@ -1030,6 +1068,16 @@ dependencies = [
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"hashbrown 0.12.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "inotify"
|
||||
version = "0.9.6"
|
||||
@@ -1467,11 +1515,13 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"assert_fs",
|
||||
"ci_info",
|
||||
"colored",
|
||||
"crossbeam-channel",
|
||||
"crossterm",
|
||||
"dashmap",
|
||||
"dunce",
|
||||
"fs4",
|
||||
"fs_extra",
|
||||
"globset",
|
||||
"hashbrown 0.14.5",
|
||||
|
||||
@@ -61,13 +61,13 @@ Tasks can fail:
|
||||
Let’s see how varying a few parameters affects the probability of the CI execution failing.
|
||||
|
||||
| Number of VMS | Avg Tests per VM | Flaky Test Probability | Slow Test Probability | Broken CI Builds (Flaky) | Slow CI Builds |
|
||||
| ------------- | ---------------- | ---------------------- | --------------------- | ------------------------ | -------------- |
|
||||
| 5 | 10 | 0.1% | 0.3% | 5% | 15% |
|
||||
| 10 | 10 | 0.1% | 0.3% | 10% | 26% |
|
||||
| 50 | 10 | 0.1% | 0.3% | 39% | 78% |
|
||||
| 5 | 10 | 0.5% | 1% | 23% | 41% |
|
||||
| 10 | 10 | 0.5% | 1% | 40% | 65% |
|
||||
| 50 | 10 | 0.5% | 1% | 92% | 99% |
|
||||
| :-----------: | :--------------: | :--------------------: | :-------------------: | :----------------------: | :------------: |
|
||||
| 5 | 10 | 0.1% | 0.3% | 5% | 15% |
|
||||
| 10 | 10 | 0.1% | 0.3% | 10% | 26% |
|
||||
| 50 | 10 | 0.1% | 0.3% | 39% | 78% |
|
||||
| 5 | 10 | 0.5% | 1% | 23% | 41% |
|
||||
| 10 | 10 | 0.5% | 1% | 40% | 65% |
|
||||
| 50 | 10 | 0.5% | 1% | 92% | 99% |
|
||||
|
||||
**The result is much worse than most intuitively expect.** For instance, assuming that an **e2e test has 1 in 1000 chance (0.1%) of failing** for a flaky reason, when the number of e2e tests reaches 500, **the probability of the CI failing for a flaky reason reaches 39%**, and the vast majority of CI executions are slowed down. Note, this is an exceptionally stable test suite. The bottom part of the table is more representative of a typical e2e suite, and the CI becomes “broken” at a much smaller scale.
|
||||
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
---
|
||||
title: Better security with Personal Access Tokens
|
||||
slug: personal-access-tokens
|
||||
authors: ['Philip Fulcher']
|
||||
tags: [nx-cloud]
|
||||
cover_image: /blog/images/2024-09-05/personal-access-tokens-header.avif
|
||||
---
|
||||
|
||||
Today, Nx Cloud gets a huge upgrade to managing access to your cached artifacts
|
||||
using [Nx Replay](/ci/features/remote-cache). Previously, workspaces
|
||||
were limited to defining access tokens with read or read/write permissions for an entire workspace. With the
|
||||
introduction of _personal access tokens_, you gain much more control over access. This is a feature request we've heard
|
||||
from many customers, especially our [Enterprise](/enterprise) customers, and we're happy to be able to deliver this
|
||||
enhancement.
|
||||
|
||||
## Access Tokens and the problem of revoking access
|
||||
|
||||
Our previous implementation of access tokens required you to commit the access token to your `nx.json` file. Typically,
|
||||
service providers don't recommend committing any kind of API token like this, and we've fielded a lot of questions about
|
||||
this practice in the past. It is safe to commit this token, as access to the cached artifacts of Nx Cloud rely on both
|
||||
the access token and the source code itself. Without access to both, you can't access the cache.
|
||||
|
||||
However, this did present the following problem: revoking someone's access to the cache became difficult as long as they
|
||||
had the source code. Imagine a scenario where someone has left an organization. As long as they have a clone of the
|
||||
repo, they have everything they need to access the cache, even if their credentials have been
|
||||
revoked. To fully revoke
|
||||
their access would require cycling the access token, which could interrupt the work of other developers and CI
|
||||
pipelines.
|
||||
|
||||
## Access Tokens become CI Access Tokens
|
||||
|
||||
What we previously called "access tokens" will now be called "[CI access tokens](/ci/recipes/security/access-tokens)."
|
||||
They are still defined at the workspace
|
||||
level, but are designed for use in CI. These tokens should be set as environment variables or secrets on your CI
|
||||
platform so that they're no longer committed to your repo.
|
||||
|
||||
## What are personal access tokens?
|
||||
|
||||
[Personal access tokens](/ci/recipes/security/personal-access-tokens) are a new type of access token that is scoped to
|
||||
an individual user. This means that this token lives and dies with that member's access to your Nx Cloud workspace.
|
||||
Users must log in to Nx Cloud and they are a member of a workspace before a personal access token can be created.
|
||||
Once created, we validate that token for access each time you use the distributed cache. As soon as a user loses access,
|
||||
the personal access token no
|
||||
longer works, and access to the cache is removed.
|
||||
|
||||
This gets even more powerful when combined with the GitHub VCS integration. When a user's GitHub access is removed from
|
||||
a GitHub-connected organization, their access to Nx Cloud is removed, and their personal access token is invalidated.
|
||||
This means that Nx Cloud can fit into existing user de-provisioning processes you already have.
|
||||
|
||||
Open source teams also benefit from personal access tokens. You can configure your access to allow anonymous users to
|
||||
read from the cache, but limit read/write access to core contributors.
|
||||
|
||||
## Controlling default access
|
||||
|
||||

|
||||
|
||||
By default, a workspace that opts in to personal access tokens will allow anonymous users (users without a personal
|
||||
access token defined) read-only access. This can be changed to disallow access to the cache for anonymous users
|
||||
in your workspace settings.
|
||||
|
||||
Users with personal access tokens will have read-only access to the cache. This can be changed to enable read-write
|
||||
access in the workspace settings.
|
||||
|
||||
## Converting existing workspaces to use personal access tokens
|
||||
|
||||
Personal access tokens can be enabled with _Nx versions 13+_. These steps will get you started, but you
|
||||
can [find more details in our docs](/ci/recipes/security/personal-access-tokens).
|
||||
|
||||
1. **Convert to using `nxCloudId` by running `npx nx-cloud convert-to-nx-cloud-id`** - Previously, your `nx.json` had a
|
||||
CI
|
||||
access token defined in the `nxCloudAccessToken` property. This command will replace that with `nxCloudId`, a generic
|
||||
id that references your workspace but no longer provides access to the cache.
|
||||
2. **Generate a personal access token by running `npx nx-cloud login`** - Follow the directions in your terminal to log
|
||||
in
|
||||
to Nx Cloud. Each contributor with access to the workspace will need to complete this step.
|
||||
3. **Move CI access tokens to environment variables** - Now that the access token is no longer committed to your
|
||||
`nx.json`,
|
||||
you'll need to provide that CI access token via the
|
||||
`NX_CLOUD_ACCESS_TOKEN` [environment variable](/ci/reference/env-vars#nxcloudaccesstoken).
|
||||
4. **_Optional_ Disable anonymous access** - By default, anyone without a personal access token will have read-only
|
||||
access
|
||||
to your cached artifacts. Once everyone has a personal access token defined, you can disable this anonymous access in
|
||||
your Nx Cloud workspace settings.
|
||||
|
||||
[Learn more about using personal access tokens](/ci/recipes/security/personal-access-tokens)
|
||||
|
||||
## Learn more
|
||||
|
||||
- [Nx Docs](/getting-started/intro)
|
||||
- [Nx Cloud Cache Security](/ci/concepts/cache-security)
|
||||
- [Nx Cloud Personal Access Tokens](/ci/recipes/security/personal-access-tokens)
|
||||
- [Nx Cloud CI Access Tokens](/ci/recipes/security/access-tokens)
|
||||
- [X/Twitter](https://twitter.com/nxdevtools) -- [LinkedIn](https://www.linkedin.com/company/nrwl/)
|
||||
- [Nx GitHub](https://github.com/nrwl/nx)
|
||||
- [Nx Official Discord Server](https://go.nx.dev/community)
|
||||
- [Nx Youtube Channel](https://www.youtube.com/@nxdevtools)
|
||||
- [Speed up your CI](https://nx.app/)
|
||||
@@ -6,6 +6,12 @@ tags: [nx, release]
|
||||
cover_image: /blog/images/evolving-nx/thumbnail.png
|
||||
---
|
||||
|
||||
_Update from Jeff Cross, October 17, 2024_
|
||||
|
||||
In my original version of this post, I said that Powerpack is completely new functionality. I mistakenly thought that all custom remote cache solutions were using private/unsupported APIs, but I've since learned that we've had docs and some APIs that helped people build their own remote caches. I'm sorry for the error, and have updated the text to indicate that Powerpack is mostly new functionality. We've also updated the [Powerpack page](/powerpack) to make it more explicit how some teams can get free Powerpack licenses.
|
||||
|
||||
---
|
||||
|
||||
Over the years, Nx has grown from a small 20% side project of our consulting business into a tool that empowers millions of developers worldwide and helps Fortune 500 companies ship high-quality software faster. In the last two years, we successfully transformed our consulting business into a product company, where our team can fully focus on evolving Nx and building Nx Cloud to extend Nx’s capabilities beyond local development.
|
||||
|
||||
This success is in large part thanks to:
|
||||
@@ -21,7 +27,7 @@ When we have new ideas to make Nx better, we’ve always had two options: it cou
|
||||
|
||||
> If you want to get into the technical details, we wrote a separate blog post diving deeper into the technical details: [Introducing Nx Powerpack](/blog/introducing-nx-powerpack).
|
||||
|
||||
Everything in Powerpack is new functionality, not previously free features that we’re now putting behind a paywall. However, this change coincides with some Nx improvements that will eventually interfere with users who were relying on our original filesystem-based implementation of local caching. We’ve completely rewritten Nx's local caching to be faster and more secure, partly by using a local database instead of checking the filesystem for artifact metadata. With this rewrite, any custom remote caches that rely on metadata reflected in the filesystem will not work as of Nx 21. This is why we decided to build an API into Powerpack to be able to connect Nx’s cache to different clouds and data sources. Now with Powerpack, teams can use an officially-supported implementation of remote caching, without needing to use Nx Cloud.
|
||||
Powerpack is mostly new functionality. However, this change coincides with some Nx improvements that will eventually interfere with users who were relying on our original filesystem-based implementation of local caching. We’ve completely rewritten Nx's local caching to be faster and more secure, partly by using a local database instead of checking the filesystem for artifact metadata. With this rewrite, any custom remote caches that rely on metadata reflected in the filesystem will not work as of Nx 21. This is why we decided to build an API into Powerpack to be able to connect Nx’s cache to different clouds and data sources. Now with Powerpack, teams can use an officially-supported implementation of remote caching, without needing to use Nx Cloud.
|
||||
|
||||
There’s a Steve Jobs quote that I think rings true with all of us at Nx:
|
||||
|
||||
@@ -45,7 +51,7 @@ Are you a startup? If these features make sense for your team but the cost is a
|
||||
|
||||
## Got Questions?
|
||||
|
||||
If you’re curious to learn more about these changes for Nx and how to get started, [check out our docs](/features/powerpack).
|
||||
If you’re curious to learn more about these changes for Nx and how to get started, [check out our docs](/nx-enterprise/powerpack).
|
||||
|
||||
## Learn more
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ A dedicated `nx sync` command automatically synchronizes these definitions to a
|
||||
...
|
||||
```
|
||||
|
||||
Read all about how to [configure Codeowners for your project in our docs](/features/powerpack/owners).
|
||||
Read all about how to [configure Codeowners for your project in our docs](/nx-enterprise/powerpack/owners).
|
||||
|
||||
## Self-hosted Cache Storage
|
||||
|
||||
@@ -178,7 +178,7 @@ jobs:
|
||||
|
||||
Similarly you can **set up network file based caching** using the `nx add @nx/powerpack-shared-fs-cache` package and by setting the `cacheDirectory` path in your `nx.json`.
|
||||
|
||||
Read all about how to [set up S3 or network drive based caching for your Nx workspace in our docs](/features/powerpack/custom-caching).
|
||||
Read all about how to [set up S3 or network drive based caching for your Nx workspace in our docs](/nx-enterprise/powerpack/custom-caching).
|
||||
|
||||
## Workspace Conformance (Beta)
|
||||
|
||||
@@ -245,7 +245,7 @@ You can then run `nx conformance` to execute the conformance checks:
|
||||
|
||||
In this first preview release, you'll only be able to run workspace conformance rules on a single workspace. In future iterations, you **will be able to connect it to your existing Nx Cloud organization**, allowing you to upload conformance rules and run them across connected workspaces.
|
||||
|
||||
Read all the details on how to [get started with workspace conformance rules in our docs](/features/powerpack/conformance).
|
||||
Read all the details on how to [get started with workspace conformance rules in our docs](/nx-enterprise/powerpack/conformance).
|
||||
|
||||
## Learn More
|
||||
|
||||
|
||||
@@ -6,7 +6,15 @@ tags: [nx, release]
|
||||
cover_image: /blog/images/2024-10-03/nx-20-header.png
|
||||
---
|
||||
|
||||
I know it's hard to believe but Nx 20 is here! There's a lot to cover in this release, so let's just dive right in.
|
||||
I know it's hard to believe but Nx 20 is here! There's a lot of great updates in this release, but look back at some of the major features from Nx 19:
|
||||
|
||||
- Added [`nx import`][nx-import] to import existing external projects, more on that below.
|
||||
- Added a [generator][crystalize-command] to convert all your Nx Plugins to use inferred tasks.
|
||||
- Moved to [rspack][nx-rspack] as the default bundler for Module Federation
|
||||
- Added [file-based versioning][file-based-versioning] for Nx Release
|
||||
- Created a new [plugin for Gradle][nx-gradle] and support for [task atomization][gradle-atomizer]
|
||||
|
||||
With Nx 20 we're keeping the momentum going and bringing some quality improvements to the overall monorepo experience as well as a boost in speed for TypeScript projects.
|
||||
|
||||
## `@nx` All The Things!
|
||||
|
||||
@@ -14,27 +22,32 @@ If you've been around the Nx ecosystem for any amount of time, you're probably a
|
||||
|
||||
## TypeScript Project References For Monorepos
|
||||
|
||||
[**Project References**](https://www.typescriptlang.org/docs/handbook/project-references.html) allows TypeScript to process individual projects rather than the entire monorepo as whole. This is a huge improvement in terms of build times and developer experience. However, Project References comes with a maintenance cost, as it is up to you to update these references. In a large monorepo, this cost is prohibitive.
|
||||
[**Project References**](https://www.typescriptlang.org/docs/handbook/project-references.html) allows TypeScript to process individual projects rather than the entire monorepo as a whole. This is a huge improvement in terms of build times and developer experience. However, Project References comes with a maintenance cost, as it is up to you to update these references. In a large monorepo, this cost is prohibitive.
|
||||
|
||||
With Nx 20, when using `create-nx-workspace --preset=ts`, workspaces will use Project References out of the box. Nx removes the maintenance cost of this feature by automatically updating the references for you when you run `build` or `typecheck` targets. You can also run [`nx sync`](/reference/nx-commands#sync) to update references, and `nx sync:check` in CI to validate the workspace.
|
||||
With Nx 20, when using `create-nx-workspace --preset=ts`, workspaces will use Project References out of the box. Nx removes the maintenance cost of this feature by automatically updating the references for you when you run `build` or `typecheck` targets. You can also run [`nx sync`](/reference/nx-commands#sync) to update project references in your `tsconfig.json`, and `nx sync:check` in CI to validate the workspace.
|
||||
|
||||
In addition to adopting Project References, we're also changing the way we link projects in a TypeScript monorepos. **Workspaces** is the standard way to link packages in monorepos. This is a feature that all modern package managers support, such as [npm](https://docs.npmjs.com/cli/using-npm/workspaces), [yarn](https://yarnpkg.com/features/workspaces), [pnpm](https://pnpm.io/workspaces), and [bun](https://bun.sh/docs/install/workspaces), so taking advantage of it is a no-brainer. Now we have a proper way to provide type information and have your packages available in a way developers are used to.
|
||||
In addition to adopting Project References, we're also changing the way we link projects in a TypeScript monorepos. **Workspaces** is the standard way to link packages in monorepos. This is a feature that all modern package managers support, such as [npm](https://docs.npmjs.com/cli/using-npm/workspaces), [yarn](https://yarnpkg.com/features/workspaces), [pnpm](https://pnpm.io/workspaces), and [bun](https://bun.sh/docs/install/workspaces), where you can declare a `workspace` key in your `package.json` and provide it an array of paths. Then on install, your package manager will traverse any directories that it finds in the workspaces key, and link them to your `node-modules`. This built in feature provides a much more standard way of connecting your packages in a monorepo that it’s a no-brainer. Now we have a proper way to provide type information and have your packages available in a way developers are used to.
|
||||
|
||||
Note that we've enabled Project References and Workspaces for the TS preset (i.e. `--preset=ts`), and we're working on extending this support for all other presets soon (Angular, React, Vue, Node). If you are an existing Nx user and want to create an empty workspace in the previous "integrated" style, you can use `create-nx-workspace --preset=apps`.
|
||||
|
||||
## `@nx/rspack` Graduates From Labs 🎓
|
||||
|
||||
[Rspack][rspack] has become one of the most exciting new bundlers in recent years. With a webpack-compatible API, it's a painless migration for folks who want faster builds without having to rewrite their entire build process. At Nx, we're big fans of Rspack and have been working on a plugin for folks who would like to migrate. With that in mind, the `@nx/rspack` plugin has officially been merged into the main Nx repository and will become a fully supported plugin for the ecosystem.
|
||||
[Rspack][rspack] has become one of the most exciting new bundlers in recent years. With a webpack-compatible API, it's a painless migration for folks who want faster builds without having to rewrite their entire build process. At Nx, we're big fans of Rspack and have been working on a plugin for folks who would like to migrate. With that in mind, the `@nx/rspack` plugin has officially been merged into the main Nx repository and will become a fully supported plugin for the ecosystem. Want to learn more about Rspac in general? Check out our recent live stream where we deep dive into how to use Rspack and cover it’s involvement with module federation.
|
||||
|
||||
{% youtube
|
||||
src="https://www.youtube.com/watch?v=_c4zjYm0pYE"
|
||||
title="Nx Live | Rspack"
|
||||
/%}
|
||||
|
||||
In addition to this, Nx core team member [Colum Ferry][colum] has taken the work he's done on the Rspack plugin and brought it to the Angular ecosystem! He's recently released `@ng-rspack/nx` to bring Rspack support to your Angular projects. Simply install the plugin and generate a new app in your workspace to try it out!
|
||||
|
||||
```bash
|
||||
```shell
|
||||
# In an Nx Workspace (npx create-nx-workspace)
|
||||
# Install Package
|
||||
npm install @ng-rspack/nx
|
||||
|
||||
# Run the app generator
|
||||
npx nx g @ng-rspack/nx: app apps/myapp
|
||||
npx nx g @ng-rspack/nx:app apps/myapp
|
||||
|
||||
# Serve the app
|
||||
npx nx serve myapp
|
||||
@@ -46,6 +59,19 @@ npx nx build myapp
|
||||
npx nx e2e myapp-e2e
|
||||
```
|
||||
|
||||
## ESLint v9 Updates
|
||||
|
||||
In [Nx 19.8](/blog/nx-19-8-update#new-nx-workspaces-created-with-eslint-v9), we highlighted that workspaces will now be created with [`eslint`](https://www.npmjs.com/package/eslint) v9, and [`typescript-eslint`](https://www.npmjs.com/package/typescript-eslint) v8.
|
||||
|
||||
This not only brings us inline with the latest version of eslint and typescript-eslint, but also that [flat config](https://eslint.org/docs/latest/use/configure/migration-guide) is only supported moving forward. Nx users should migrate to this new config format using [our flat config generator](/recipes/tips-n-tricks/flat-config#switching-to-eslints-flat-config-format).
|
||||
|
||||
For more on eslint's flat config, and how to use our generator to get to flat config checkout this video:
|
||||
|
||||
{% youtube
|
||||
src="https://www.youtube.com/watch?v=32XH909CZrY"
|
||||
title="ESLint Config Automation With Nx"
|
||||
/%}
|
||||
|
||||
## Nx Release: More Powerful And Flexible Versioning
|
||||
|
||||
`nx release` has added many powerful versioning capabilities since it was first made public as part of Nx 19. We are super excited about an in progress ground-up reworking of our versioning logic that powers `nx release` and the programmatic API `releaseVersion()` that will continue to support all these features, and allow for even more complex and large scale workspaces to be supported.
|
||||
@@ -56,6 +82,26 @@ Additionally, for workspaces that contain multiple different programming languag
|
||||
|
||||
The Nx Team provides the JavaScript version generator out of the box, so for many users, this is not a concern. But for those working with Go, Rust, Dotnet, Java etc, currently a lot of logic needs to be reimplemented and kept up to date with the latest features. In the upcoming versioning rework, the abstraction required for each new language/ecosystem is tiny and purely deals with interacting with the relevant manifest file and registry, if applicable. All feature capabilities are maintained on the Nx core side. Once this new versioning implementation is available in an Nx v20 minor release we will update our documentation to provide guidance on how to opt in, before it ultimately becomes the primary implementation in Nx v21.
|
||||
|
||||
## Importing Existing Projects
|
||||
|
||||
Another important feature worth highlighting with Nx 20 is the ability to import external projects and add them to your Nx workspace with `nx import`. Not only does `nx import` ease the process of consolidating separate projects into one monorepo, it also maintains that original projects git history. Now you have the full historical context of that particular project. In addition to just being able to bring in external projects, `nx import` will also analyze the project and provide recommended Nx plugins to be added to your workspace. So if you're importing a Vite project that also has ESLint, `nx import` will detect the config files and suggest installing them into your workspace. So not only is migrating to a monorepo simpler, you can keep your existing tool chain and keep working with a setup you are familiar with. Get a glance of how import works in a past live stream and be on the lookout for more on import in the future.
|
||||
|
||||
{% youtube
|
||||
src="https://youtu.be/8ljemsNT21c?t=2632"
|
||||
title="Nx Import Preview"
|
||||
/%}
|
||||
|
||||
## Caching - Now With Databases
|
||||
|
||||
Caching is a big feature of Nx and is one of many reasons why we can have such a fast build time. But our approach to caching has historically been lacking for a bit. Prior to Nx 20, we utilized a file-based caching system where the build results were written to disk and were read from disk when any subsequent builds were performed. This solution could lead to some performance issues if the cached output was rather large, leading to the build process needing to wait for any output to be loaded from the cache. In Nx 20, we've adopted a database-driven solution for caching your results. Not only is this a faster mechanism for caching, but it's a much more robust solution than simply reading/writing from a directory. We can make sure that as your monorepo scales, the caching portion does not become a bottleneck. While the new database caching solution is the default for Nx 20, you can opt-out by setting `useLegacyCache` in your `nx.json`
|
||||
|
||||
```json {% fileName="nx.json" %}
|
||||
{
|
||||
"useLegacyCache": true,
|
||||
"namedInputs": {...}
|
||||
}
|
||||
```
|
||||
|
||||
## So Long Derived Directories 👋
|
||||
|
||||
Generating apps and libraries in a monorepo is something folks do quite regularly and part of that is telling Nx where it should put things. So you've probably seen this prompt before:
|
||||
@@ -66,10 +112,34 @@ This is where the concept of derived directories comes in. It will try to inspec
|
||||
|
||||
## Wrapping Up
|
||||
|
||||
There's a lot more in Nx 20, so be sure to check the full changelog for all the details on everything in this major release.
|
||||
Updating Nx and its plugins is easy as we ship an [automated migration command][migration-step].
|
||||
|
||||
- [Nx 20 Changelog](/changelog)
|
||||
{% youtube
|
||||
src="https://www.youtube.com/watch?v=A0FjwsTlZ8A"
|
||||
title="Nx Automatic Migrations"
|
||||
/%}
|
||||
|
||||
```shell
|
||||
npx nx migrate latest
|
||||
npx nx migrate --run-migrations
|
||||
```
|
||||
|
||||
There's a lot more in Nx 20, so be sure to check the full changelog for all the details on everything in this major release and any of our past releases.
|
||||
|
||||
- [Nx 20.0 Changelog](/changelog#20.0.0)
|
||||
- [Nx 19.8 Changelog](/changelog#19.8.0)
|
||||
- [Nx 19.7 Changelog](/changelog#19.7.0)
|
||||
- [Nx 19.6 Changelog](/changelog#19.6.0)
|
||||
- [Nx 19.5 Changelog](/changelog#19.5.0)
|
||||
- [Nx 19.0 Changelog](/changelog#19.0.0)
|
||||
|
||||
[rspack]: https://rspack.dev
|
||||
[rescope]: /deprecated/rescope
|
||||
[colum]: https://x.com/FerryColum
|
||||
[gradle-atomizer]: /blog/nx-19-5-adds-stackblitz-new-features-and-more#experimental-gradle-test-atomization
|
||||
[nx-gradle]: /blog/nx-19-release#new-plugin-nxgradle
|
||||
[file-based-versioning]: /recipes/nx-release/file-based-versioning-version-plans
|
||||
[nx-rspack]: /nx-api/rspack
|
||||
[crystalize-command]: /blog/nx-19-8-update#crystalize-your-entire-workspace-in-one-command
|
||||
[nx-import]: /recipes/adopting-nx/import-project
|
||||
[migration-step]: /features/automate-updating-dependencies
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 709 KiB |
|
Before Width: | Height: | Size: 478 KiB |
|
Before Width: | Height: | Size: 25 KiB |
@@ -1,4 +1,4 @@
|
||||
# Nx 20
|
||||
# [Nx 20.0 Blogpost](/blog/announcing-nx-20)
|
||||
|
||||
## Features
|
||||
|
||||
|
||||
@@ -14,7 +14,17 @@
|
||||
"originalFilePath": "shared/packages/powerpack-conformance/powerpack-conformance-plugin"
|
||||
}
|
||||
],
|
||||
"executors": [],
|
||||
"executors": [
|
||||
{
|
||||
"description": "Compile and bundle an Nx Conformance Rule",
|
||||
"file": "external-generated/packages/powerpack-conformance/executors/bundle-rule.json",
|
||||
"hidden": false,
|
||||
"name": "bundle-rule",
|
||||
"originalFilePath": "/libs/nx-packages/powerpack-conformance/src/executors/bundle-rule/schema.json",
|
||||
"path": "powerpack-conformance/executors/bundle-rule",
|
||||
"type": "executor"
|
||||
}
|
||||
],
|
||||
"generators": [],
|
||||
"githubRoot": "https://github.com/nrwl/nx/blob/master",
|
||||
"name": "powerpack-conformance",
|
||||
|
||||
@@ -18,7 +18,7 @@ In order to use `@nx/powerpack-conformance`, you need to have an active Powerpac
|
||||
|
||||
## Set Up @nx/powerpack-conformance
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
@@ -189,6 +189,7 @@ import { createConformanceRule } from '@nx/powerpack-conformance';
|
||||
|
||||
const rule = createConformanceRule({
|
||||
name: 'local-conformance-rule-example',
|
||||
description: 'The description of the rule',
|
||||
category: 'security', // `consistency`, `maintainability`, `reliability` or `security`
|
||||
reporter: 'project-reporter', // `project-reporter` or `project-files-reporter`
|
||||
implementation: async (context) => {
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "bundle-rule",
|
||||
"implementation": "/libs/nx-packages/powerpack-conformance/src/executors/bundle-rule/executor.ts",
|
||||
"schema": {
|
||||
"$schema": "https://json-schema.org/schema",
|
||||
"version": 2,
|
||||
"title": "BundleNxConformanceRule",
|
||||
"description": "Compile and bundle an Nx Conformance Rule",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"main": {
|
||||
"type": "string",
|
||||
"description": "The entrypoint file for the rule"
|
||||
},
|
||||
"outputPath": {
|
||||
"type": "string",
|
||||
"description": "The output path for the bundled rule"
|
||||
}
|
||||
},
|
||||
"required": ["main", "outputPath"],
|
||||
"presets": []
|
||||
},
|
||||
"description": "Compile and bundle an Nx Conformance Rule",
|
||||
"aliases": [],
|
||||
"hidden": false,
|
||||
"path": "/libs/nx-packages/powerpack-conformance/src/executors/bundle-rule/schema.json",
|
||||
"type": "executor"
|
||||
}
|
||||
@@ -13,7 +13,7 @@ In order to use `@nx/powerpack-owners`, you need to have an active Powerpack lic
|
||||
|
||||
## Set Up @nx/powerpack-owners
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
|
||||
@@ -19,7 +19,7 @@ In order to use `@nx/powerpack-s3-cache`, you need to have an active Powerpack l
|
||||
|
||||
### 1. Install the Package
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
@@ -48,6 +48,35 @@ There are four different ways to authenticate with AWS. They will be attempted i
|
||||
|
||||
Both the `AWS_ACCESS_KEY_ID` and the `AWS_SECRET_ACCESS_KEY` environment variables are required to use the environment variable authentication method.
|
||||
|
||||
Here's an example of using OICD in GitHub Actions to set the environment variables in CI:
|
||||
|
||||
```yaml {% fileName=".github/workflows/ci.yml" %}
|
||||
name: CI
|
||||
...
|
||||
permissions:
|
||||
id-token: write
|
||||
...
|
||||
|
||||
env:
|
||||
NX_DB_CACHE: true
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
...
|
||||
|
||||
- name: 'Configure AWS Credentials'
|
||||
uses: aws-actions/configure-aws-credentials@v4.0.2
|
||||
with:
|
||||
role-to-assume: arn:aws:iam::123456789123:role/GhAIBucketUserRole
|
||||
aws-region: us-east-1
|
||||
|
||||
...
|
||||
|
||||
- run: pnpm exec nx affected -t lint test build
|
||||
```
|
||||
|
||||
#### INI Config Files
|
||||
|
||||
AWS can read your authentication credentials from [shared INI config files](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html). The files are located at `~/.aws/credentials` and `~/.aws/config`. Both files are expected to be INI formatted with section names corresponding to profiles. Sections in the credentials file are treated as profile names, whereas profile sections in the config file must have the format of `[profile profile-name]`, except for the default profile. Profiles that appear in both files will not be merged, and the version that appears in the credentials file will be given precedence over the profile found in the config file.
|
||||
|
||||
@@ -19,7 +19,7 @@ In order to use `@nx/powerpack-shared-fs-cache`, you need to have an active Powe
|
||||
|
||||
### 1. Install the Package
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
|
||||
@@ -171,7 +171,7 @@ Named inputs targets can refer to reduce duplication
|
||||
|
||||
• `Optional` **neverConnectToCloud**: `boolean`
|
||||
|
||||
Set this to false to disable connection to Nx Cloud
|
||||
Set this to true to disable connection to Nx Cloud
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -211,7 +211,7 @@ Named inputs targets can refer to reduce duplication
|
||||
|
||||
• `Optional` **neverConnectToCloud**: `boolean`
|
||||
|
||||
Set this to false to disable connection to Nx Cloud
|
||||
Set this to true to disable connection to Nx Cloud
|
||||
|
||||
#### Inherited from
|
||||
|
||||
|
||||
@@ -681,6 +681,95 @@
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "single-tenant",
|
||||
"name": "Single Tenant",
|
||||
"description": "Manage an on-premise installation of Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "overview",
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/overview",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"tags": ["single-tenant"]
|
||||
},
|
||||
{
|
||||
"id": "auth-github",
|
||||
"name": "Authenticate with GitHub",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-github",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-gitlab",
|
||||
"name": "Authenticate with GitLab",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-gitlab",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-bitbucket",
|
||||
"name": "Authenticate with BitBucket",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-saml",
|
||||
"name": "Authenticate via SAML",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-saml",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "custom-github-app",
|
||||
"name": "Custom GitHub App",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/custom-github-app",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"tags": []
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "on-premise",
|
||||
"name": "On-Premise",
|
||||
@@ -1276,6 +1365,95 @@
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "single-tenant",
|
||||
"name": "Single Tenant",
|
||||
"description": "Manage an on-premise installation of Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "overview",
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/overview",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"tags": ["single-tenant"]
|
||||
},
|
||||
{
|
||||
"id": "auth-github",
|
||||
"name": "Authenticate with GitHub",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-github",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-gitlab",
|
||||
"name": "Authenticate with GitLab",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-gitlab",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-bitbucket",
|
||||
"name": "Authenticate with BitBucket",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-saml",
|
||||
"name": "Authenticate via SAML",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-saml",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "custom-github-app",
|
||||
"name": "Custom GitHub App",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/custom-github-app",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"tags": []
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "on-premise",
|
||||
"name": "On-Premise",
|
||||
@@ -1481,6 +1659,172 @@
|
||||
"path": "/ci/recipes/enterprise",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant": {
|
||||
"id": "single-tenant",
|
||||
"name": "Single Tenant",
|
||||
"description": "Manage an on-premise installation of Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "overview",
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/overview",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"tags": ["single-tenant"]
|
||||
},
|
||||
{
|
||||
"id": "auth-github",
|
||||
"name": "Authenticate with GitHub",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-github",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-gitlab",
|
||||
"name": "Authenticate with GitLab",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-gitlab",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-bitbucket",
|
||||
"name": "Authenticate with BitBucket",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "auth-saml",
|
||||
"name": "Authenticate via SAML",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-saml",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "custom-github-app",
|
||||
"name": "Custom GitHub App",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/custom-github-app",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"tags": []
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant/overview": {
|
||||
"id": "overview",
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/overview",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"tags": ["single-tenant"]
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant/auth-github": {
|
||||
"id": "auth-github",
|
||||
"name": "Authenticate with GitHub",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-github",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant/auth-gitlab": {
|
||||
"id": "auth-gitlab",
|
||||
"name": "Authenticate with GitLab",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-gitlab",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant/auth-bitbucket": {
|
||||
"id": "auth-bitbucket",
|
||||
"name": "Authenticate with BitBucket",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center": {
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant/auth-saml": {
|
||||
"id": "auth-saml",
|
||||
"name": "Authenticate via SAML",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-saml",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/single-tenant/custom-github-app": {
|
||||
"id": "custom-github-app",
|
||||
"name": "Custom GitHub App",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/custom-github-app",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"tags": []
|
||||
},
|
||||
"/ci/recipes/enterprise/on-premise": {
|
||||
"id": "on-premise",
|
||||
"name": "On-Premise",
|
||||
|
||||
@@ -323,39 +323,6 @@
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Powerpack Features",
|
||||
"path": "/features/powerpack",
|
||||
"id": "powerpack",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/features/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/features/powerpack/owners",
|
||||
"id": "owners",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/features/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "CI Features",
|
||||
"path": "/features/ci-features",
|
||||
@@ -472,63 +439,6 @@
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Powerpack Features",
|
||||
"path": "/features/powerpack",
|
||||
"id": "powerpack",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/features/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/features/powerpack/owners",
|
||||
"id": "owners",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/features/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/features/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/features/powerpack/owners",
|
||||
"id": "owners",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/features/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "CI Features",
|
||||
"path": "/features/ci-features",
|
||||
@@ -1155,14 +1065,6 @@
|
||||
"id": "installation",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Activate Powerpack",
|
||||
"path": "/recipes/installation/activate-powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Install Nx in a Non-Javascript Repo",
|
||||
"path": "/recipes/installation/install-non-javascript",
|
||||
@@ -2144,14 +2046,6 @@
|
||||
"id": "installation",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Activate Powerpack",
|
||||
"path": "/recipes/installation/activate-powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Install Nx in a Non-Javascript Repo",
|
||||
"path": "/recipes/installation/install-non-javascript",
|
||||
@@ -2171,14 +2065,6 @@
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Activate Powerpack",
|
||||
"path": "/recipes/installation/activate-powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Install Nx in a Non-Javascript Repo",
|
||||
"path": "/recipes/installation/install-non-javascript",
|
||||
@@ -3973,6 +3859,121 @@
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Enterprise",
|
||||
"path": "/nx-enterprise",
|
||||
"id": "nx-enterprise",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Activate Powerpack",
|
||||
"path": "/nx-enterprise/activate-powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Powerpack Features",
|
||||
"path": "/nx-enterprise/powerpack",
|
||||
"id": "powerpack",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/nx-enterprise/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/nx-enterprise/powerpack/owners",
|
||||
"id": "owners",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/nx-enterprise/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Activate Powerpack",
|
||||
"path": "/nx-enterprise/activate-powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Powerpack Features",
|
||||
"path": "/nx-enterprise/powerpack",
|
||||
"id": "powerpack",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/nx-enterprise/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/nx-enterprise/powerpack/owners",
|
||||
"id": "owners",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/nx-enterprise/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/nx-enterprise/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/nx-enterprise/powerpack/owners",
|
||||
"id": "owners",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/nx-enterprise/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Showcase",
|
||||
"path": "/showcase",
|
||||
@@ -5895,6 +5896,71 @@
|
||||
"id": "enterprise",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Single Tenant",
|
||||
"path": "/ci/recipes/enterprise/single-tenant",
|
||||
"id": "single-tenant",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"id": "overview",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitHub",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"id": "auth-github",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitLab",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"id": "auth-gitlab",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"id": "auth-bitbucket",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate via SAML",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"id": "auth-saml",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Custom GitHub App",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"id": "custom-github-app",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "On-Premise",
|
||||
"path": "/ci/recipes/enterprise/on-premise",
|
||||
@@ -6329,6 +6395,71 @@
|
||||
"id": "enterprise",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Single Tenant",
|
||||
"path": "/ci/recipes/enterprise/single-tenant",
|
||||
"id": "single-tenant",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"id": "overview",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitHub",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"id": "auth-github",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitLab",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"id": "auth-gitlab",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"id": "auth-bitbucket",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate via SAML",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"id": "auth-saml",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Custom GitHub App",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"id": "custom-github-app",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "On-Premise",
|
||||
"path": "/ci/recipes/enterprise/on-premise",
|
||||
@@ -6478,6 +6609,127 @@
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Single Tenant",
|
||||
"path": "/ci/recipes/enterprise/single-tenant",
|
||||
"id": "single-tenant",
|
||||
"isExternal": false,
|
||||
"children": [
|
||||
{
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"id": "overview",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitHub",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"id": "auth-github",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitLab",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"id": "auth-gitlab",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"id": "auth-bitbucket",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate via SAML",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"id": "auth-saml",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Custom GitHub App",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"id": "custom-github-app",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview",
|
||||
"id": "overview",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitHub",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-github",
|
||||
"id": "auth-github",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitLab",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-gitlab",
|
||||
"id": "auth-gitlab",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket",
|
||||
"id": "auth-bitbucket",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center",
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Authenticate via SAML",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/auth-saml",
|
||||
"id": "auth-saml",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "Custom GitHub App",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/custom-github-app",
|
||||
"id": "custom-github-app",
|
||||
"isExternal": false,
|
||||
"children": [],
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"name": "On-Premise",
|
||||
"path": "/ci/recipes/enterprise/on-premise",
|
||||
@@ -10617,6 +10869,23 @@
|
||||
],
|
||||
"isExternal": false,
|
||||
"disableCollapsible": false
|
||||
},
|
||||
{
|
||||
"id": "executors",
|
||||
"path": "/nx-api/powerpack-conformance/executors",
|
||||
"name": "executors",
|
||||
"children": [
|
||||
{
|
||||
"id": "bundle-rule",
|
||||
"path": "/nx-api/powerpack-conformance/executors/bundle-rule",
|
||||
"name": "bundle-rule",
|
||||
"children": [],
|
||||
"isExternal": false,
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"disableCollapsible": false
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
|
||||
@@ -3626,7 +3626,17 @@
|
||||
},
|
||||
"root": "/libs/nx-packages/powerpack-conformance",
|
||||
"source": "/libs/nx-packages/powerpack-conformance/src",
|
||||
"executors": {},
|
||||
"executors": {
|
||||
"/nx-api/powerpack-conformance/executors/bundle-rule": {
|
||||
"description": "Compile and bundle an Nx Conformance Rule",
|
||||
"file": "external-generated/packages/powerpack-conformance/executors/bundle-rule.json",
|
||||
"hidden": false,
|
||||
"name": "bundle-rule",
|
||||
"originalFilePath": "/libs/nx-packages/powerpack-conformance/src/executors/bundle-rule/schema.json",
|
||||
"path": "/nx-api/powerpack-conformance/executors/bundle-rule",
|
||||
"type": "executor"
|
||||
}
|
||||
},
|
||||
"generators": {},
|
||||
"path": "/nx-api/powerpack-conformance"
|
||||
},
|
||||
|
||||
@@ -438,51 +438,6 @@
|
||||
"path": "/features/manage-releases",
|
||||
"tags": ["nx-release"]
|
||||
},
|
||||
{
|
||||
"id": "powerpack",
|
||||
"name": "Powerpack Features",
|
||||
"description": "Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/index",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/conformance",
|
||||
"tags": ["conformance"]
|
||||
},
|
||||
{
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/owners",
|
||||
"tags": ["owners"]
|
||||
},
|
||||
{
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/custom-caching",
|
||||
"tags": ["custom-caching"]
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack",
|
||||
"tags": []
|
||||
},
|
||||
{
|
||||
"id": "ci-features",
|
||||
"name": "CI Features",
|
||||
@@ -643,84 +598,6 @@
|
||||
"path": "/features/manage-releases",
|
||||
"tags": ["nx-release"]
|
||||
},
|
||||
"/features/powerpack": {
|
||||
"id": "powerpack",
|
||||
"name": "Powerpack Features",
|
||||
"description": "Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/index",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/conformance",
|
||||
"tags": ["conformance"]
|
||||
},
|
||||
{
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/owners",
|
||||
"tags": ["owners"]
|
||||
},
|
||||
{
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/custom-caching",
|
||||
"tags": ["custom-caching"]
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack",
|
||||
"tags": []
|
||||
},
|
||||
"/features/powerpack/conformance": {
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/conformance",
|
||||
"tags": ["conformance"]
|
||||
},
|
||||
"/features/powerpack/owners": {
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/owners",
|
||||
"tags": ["owners"]
|
||||
},
|
||||
"/features/powerpack/custom-caching": {
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/features/powerpack/custom-caching",
|
||||
"tags": ["custom-caching"]
|
||||
},
|
||||
"/features/ci-features": {
|
||||
"id": "ci-features",
|
||||
"name": "CI Features",
|
||||
@@ -1577,17 +1454,6 @@
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "activate-powerpack",
|
||||
"name": "Activate Powerpack",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "shared/recipes/installation/activate-powerpack",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/recipes/installation/activate-powerpack",
|
||||
"tags": ["installation"]
|
||||
},
|
||||
{
|
||||
"id": "install-non-javascript",
|
||||
"name": "Install Nx in a Non-Javascript Repo",
|
||||
@@ -2931,17 +2797,6 @@
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "activate-powerpack",
|
||||
"name": "Activate Powerpack",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "shared/recipes/installation/activate-powerpack",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/recipes/installation/activate-powerpack",
|
||||
"tags": ["installation"]
|
||||
},
|
||||
{
|
||||
"id": "install-non-javascript",
|
||||
"name": "Install Nx in a Non-Javascript Repo",
|
||||
@@ -2969,17 +2824,6 @@
|
||||
"path": "/recipes/installation",
|
||||
"tags": []
|
||||
},
|
||||
"/recipes/installation/activate-powerpack": {
|
||||
"id": "activate-powerpack",
|
||||
"name": "Activate Powerpack",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "shared/recipes/installation/activate-powerpack",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/recipes/installation/activate-powerpack",
|
||||
"tags": ["installation"]
|
||||
},
|
||||
"/recipes/installation/install-non-javascript": {
|
||||
"id": "install-non-javascript",
|
||||
"name": "Install Nx in a Non-Javascript Repo",
|
||||
@@ -5440,6 +5284,163 @@
|
||||
"path": "/recipes/nx-release/build-before-versioning",
|
||||
"tags": ["nx-release"]
|
||||
},
|
||||
"/nx-enterprise": {
|
||||
"id": "nx-enterprise",
|
||||
"name": "Enterprise",
|
||||
"description": "Enterprise solutions for the Nx CLI",
|
||||
"mediaImage": "",
|
||||
"file": "",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "activate-powerpack",
|
||||
"name": "Activate Powerpack",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "shared/recipes/installation/activate-powerpack",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/activate-powerpack",
|
||||
"tags": ["installation"]
|
||||
},
|
||||
{
|
||||
"id": "powerpack",
|
||||
"name": "Powerpack Features",
|
||||
"description": "Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/index",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/conformance",
|
||||
"tags": ["conformance"]
|
||||
},
|
||||
{
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/owners",
|
||||
"tags": ["owners"]
|
||||
},
|
||||
{
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/custom-caching",
|
||||
"tags": ["custom-caching"]
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack",
|
||||
"tags": []
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise",
|
||||
"tags": []
|
||||
},
|
||||
"/nx-enterprise/activate-powerpack": {
|
||||
"id": "activate-powerpack",
|
||||
"name": "Activate Powerpack",
|
||||
"description": "",
|
||||
"mediaImage": "",
|
||||
"file": "shared/recipes/installation/activate-powerpack",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/activate-powerpack",
|
||||
"tags": ["installation"]
|
||||
},
|
||||
"/nx-enterprise/powerpack": {
|
||||
"id": "powerpack",
|
||||
"name": "Powerpack Features",
|
||||
"description": "Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/index",
|
||||
"itemList": [
|
||||
{
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/conformance",
|
||||
"tags": ["conformance"]
|
||||
},
|
||||
{
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/owners",
|
||||
"tags": ["owners"]
|
||||
},
|
||||
{
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/custom-caching",
|
||||
"tags": ["custom-caching"]
|
||||
}
|
||||
],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack",
|
||||
"tags": []
|
||||
},
|
||||
"/nx-enterprise/powerpack/conformance": {
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/conformance",
|
||||
"tags": ["conformance"]
|
||||
},
|
||||
"/nx-enterprise/powerpack/owners": {
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/owners",
|
||||
"tags": ["owners"]
|
||||
},
|
||||
"/nx-enterprise/powerpack/custom-caching": {
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"mediaImage": "",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"itemList": [],
|
||||
"isExternal": false,
|
||||
"path": "/nx-enterprise/powerpack/custom-caching",
|
||||
"tags": ["custom-caching"]
|
||||
},
|
||||
"/showcase": {
|
||||
"id": "showcase",
|
||||
"name": "Showcase",
|
||||
|
||||
@@ -575,33 +575,6 @@
|
||||
"path": "/nx-api/nx/documents/release"
|
||||
}
|
||||
],
|
||||
"conformance": [
|
||||
{
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/features/powerpack/conformance"
|
||||
}
|
||||
],
|
||||
"owners": [
|
||||
{
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/features/powerpack/owners"
|
||||
}
|
||||
],
|
||||
"custom-caching": [
|
||||
{
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/features/powerpack/custom-caching"
|
||||
}
|
||||
],
|
||||
"intro": [
|
||||
{
|
||||
"description": "",
|
||||
@@ -811,13 +784,6 @@
|
||||
}
|
||||
],
|
||||
"installation": [
|
||||
{
|
||||
"description": "",
|
||||
"file": "shared/recipes/installation/activate-powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"name": "Activate Powerpack",
|
||||
"path": "/recipes/installation/activate-powerpack"
|
||||
},
|
||||
{
|
||||
"description": "",
|
||||
"file": "shared/recipes/installation/install-non-javascript",
|
||||
@@ -831,6 +797,13 @@
|
||||
"id": "update-global-installation",
|
||||
"name": "Update Your Global Nx Installation",
|
||||
"path": "/recipes/installation/update-global-installation"
|
||||
},
|
||||
{
|
||||
"description": "",
|
||||
"file": "shared/recipes/installation/activate-powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"name": "Activate Powerpack",
|
||||
"path": "/nx-enterprise/activate-powerpack"
|
||||
}
|
||||
],
|
||||
"workspace-watching": [
|
||||
@@ -1103,6 +1076,33 @@
|
||||
"path": "/recipes/tips-n-tricks/flat-config"
|
||||
}
|
||||
],
|
||||
"conformance": [
|
||||
{
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"file": "shared/features/powerpack/conformance",
|
||||
"id": "conformance",
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"path": "/nx-enterprise/powerpack/conformance"
|
||||
}
|
||||
],
|
||||
"owners": [
|
||||
{
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"file": "shared/features/powerpack/owners",
|
||||
"id": "owners",
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"path": "/nx-enterprise/powerpack/owners"
|
||||
}
|
||||
],
|
||||
"custom-caching": [
|
||||
{
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"file": "shared/features/powerpack/custom-caching",
|
||||
"id": "custom-caching",
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"path": "/nx-enterprise/powerpack/custom-caching"
|
||||
}
|
||||
],
|
||||
"database": [
|
||||
{
|
||||
"description": "",
|
||||
@@ -1188,6 +1188,15 @@
|
||||
"path": "/ci/features/remote-cache"
|
||||
}
|
||||
],
|
||||
"single-tenant": [
|
||||
{
|
||||
"description": "",
|
||||
"file": "nx-cloud/enterprise/single-tenant/overview",
|
||||
"id": "overview",
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"path": "/ci/recipes/enterprise/single-tenant/overview"
|
||||
}
|
||||
],
|
||||
"on-premise": [
|
||||
{
|
||||
"description": "Set up Nx Cloud on machines that you control",
|
||||
|
||||
@@ -77,7 +77,7 @@ npm add -D @nx/rspack
|
||||
|
||||
### Generate a new project using Rspack
|
||||
|
||||
You can generate a [React](/nx-api/react) application or library that uses Rspack. The [`@nx/react:app`](/nx-api/react/generators/application) and [`@nx/react:lib`](/nx-api/react/generators/library) generators accept the `bundler` option, where you can pass `rspack`. This will generate a new application configured to use Rspack, and it will also install all the necessary dependencies, including the `@nx/rspack` plugin.
|
||||
You can generate a [React](/nx-api/react) application that uses Rspack. The [`@nx/react:app`](/nx-api/react/generators/application) generator accepts the `bundler` option, where you can pass `rspack`. This will generate a new application configured to use Rspack, and it will also install all the necessary dependencies, including the `@nx/rspack` plugin.
|
||||
|
||||
To generate a React application using Rspack, run the following:
|
||||
|
||||
@@ -85,12 +85,6 @@ To generate a React application using Rspack, run the following:
|
||||
nx g @nx/react:app my-app --bundler=rspack
|
||||
```
|
||||
|
||||
To generate a React library using Rspack, run the following:
|
||||
|
||||
```bash
|
||||
nx g @nx/react:lib my-lib --bundler=rspack
|
||||
```
|
||||
|
||||
### Modify an existing React project to use Rspack
|
||||
|
||||
You can use the `@nx/rspack:configuration` generator to change your React to use Rspack. This generator will modify your project's configuration to use Rspack, and it will also install all the necessary dependencies, including the `@nx/rspack` plugin.
|
||||
|
||||
@@ -131,35 +131,6 @@
|
||||
"tags": ["nx-release"],
|
||||
"file": "shared/features/manage-releases"
|
||||
},
|
||||
{
|
||||
"name": "Powerpack Features",
|
||||
"id": "powerpack",
|
||||
"description": "Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.",
|
||||
"file": "shared/features/powerpack/index",
|
||||
"itemList": [
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"id": "conformance",
|
||||
"tags": ["conformance"],
|
||||
"file": "shared/features/powerpack/conformance"
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"id": "owners",
|
||||
"tags": ["owners"],
|
||||
"file": "shared/features/powerpack/owners"
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"id": "custom-caching",
|
||||
"tags": ["custom-caching"],
|
||||
"file": "shared/features/powerpack/custom-caching"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CI Features",
|
||||
"id": "ci-features",
|
||||
@@ -377,12 +348,6 @@
|
||||
"id": "installation",
|
||||
"description": "Installing Nx",
|
||||
"itemList": [
|
||||
{
|
||||
"name": "Activate Powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"tags": ["installation"],
|
||||
"file": "shared/recipes/installation/activate-powerpack"
|
||||
},
|
||||
{
|
||||
"name": "Install Nx in a Non-Javascript Repo",
|
||||
"id": "install-non-javascript",
|
||||
@@ -1105,6 +1070,48 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Enterprise",
|
||||
"id": "nx-enterprise",
|
||||
"description": "Enterprise solutions for the Nx CLI",
|
||||
"itemList": [
|
||||
{
|
||||
"name": "Activate Powerpack",
|
||||
"id": "activate-powerpack",
|
||||
"tags": ["installation"],
|
||||
"file": "shared/recipes/installation/activate-powerpack"
|
||||
},
|
||||
{
|
||||
"name": "Powerpack Features",
|
||||
"id": "powerpack",
|
||||
"description": "Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.",
|
||||
"file": "shared/features/powerpack/index",
|
||||
"itemList": [
|
||||
{
|
||||
"name": "Run Language-Agnostic Conformance Rules",
|
||||
"description": "Write and apply rules for your Nx workspace",
|
||||
"id": "conformance",
|
||||
"tags": ["conformance"],
|
||||
"file": "shared/features/powerpack/conformance"
|
||||
},
|
||||
{
|
||||
"name": "Define Code Ownership at the Project Level",
|
||||
"description": "Configure and maintain code owners for projects in an Nx workspace",
|
||||
"id": "owners",
|
||||
"tags": ["owners"],
|
||||
"file": "shared/features/powerpack/owners"
|
||||
},
|
||||
{
|
||||
"name": "Self-Host the Remote Cache",
|
||||
"description": "Host the remote cache without using Nx Cloud",
|
||||
"id": "custom-caching",
|
||||
"tags": ["custom-caching"],
|
||||
"file": "shared/features/powerpack/custom-caching"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Showcase",
|
||||
"id": "showcase",
|
||||
@@ -1853,6 +1860,49 @@
|
||||
"id": "enterprise",
|
||||
"description": "Recipes for enterprise accounts",
|
||||
"itemList": [
|
||||
{
|
||||
"name": "Single Tenant",
|
||||
"id": "single-tenant",
|
||||
"description": "Manage an on-premise installation of Nx Cloud",
|
||||
"itemList": [
|
||||
{
|
||||
"name": "Single Tenant Nx Cloud Hosting",
|
||||
"id": "overview",
|
||||
"tags": ["single-tenant"],
|
||||
"file": "nx-cloud/enterprise/single-tenant/overview"
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitHub",
|
||||
"id": "auth-github",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-github"
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with GitLab",
|
||||
"id": "auth-gitlab",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-gitlab"
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket",
|
||||
"id": "auth-bitbucket",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket"
|
||||
},
|
||||
{
|
||||
"name": "Authenticate with BitBucket Data Center",
|
||||
"id": "auth-bitbucket-data-center",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-bitbucket-data-center"
|
||||
},
|
||||
{
|
||||
"name": "Authenticate via SAML",
|
||||
"id": "auth-saml",
|
||||
"file": "nx-cloud/enterprise/single-tenant/auth-saml"
|
||||
},
|
||||
{
|
||||
"name": "Custom GitHub App",
|
||||
"id": "custom-github-app",
|
||||
"file": "nx-cloud/enterprise/single-tenant/custom-github-app"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "On-Premise",
|
||||
"id": "on-premise",
|
||||
|
||||
@@ -46,7 +46,7 @@ In order to guarantee that cache poisoning will never affect your end users, [sk
|
||||
|
||||
### Do Not Manually Share Your Local Cache
|
||||
|
||||
Nx implicitly trusts the local cache which is stored by default in the `.nx/cache` folder. You can change the location of that folder in the `nx.json` file, so it could be tempting to place it on a network drive and easily share your cache with everyone on the company network. However, by doing this you've voided the guarantee of immutability from your cache. If someone has direct access to the cached files, they could directly poison the cache. Nx will automatically detect if a cache entry has been created in your local cache using a different machine and warn you with an [Unknown Local Cache Error](/troubleshooting/unknown-local-cache). Instead, use Nx Cloud [remote caching](/ci/features/remote-cache). If you want share your local cache anyway, you can [activate Nx Powerpack](/recipes/installation/activate-powerpack) and use the [`@nx/powerpack-shared-fs-cache`](/nx-api/powerpack-shared-fs-cache) plugin.
|
||||
Nx implicitly trusts the local cache which is stored by default in the `.nx/cache` folder. You can change the location of that folder in the `nx.json` file, so it could be tempting to place it on a network drive and easily share your cache with everyone on the company network. However, by doing this you've voided the guarantee of immutability from your cache. If someone has direct access to the cached files, they could directly poison the cache. Nx will automatically detect if a cache entry has been created in your local cache using a different machine and warn you with an [Unknown Local Cache Error](/troubleshooting/unknown-local-cache). Instead, use Nx Cloud [remote caching](/ci/features/remote-cache). If you want share your local cache anyway, you can [activate Nx Powerpack](/nx-enterprise/activate-powerpack) and use the [`@nx/powerpack-shared-fs-cache`](/nx-api/powerpack-shared-fs-cache) plugin.
|
||||
|
||||
### Configure End to End Encryption
|
||||
|
||||
|
||||
@@ -63,3 +63,16 @@ If you use an external file storage and an external MongoDB instance, you don't
|
||||
See note above about setting a cache expiration time. For Azure blob
|
||||
storage, [see this guide](https://docs.microsoft.com/en-us/azure/cdn/cdn-manage-expiration-of-blob-content).
|
||||
{% /callout %}
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -180,3 +180,16 @@ And apply the changes:
|
||||
```bash
|
||||
scp -r ./myconfiguration.yaml nx-cloud@<your-instance-ip>:~/config/user/update.yaml
|
||||
```
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -21,3 +21,16 @@ And create a new link using the settings below (make sure the callback URL is po
|
||||
## Connect your Nx Cloud installation to your new app
|
||||
|
||||
It's now time to enable auth on NxCloud. Refer to the [auth guide](https://github.com/nrwl/nx-cloud-helm/blob/main/AUTH-GUIDE.md) here for instructions on configuring your Helm values file.
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -46,3 +46,16 @@ Once you create, keep a note of the Key and the Secret:
|
||||
## Connect your Nx Cloud installation to your new app
|
||||
|
||||
It's now time to enable auth on NxCloud. Refer to the [auth guide](https://github.com/nrwl/nx-cloud-helm/blob/main/AUTH-GUIDE.md) here for instructions on configuring your Helm values file.
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -42,3 +42,16 @@ And then generate a new client secret, and save it somewhere secure (we'll use i
|
||||
## Configure Nx Cloud Installation
|
||||
|
||||
It's now time to enable auth on NxCloud. Refer to the [auth guide](https://github.com/nrwl/nx-cloud-helm/blob/main/AUTH-GUIDE.md) here for instructions on configuring your Helm values file.
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -38,3 +38,16 @@ Once you create, keep a note of the Client ID and the Secret:
|
||||
## Connect your Nx Cloud installation to your new app
|
||||
|
||||
It's now time to enable auth on NxCloud. Refer to the [auth guide](https://github.com/nrwl/nx-cloud-helm/blob/main/AUTH-GUIDE.md) here for instructions on configuring your Helm values file.
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -145,3 +145,16 @@ if you are interested.
|
||||
## Helm config
|
||||
|
||||
It's now time to enable auth on NxCloud. Refer to the [auth guide](https://github.com/nrwl/nx-cloud-helm/blob/main/AUTH-GUIDE.md) here for instructions on configuring your Helm values file.
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -67,3 +67,16 @@ GitLab:
|
||||
GitHub:
|
||||
|
||||

|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -104,3 +104,16 @@ This will point all auth endpoints to your GitHub server (rather the public one)
|
||||
The above environment variable, also helps with setting up the GitHub app integration, so you can have Nx Cloud build
|
||||
stats directly on your pull request. See full set up instructions [here](/ci/recipes/source-control-integration/github).
|
||||
{% /callout %} -->
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# BitBucket Data Center Auth
|
||||
|
||||
This page is for configuring auth via BitBucket Data Center (on-prem). If you are using BitBucket Cloud please refer to the docs [here](/ci/recipes/enterprise/single-tenant/auth-bitbucket).
|
||||
|
||||
Before creating your container, your Bitbucket Data Center admin will need to create an "Application Link".
|
||||
|
||||
## Creating an Application Link
|
||||
|
||||
Your BitBucket installation admin will need to navigate to their installation settings:
|
||||
|
||||

|
||||
|
||||
Then "Application Links":
|
||||
|
||||

|
||||
|
||||
And create a new link using the settings below (make sure the callback URL is pointed to your BitBucket installation):
|
||||
|
||||

|
||||
|
||||
## Connect Your Nx Cloud Installation to Your New App
|
||||
|
||||
Contact your developer productivity engineer to connect your Nx Cloud instance to the newly created BitBucket data center app.
|
||||
@@ -0,0 +1,48 @@
|
||||
# BitBucket Cloud Auth
|
||||
|
||||
This page is only for BitBucket Cloud (bitbucket.org). If you have an on-premise version of BitBucket Data Center please refer to the docs [here](/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center).
|
||||
|
||||
First, you'll need to create a BitBucket "OAuth consumer" for your organisation.
|
||||
|
||||
## Creating a BitBucket OAuth Consumer
|
||||
|
||||
From BitBucket, click on your profile picture and select your workspace:
|
||||
|
||||

|
||||
|
||||
Then "Settings":
|
||||
|
||||

|
||||
|
||||
Then "OAuth consumers":
|
||||
|
||||

|
||||
|
||||
And create a new consumer.
|
||||
|
||||
Give the app a name. The callback URL is the important bit. It needs to be in this form:
|
||||
|
||||
```
|
||||
[your-nx-cloud-url]/auth-callback
|
||||
|
||||
# for example
|
||||
https://my.nx-enterprise.url:8080/auth-callback
|
||||
```
|
||||
|
||||
**Important:** Ensure there is **no backslash at the end of the "Callback URL"** (i.e. it matches the above pattern)
|
||||
|
||||

|
||||
|
||||
Ensure you grant it the `account:read` and `account:email` scopes:
|
||||
|
||||

|
||||
|
||||
Save your changes.
|
||||
|
||||
Once you create, keep a note of the Key and the Secret:
|
||||
|
||||

|
||||
|
||||
## Connect Your Nx Cloud Installation to Your BitBucket OAuth Consumer
|
||||
|
||||
Contact your developer productivity engineer to connect your Nx Cloud instance to the newly created BitBucket OAuth consumer.
|
||||
@@ -0,0 +1,44 @@
|
||||
# GitHub Auth
|
||||
|
||||
First, you'll need to create a GitHub OAuth app for your organisation.
|
||||
|
||||
## Creating a GitHub OAuth app
|
||||
|
||||
From GitHub, click on your profile picture and chose "Settings":
|
||||
|
||||

|
||||
|
||||
Then "Developer settings" from the left-hand menu:
|
||||
|
||||

|
||||
|
||||
Then "OAuth Apps":
|
||||
|
||||

|
||||
|
||||
And create a new OAuth app:
|
||||
|
||||

|
||||
|
||||
Give it a name, and a homepage URL. The authorization callback is the important bit. It needs to be in this form:
|
||||
|
||||
```
|
||||
[your-nx-cloud-url]/auth-callback
|
||||
|
||||
# for example
|
||||
https://my.nx-enterprise.url:8080/auth-callback
|
||||
```
|
||||
|
||||

|
||||
|
||||
Once you create, keep a note of the Client ID:
|
||||
|
||||

|
||||
|
||||
And then generate a new client secret, and save it somewhere secure (we'll use it in a bit):
|
||||
|
||||

|
||||
|
||||
## Configure Nx Cloud Installation
|
||||
|
||||
Contact your developer productivity engineer to connect your Nx Cloud instance to the newly created GitHub OAuth app.
|
||||
@@ -0,0 +1,40 @@
|
||||
# GitLab Auth
|
||||
|
||||
Before creating your container, you'll need to create a GitLab app for your organisation.
|
||||
|
||||
## Creating a GitLab app
|
||||
|
||||
From GitLab, click on your profile picture and chose "Preferences":
|
||||
|
||||

|
||||
|
||||
Then "Applications" from the left-hand menu:
|
||||
|
||||

|
||||
|
||||
Give the app a name. The authorization callback is the important bit. It needs to be in this form:
|
||||
|
||||
```
|
||||
[your-nx-cloud-url]/auth-callback
|
||||
|
||||
# for example
|
||||
https://my.nx-enterprise.url:8080/auth-callback
|
||||
```
|
||||
|
||||
**Important:** Ensure there is **no backslash at the end of the "Redirect URI"** (i.e. it matches the above pattern)
|
||||
|
||||

|
||||
|
||||
Ensure you grant it the "`read_user`" scope:
|
||||
|
||||

|
||||
|
||||
Click "Save application".
|
||||
|
||||
Once you create, keep a note of the Client ID and the Secret:
|
||||
|
||||

|
||||
|
||||
## Connect Your Nx Cloud Installation to Your New App
|
||||
|
||||
Contact your developer productivity engineer to connect your Nx Cloud instance to the newly created GitLab app.
|
||||
@@ -0,0 +1,147 @@
|
||||
# SAML Auth
|
||||
|
||||
SAML support for Nx Cloud is an addon for Nx Enterprise contracts and requires an unlock key. Please [get in touch](mailto:cloud-support@nrwl.io)
|
||||
if you are interested.
|
||||
|
||||
### Jump To
|
||||
|
||||
- [Azure AD Config](#azure-active-directory-set-up)
|
||||
- [Okta Config](#okta-setup)
|
||||
|
||||
## Azure Active Directory Set-up
|
||||
|
||||
1. Create a new enterprise app
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
2. Choose “Create your own”:
|
||||
|
||||

|
||||
|
||||
3. Give it a name
|
||||
|
||||

|
||||
|
||||
4. Assign your users and/or groups to it:
|
||||
|
||||

|
||||
|
||||
5. Then set-up SSO
|
||||
|
||||

|
||||
|
||||
6. And choose SAML:
|
||||
|
||||

|
||||
|
||||
7. Add these configuration options
|
||||
|
||||
1. Configure the Identifier **exactly** as `nx-private-cloud`
|
||||
2. For the **Reply URL**, it should point to your Private Cloud instance URL. Make sure it ends with `/auth-callback`
|
||||
|
||||

|
||||
|
||||
8. Scroll down and manage claims:
|
||||
|
||||

|
||||
|
||||
9. The first row should be the `email` claim, click to Edit it:
|
||||
|
||||

|
||||
|
||||
10. Configure it as per below
|
||||
|
||||
1. **“Namespace”** needs to be blank
|
||||
2. **“Name:”** needs to be “email”
|
||||
3. See screenshot below. This is an important step, because Nx Cloud will expect the “email” property on each profile that logs in.
|
||||
|
||||

|
||||
|
||||
Make sure your application user profile exposes the email address under `user.mail`. This can be configured in `Users and Groups` in the Azure portal. Alternatively, you can always configure the `email` claim to use a different property under the `user` object.
|
||||
|
||||
11. Under `SAML Certificates`, click the pencil icon to edit
|
||||
|
||||

|
||||
|
||||
For **Signing Option**, select **Sign SAML response and assertion**
|
||||
|
||||

|
||||
|
||||
Then click **Save** and close the popover.
|
||||
|
||||
12. Download the certificate in **Base64**:
|
||||
|
||||

|
||||
|
||||
13. Extract the downloaded certificate value as a one-line string:
|
||||
1. `awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' azure_cert_file.cer`
|
||||
2. We’ll use this later
|
||||
14. Copy the Login URL:
|
||||
|
||||

|
||||
|
||||
15. Save the following information to send to your DPE:
|
||||
1. `SAML_CERT=<your-cert-string-from-above>`
|
||||
2. `SAML_ENTRY_POINT=<your-login-url-from-above>`
|
||||
|
||||
## Okta Set-up
|
||||
|
||||
1. Create a new Okta App Integration:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
2. Give it a name:
|
||||
|
||||

|
||||
|
||||
3. On the Next page, configure it as below:
|
||||
|
||||
1. The Single Sign On URL needs to point to your Nx Cloud instance URL and ends with `/auth-callback`
|
||||
2. The Audience should be `nx-private-cloud`
|
||||
|
||||

|
||||
|
||||
4. Scroll down to attribute statements and configure them as per below:
|
||||
|
||||

|
||||
|
||||
5. Click “Next”, and select the first option on the next screen.
|
||||
6. Go to the assignments tab and assign the users that can login to the Nx Cloud WebApp:
|
||||
|
||||
1. **Note:** This just gives them permission to use the Nx Cloud web app with their own workspace. Users will still need to be invited manually through the web app to your main workspace.
|
||||
|
||||

|
||||
|
||||
7. Then in the Sign-On tab scroll down:
|
||||
|
||||

|
||||
|
||||
8. Scroll down and from the list of certificates, download the one with the “Active” status:
|
||||
|
||||

|
||||
|
||||
9. Extract the downloaded certificate value as a one-line string:
|
||||
1. `awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' okta.cert`
|
||||
2. We'll use this later
|
||||
10. Then view the ldP metadata:
|
||||
|
||||

|
||||
|
||||
11. Then find the row similar to the below, and copy the highlighted URL (see screenshot as well):
|
||||
|
||||
1. ```html
|
||||
<md:SingleSignOnService
|
||||
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
|
||||
Location="https://trial-xxxxx.okta.com/app/trial-xxxxx_nxcloudtest_1/xxxxxxxxx/sso/saml"
|
||||
/>
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Connect Your Nx Cloud Installation to Your SAML Set Up
|
||||
|
||||
Contact your developer productivity engineer to connect your Nx Cloud instance to the SAML configuration.
|
||||
@@ -0,0 +1,64 @@
|
||||
# Custom GitHub App
|
||||
|
||||
Before creating your container, you'll need to create a GitHub app for your organisation.
|
||||
|
||||
## Creating a GitHub OAuth app
|
||||
|
||||
From GitHub, click on your profile picture and chose "Settings":
|
||||
|
||||

|
||||
|
||||
Then "Developer settings" from the left-hand menu:
|
||||
|
||||

|
||||
|
||||
Then "GitHub Apps":
|
||||
|
||||

|
||||
|
||||
And create a new GitHub app:
|
||||
|
||||

|
||||
|
||||
Give it a name, and a homepage URL. The callback URL is the important bit. It needs to be in this form:
|
||||
|
||||
```
|
||||
[your-nx-cloud-url]/callbacks/github-user
|
||||
|
||||
# for example
|
||||
https://my.nx-enterprise.url:8080/callbacks/github-user
|
||||
```
|
||||
|
||||
Once you create the app, keep a note of the Client ID and App ID:
|
||||
|
||||

|
||||
|
||||
Then generate a new client secret, and save it somewhere secure (we'll use it in a bit):
|
||||
|
||||

|
||||
|
||||
## Configure Permissions for the GitHub App
|
||||
|
||||
The following permissions are required for Nx Cloud to work:
|
||||
|
||||
Repository permissions:
|
||||
|
||||
- `Contents: Read & Write`
|
||||
- `Pull requests: Read & Write`
|
||||
- `Checks: Read Only`
|
||||
- `Commit Statuses: Read & Write`
|
||||
- `Issues: Read & Write`
|
||||
- `Metadata: Read Only`
|
||||
|
||||
Organization permissions:
|
||||
|
||||
- `Administration: Read Only`
|
||||
- `Members: Read Only`
|
||||
|
||||
## Connect Your Nx Cloud Installation
|
||||
|
||||
Provide the following values to your developer productivity engineer so they can help connect Nx Cloud to your custom GitHub app:
|
||||
|
||||
- Github App Client ID
|
||||
- Github App Client Secret
|
||||
- Github App App ID
|
||||
@@ -0,0 +1,55 @@
|
||||
# Single Tenant Nx Cloud Hosting
|
||||
|
||||
We offer multiple ways of running Nx Cloud for our Enterprise customers. The below options are listed in recommended order, from easiest to most complex in terms of set-up and maintenance for your team. Please carefully consider your organization's requirements and level of infrastructure expertise before deciding on a deployment option.
|
||||
|
||||
{% call-to-action title="Get in Touch" icon="nxcloud" description="Get the package that best fits your needs" url="/enterprise" /%}
|
||||
|
||||
## Multi-tenant
|
||||
|
||||
The quickest and easiest way to start using Nx Cloud is by utilizing our pre-existing secure, multi-tenant managed clusters:
|
||||
|
||||
- [https://nx.app/](https://nx.app/)
|
||||
- Enterprise customers can contact their developer productivity engineer (DPE) to configure the EU hosted version of Nx Cloud.
|
||||
|
||||
We also offer an uptime SLA guarantee of 99.98% for our Enterprise customers, SOC certificates on request, and we're happy to meet with your security teams if they have questions, or fill in security questionnaires. We also maintain a [Status Page here](https://status.nx.app/).
|
||||
|
||||
To start with this option, it's as easy as creating an account on [nx.app](https://cloud.nx.app) and connecting your repository.
|
||||
|
||||
## Single Tenant Instance
|
||||
|
||||
If you have very specific requirements, then we can also offer to host Nx Cloud for you in an isolated/single-tenant cluster.
|
||||
|
||||
We'll be able to discuss specific requirements such as:
|
||||
|
||||
- SAML/SSO
|
||||
- Specific regions you want your data to be in
|
||||
- Network isolation / dedicated VPCs
|
||||
- Dedicated instances
|
||||
- Different storage encryption than what is available on our multi-tenant instances
|
||||
- Custom storage replication / redundancy requirements
|
||||
- Custom Node types for Nx agents
|
||||
- Static IPs (if you need to open up connections in your corporate network)
|
||||
- VPC peering on GCloud or AWS Private Link
|
||||
|
||||
This option allows you to define specific parameters of how the instance should run.
|
||||
Your data and the Nx Cloud will run in complete isolation and will only serve your company. There will be no external API calls to any services outside of the clusters we set-up for you.
|
||||
|
||||
Once you let us know you'd like this option, depending on the agreed requirements, it might take a few days to get it set up.
|
||||
|
||||
### More Stable Version of Nx Cloud
|
||||
|
||||
The Nx Cloud software that is used in single tenant instances trails the version used in the multi-tenant instance by about month. This allows single tenant customers to benefit from an extra month of real world validation of any new features before enabling those features.
|
||||
|
||||
### Easy Set Up
|
||||
|
||||
While the multi-tenant option requires no set up at all, single tenant Nx Cloud still has a simple set up process from your perspective. Since the Nx Cloud team manages the instance, your infrastructure team members do not need to become experts in the specific configuration required to make sure all the parts of Nx Cloud work together correctly. Our team will provision and configure all the hardware required to get your Nx Cloud instance ready. This process usually takes a few days.
|
||||
|
||||
### Nx Maintenance Team
|
||||
|
||||
Our team will also manage changes to the Nx Cloud instance.
|
||||
|
||||
- As your usage grows, we will take care of allocating and scaling resources.
|
||||
- When new features are available for Nx Cloud, our team will automatically enable them for you so that you can always have access to the best version of Nx Cloud.
|
||||
- If you encounter issues with your Nx Cloud instance, we have full access to the set up and can diagnose the problems for you.
|
||||
|
||||
{% call-to-action title="Get in Touch" icon="nxcloud" description="Get the package that best fits your needs" url="/enterprise" /%}
|
||||
@@ -35,7 +35,7 @@ We'll be able to discuss specific requirements such as:
|
||||
- Static IPs (if you need to open up connections in your corporate network)
|
||||
- VPC peering on GCloud or AWS Private Link
|
||||
|
||||
This would be a "best of both worlds" option, as it would free you up from managing the instance yourself, but you will get to define specific parameters of how it should it run.
|
||||
This would be a "best of both worlds" option, as it would free you up from managing the instance yourself, but you will get to define specific parameters of how it should run.
|
||||
Your data and the Nx Cloud will run in complete isolation and will only serve your company. There will be no external API calls to any services outside of the clusters we set-up for you.
|
||||
|
||||
Once you let us know you'd like this option, depending on the agreed requirements, it might take a few days to get it set up.
|
||||
@@ -55,4 +55,16 @@ We also offer a multi-node Kubernetes setup, that is deployed via Helm. You can
|
||||
## Resources
|
||||
|
||||
- [Integration with your source control provider](/ci/recipes/source-control-integration)
|
||||
- [On-Prem specific features](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
|
||||
## On Premise Docs
|
||||
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/on-premise/auth-github)
|
||||
- [On-Prem VM Setup](/ci/recipes/enterprise/on-premise/ami-setup)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/on-premise/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/on-premise/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/on-premise/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/on-premise/auth-saml)
|
||||
- [Advanced Configuration](/ci/recipes/enterprise/on-premise/advanced-config)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/on-premise/custom-github-app)
|
||||
|
||||
@@ -165,11 +165,11 @@ Along with all the UI changes to support agents (following their logs and track
|
||||
|
||||
When upgrading to this version and anything above it, you will need to use Helm version 0.12.0+:
|
||||
|
||||
| Chart Version | Compatible Images |
|
||||
| ------------- | ---------------------------------- |
|
||||
| Chart Version | Compatible Images |
|
||||
| :-----------: | :--------------------------------: |
|
||||
| <= `0.10.11` | `2306.01.2.patch4` **and earlier** |
|
||||
| >= `0.11.0` | `2308.22.7` **and later** |
|
||||
| >= `0.12.0` | `2312.11.7` **and later** |
|
||||
| >= `0.11.0` | `2308.22.7` **and later** |
|
||||
| >= `0.12.0` | `2312.11.7` **and later** |
|
||||
|
||||
##### New UI features and improvements
|
||||
|
||||
@@ -268,10 +268,10 @@ product. It's faster, it handles resource caching better, and should allow the f
|
||||
|
||||
When upgrading to this version and anything above it, you will need to use Helm version 0.11.1:
|
||||
|
||||
| Chart Version | Compatible Images |
|
||||
| ------------- | ---------------------------------- |
|
||||
| Chart Version | Compatible Images |
|
||||
| :-----------: | :--------------------------------: |
|
||||
| <= `0.10.11` | `2306.01.2.patch4` **and earlier** |
|
||||
| >= `0.11.0` | `2308.22.7` **and later** |
|
||||
| >= `0.11.0` | `2308.22.7` **and later** |
|
||||
|
||||
##### VCS proxy support
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
# Connect your workspace by running "nx connect" and uncomment this line to enable task distribution
|
||||
# - run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci"
|
||||
|
||||
- run: pnpm install --frozen-lockfile
|
||||
@@ -252,7 +252,7 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
# Connect your workspace by running "nx connect" and uncomment this line to enable task distribution
|
||||
- run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci"
|
||||
|
||||
- run: pnpm install --frozen-lockfile
|
||||
|
||||
@@ -80,7 +80,7 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
# Connect your workspace by running "nx connect" and uncomment this line to enable task distribution
|
||||
# - run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci"
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
@@ -215,7 +215,7 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
# Uncomment this line to enable task distribution
|
||||
- run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci"
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
|
||||
@@ -69,8 +69,8 @@ Local computation caching (often also refered to as "build caching") is the proc
|
||||
Local computation caching helps speed up things locally, but the real benefits start when you distribute and share that cache remotely with your CI system and teammates.
|
||||
|
||||
- Both Nx and Turborepo support it.
|
||||
- Nx exposes a public API, which allows you to provide your own implementation of the remote cache (and some companies do). Turborepo’s implementation is not customizable, so you have to use Turborepo’s remote cache.
|
||||
- If you choose not to implement your own version of the remote cache, you can use Nx Cloud. **There is an on-prem version of Nx Cloud, so you can host your own cached artifacts. Turborepo doesn’t offer an on-prem solution.**
|
||||
- Nx's recommended remote caching implementation is included with Nx Cloud. If enterprise clients are concerned about storing their cache data on shared infrastructure, Nx Cloud can be run on a single-tenant cloud server or we can create an on-prem solution. **Turborepo doesn't offer an on-prem solution.**
|
||||
- If you want to manage your own remote cache storage, you can [purchase a Powerpack license](/powerpack) and store the remote cache on a shared network drive or AWS S3 bucket.
|
||||
|
||||
#### 8. Distributed task execution
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ The plugin also provides the following pre-written rules:
|
||||
|
||||
## Setup
|
||||
|
||||
The `@nx/powerpack-conformance` plugin requires an Nx Powerpack license to function. [Activating Powerpack](/recipes/installation/activate-powerpack) is a simple process.
|
||||
The `@nx/powerpack-conformance` plugin requires an Nx Powerpack license to function. [Activating Powerpack](/nx-enterprise/activate-powerpack) is a simple process.
|
||||
|
||||
{% call-to-action title="Buy a Powerpack License" icon="nx" description="Unlock all the features of Nx" url="https://cloud.nx.app/powerpack/purchase" /%}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ The options range from fully opting in to Nx's management of the remote cache to
|
||||
|
||||
## Setup
|
||||
|
||||
The `@nx/powerpack-s3-cache` and `@nx/powerpack-shared-fs-cache` plugins require an Nx Powerpack license to function. [Activating Powerpack](/recipes/installation/activate-powerpack) is a simple process.
|
||||
The `@nx/powerpack-s3-cache` and `@nx/powerpack-shared-fs-cache` plugins require an Nx Powerpack license to function. [Activating Powerpack](/nx-enterprise/activate-powerpack) is a simple process.
|
||||
|
||||
{% call-to-action title="Buy a Powerpack License" icon="nx" description="Unlock all the features of the Nx CLI" url="https://cloud.nx.app/powerpack/purchase" /%}
|
||||
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
Nx PowerPack is a suite of paid extensions for the Nx CLI specifically designed for enterprises. Powerpack is available for Nx version 19.8 and higher.
|
||||
|
||||
The following features are available after you [activate a Powerpack license](/recipes/installation/activate-powerpack):
|
||||
The following features are available after you [activate a Powerpack license](/nx-enterprise/activate-powerpack):
|
||||
|
||||
{% cards cols="2" lgCols="3" mdCols="3" smCols="2" %}
|
||||
|
||||
{% link-card title="Conformance" type="Powerpack Feature" url="/features/powerpack/conformance" icon="CheckBadgeIcon" /%}
|
||||
{% link-card title="Owners" type="Powerpack Feature" url="/features/powerpack/owners" icon="UserGroupIcon" /%}
|
||||
{% link-card title="Self-Hosted Remote Cache" type="Powerpack Feature" url="/features/powerpack/custom-caching" icon="AwsIcon" /%}
|
||||
{% link-card title="Conformance" type="Powerpack Feature" url="/nx-enterprise/powerpack/conformance" icon="CheckBadgeIcon" /%}
|
||||
{% link-card title="Owners" type="Powerpack Feature" url="/nx-enterprise/powerpack/owners" icon="UserGroupIcon" /%}
|
||||
{% link-card title="Self-Hosted Remote Cache" type="Powerpack Feature" url="/nx-enterprise/powerpack/custom-caching" icon="AwsIcon" /%}
|
||||
|
||||
{% /cards %}
|
||||
|
||||
@@ -8,7 +8,7 @@ The atomic unit of code in an Nx workspace is a project. Tasks, module boundarie
|
||||
|
||||
## Setup
|
||||
|
||||
The `@nx/powerpack-owners` plugin requires an Nx Powerpack license to function. [Activating Powerpack](/recipes/installation/activate-powerpack) is a simple process.
|
||||
The `@nx/powerpack-owners` plugin requires an Nx Powerpack license to function. [Activating Powerpack](/nx-enterprise/activate-powerpack) is a simple process.
|
||||
|
||||
{% call-to-action title="Buy a Powerpack License" icon="nx" description="Unlock all the features of Nx" url="https://cloud.nx.app/powerpack/purchase" /%}
|
||||
|
||||
|
||||
@@ -73,11 +73,11 @@ allow overwrites.
|
||||
an access token gets compromised it can be easily removed, in turn deleting all the cache artifacts that were created
|
||||
using it.
|
||||
|
||||
Nx Replay is not the only remote cache you can use. You can also use one of the [Powerpack self-hosted remote cache plugins](/features/powerpack/custom-caching). These plugins offer the performance benefits of a remote cache, but do not have the same security guarantees as Nx Replay.
|
||||
Nx Replay is not the only remote cache you can use. You can also use one of the [Powerpack self-hosted remote cache plugins](/nx-enterprise/powerpack/custom-caching). These plugins offer the performance benefits of a remote cache, but do not have the same security guarantees as Nx Replay.
|
||||
|
||||
## Self-Hosted Remote Cache
|
||||
|
||||
If you can't use Nx Replay, Nx provides plugins that enable you to [self-host the remote cache](/features/powerpack/custom-caching). These plugins are available as part of the [Nx Powerpack](/powerpack), which you can unlock by [activating your license](/recipes/installation/activate-powerpack). There are plugins to self-host your remote cache in the following locations:
|
||||
If you can't use Nx Replay, Nx provides plugins that enable you to [self-host the remote cache](/nx-enterprise/powerpack/custom-caching). These plugins are available as part of the [Nx Powerpack](/powerpack), which you can unlock by [activating your license](/nx-enterprise/activate-powerpack). There are plugins to self-host your remote cache in the following locations:
|
||||
|
||||
- [Amazon S3 Bucket](/nx-api/powerpack-s3-cache)
|
||||
- [Shared File System](/nx-api/powerpack-shared-fs-cache)
|
||||
|
||||
@@ -18,7 +18,7 @@ In order to use `@nx/powerpack-conformance`, you need to have an active Powerpac
|
||||
|
||||
## Set Up @nx/powerpack-conformance
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
|
||||
@@ -13,7 +13,7 @@ In order to use `@nx/powerpack-owners`, you need to have an active Powerpack lic
|
||||
|
||||
## Set Up @nx/powerpack-owners
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
|
||||
@@ -19,7 +19,7 @@ In order to use `@nx/powerpack-s3-cache`, you need to have an active Powerpack l
|
||||
|
||||
### 1. Install the Package
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
@@ -48,6 +48,35 @@ There are four different ways to authenticate with AWS. They will be attempted i
|
||||
|
||||
Both the `AWS_ACCESS_KEY_ID` and the `AWS_SECRET_ACCESS_KEY` environment variables are required to use the environment variable authentication method.
|
||||
|
||||
Here's an example of using OICD in GitHub Actions to set the environment variables in CI:
|
||||
|
||||
```yaml {% fileName=".github/workflows/ci.yml" %}
|
||||
name: CI
|
||||
...
|
||||
permissions:
|
||||
id-token: write
|
||||
...
|
||||
|
||||
env:
|
||||
NX_DB_CACHE: true
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
...
|
||||
|
||||
- name: 'Configure AWS Credentials'
|
||||
uses: aws-actions/configure-aws-credentials@v4.0.2
|
||||
with:
|
||||
role-to-assume: arn:aws:iam::123456789123:role/GhAIBucketUserRole
|
||||
aws-region: us-east-1
|
||||
|
||||
...
|
||||
|
||||
- run: pnpm exec nx affected -t lint test build
|
||||
```
|
||||
|
||||
#### INI Config Files
|
||||
|
||||
AWS can read your authentication credentials from [shared INI config files](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html). The files are located at `~/.aws/credentials` and `~/.aws/config`. Both files are expected to be INI formatted with section names corresponding to profiles. Sections in the credentials file are treated as profile names, whereas profile sections in the config file must have the format of `[profile profile-name]`, except for the default profile. Profiles that appear in both files will not be merged, and the version that appears in the credentials file will be given precedence over the profile found in the config file.
|
||||
|
||||
@@ -19,7 +19,7 @@ In order to use `@nx/powerpack-shared-fs-cache`, you need to have an active Powe
|
||||
|
||||
### 1. Install the Package
|
||||
|
||||
1. [Activate Powerpack](/recipes/installation/activate-powerpack) if you haven't already
|
||||
1. [Activate Powerpack](/nx-enterprise/activate-powerpack) if you haven't already
|
||||
2. Install the package
|
||||
|
||||
```shell
|
||||
|
||||
@@ -77,7 +77,7 @@ npm add -D @nx/rspack
|
||||
|
||||
### Generate a new project using Rspack
|
||||
|
||||
You can generate a [React](/nx-api/react) application or library that uses Rspack. The [`@nx/react:app`](/nx-api/react/generators/application) and [`@nx/react:lib`](/nx-api/react/generators/library) generators accept the `bundler` option, where you can pass `rspack`. This will generate a new application configured to use Rspack, and it will also install all the necessary dependencies, including the `@nx/rspack` plugin.
|
||||
You can generate a [React](/nx-api/react) application that uses Rspack. The [`@nx/react:app`](/nx-api/react/generators/application) generator accepts the `bundler` option, where you can pass `rspack`. This will generate a new application configured to use Rspack, and it will also install all the necessary dependencies, including the `@nx/rspack` plugin.
|
||||
|
||||
To generate a React application using Rspack, run the following:
|
||||
|
||||
@@ -85,12 +85,6 @@ To generate a React application using Rspack, run the following:
|
||||
nx g @nx/react:app my-app --bundler=rspack
|
||||
```
|
||||
|
||||
To generate a React library using Rspack, run the following:
|
||||
|
||||
```bash
|
||||
nx g @nx/react:lib my-lib --bundler=rspack
|
||||
```
|
||||
|
||||
### Modify an existing React project to use Rspack
|
||||
|
||||
You can use the `@nx/rspack:configuration` generator to change your React to use Rspack. This generator will modify your project's configuration to use Rspack, and it will also install all the necessary dependencies, including the `@nx/rspack` plugin.
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
|
||||
Nx Powerpack unlocks features of Nx that are particularly useful for larger organizations. Powerpack is available for Nx version 19.8 and higher. The features include the ability to:
|
||||
|
||||
- [Run language-agnostic conformance rules](/features/powerpack/conformance)
|
||||
- [Define code ownership at the project level](/features/powerpack/owners)
|
||||
- [Change the remote cache storage location](/features/powerpack/custom-caching)
|
||||
- [Run language-agnostic conformance rules](/nx-enterprise/powerpack/conformance)
|
||||
- [Define code ownership at the project level](/nx-enterprise/powerpack/owners)
|
||||
- [Change the remote cache storage location](/nx-enterprise/powerpack/custom-caching)
|
||||
|
||||
Activating Powerpack is a two step process.
|
||||
|
||||
## 1. Purchase a License
|
||||
|
||||
You'll need to [purchase a license](https://cloud.nx.app/powerpack/purchase) online. The license is a seat-based license. If you have an open-source repository, reach out to [powerpack-support@nrwl.io](mailto:powerpack-support@nrwl.io) for a free license.
|
||||
You'll need to [purchase a license](https://cloud.nx.app/powerpack/purchase) online. The license is a seat-based license. If you are a small team, the purchase form has an option to apply for a free license. If you have an open-source repository, you can [register for a free OSS license](https://forms.gle/mWjQo6Vrv5Kt6WYh9) as well.
|
||||
|
||||
{% call-to-action title="Buy a Powerpack License" icon="nx" description="Unlock all the features of Nx" url="https://cloud.nx.app/powerpack/purchase" /%}
|
||||
|
||||
|
||||
@@ -2,38 +2,36 @@
|
||||
|
||||
The following environment variables are ones that you can set to change the behavior of Nx in different environments.
|
||||
|
||||
| Property | Type | Description |
|
||||
| --------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| NX_ADD_PLUGINS | boolean | If set to `false`, Nx will not add plugins to infer tasks. This is `true` by default. Workspaces created before Nx 18 will have this disabled via a migration for backwards compatibility |
|
||||
| NX_ADD_TS_PLUGIN | boolean | If set to `false` when creating a new workspace using the `ts` preset, Nx will not add the `@nx/js/typescript` plugin to infer tasks and will not set up the workspace with [TypeScript project references](https://www.typescriptlang.org/docs/handbook/project-references.html). This is `true` by default. |
|
||||
| NX_BASE | string | The default base branch to use when calculating the affected projects. Can be overridden on the command line with `--base`. |
|
||||
| NX_CACHE_DIRECTORY | string | The cache for task outputs is stored in `.nx/cache` by default. Set this variable to use a different directory. |
|
||||
| NX_CACHE_PROJECT_GRAPH | boolean | If set to `false`, disables the project graph cache. Most useful when developing a plugin that modifies the project graph. |
|
||||
| NX_DAEMON | boolean | If set to `false`, disables the Nx daemon process. Disable the daemon to print `console.log` statements in plugin code you are developing. |
|
||||
| NX_DEFAULT_PROJECT | string | The default project used for commands which require a project. e.g. `nx build`, `nx g component`, etc. |
|
||||
| NX_HEAD | string | The default head branch to use when calculating the affected projects. Can be overridden on the command line with `--head`. |
|
||||
| NX_PERF_LOGGING | boolean | If set to `true`, will print debug information useful for for profiling executors and Nx itself |
|
||||
| NX_PROFILE | string | Prepend `NX_PROFILE=profile.json` before running targets with Nx to generate a file that be [loaded in Chrome dev tools](/troubleshooting/performance-profiling) to visualize the performance of Nx across multiple processes. |
|
||||
| NX_WORKSPACE_DATA_CACHE_DIRECTORY | string | The project graph cache and some other internal nx caches are stored in `.nx/workspace-data` by default. Set this variable to use a different directory. |
|
||||
| NX_PROJECT_GRAPH_MAX_WORKERS | number | The number of workers to use when calculating the project graph. |
|
||||
| NX_PARALLEL | number | The number of tasks Nx should run in parallel. Overrides any configured value inside nx.json |
|
||||
| NX_RUNNER | string | The name of task runner from the config to use. Can be overridden on the command line with `--runner`. Not read if `NX_TASKS_RUNNER` is set. |
|
||||
| NX_SKIP_NX_CACHE | boolean | Rerun the tasks even when the results are available in the cache |
|
||||
| NX_TASKS_RUNNER | string | The name of task runner from the config to use. Can be overridden on the command line with `--runner`. Preferred over `NX_RUNNER`. |
|
||||
| NX_TASKS_RUNNER_DYNAMIC_OUTPUT | boolean | If set to `false`, will use non-dynamic terminal output strategy (what you see in CI), even when you terminal can support the dynamic version |
|
||||
| NX_VERBOSE_LOGGING | boolean | If set to `true`, will print debug information useful for troubleshooting |
|
||||
| NX_DRY_RUN | boolean | If set to `true`, will perform a dry run of the generator. No files will be created and no packages will be installed. |
|
||||
| NX_INTERACTIVE | boolean | If set to `true`, will allow Nx to prompt you in the terminal to answer some further questions when running generators. |
|
||||
| NX_GENERATE_QUIET | boolean | If set to `true`, will prevent Nx logging file operations during generate |
|
||||
| NX_PREFER_TS_NODE | boolean | If set to `true`, Nx will use `ts-node` for local execution of plugins even if `@swc-node/register` is installed. |
|
||||
| NX_IGNORE_CYCLES | boolean | If set to `true`, Nx will ignore errors created by a task graph circular dependency. Can be overriden on the command line with `--nxIgnoreCycles` |
|
||||
| NX_BATCH_MODE | boolean | If set to `true`, Nx will run task(s) in batches for executors which support batches. |
|
||||
| NX_SKIP_LOG_GROUPING | boolean | If set to `true`, Nx will not group command's logs on CI. |
|
||||
| NX_MIGRATE_CLI_VERSION | string | The version of Nx to use for running the `nx migrate` command. If not set, it defaults to `latest`. |
|
||||
| NX_LOAD_DOT_ENV_FILES | boolean | If set to 'false', Nx will not load any environment files (e.g. `.local.env`, `.env.local`) |
|
||||
| NX_NATIVE_FILE_CACHE_DIRECTORY | string | The cache for native `.node` files is stored under a global temp directory by default. Set this variable to use a different directory. This is interpreted as an absolute path. |
|
||||
| NX_PLUGIN_NO_TIMEOUTS | boolean | If set to `true`, plugin operations will not timeout |
|
||||
| NX_SOCKET_DIRECTORY | string | Sets the directory that Nx will use when creating sockets to communicate with child processes. May be needed if the derived socket path is too long. |
|
||||
| Property | Type | Description |
|
||||
| ------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| NX_ADD_PLUGINS | boolean | If set to `false`, Nx will not add plugins to infer tasks. This is `true` by default. Workspaces created before Nx 18 will have this disabled via a migration for backwards compatibility |
|
||||
| NX_ADD_TS_PLUGIN | boolean | If set to `false` when creating a new workspace using the `ts` preset, Nx will not add the `@nx/js/typescript` plugin to infer tasks and will not set up the workspace with [TypeScript project references](https://www.typescriptlang.org/docs/handbook/project-references.html). This is `true` by default. |
|
||||
| NX_BASE | string | The default base branch to use when calculating the affected projects. Can be overridden on the command line with `--base`. |
|
||||
| NX_CACHE_DIRECTORY | string | The cache for task outputs is stored in `.nx/cache` by default. Set this variable to use a different directory. |
|
||||
| NX_CACHE_PROJECT_GRAPH | boolean | If set to `false`, disables the project graph cache. Most useful when developing a plugin that modifies the project graph. |
|
||||
| NX_DAEMON | boolean | If set to `false`, disables the Nx daemon process. Disable the daemon to print `console.log` statements in plugin code you are developing. |
|
||||
| NX_DEFAULT_PROJECT | string | The default project used for commands which require a project. e.g. `nx build`, `nx g component`, etc. |
|
||||
| NX_HEAD | string | The default head branch to use when calculating the affected projects. Can be overridden on the command line with `--head`. |
|
||||
| NX_PERF_LOGGING | boolean | If set to `true`, will print debug information useful for for profiling executors and Nx itself |
|
||||
| NX_PROFILE | string | Prepend `NX_PROFILE=profile.json` before running targets with Nx to generate a file that be [loaded in Chrome dev tools](/troubleshooting/performance-profiling) to visualize the performance of Nx across multiple processes. |
|
||||
| NX_WORKSPACE_DATA_DIRECTORY | string | The project graph cache and some other internal nx caches are stored in `.nx/workspace-data` by default. Set this variable to use a different directory. |
|
||||
| NX_PARALLEL | number | The number of tasks Nx should run in parallel. Overrides any configured value inside nx.json |
|
||||
| NX_RUNNER | string | The name of task runner from the config to use. Can be overridden on the command line with `--runner`. Not read if `NX_TASKS_RUNNER` is set. |
|
||||
| NX_SKIP_NX_CACHE | boolean | Rerun the tasks even when the results are available in the cache |
|
||||
| NX_TASKS_RUNNER | string | The name of task runner from the config to use. Can be overridden on the command line with `--runner`. Preferred over `NX_RUNNER`. |
|
||||
| NX_TASKS_RUNNER_DYNAMIC_OUTPUT | boolean | If set to `false`, will use non-dynamic terminal output strategy (what you see in CI), even when you terminal can support the dynamic version |
|
||||
| NX_VERBOSE_LOGGING | boolean | If set to `true`, will print debug information useful for troubleshooting |
|
||||
| NX_DRY_RUN | boolean | If set to `true`, will perform a dry run of the generator. No files will be created and no packages will be installed. |
|
||||
| NX_INTERACTIVE | boolean | If set to `true`, will allow Nx to prompt you in the terminal to answer some further questions when running generators. |
|
||||
| NX_GENERATE_QUIET | boolean | If set to `true`, will prevent Nx logging file operations during generate |
|
||||
| NX_PREFER_TS_NODE | boolean | If set to `true`, Nx will use `ts-node` for local execution of plugins even if `@swc-node/register` is installed. |
|
||||
| NX_IGNORE_CYCLES | boolean | If set to `true`, Nx will ignore errors created by a task graph circular dependency. Can be overridden on the command line with `--nxIgnoreCycles` |
|
||||
| NX_BATCH_MODE | boolean | If set to `true`, Nx will run task(s) in batches for executors which support batches. |
|
||||
| NX_SKIP_LOG_GROUPING | boolean | If set to `true`, Nx will not group command's logs on CI. |
|
||||
| NX_MIGRATE_CLI_VERSION | string | The version of Nx to use for running the `nx migrate` command. If not set, it defaults to `latest`. |
|
||||
| NX_LOAD_DOT_ENV_FILES | boolean | If set to 'false', Nx will not load any environment files (e.g. `.local.env`, `.env.local`) |
|
||||
| NX_NATIVE_FILE_CACHE_DIRECTORY | string | The cache for native `.node` files is stored under a global temp directory by default. Set this variable to use a different directory. This is interpreted as an absolute path. |
|
||||
| NX_PLUGIN_NO_TIMEOUTS | boolean | If set to `true`, plugin operations will not timeout |
|
||||
|
||||
Nx will set the following environment variables so they can be accessible within the process even outside of executors and generators.
|
||||
|
||||
|
||||
@@ -19,11 +19,11 @@ should use `nx migrate` to ensure that they stay on a supported version.
|
||||
The following are the currently supported major versions of Nx.
|
||||
|
||||
| Version | Support Type | Release Date |
|
||||
| ------- | ------------ | ------------ |
|
||||
| v19 | Current | 2024-05-06 |
|
||||
| v18\* | LTS | 2024-02-03 |
|
||||
| v17 | LTS | 2023-10-19 |
|
||||
| v16 | LTS | 2023-04-27 |
|
||||
| :-----: | :----------: | :----------: |
|
||||
| v20 | Current | 2024-10-06 |
|
||||
| v19 | LTS | 2024-05-06 |
|
||||
| v18\* | LTS | 2024-02-03 |
|
||||
| v17 | LTS | 2023-10-19 |
|
||||
|
||||
**\*Note:** v18 is a special release and does not fit into the normal release cycle. Thus, v16 continues to be supported
|
||||
according to schedule.
|
||||
|
||||
@@ -21,10 +21,6 @@
|
||||
- [Automate Updating Dependencies](/features/automate-updating-dependencies)
|
||||
- [Enforce Module Boundaries](/features/enforce-module-boundaries)
|
||||
- [Manage Releases](/features/manage-releases)
|
||||
- [Powerpack Features](/features/powerpack)
|
||||
- [Run Language-Agnostic Conformance Rules](/features/powerpack/conformance)
|
||||
- [Define Code Ownership at the Project Level](/features/powerpack/owners)
|
||||
- [Self-Host the Remote Cache](/features/powerpack/custom-caching)
|
||||
- [CI Features](/features/ci-features)
|
||||
- [Concepts](/concepts)
|
||||
- [Mental Model](/concepts/mental-model)
|
||||
@@ -54,7 +50,6 @@
|
||||
- [Folder Structure](/concepts/decisions/folder-structure)
|
||||
- [Recipes](/recipes)
|
||||
- [Installation](/recipes/installation)
|
||||
- [Activate Powerpack](/recipes/installation/activate-powerpack)
|
||||
- [Install Nx in a Non-Javascript Repo](/recipes/installation/install-non-javascript)
|
||||
- [Update Your Global Nx Installation](/recipes/installation/update-global-installation)
|
||||
- [Tasks & Caching](/recipes/running-tasks)
|
||||
@@ -175,6 +170,12 @@
|
||||
- [Publish a Custom Dist Directory](/recipes/nx-release/publish-custom-dist-directory)
|
||||
- [Build Before Versioning](/recipes/nx-release/build-before-versioning)
|
||||
- [Troubleshoot Nx Console Issues](/recipes/nx-console/console-troubleshooting)
|
||||
- [Enterprise](/nx-enterprise)
|
||||
- [Activate Powerpack](/nx-enterprise/activate-powerpack)
|
||||
- [Powerpack Features](/nx-enterprise/powerpack)
|
||||
- [Run Language-Agnostic Conformance Rules](/nx-enterprise/powerpack/conformance)
|
||||
- [Define Code Ownership at the Project Level](/nx-enterprise/powerpack/owners)
|
||||
- [Self-Host the Remote Cache](/nx-enterprise/powerpack/custom-caching)
|
||||
- [Showcase](/showcase)
|
||||
- [Nx with your favorite tech](/showcase/example-repos)
|
||||
- [Express](/showcase/example-repos/add-express)
|
||||
@@ -297,6 +298,14 @@
|
||||
- [Enable GitLab MR Integration](/ci/recipes/source-control-integration/gitlab)
|
||||
- [Enable Azure DevOps PR Integration](/ci/recipes/source-control-integration/azure-devops)
|
||||
- [Enterprise](/ci/recipes/enterprise)
|
||||
- [Single Tenant](/ci/recipes/enterprise/single-tenant)
|
||||
- [Single Tenant Nx Cloud Hosting](/ci/recipes/enterprise/single-tenant/overview)
|
||||
- [Authenticate with GitHub](/ci/recipes/enterprise/single-tenant/auth-github)
|
||||
- [Authenticate with GitLab](/ci/recipes/enterprise/single-tenant/auth-gitlab)
|
||||
- [Authenticate with BitBucket](/ci/recipes/enterprise/single-tenant/auth-bitbucket)
|
||||
- [Authenticate with BitBucket Data Center](/ci/recipes/enterprise/single-tenant/auth-bitbucket-data-center)
|
||||
- [Authenticate via SAML](/ci/recipes/enterprise/single-tenant/auth-saml)
|
||||
- [Custom GitHub App](/ci/recipes/enterprise/single-tenant/custom-github-app)
|
||||
- [On-Premise](/ci/recipes/enterprise/on-premise)
|
||||
- [Set up Nx Cloud On-Premise](/ci/recipes/enterprise/on-premise/on-premise)
|
||||
- [Authenticate with a Single Admin](/ci/recipes/enterprise/on-premise/auth-single-admin)
|
||||
@@ -777,6 +786,8 @@
|
||||
- [powerpack-conformance](/nx-api/powerpack-conformance)
|
||||
- [documents](/nx-api/powerpack-conformance/documents)
|
||||
- [Overview](/nx-api/powerpack-conformance/documents/overview)
|
||||
- [executors](/nx-api/powerpack-conformance/executors)
|
||||
- [bundle-rule](/nx-api/powerpack-conformance/executors/bundle-rule)
|
||||
- [powerpack-license](/nx-api/powerpack-license)
|
||||
- [powerpack-owners](/nx-api/powerpack-owners)
|
||||
- [documents](/nx-api/powerpack-owners/documents)
|
||||
|
||||
@@ -1275,7 +1275,7 @@ Once you click the link, follow the steps provided and make sure Nx Cloud is ena
|
||||
|
||||
### Configure Your CI Workflow {% highlightColor="green" %}
|
||||
|
||||
When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs.
|
||||
When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. If you would like to also distribute tasks across multiple machines to ensure fast and reliable CI runs, uncomment the `nx-cloud start-ci-run` line.
|
||||
|
||||
If you need to generate a new workflow file for GitHub Actions or other providers, you can do so with this command:
|
||||
|
||||
@@ -1298,8 +1298,8 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
- run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
# Uncomment this line to enable task distribution
|
||||
# - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
@@ -1075,7 +1075,7 @@ Once you click the link, follow the steps provided and make sure Nx Cloud is ena
|
||||
|
||||
### Configure Your CI Workflow {% highlightColor="green" %}
|
||||
|
||||
When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs.
|
||||
When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. If you would like to also distribute tasks across multiple machines to ensure fast and reliable CI runs, uncomment the `nx-cloud start-ci-run` line.
|
||||
|
||||
If you need to generate a new workflow file for GitHub Actions or other providers, you can do so with this command:
|
||||
|
||||
@@ -1098,8 +1098,8 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
- run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
# Uncomment this line to enable task distribution
|
||||
# - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
@@ -326,7 +326,7 @@ And use the following command to generate a CI workflow file.
|
||||
./nx generate ci-workflow --ci=github
|
||||
```
|
||||
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs.
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. If you would like to also distribute tasks across multiple machines to ensure fast and reliable CI runs, uncomment the `nx-cloud start-ci-run` line.
|
||||
|
||||
The key lines in the CI pipeline are:
|
||||
|
||||
@@ -354,7 +354,8 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
- run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-jvm" --stop-agents-after="build"
|
||||
# Uncomment this line to enable task distribution
|
||||
# - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-jvm" --stop-agents-after="build"
|
||||
|
||||
- name: Set up JDK 17 for x64
|
||||
uses: actions/setup-java@v4
|
||||
|
||||
@@ -1,70 +1,314 @@
|
||||
{
|
||||
"project": {
|
||||
"name": "@tuskdesign/demo",
|
||||
"name": "@tuskdesign/zoo",
|
||||
"type": "lib",
|
||||
"data": {
|
||||
"root": "apps/demo",
|
||||
"root": "packages/zoo",
|
||||
"projectType": "library",
|
||||
"targets": {
|
||||
"build": {
|
||||
"typecheck": {
|
||||
"dependsOn": ["^typecheck"],
|
||||
"options": {
|
||||
"cwd": "packages/zoo",
|
||||
"command": "tsc --build --emitDeclarationOnly --pretty --verbose"
|
||||
},
|
||||
"cache": true,
|
||||
"dependsOn": ["^build"],
|
||||
"inputs": [
|
||||
"default",
|
||||
"^default",
|
||||
"{workspaceRoot}/tsconfig.base.json",
|
||||
"{projectRoot}/tsconfig.json",
|
||||
"{projectRoot}/tsconfig.lib.json",
|
||||
"{projectRoot}/**/*.ts",
|
||||
"!{projectRoot}/dist",
|
||||
"!{projectRoot}/src/**/*.test.ts",
|
||||
"!{projectRoot}/src/**/*.spec.ts",
|
||||
"!{projectRoot}/src/**/*.test.tsx",
|
||||
"!{projectRoot}/src/**/*.spec.tsx",
|
||||
"!{projectRoot}/src/**/*.test.js",
|
||||
"!{projectRoot}/src/**/*.spec.js",
|
||||
"!{projectRoot}/src/**/*.test.jsx",
|
||||
"!{projectRoot}/src/**/*.spec.jsx",
|
||||
{
|
||||
"externalDependencies": ["vite"]
|
||||
"dependentTasksOutputFiles": "**/*.d.ts"
|
||||
},
|
||||
{
|
||||
"externalDependencies": ["typescript"]
|
||||
}
|
||||
],
|
||||
"outputs": ["{workspaceRoot}/packages/zoo/dist"],
|
||||
"syncGenerators": ["@nx/js:typescript-sync"],
|
||||
"metadata": {
|
||||
"technologies": ["typescript"],
|
||||
"description": "Runs type-checking for the project.",
|
||||
"help": {
|
||||
"command": "npx tsc --build --help",
|
||||
"example": {
|
||||
"args": ["--force"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"executor": "nx:run-commands",
|
||||
"configurations": {},
|
||||
"parallelism": true
|
||||
},
|
||||
"build": {
|
||||
"dependsOn": ["^build"],
|
||||
"options": {
|
||||
"cwd": "packages/zoo",
|
||||
"command": "tsc --build tsconfig.lib.json --pretty --verbose"
|
||||
},
|
||||
"cache": true,
|
||||
"inputs": [
|
||||
"{workspaceRoot}/tsconfig.base.json",
|
||||
"{projectRoot}/tsconfig.lib.json",
|
||||
"{projectRoot}/**/*.ts",
|
||||
"!{projectRoot}/dist",
|
||||
"!{projectRoot}/src/**/*.test.ts",
|
||||
"!{projectRoot}/src/**/*.spec.ts",
|
||||
"!{projectRoot}/src/**/*.test.tsx",
|
||||
"!{projectRoot}/src/**/*.spec.tsx",
|
||||
"!{projectRoot}/src/**/*.test.js",
|
||||
"!{projectRoot}/src/**/*.spec.js",
|
||||
"!{projectRoot}/src/**/*.test.jsx",
|
||||
"!{projectRoot}/src/**/*.spec.jsx",
|
||||
{
|
||||
"dependentTasksOutputFiles": "**/*.d.ts"
|
||||
},
|
||||
{
|
||||
"externalDependencies": ["typescript"]
|
||||
}
|
||||
],
|
||||
"outputs": ["{projectRoot}/dist"],
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"cwd": "apps/demo",
|
||||
"command": "vite build"
|
||||
"syncGenerators": ["@nx/js:typescript-sync"],
|
||||
"metadata": {
|
||||
"technologies": ["typescript"],
|
||||
"description": "Builds the project with `tsc`.",
|
||||
"help": {
|
||||
"command": "npx tsc --build --help",
|
||||
"example": {
|
||||
"args": ["--force"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"configurations": {}
|
||||
"executor": "nx:run-commands",
|
||||
"configurations": {},
|
||||
"parallelism": true
|
||||
},
|
||||
"serve": {
|
||||
"executor": "nx:run-script",
|
||||
"options": {
|
||||
"script": "serve"
|
||||
},
|
||||
"metadata": {
|
||||
"scriptContent": "node dist/index.js",
|
||||
"runCommand": "npm run serve"
|
||||
},
|
||||
"configurations": {},
|
||||
"parallelism": true
|
||||
},
|
||||
"nx-release-publish": {
|
||||
"executor": "@nx/js:release-publish",
|
||||
"dependsOn": ["^nx-release-publish"],
|
||||
"options": {},
|
||||
"configurations": {},
|
||||
"parallelism": true
|
||||
}
|
||||
},
|
||||
"sourceRoot": "apps/demo",
|
||||
"name": "@tuskdesign/demo",
|
||||
"projectType": "library",
|
||||
"includedScripts": [],
|
||||
"implicitDependencies": [],
|
||||
"tags": []
|
||||
"sourceRoot": "packages/zoo",
|
||||
"name": "@tuskdesign/zoo",
|
||||
"tags": ["npm:public"],
|
||||
"metadata": {
|
||||
"targetGroups": {
|
||||
"NPM Scripts": ["serve"]
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"implicitDependencies": []
|
||||
}
|
||||
},
|
||||
"sourceMap": {
|
||||
"root": ["apps/demo/package.json", "nx/core/package-json-workspaces"],
|
||||
"targets": ["apps/demo/package.json", "nx/core/package-json-workspaces"],
|
||||
"targets.build": ["apps/demo/package.json", "nx/core/target-defaults"],
|
||||
"targets.build.options": ["apps/demo/vite.config.ts", "@nx/vite/plugin"],
|
||||
"targets.build.cache": [
|
||||
"apps/demo/package.json",
|
||||
"nx/core/target-defaults"
|
||||
"root": ["packages/zoo/package.json", "nx/core/package-json"],
|
||||
"projectType": ["packages/zoo/tsconfig.lib.json", "@nx/js/typescript"],
|
||||
"targets": ["packages/zoo/tsconfig.json", "@nx/js/typescript"],
|
||||
"targets.typecheck": ["packages/zoo/tsconfig.json", "@nx/js/typescript"],
|
||||
"targets.typecheck.dependsOn": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.dependsOn": [
|
||||
"apps/demo/package.json",
|
||||
"nx/core/target-defaults"
|
||||
"targets.typecheck.options": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.cache": ["nx.json", "nx/target-defaults"],
|
||||
"targets.typecheck.inputs": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.outputs": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.syncGenerators": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.metadata": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.executor": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.options.cwd": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.options.command": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.metadata.technologies": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.metadata.technologies.0": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.metadata.description": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.metadata.help": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.metadata.help.command": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.typecheck.metadata.help.example": [
|
||||
"packages/zoo/tsconfig.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build": ["packages/zoo/tsconfig.lib.json", "@nx/js/typescript"],
|
||||
"targets.build.dependsOn": ["nx.json", "nx/target-defaults"],
|
||||
"targets.build.options": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.cache": ["nx.json", "nx/target-defaults"],
|
||||
"targets.build.inputs": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.outputs": ["nx.json", "nx/target-defaults"],
|
||||
"targets.build.syncGenerators": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.metadata": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.executor": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.inputs": ["apps/demo/vite.config.ts", "@nx/vite/plugin"],
|
||||
"targets.build.outputs": ["apps/demo/vite.config.ts", "@nx/vite/plugin"],
|
||||
"targets.build.executor": ["apps/demo/vite.config.ts", "@nx/vite/plugin"],
|
||||
"targets.build.options.cwd": [
|
||||
"apps/demo/vite.config.ts",
|
||||
"@nx/vite/plugin"
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.options.command": [
|
||||
"apps/demo/vite.config.ts",
|
||||
"@nx/vite/plugin"
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"sourceRoot": ["apps/demo/package.json", "nx/core/package-json-workspaces"],
|
||||
"name": ["apps/demo/package.json", "nx/core/package-json-workspaces"],
|
||||
"projectType": [
|
||||
"apps/demo/package.json",
|
||||
"nx/core/package-json-workspaces"
|
||||
"targets.build.metadata.technologies": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"includedScripts": [
|
||||
"apps/demo/package.json",
|
||||
"nx/core/package-json-workspaces"
|
||||
]
|
||||
"targets.build.metadata.technologies.0": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.metadata.description": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.metadata.help": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.metadata.help.command": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"targets.build.metadata.help.example": [
|
||||
"packages/zoo/tsconfig.lib.json",
|
||||
"@nx/js/typescript"
|
||||
],
|
||||
"sourceRoot": ["packages/zoo/package.json", "nx/core/package-json"],
|
||||
"name": ["packages/zoo/package.json", "nx/core/package-json"],
|
||||
"tags": ["packages/zoo/package.json", "nx/core/package-json"],
|
||||
"tags.npm:public": ["packages/zoo/package.json", "nx/core/package-json"],
|
||||
"metadata.targetGroups": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"metadata.targetGroups.NPM Scripts": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"metadata.targetGroups.NPM Scripts.0": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"metadata.description": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.serve": ["packages/zoo/package.json", "nx/core/package-json"],
|
||||
"targets.serve.executor": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.serve.options": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.serve.metadata": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.serve.options.script": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.serve.metadata.scriptContent": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.serve.metadata.runCommand": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.nx-release-publish": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.nx-release-publish.executor": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.nx-release-publish.dependsOn": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.nx-release-publish.options": [
|
||||
"packages/zoo/package.json",
|
||||
"nx/core/package-json"
|
||||
],
|
||||
"targets.typecheck.parallelism": ["nx.json", "nx/target-defaults"],
|
||||
"targets.build.parallelism": ["nx.json", "nx/target-defaults"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,21 +2,21 @@
|
||||
"hash": "b403577d293fcd1162049fb6cd70752277d68eecc34268aa57452ce597b7352e",
|
||||
"projects": [
|
||||
{
|
||||
"name": "@tuskdesign/buttons",
|
||||
"name": "@tuskdesign/animals",
|
||||
"type": "lib",
|
||||
"data": {
|
||||
"tags": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "@tuskdesign/forms",
|
||||
"name": "@tuskdesign/names",
|
||||
"type": "lib",
|
||||
"data": {
|
||||
"tags": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "@tuskdesign/demo",
|
||||
"name": "@tuskdesign/zoo",
|
||||
"type": "lib",
|
||||
"data": {
|
||||
"tags": []
|
||||
@@ -24,23 +24,23 @@
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"@tuskdesign/buttons": [],
|
||||
"@tuskdesign/forms": [
|
||||
"@tuskdesign/animals": [],
|
||||
"@tuskdesign/names": [
|
||||
{
|
||||
"source": "@tuskdesign/forms",
|
||||
"target": "@tuskdesign/buttons",
|
||||
"source": "@tuskdesign/names",
|
||||
"target": "@tuskdesign/animals",
|
||||
"type": "static"
|
||||
}
|
||||
],
|
||||
"@tuskdesign/demo": [
|
||||
"@tuskdesign/zoo": [
|
||||
{
|
||||
"source": "@tuskdesign/demo",
|
||||
"target": "@tuskdesign/buttons",
|
||||
"source": "@tuskdesign/zoo",
|
||||
"target": "@tuskdesign/animals",
|
||||
"type": "static"
|
||||
},
|
||||
{
|
||||
"source": "@tuskdesign/demo",
|
||||
"target": "@tuskdesign/forms",
|
||||
"source": "@tuskdesign/zoo",
|
||||
"target": "@tuskdesign/names",
|
||||
"type": "static"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -22,14 +22,14 @@ Here's the source code of the final result for this tutorial.
|
||||
|
||||
{% github-repository url="https://github.com/nrwl/nx-recipes/tree/main/npm-workspaces" /%} -->
|
||||
|
||||
{% youtube
|
||||
<!-- {% youtube
|
||||
src="https://www.youtube.com/embed/ZA9K4iT3ANc"
|
||||
title="Nx NPM Workspaces Tutorial Walkthrough"
|
||||
/%}
|
||||
/%} -->
|
||||
|
||||
## Starting Repository
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=51" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=51" /%} -->
|
||||
|
||||
To get started, fork [the sample repository](https://github.com/nrwl/tuskydesign/fork) and clone it on your local machine:
|
||||
|
||||
@@ -37,11 +37,11 @@ To get started, fork [the sample repository](https://github.com/nrwl/tuskydesign
|
||||
git clone https://github.com/<your-username>/tuskydesign.git
|
||||
```
|
||||
|
||||
The repository has two React packages (under `packages/buttons` and `packages/forms`) that are used in a `demo` application (located in `apps/demo`) that was designed to be used with the Vite CLI. The root `package.json` has a `workspaces` property that tells NPM how to find the projects in the repository.
|
||||
The repository has three TypeScript packages under `packages/animals`, `packages/names` and `packages/zoo`. The `zoo` package uses `animals` and `names` to generate a random message. The root `package.json` has a `workspaces` property that tells NPM how to find the projects in the repository.
|
||||
|
||||
```json {% fileName="package.json" %}
|
||||
{
|
||||
"workspaces": ["packages/*", "apps/*"]
|
||||
"workspaces": ["packages/*"]
|
||||
}
|
||||
```
|
||||
|
||||
@@ -51,32 +51,34 @@ Because of this setting, when the install command is run at the root, the correc
|
||||
npm install
|
||||
```
|
||||
|
||||
Now let's try running some tasks. To lint the `demo` app, use the `lint` npm script:
|
||||
Now let's try running some tasks. To build the `animals` package, use the `build` npm script:
|
||||
|
||||
```text {% command="npm run lint -w @tuskdesign/demo" path="~/tuskydesigns" %}
|
||||
> @tuskdesign/demo@0.0.0 lint
|
||||
> eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0
|
||||
```text {% command="npm run build -w @tuskdesign/animals" path="~/tuskydesigns" %}
|
||||
> @tuskdesign/animals@1.2.0 build
|
||||
> tsc --build tsconfig.lib.json
|
||||
```
|
||||
|
||||
If you try to build the `demo` app, it will fail.
|
||||
The repository is set up using [TypeScript project references](https://www.typescriptlang.org/docs/handbook/project-references.html) so building the `zoo` package will automatically build all its dependencies.
|
||||
|
||||
```text
|
||||
Error: Failed to resolve entry for package "@tuskdesign/buttons". The package may have incorrect main/module/exports specified in its package.json.
|
||||
```text {% command="npm run build -w @tuskdesign/zoo" path="~/tuskydesigns" %}
|
||||
> @tuskdesign/zoo@1.2.0 build
|
||||
> tsc --build tsconfig.lib.json
|
||||
```
|
||||
|
||||
The `build` script fails because it needs the `buttons` and `forms` projects to be built first in order to work correctly. To do this, lets return to the root of the repository and run the `build` task for every project in the repo:
|
||||
To run the `zoo` package use the `serve` script:
|
||||
|
||||
```shell {% path="~/tuskydesigns" %}
|
||||
npm run build --ws
|
||||
```text {% command="npm run serve -w @tuskdesign/zoo" path="~/tuskydesigns" %}
|
||||
> @tuskdesign/zoo@1.2.0 serve
|
||||
> node dist/index.js
|
||||
|
||||
Bo the pig says oink!
|
||||
```
|
||||
|
||||
When the `buttons` and `forms` projects are built first, the `demo` app can build successfully.
|
||||
|
||||
Now that you have a basic understanding of the repository we're working with, let's see how Nx can help us.
|
||||
|
||||
## Smart Monorepo
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=170" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=170" /%} -->
|
||||
|
||||
Nx offers many features, but at its core, it is a task runner. Out of the box, it can cache your tasks and ensure those tasks are run in the correct order. After the initial set up, you can incrementally add on other features that would be helpful in your organization.
|
||||
|
||||
@@ -97,20 +99,19 @@ First, the script will propose installing some plugins based on the packages tha
|
||||
Second, the script asks a series of questions to help set up caching for you.
|
||||
|
||||
- `Which scripts need to be run in order?` - Choose `build`
|
||||
- `Which scripts are cacheable?` - Choose `typecheck`, `build` and `lint`
|
||||
- `Does the "typecheck" script create any outputs?` - Enter nothing
|
||||
- `Which scripts are cacheable?` - Choose `build` and `typecheck`
|
||||
- `Does the "build" script create any outputs?` - Enter `dist`
|
||||
- `Does the "lint" script create any outputs?` - Enter nothing
|
||||
- `Does the "typecheck" script create any outputs?` - Enter nothing
|
||||
- `Would you like remote caching to make your build faster?` - Choose `Skip for now`
|
||||
|
||||
### Explore Your Workspace
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=250" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=250" /%} -->
|
||||
|
||||
If you run `nx graph` as instructed, you'll see the dependencies between your projects.
|
||||
|
||||
```shell {% path="~/tuskydesigns" %}
|
||||
npx nx graph --focus=@tuskdesign/demo
|
||||
npx nx graph --focus=@tuskdesign/zoo
|
||||
```
|
||||
|
||||
{% graph title="Tusk Design" height="200px" jsonFile="shared/tutorials/npm-workspaces-project-graph.json" %}
|
||||
@@ -120,12 +121,12 @@ Nx uses this graph to determine the order tasks are run and enforce module bound
|
||||
|
||||
### Caching Pre-configured
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=285" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=285" /%} -->
|
||||
|
||||
Nx has been configured to run your `build`, `typecheck` and `lint` tasks. You can run a single task like this:
|
||||
|
||||
```shell {% path="~/tuskydesigns" %}
|
||||
npx nx build @tuskdesign/demo
|
||||
npx nx build @tuskdesign/zoo
|
||||
```
|
||||
|
||||
Or all tasks with a certain name like this:
|
||||
@@ -156,23 +157,23 @@ During the `init` script, Nx also configured caching for these tasks. You can se
|
||||
}
|
||||
```
|
||||
|
||||
Try running `build` for the `demo` app a second time:
|
||||
Try running `build` for the `zoo` app a second time:
|
||||
|
||||
```shell {% path="~/tuskydesigns" %}
|
||||
npx nx build @tuskdesign/demo
|
||||
npx nx build @tuskdesign/zoo
|
||||
```
|
||||
|
||||
The first time `nx build` was run, it took about 5 seconds - just like running `npm run build`. But the second time you run `nx build`, it completes instantly and displays this message:
|
||||
The first time `nx build` was run, it took about 1 second - just like running `npm run build`. But the second time you run `nx build`, it completes instantly and displays this message:
|
||||
|
||||
```text
|
||||
Nx read the output from the cache instead of running the command for 3 out of 3 tasks.
|
||||
```
|
||||
|
||||
You can see the same caching behavior working when you run `npx nx lint` or `npx nx typecheck`.
|
||||
You can see the same caching behavior working when you run `npx nx typecheck`.
|
||||
|
||||
### Use Task Pipelines
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=358" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=358" /%} -->
|
||||
|
||||
You may be wondering why the caching message in the previous section mentioned 3 tasks when you only ran the `build` task from the terminal. When we said that `build` tasks must be run in order during the setup script, Nx created a simple task pipeline. You can see the configuration for it in the `nx.json` file:
|
||||
|
||||
@@ -195,135 +196,159 @@ npx nx graph
|
||||
Alternatively, you can pass the `--graph` option to the run command to inspect the task graph.
|
||||
|
||||
```shell {% path="~/tuskydesigns" %}
|
||||
npx nx run @tuskdesign/demo:build --graph
|
||||
npx nx run @tuskdesign/zoo:build --graph
|
||||
```
|
||||
|
||||
{% graph height="200px" title="Build Task Pipeline" type="task" jsonFile="shared/tutorials/npm-workspaces-build-tasks1.json" %}
|
||||
{% /graph %}
|
||||
|
||||
With this pipeline in place, you will never run into the error we hit at the beginning of the tutorial where the `forms` and `buttons` packages weren't built so the `demo` app couldn't build. Test this out by deleting the `packages/forms/dist` folder and then re-running the `build` task for the `demo` app.
|
||||
|
||||
```text {% command="npx nx build @tuskdesign/demo" path="~/tuskydesigns" %}
|
||||
...
|
||||
|
||||
NX Successfully ran target build for project @tuskdesign/demo and 2 tasks it depends on (40ms)
|
||||
|
||||
Nx read the output from the cache instead of running the command for 3 out of 3 tasks.
|
||||
```
|
||||
|
||||
Not only does the build complete successfully, but it finishes instantly and the `packages/forms/dist` folder is put back in place thanks to the caching.
|
||||
|
||||
### Create a Task Pipeline
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=450" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=450" /%} -->
|
||||
|
||||
You may have noticed in the `apps/demo/package.json` file, there is a `prebuild` script that runs `typecheck` before the `build` script in order to catch any type errors. Let's set up this same behavior in the Nx task pipeline as well.
|
||||
You may have noticed in the `packages/zoo/package.json` file, there is a `serve` script that expects the `build` task to already have created the `dist` folder. Let's set up a task pipeline that will guarantee that the project's `build` task has been run.
|
||||
|
||||
```json {% fileName="nx.json" highlightLines=[5] %}
|
||||
{
|
||||
"$schema": "./node_modules/nx/schemas/nx-schema.json",
|
||||
"targetDefaults": {
|
||||
"serve": {
|
||||
"dependsOn": ["build"]
|
||||
},
|
||||
"build": {
|
||||
"dependsOn": ["^build", "typecheck"],
|
||||
"dependsOn": ["^build"],
|
||||
"outputs": ["{projectRoot}/dist"],
|
||||
"cache": true
|
||||
},
|
||||
"typecheck": {
|
||||
"cache": true
|
||||
},
|
||||
"lint": {
|
||||
"cache": true
|
||||
}
|
||||
},
|
||||
"defaultBase": "main"
|
||||
}
|
||||
```
|
||||
|
||||
The `dependsOn` line makes Nx run the `typecheck` task for the current project and the `build` task for any dependencies before running the current project's `build` task. Now `nx build` will run the `typecheck` task just like `npm run build` does.
|
||||
The `serve` target's `dependsOn` line makes Nx run the `build` task for the current project before running the current project's `build` task. Now `nx serve` will run the `build` task before running the `serve` task.
|
||||
|
||||
### Use Nx Plugins to Enhance Vite Tasks with Caching
|
||||
### Use Nx Plugins to Enhance Your Workspace
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=507" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=507" /%} -->
|
||||
|
||||
You may remember that we defined the `outputs` property in `nx.json` when we were answering questions in the `nx init` script. The value is currently hard-coded so that if you change the output path in your `vite.config.ts`, you have to remember to also change the `outputs` array in the `build` task configuration. This is where plugins can help. They directly infer information from the actual tooling configuration files (`vite.config.ts` in this case).
|
||||
We mentioned earlier that this repository is using TypeScript project references defined in the `tsconfig.json` files to incrementally build each project so that the output is available for other projects in the repository. In order for this feature to work, the `references` section in the `tsconfig.json` files for each project need to accurately reflect the actual dependencies of that project. This can be difficult to maintain, but Nx already knows the dependencies of every project and you can use the `@nx/js` plugin to automatically keep the TypeScript project references in sync with the code base.
|
||||
|
||||
Nx plugins can:
|
||||
|
||||
- automatically configure caching for you, including inputs and outputs based on the underlying tooling configuration
|
||||
- infer tasks that can be run on a project because of the tooling present
|
||||
- keep tooling configuration in sync with the structure of your codebase
|
||||
- provide code generators to help scaffold out projects
|
||||
- automatically keep the tooling versions and configuration files up to date
|
||||
|
||||
For this tutorial, we'll just focus on the automatic caching configuration.
|
||||
For this tutorial, we'll focus on inferring tasks and keeping tooling configuration in sync.
|
||||
|
||||
First, let's delete the `outputs` array from `nx.json` so that we don't override the inferred values from the plugin. Your `nx.json` should look like this:
|
||||
First, let's remove the existing `build` and `typecheck` scripts from each project's `package.json` files to allow the `@nx/js` plugin to infer those tasks for us.
|
||||
|
||||
```json {% fileName="nx.json" %}
|
||||
```json {% fileName="packages/animals/package.json" %}
|
||||
{
|
||||
"$schema": "./node_modules/nx/schemas/nx-schema.json",
|
||||
"targetDefaults": {
|
||||
"build": {
|
||||
"dependsOn": ["^build", "typecheck"],
|
||||
"cache": true
|
||||
},
|
||||
"typecheck": {
|
||||
"cache": true
|
||||
},
|
||||
"lint": {
|
||||
"cache": true
|
||||
}
|
||||
},
|
||||
"defaultBase": "main"
|
||||
"scripts": {}
|
||||
}
|
||||
```
|
||||
|
||||
Now let's add the `@nx/vite` plugin:
|
||||
|
||||
```{% command="npx nx add @nx/vite" path="~/tuskydesign" %}
|
||||
✔ Installing @nx/vite...
|
||||
✔ Initializing @nx/vite...
|
||||
|
||||
NX Package @nx/vite added successfully.
|
||||
```json {% fileName="packages/names/package.json" %}
|
||||
{
|
||||
"scripts": {}
|
||||
}
|
||||
```
|
||||
|
||||
The `nx add` command installs the version of the plugin that matches your repo's Nx version and runs that plugin's initialization script. For `@nx/vite`, the initialization script registers the plugin in the `plugins` array of `nx.json` and updates any `package.json` scripts that execute Vite related tasks. Open the project details view for the `demo` app and look at the `build` task.
|
||||
```json {% fileName="packages/zoo/package.json" %}
|
||||
{
|
||||
"scripts": {
|
||||
"serve": "node dist/index.js"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Now let's add the `@nx/js` plugin:
|
||||
|
||||
```{% command="npx nx add @nx/js" path="~/tuskydesign" %}
|
||||
✔ Installing @nx/js...
|
||||
✔ Initializing @nx/js...
|
||||
NX Generating @nx/js:init
|
||||
|
||||
UPDATE nx.json
|
||||
UPDATE package.json
|
||||
|
||||
NX Package @nx/js added successfully.
|
||||
```
|
||||
|
||||
The `nx add` command installs the version of the plugin that matches your repo's Nx version and runs that plugin's initialization script. For `@nx/js`, the initialization script registers the plugin in the `plugins` array of `nx.json`. The registered plugin automatically infers `build` and `typecheck` tasks for any project with a `tsconfig.json` file. Open the project details view for the `zoo` package and look at the `build` task.
|
||||
|
||||
```shell {% path="~/tuskydesigns" %}
|
||||
npx nx show project @tuskdesign/demo
|
||||
npx nx show project @tuskdesign/zoo
|
||||
```
|
||||
|
||||
{% project-details title="Project Details View" jsonFile="shared/tutorials/npm-workspaces-pdv.json" %}
|
||||
{% /project-details %}
|
||||
|
||||
If you hover over the settings for the `vite:build` task, you can see where those settings come from. The `inputs` and `outputs` are defined by the `@nx/vite` plugin from the `vite.config.ts` file where as the `dependsOn` property we set earlier in the tutorial in the `targetDefaults` in the `nx.json` file.
|
||||
Notice that the `inputs` that are inferred for the `build` task match the `include` and `exclude` settings in the `tsconfig.lib.json` file. As those settings are changed, the cache `inputs` will automatically update to the correct values.
|
||||
|
||||
Now let's change where the `build` results are output to in the `vite.config.ts` file.
|
||||
The `build` task also has a [sync generator](/concepts/sync-generators) defined. The `@nx/js:typescript-sync` generator will automatically update the `references` property in the `tsconfig.json` files across the repository to match the actual dependencies in your code.
|
||||
|
||||
```ts {% fileName="apps/demo/vite.config.ts" highlightLines=[7-9] %}
|
||||
import { defineConfig } from 'vite';
|
||||
import react from '@vitejs/plugin-react';
|
||||
Let's see this behavior in action by extracting some common code into a new `util` library.
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
build: {
|
||||
outDir: '../../dist/demo',
|
||||
},
|
||||
});
|
||||
First, create a library with `@nx/js:lib` generator:
|
||||
|
||||
```shell
|
||||
nx g @nx/js:lib packages/util
|
||||
```
|
||||
|
||||
Now if you look at project details view again, you'll see that the `outputs` property for Nx's caching has been updated to stay in sync with the setting in the `vite.config.ts` file.
|
||||
Set the bundler to `tsc`, the linter to `none` and the unit test runner to `none`.
|
||||
|
||||
You can also add the `@nx/eslint` plugin to see how it infers `lint` tasks based on the ESLint configuration files.
|
||||
Now we can move the `getRandomItem` function from `packages/names/names.ts` and `packages/animals/animals.ts` into the `packages/util/src/lib/util.ts` file.
|
||||
|
||||
```ts {% fileName="packages/util/src/lib/util.ts" %}
|
||||
export function getRandomItem<T>(arr: T[]): T {
|
||||
return arr[Math.floor(Math.random() * arr.length)];
|
||||
}
|
||||
```
|
||||
|
||||
```ts {% fileName="packages/animals/animals.ts" %}
|
||||
import { getRandomItem } from '@tuskdesign/util';
|
||||
|
||||
// ...
|
||||
```
|
||||
|
||||
```ts {% fileName="packages/names/names.ts" %}
|
||||
import { getRandomItem } from '@tuskdesign/util';
|
||||
|
||||
// ...
|
||||
```
|
||||
|
||||
Now if you run run the build, Nx will notice that the TypeScript project references need to be updated and ask your permission to update them.
|
||||
|
||||
```text {% command="nx build @tuskdesign/zoo" path="~/tuskydesigns" %}
|
||||
NX The workspace is out of sync
|
||||
|
||||
The @nx/js:typescript-sync sync generator identified 6 files in the workspace that are out of sync:
|
||||
Based on the workspace project graph, some TypeScript configuration files are missing project references to the projects they depend on or contain outdated project references.
|
||||
|
||||
Please note that having the workspace out of sync will result in an error in CI.
|
||||
|
||||
? Would you like to sync the identified changes to get your workspace up to date? …
|
||||
❯ Yes, sync the changes and run the tasks
|
||||
No, run the tasks without syncing the changes
|
||||
```
|
||||
|
||||
Allow the sync to happen and you'll see that the `tsconfig.json` and `tsconfig.lib.json` files have been updated to include references to the new `util` library. With this system in place, no matter how your codebase changes, the TypeScript project references will always be correct.
|
||||
|
||||
### Checkpoint
|
||||
|
||||
At this point, the repository is still using all the same tools to run tasks, but now Nx runs those tasks in a smarter way. The tasks are efficiently cached so that there is no repeated work and the cache configuration settings are automatically synced with your tooling configuration files by Nx plugins. Also, any task dependencies are automatically executed whenever needed because we configured task pipelines for the projects.
|
||||
|
||||
Open up the task graph for `demo` app's `build` task again to see the changes.
|
||||
Open up the task graph for `zoo` app's `serve` task again to see the changes.
|
||||
|
||||
```shell {% path="~/tuskydesigns" %}
|
||||
npx nx run @tuskdesign/demo:build --graph
|
||||
npx nx run @tuskdesign/zoo:serve --graph
|
||||
```
|
||||
|
||||
{% graph height="200px" title="Build Task Pipeline" type="task" jsonFile="shared/tutorials/npm-workspaces-build-tasks2.json" %}
|
||||
@@ -331,9 +356,9 @@ npx nx run @tuskdesign/demo:build --graph
|
||||
|
||||
## Manage Releases
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=713" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=713" /%} -->
|
||||
|
||||
If you decide to publish the `forms` or `buttons` packages on NPM, Nx can also help you [manage the release process](/features/manage-releases). Release management involves updating the version of your package, populating a changelog, and publishing the new version to the NPM registry.
|
||||
If you decide to publish the `animals` or `names` packages on NPM, Nx can also help you [manage the release process](/features/manage-releases). Release management involves updating the version of your package, populating a changelog, and publishing the new version to the NPM registry.
|
||||
|
||||
First you'll need to define which projects Nx should manage releases for by setting the `release.projects` property in `nx.json`:
|
||||
|
||||
@@ -345,7 +370,7 @@ First you'll need to define which projects Nx should manage releases for by sett
|
||||
}
|
||||
```
|
||||
|
||||
Now you're ready to use the `nx release` command to publish the `forms` and `buttons` packages. The first time you run `nx release`, you need to add the `--first-release` flag so that Nx doesn't try to find the previous version to compare against. It's also recommended to use the `--dry-run` flag until you're sure about the results of the `nx release` command, then you can run it a final time without the `--dry-run` flag.
|
||||
Now you're ready to use the `nx release` command to publish the `animals` and `names` packages. The first time you run `nx release`, you need to add the `--first-release` flag so that Nx doesn't try to find the previous version to compare against. It's also recommended to use the `--dry-run` flag until you're sure about the results of the `nx release` command, then you can run it a final time without the `--dry-run` flag.
|
||||
|
||||
To preview your first release, run:
|
||||
|
||||
@@ -363,7 +388,7 @@ After this first release, you can remove the `--first-release` flag and just run
|
||||
|
||||
## Fast CI ⚡ {% highlightColor="green" %}
|
||||
|
||||
{% video-link link="https://youtu.be/ZA9K4iT3ANc?t=821" /%}
|
||||
<!-- {% video-link link="https://youtu.be/ZA9K4iT3ANc?t=821" /%} -->
|
||||
|
||||
{% callout type="check" title="Forked repository with Nx" %}
|
||||
Make sure you have completed the previous sections of this tutorial before starting this one. If you want a clean starting point, you can fork the [sample repository with Nx already added](https://github.com/nrwl/nx-recipes/tree/main/npm-workspaces).
|
||||
@@ -415,7 +440,7 @@ Use the following command to generate a CI workflow file.
|
||||
npx nx generate ci-workflow --ci=github
|
||||
```
|
||||
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also [distribute tasks across multiple machines](/ci/features/distribute-task-execution) to ensure fast and reliable CI runs.
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. If you would like to also distribute tasks across multiple machines to ensure fast and reliable CI runs, uncomment the `nx-cloud start-ci-run` line.
|
||||
|
||||
The key lines in the CI pipeline are:
|
||||
|
||||
@@ -432,8 +457,8 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
- run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
# Uncomment this line to enable task distribution
|
||||
# - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 20
|
||||
@@ -475,4 +500,4 @@ Connect with the rest of the Nx community with these resources:
|
||||
- [Join the Official Nx Discord Server](https://go.nx.dev/community) to ask questions and find out the latest news about Nx.
|
||||
- [Follow Nx on Twitter](https://twitter.com/nxdevtools) to stay up to date with Nx news
|
||||
- [Read our Nx blog](/blog)
|
||||
- [Subscribe to our Youtube channel](https://www.youtube.com/@nxdevtools) for demos and Nx insights
|
||||
- [Subscribe to our Youtube channel](https://www.youtube.com/@nxdevtools) for zoos and Nx insights
|
||||
|
||||
@@ -1078,7 +1078,7 @@ Once you click the link, follow the steps provided and make sure Nx Cloud is ena
|
||||
|
||||
### Configure Your CI Workflow {% highlightColor="green" %}
|
||||
|
||||
When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs.
|
||||
When you chose GitHub Actions as your CI provider at the beginning of the tutorial, `create-nx-workspace` created a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. If you would like to also distribute tasks across multiple machines to ensure fast and reliable CI runs, uncomment the `nx-cloud start-ci-run` line.
|
||||
|
||||
If you need to generate a new workflow file for GitHub Actions or other providers, you can do so with this command:
|
||||
|
||||
@@ -1101,8 +1101,8 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
- run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
# Uncomment this line to enable task distribution
|
||||
# - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
@@ -1033,7 +1033,7 @@ Use the following command to generate a CI workflow file.
|
||||
npx nx generate ci-workflow --ci=github
|
||||
```
|
||||
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs.
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. If you would like to also distribute tasks across multiple machines to ensure fast and reliable CI runs, uncomment the `nx-cloud start-ci-run` line.
|
||||
|
||||
The key lines in the CI pipeline are:
|
||||
|
||||
|
||||
@@ -1081,7 +1081,7 @@ Use the following command to generate a CI workflow file.
|
||||
npx nx generate ci-workflow --ci=github
|
||||
```
|
||||
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. Since we are using Nx Cloud, the pipeline will also distribute tasks across multiple machines to ensure fast and reliable CI runs.
|
||||
This generator creates a `.github/workflows/ci.yml` file that contains a CI pipeline that will run the `lint`, `test`, `build` and `e2e` tasks for projects that are affected by any given PR. If you would like to also distribute tasks across multiple machines to ensure fast and reliable CI runs, uncomment the `nx-cloud start-ci-run` line.
|
||||
|
||||
The key lines in the CI pipeline are:
|
||||
|
||||
@@ -1098,8 +1098,8 @@ jobs:
|
||||
# This enables task distribution via Nx Cloud
|
||||
# Run this command as early as possible, before dependencies are installed
|
||||
# Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun
|
||||
# Connect your workspace by running "nx connect" and uncomment this
|
||||
- run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
# Uncomment this line to enable task distribution
|
||||
# - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
@@ -273,7 +273,7 @@ export function runCommandUntil(
|
||||
...opts.env,
|
||||
FORCE_COLOR: 'false',
|
||||
},
|
||||
windowsHide: true,
|
||||
windowsHide: false,
|
||||
});
|
||||
return new Promise((res, rej) => {
|
||||
let output = '';
|
||||
|
||||
@@ -65,7 +65,7 @@ function getPublishedVersion(): Promise<string | undefined> {
|
||||
exec(
|
||||
'npm view nx@latest version',
|
||||
{
|
||||
windowsHide: true,
|
||||
windowsHide: false,
|
||||
},
|
||||
(error, stdout, stderr) => {
|
||||
if (error) {
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { useCallback } from 'react';
|
||||
import { ProjectDetails } from '@nx/graph-internal/ui-project-details';
|
||||
import {
|
||||
ErrorToastUI,
|
||||
ExpandedTargetsProvider,
|
||||
getExternalApiService,
|
||||
} from '@nx/graph/shared';
|
||||
import { useMachine, useSelector } from '@xstate/react';
|
||||
import { ProjectDetails } from '@nx/graph-internal/ui-project-details';
|
||||
import { useSelector } from '@xstate/react';
|
||||
import { useCallback } from 'react';
|
||||
import { Interpreter } from 'xstate';
|
||||
import {
|
||||
ProjectDetailsEvents,
|
||||
ProjectDetailsState,
|
||||
} from './project-details.machine';
|
||||
import { Interpreter } from 'xstate';
|
||||
|
||||
export function ProjectDetailsApp({
|
||||
service,
|
||||
@@ -26,6 +26,10 @@ export function ProjectDetailsApp({
|
||||
service,
|
||||
(state) => state.context.connectedToCloud
|
||||
);
|
||||
const disabledTaskSyncGenerators = useSelector(
|
||||
service,
|
||||
(state) => state.context.disabledTaskSyncGenerators
|
||||
);
|
||||
|
||||
const handleViewInProjectGraph = useCallback(
|
||||
(data: { projectName: string }) => {
|
||||
@@ -83,6 +87,7 @@ export function ProjectDetailsApp({
|
||||
viewInProjectGraphPosition="bottom"
|
||||
connectedToCloud={connectedToCloud}
|
||||
onNxConnect={handleNxConnect}
|
||||
disabledTaskSyncGenerators={disabledTaskSyncGenerators}
|
||||
/>
|
||||
</ExpandedTargetsProvider>
|
||||
<ErrorToastUI errors={errors} />
|
||||
|
||||
@@ -12,6 +12,7 @@ export interface ProjectDetailsState {
|
||||
sourceMap: null | Record<string, string[]>;
|
||||
errors?: GraphError[];
|
||||
connectedToCloud?: boolean;
|
||||
disabledTaskSyncGenerators?: string[];
|
||||
}
|
||||
|
||||
export type ProjectDetailsEvents = {
|
||||
@@ -20,6 +21,7 @@ export type ProjectDetailsEvents = {
|
||||
sourceMap: Record<string, string[]>;
|
||||
connectedToCloud: boolean;
|
||||
errors?: GraphError[];
|
||||
disabledTaskSyncGenerators?: string[];
|
||||
};
|
||||
|
||||
const initialContext: ProjectDetailsState = {
|
||||
@@ -50,6 +52,7 @@ export const projectDetailsMachine = createMachine<
|
||||
ctx.sourceMap = event.sourceMap;
|
||||
ctx.connectedToCloud = event.connectedToCloud;
|
||||
ctx.errors = event.errors;
|
||||
ctx.disabledTaskSyncGenerators = event.disabledTaskSyncGenerators;
|
||||
}),
|
||||
],
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { MenuItem, MenuSection } from '@nx/nx-dev/models-menu';
|
||||
|
||||
const COLLAPSIBLE_SECTIONS = ['concepts', 'recipes'];
|
||||
const COLLAPSIBLE_SECTIONS = ['concepts', 'recipes', 'enterprise'];
|
||||
|
||||
export function getBasicNxSection(items: MenuItem[]): MenuSection {
|
||||
return {
|
||||
@@ -14,6 +14,7 @@ export function getBasicNxSection(items: MenuItem[]): MenuSection {
|
||||
m.id === 'features' ||
|
||||
m.id === 'concepts' ||
|
||||
m.id === 'recipes' ||
|
||||
m.id === 'nx-enterprise' ||
|
||||
m.id === 'showcase' ||
|
||||
m.id === 'reference' ||
|
||||
m.id === 'troubleshooting'
|
||||
@@ -93,6 +94,17 @@ export function getBasicNxCloudSection(items: MenuItem[]): MenuSection {
|
||||
m.id === 'troubleshooting'
|
||||
)
|
||||
.map((m) => {
|
||||
if (m.id === 'recipes') {
|
||||
m.children.map((recipesChild) => {
|
||||
if (recipesChild.id !== 'enterprise') {
|
||||
return recipesChild;
|
||||
}
|
||||
recipesChild.children = recipesChild.children.filter(
|
||||
(enterpriseChild) => enterpriseChild.id !== 'on-premise'
|
||||
);
|
||||
return recipesChild;
|
||||
});
|
||||
}
|
||||
return {
|
||||
...m,
|
||||
disableCollapsible:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { Metadata, Viewport } from 'next';
|
||||
import AppRouterAnalytics from './app-router-analytics';
|
||||
import GlobalScripts from './global-scripts';
|
||||
|
||||
import { LiveStreamNotifier } from '@nx/nx-dev/ui-common';
|
||||
import '../styles/main.css';
|
||||
|
||||
// Metadata for the entire site
|
||||
@@ -80,6 +80,7 @@ export default function RootLayout({
|
||||
</head>
|
||||
<body className="h-full bg-white text-slate-700 antialiased selection:bg-blue-500 selection:text-white dark:bg-slate-900 dark:text-slate-400 dark:selection:bg-sky-500">
|
||||
{children}
|
||||
<LiveStreamNotifier />
|
||||
<GlobalScripts gaMeasurementId={gaMeasurementId} />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,6 +7,7 @@ import Script from 'next/script';
|
||||
import { useEffect } from 'react';
|
||||
import '../styles/main.css';
|
||||
import Link from 'next/link';
|
||||
import { LiveStreamNotifier } from '@nx/nx-dev/ui-common';
|
||||
|
||||
export default function CustomApp({
|
||||
Component,
|
||||
@@ -79,6 +80,7 @@ export default function CustomApp({
|
||||
Skip to content
|
||||
</Link>
|
||||
<Component {...pageProps} />
|
||||
<LiveStreamNotifier />
|
||||
|
||||
{/* Global Site Tag (gtag.js) - Google Analytics */}
|
||||
<Script
|
||||
|
||||
|
Before Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 67 KiB |
@@ -488,6 +488,7 @@ const nxCloudUrls = {
|
||||
'/ci/recipes/set-up/connect-to-cloud': '/ci/intro/connect-to-nx-cloud',
|
||||
'/ci/intro/connect-to-cloud': '/ci/intro/connect-to-nx-cloud',
|
||||
'/pricing/special-offer': 'https://forms.gle/FBzvsspz1o63fDAz6',
|
||||
'/powerpack/special-offer': 'https://forms.gle/mWjQo6Vrv5Kt6WYh9',
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -862,6 +863,10 @@ const missingAndCatchAllRedirects = {
|
||||
'/packages/:path*': '/nx-api/:path*',
|
||||
};
|
||||
|
||||
const marketing = {
|
||||
'/conf': 'https://monorepo.world',
|
||||
};
|
||||
|
||||
const movePluginFeaturesToCore = {
|
||||
'/plugin-features/use-task-executors':
|
||||
'/concepts/executors-and-configurations',
|
||||
@@ -1139,6 +1144,16 @@ const featurePagesUpdate = {
|
||||
'/ci/features/ai-features': '/ci/concepts/ai-features',
|
||||
};
|
||||
|
||||
const enterpriseNxSection = {
|
||||
'/features/powerpack': '/nx-enterprise/powerpack',
|
||||
'/features/powerpack/conformance': '/nx-enterprise/powerpack/conformance',
|
||||
'/features/powerpack/owners': '/nx-enterprise/powerpack/owners',
|
||||
'/features/powerpack/custom-caching':
|
||||
'/nx-enterprise/powerpack/custom-caching',
|
||||
'/recipes/installation/activate-powerpack':
|
||||
'/nx-enterprise/activate-powerpack',
|
||||
};
|
||||
|
||||
/**
|
||||
* Public export API
|
||||
*/
|
||||
@@ -1171,4 +1186,6 @@ module.exports = {
|
||||
blogPosts,
|
||||
decisionsSection,
|
||||
featurePagesUpdate,
|
||||
marketing,
|
||||
enterpriseNxSection,
|
||||
};
|
||||
|
||||
@@ -22,6 +22,7 @@ export * from './lib/discord-icon';
|
||||
export * from './lib/trusted-by';
|
||||
export * from './lib/testimonials';
|
||||
export * from './lib/square-dotted-pattern';
|
||||
export * from './lib/live-stream-notifier';
|
||||
|
||||
export { resourceMenuItems } from './lib/headers/menu-items';
|
||||
export { solutionsMenuItems } from './lib/headers/menu-items';
|
||||
|
||||
@@ -27,7 +27,7 @@ import { SectionHeading } from './typography';
|
||||
export function ChampionPerks(): JSX.Element {
|
||||
return (
|
||||
<article
|
||||
id="nx-is-fast"
|
||||
id="making-of-champion"
|
||||
className="relative bg-slate-50 py-28 dark:bg-slate-800/40"
|
||||
>
|
||||
<div className="mx-auto max-w-7xl px-4 sm:grid sm:grid-cols-2 sm:gap-8 sm:px-6 lg:px-8">
|
||||
|
||||
@@ -18,7 +18,6 @@ import {
|
||||
solutionsMenuItems,
|
||||
} from './menu-items';
|
||||
import { SectionsMenu } from './sections-menu';
|
||||
import { AnnouncementBanner } from '../announcement-banner';
|
||||
import { DiscordIcon } from '../discord-icon';
|
||||
import { NxCloudAnimatedIcon, NxIcon } from '@nx/nx-dev/ui-icons';
|
||||
|
||||
@@ -170,9 +169,6 @@ export function DocumentationHeader({
|
||||
|
||||
return (
|
||||
<div className="border-b border-slate-200 bg-slate-50 dark:border-slate-700 dark:bg-slate-800/60 print:hidden">
|
||||
<div className="hidden w-full md:block">
|
||||
<AnnouncementBanner />
|
||||
</div>
|
||||
<div className="mx-auto flex w-full items-center gap-6 lg:px-8 lg:py-4">
|
||||
{/*MOBILE MENU*/}
|
||||
<div className="flex w-full items-center lg:hidden">
|
||||
@@ -266,7 +262,7 @@ export function DocumentationHeader({
|
||||
leaveTo="opacity-0 translate-y-1"
|
||||
>
|
||||
<Popover.Panel className="absolute z-30 mt-3 w-max max-w-3xl xl:max-w-3xl">
|
||||
<TwoColumnsMenu items={featuresItems} />
|
||||
<SectionsMenu sections={featuresItems} />
|
||||
</Popover.Panel>
|
||||
</Transition>
|
||||
</>
|
||||
|
||||
@@ -107,7 +107,7 @@ export function Header(): JSX.Element {
|
||||
leaveTo="opacity-0 translate-y-1"
|
||||
>
|
||||
<Popover.Panel className="absolute z-10 mt-3 w-max max-w-3xl xl:max-w-3xl">
|
||||
<TwoColumnsMenu items={featuresItems} />
|
||||
<SectionsMenu sections={featuresItems} />
|
||||
</Popover.Panel>
|
||||
</Transition>
|
||||
</>
|
||||
@@ -397,12 +397,14 @@ export function Header(): JSX.Element {
|
||||
as="ul"
|
||||
className="space-y-1 pb-2"
|
||||
>
|
||||
{featuresItems.map((item) => (
|
||||
<MobileMenuItem
|
||||
key={item.name}
|
||||
item={item}
|
||||
/>
|
||||
))}
|
||||
{Object.values(featuresItems)
|
||||
.flat()
|
||||
.map((item) => (
|
||||
<MobileMenuItem
|
||||
key={item.name}
|
||||
item={item}
|
||||
/>
|
||||
))}
|
||||
</Disclosure.Panel>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -31,95 +31,101 @@ export interface MenuItem {
|
||||
isNew: boolean;
|
||||
}
|
||||
|
||||
export const featuresItems: MenuItem[] = [
|
||||
{
|
||||
name: 'Run Tasks',
|
||||
// description: 'Run one or many tasks in parallel.',
|
||||
description: null,
|
||||
href: '/features/run-tasks',
|
||||
icon: BoltIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Cache Task Results',
|
||||
// description: 'Speeds up your local workflow.',
|
||||
description: null,
|
||||
href: '/features/cache-task-results',
|
||||
icon: CircleStackIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Explore Your Workspace',
|
||||
// description: 'See interactions for tasks and modules.',
|
||||
description: null,
|
||||
href: '/features/explore-graph',
|
||||
icon: ShareIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Automate Updating Dependencies',
|
||||
// description: 'Keep running on latest without effort.',
|
||||
description: null,
|
||||
href: '/features/automate-updating-dependencies',
|
||||
icon: ArrowUpCircleIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Enforce Module Boundaries',
|
||||
// description: 'Partition your code into defined units.',
|
||||
description: null,
|
||||
href: '/features/enforce-module-boundaries',
|
||||
icon: Squares2X2Icon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Manage Releases',
|
||||
// description: 'Versioning, changelog, publishing.',
|
||||
description: null,
|
||||
href: '/features/manage-releases',
|
||||
icon: CubeIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Run Conformance Rules',
|
||||
description: null,
|
||||
href: '/features/powerpack/conformance',
|
||||
icon: CheckBadgeIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Define Project Owners',
|
||||
description: null,
|
||||
href: '/features/powerpack/owners',
|
||||
icon: UserGroupIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Use Remote Caching (Nx Replay)',
|
||||
description: 'Zero-config, fast & secure remote cache solution.',
|
||||
href: '/ci/features/remote-cache',
|
||||
icon: NxReplayIcon,
|
||||
isNew: false,
|
||||
isHighlight: true,
|
||||
},
|
||||
{
|
||||
name: 'Distribute Task Execution (Nx Agents)',
|
||||
description:
|
||||
'One-line config for distributing tasks across multiple machines',
|
||||
href: '/ci/features/distribute-task-execution',
|
||||
icon: NxAgentsIcon,
|
||||
isNew: false,
|
||||
isHighlight: true,
|
||||
},
|
||||
];
|
||||
export const featuresItems: Record<string, MenuItem[]> = {
|
||||
'': [
|
||||
{
|
||||
name: 'Run Tasks',
|
||||
// description: 'Run one or many tasks in parallel.',
|
||||
description: null,
|
||||
href: '/features/run-tasks',
|
||||
icon: BoltIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Cache Task Results',
|
||||
// description: 'Speeds up your local workflow.',
|
||||
description: null,
|
||||
href: '/features/cache-task-results',
|
||||
icon: CircleStackIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Explore Your Workspace',
|
||||
// description: 'See interactions for tasks and modules.',
|
||||
description: null,
|
||||
href: '/features/explore-graph',
|
||||
icon: ShareIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Automate Updating Dependencies',
|
||||
// description: 'Keep running on latest without effort.',
|
||||
description: null,
|
||||
href: '/features/automate-updating-dependencies',
|
||||
icon: ArrowUpCircleIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Enforce Module Boundaries',
|
||||
// description: 'Partition your code into defined units.',
|
||||
description: null,
|
||||
href: '/features/enforce-module-boundaries',
|
||||
icon: Squares2X2Icon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Manage Releases',
|
||||
// description: 'Versioning, changelog, publishing.',
|
||||
description: null,
|
||||
href: '/features/manage-releases',
|
||||
icon: CubeIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
],
|
||||
'Nx Cloud Features': [
|
||||
{
|
||||
name: 'Use Remote Caching (Nx Replay)',
|
||||
description: 'Zero-config, fast & secure remote cache solution.',
|
||||
href: '/ci/features/remote-cache',
|
||||
icon: NxReplayIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Distribute Task Execution (Nx Agents)',
|
||||
description:
|
||||
'One-line config for distributing tasks across multiple machines',
|
||||
href: '/ci/features/distribute-task-execution',
|
||||
icon: NxAgentsIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
],
|
||||
'Nx Powerpack Features (Paid Enterprise Extensions)': [
|
||||
{
|
||||
name: 'Run Conformance Rules',
|
||||
description: null,
|
||||
href: '/nx-enterprise/powerpack/conformance',
|
||||
icon: CheckBadgeIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Define Project Owners',
|
||||
description: null,
|
||||
href: '/nx-enterprise/powerpack/owners',
|
||||
icon: UserGroupIcon,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
],
|
||||
};
|
||||
export const solutions: MenuItem[] = [
|
||||
{
|
||||
name: 'Nx Cloud',
|
||||
@@ -149,40 +155,6 @@ export const solutions: MenuItem[] = [
|
||||
isHighlight: false,
|
||||
},
|
||||
];
|
||||
const useCaseItems: MenuItem[] = [
|
||||
{
|
||||
name: 'Get actionable feedback',
|
||||
description: 'Enhanced analysis & analytics of your workflows.',
|
||||
href: '',
|
||||
icon: null,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Reduce CI timings with remote caching',
|
||||
description: 'Share task results & artifacts between CI & teams.',
|
||||
href: '',
|
||||
icon: null,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Performant task distribution at scale',
|
||||
description: 'Faster & cheaper CI workflows.',
|
||||
href: '',
|
||||
icon: null,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
{
|
||||
name: 'Improve E2E time execution on CI',
|
||||
description: 'Automatic task splitting.',
|
||||
href: '',
|
||||
icon: null,
|
||||
isNew: false,
|
||||
isHighlight: false,
|
||||
},
|
||||
];
|
||||
export const learnItems: MenuItem[] = [
|
||||
{
|
||||
name: 'Step by step tutorials',
|
||||
|
||||
@@ -11,9 +11,11 @@ export function SectionsMenu({
|
||||
<div className="divide-y divide-slate-200 dark:divide-slate-800">
|
||||
{Object.keys(sections).map((section) => (
|
||||
<div key={section}>
|
||||
<h5 className="px-4 pt-6 text-sm text-slate-500 dark:text-slate-400">
|
||||
{section}
|
||||
</h5>
|
||||
{section ? (
|
||||
<h5 className="px-4 pt-6 text-sm text-slate-500 dark:text-slate-400">
|
||||
{section}
|
||||
</h5>
|
||||
) : undefined}
|
||||
<div className="grid grid-cols-2 gap-2 p-2">
|
||||
{sections[section].map((item) => (
|
||||
<DefaultMenuItem key={item.name} item={item} />
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
'use client';
|
||||
|
||||
import { useState, useEffect, ReactElement } from 'react';
|
||||
import { motion } from 'framer-motion';
|
||||
import { MonorepoWorldIcon } from '@nx/nx-dev/ui-icons';
|
||||
import { ButtonLink } from './button';
|
||||
import {
|
||||
PlayIcon,
|
||||
XMarkIcon,
|
||||
ChatBubbleLeftRightIcon,
|
||||
} from '@heroicons/react/24/outline';
|
||||
|
||||
export function LiveStreamNotifier(): ReactElement | null {
|
||||
const [isVisible, setIsVisible] = useState<boolean>(true);
|
||||
|
||||
useEffect(() => {
|
||||
const isClosedSession = sessionStorage.getItem(
|
||||
'live-stream-notifier-closed'
|
||||
);
|
||||
if (isClosedSession === 'true') {
|
||||
setIsVisible(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
const closeNotifier = (e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
setIsVisible(false);
|
||||
sessionStorage.setItem('live-stream-notifier-closed', 'true');
|
||||
};
|
||||
|
||||
if (!isVisible) return null;
|
||||
|
||||
return (
|
||||
<motion.div
|
||||
layout
|
||||
initial={{ y: '120%' }}
|
||||
animate={{ y: 0 }}
|
||||
exit={{ y: '120%' }}
|
||||
transition={{
|
||||
type: 'spring',
|
||||
stiffness: 300,
|
||||
damping: 30,
|
||||
mass: 1,
|
||||
}}
|
||||
className="fixed bottom-0 left-0 right-0 z-30 w-full overflow-hidden bg-slate-950 text-white shadow-lg md:bottom-4 md:left-auto md:right-4 md:w-[512px] md:rounded-lg"
|
||||
style={{ originY: 1 }}
|
||||
>
|
||||
<div className="relative p-4">
|
||||
<button
|
||||
onClick={closeNotifier}
|
||||
className="absolute right-2 top-2 rounded-full p-1 hover:bg-slate-800 focus:outline-none focus:ring-2 focus:ring-white"
|
||||
>
|
||||
<XMarkIcon className="size-5" aria-hidden="true" />
|
||||
<span className="sr-only">Close</span>
|
||||
</button>
|
||||
<div>
|
||||
<motion.h3
|
||||
layout="position"
|
||||
className="flex items-center gap-2 pr-8 text-lg font-semibold"
|
||||
>
|
||||
<MonorepoWorldIcon
|
||||
aria-hidden="true"
|
||||
className="size-8 flex-shrink-0"
|
||||
/>
|
||||
<span>Monorepo World live replays available!</span>
|
||||
</motion.h3>
|
||||
<motion.div key="live-event" className="mt-4 space-y-4">
|
||||
<p className="mb-2 text-sm">
|
||||
Watch the replays of exciting talks on developer tooling and
|
||||
monorepos! Catch all the insightful presentations from the event
|
||||
on our YouTube channel.
|
||||
</p>
|
||||
<div className="flex flex-wrap items-center gap-1 sm:gap-4">
|
||||
<a
|
||||
title="Watch track 1"
|
||||
href="http://go.nx.dev/MWTrack1"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center justify-center gap-2 rounded-lg bg-[#DDFB24] px-2 py-2 text-sm font-semibold text-black transition hover:bg-[#B2CF04] focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500 active:text-black/70 md:px-4"
|
||||
>
|
||||
<PlayIcon aria-hidden="true" className="size-4" />
|
||||
<span>Track 1</span>
|
||||
</a>
|
||||
<a
|
||||
href="http://go.nx.dev/MWTrack2"
|
||||
target="_blank"
|
||||
title="Watch track 2"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center justify-center gap-2 rounded-lg bg-[#DDFB24] px-2 py-2 text-sm font-semibold text-black transition hover:bg-[#B2CF04] focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500 active:text-black/70 md:px-4"
|
||||
>
|
||||
<PlayIcon aria-hidden="true" className="size-4" />
|
||||
<span>Track 2</span>
|
||||
</a>
|
||||
<ButtonLink
|
||||
variant="secondary"
|
||||
size="small"
|
||||
href="https://discord.gg/7yFabzBP"
|
||||
target="_blank"
|
||||
title="Join the discussion on Discord"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<ChatBubbleLeftRightIcon
|
||||
aria-hidden="true"
|
||||
className="size-4"
|
||||
/>
|
||||
<span>#monorepo-world</span>
|
||||
</ButtonLink>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
);
|
||||
}
|
||||
@@ -10,15 +10,15 @@ export function Security(): JSX.Element {
|
||||
Security
|
||||
</SectionHeading>
|
||||
<p className="mt-6 text-lg">
|
||||
Nx Cloud is certified to the industry standards, is constantly
|
||||
monitored and{' '}
|
||||
Nx Cloud is certified to industry standards, is constantly
|
||||
monitored, and{' '}
|
||||
<a
|
||||
href="https://security.nx.app/"
|
||||
target="_blank"
|
||||
rel="nofollow noreferrer"
|
||||
className="underline"
|
||||
>
|
||||
issue security Trust Reports powered by Vanta
|
||||
issues security trust reports powered by Vanta
|
||||
</a>
|
||||
.
|
||||
</p>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import {
|
||||
ArrowsRightLeftIcon,
|
||||
BanknotesIcon,
|
||||
BoltIcon,
|
||||
ChartBarSquareIcon,
|
||||
ChevronRightIcon,
|
||||
ClipboardDocumentIcon,
|
||||
@@ -15,6 +16,7 @@ import { useEffect } from 'react';
|
||||
import { BentoGrid, BentoGridItem } from './bento-grid';
|
||||
import { cx } from '@nx/nx-dev/ui-primitives';
|
||||
import { SectionHeading } from '@nx/nx-dev/ui-common';
|
||||
import Link from 'next/link';
|
||||
|
||||
export function SolveYourCi(): JSX.Element {
|
||||
return (
|
||||
@@ -182,6 +184,28 @@ export function SolveYourCi(): JSX.Element {
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-start gap-6">
|
||||
<div className="rounded-full p-3 shadow-sm ring-1 ring-slate-200 dark:ring-slate-800/60">
|
||||
<BoltIcon className="h-5 w-5 text-slate-900 dark:text-slate-100" />
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="relative text-base font-medium leading-6 text-slate-900 dark:text-slate-100">
|
||||
Nx Powerpack included
|
||||
</h4>
|
||||
<p className="mt-2">
|
||||
A suite of paid extensions for the Nx CLI specifically
|
||||
designed for enterprises, built and supported by the Nx core
|
||||
team.{' '}
|
||||
<Link
|
||||
href="/powerpack"
|
||||
title="Learn more about Nx Powerpack"
|
||||
className="font-semibold underline"
|
||||
>
|
||||
Learn more about Nx Powerpack →
|
||||
</Link>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,11 @@ import { Theme, useTheme } from '@nx/nx-dev/ui-theme';
|
||||
import { useState } from 'react';
|
||||
import Link from 'next/link';
|
||||
import { useIsomorphicLayoutEffect } from '@nx/nx-dev/ui-primitives';
|
||||
import { MonorepoWorldIcon } from '@nx/nx-dev/ui-icons';
|
||||
import {
|
||||
MonorepoWorldIcon,
|
||||
RustIcon,
|
||||
TypeScriptIcon,
|
||||
} from '@nx/nx-dev/ui-icons';
|
||||
import { motion, MotionConfig } from 'framer-motion';
|
||||
|
||||
export function Hero(): JSX.Element {
|
||||
@@ -80,57 +84,13 @@ export function Hero(): JSX.Element {
|
||||
Contact us
|
||||
</ButtonLink>
|
||||
</div>
|
||||
<div className="mt-12 flex justify-center">
|
||||
<MotionConfig reducedMotion="user">
|
||||
<motion.div
|
||||
initial={{
|
||||
y: 16,
|
||||
opacity: 0,
|
||||
}}
|
||||
whileInView={{
|
||||
y: 0,
|
||||
opacity: 1,
|
||||
}}
|
||||
viewport={{ once: true }}
|
||||
transition={{
|
||||
ease: 'easeOut',
|
||||
duration: 0.225,
|
||||
delay: 1,
|
||||
}}
|
||||
className="pointer-events-auto relative mx-auto w-full max-w-lg overflow-hidden rounded-lg bg-slate-950 text-left text-white shadow-lg ring-1 ring-white ring-opacity-5 transition hover:bg-slate-800"
|
||||
>
|
||||
<div className="p-4">
|
||||
<div className="flex items-start gap-6">
|
||||
<div className="-m-4 hidden flex-shrink-0 sm:block">
|
||||
<img
|
||||
src="/images/conferences/monorepoworld-vertical-banner.avif"
|
||||
alt="MonorepoWorld conference image"
|
||||
className="size-32"
|
||||
/>
|
||||
</div>
|
||||
<div className="w-0 flex-1 pt-1">
|
||||
<p className="text-base font-semibold">
|
||||
<a
|
||||
href="https://monorepo.world/?utm_source=nxdev&utm_medium=website&utm_campaign=homepage_banner&utm_campaign=monorepoworld"
|
||||
title="Join us at Monorepo World"
|
||||
target="_blank"
|
||||
>
|
||||
<span className="absolute inset-0" />
|
||||
The Nx team will be at Monorepo World!
|
||||
</a>
|
||||
</p>
|
||||
<p className="mt-1 text-sm text-slate-300">
|
||||
The ultimate conference for{' '}
|
||||
<span className="text-[#DDFB24]">monorepos</span> and
|
||||
developer{' '}
|
||||
<span className="text-[#DDFB24]">tooling</span> on 0ct.
|
||||
7. 2024, Mountain View, CA.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
</MotionConfig>
|
||||
|
||||
<div className="mt-4 flex items-center justify-center gap-2 text-sm italic">
|
||||
Built with
|
||||
<RustIcon aria-hidden="true" className="size-5 shrink-0" />
|
||||
<span className="sr-only">Rust</span> for speed &
|
||||
<TypeScriptIcon aria-hidden="true" className="size-4 shrink-0" />
|
||||
<span className="sr-only">TypeScript</span> for extensibility.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -56,7 +56,6 @@ import { pill } from './lib/tags/pill.schema';
|
||||
import { fence } from './lib/nodes/fence.schema';
|
||||
import { FenceWrapper } from './lib/nodes/fence-wrapper.component';
|
||||
import { VideoPlayer, videoPlayer } from './lib/tags/video-player.component';
|
||||
import { td } from './lib/nodes/td.schema';
|
||||
// TODO fix this export
|
||||
export { GithubRepository } from './lib/tags/github-repository.component';
|
||||
|
||||
@@ -70,7 +69,6 @@ export const getMarkdocCustomConfig = (
|
||||
heading: getHeadingSchema(headingClass),
|
||||
image: getImageSchema(documentFilePath),
|
||||
link,
|
||||
td,
|
||||
},
|
||||
tags: {
|
||||
callout,
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
import { Schema } from '@markdoc/markdoc';
|
||||
|
||||
export const td: Schema = {
|
||||
render: 'td',
|
||||
attributes: {
|
||||
className: { type: 'String', default: 'text-center' },
|
||||
},
|
||||
};
|
||||
@@ -23,8 +23,11 @@ export function Tabs({
|
||||
const [currentTab, setCurrentTab] = useState<string>(labels[0]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleTabSelectedEvent = (defaultTab?: string) => {
|
||||
const handleTabSelectedEvent = (
|
||||
tabSelectedEvent: CustomEvent<{ defaultTab?: string }>
|
||||
) => {
|
||||
const selectedTab = localStorage.getItem(SELECTED_TAB_KEY);
|
||||
const defaultTab = tabSelectedEvent.detail.defaultTab;
|
||||
if (selectedTab && labels.includes(selectedTab)) {
|
||||
setCurrentTab(selectedTab);
|
||||
} else if (defaultTab) {
|
||||
@@ -32,15 +35,23 @@ export function Tabs({
|
||||
}
|
||||
};
|
||||
|
||||
handleTabSelectedEvent(labels[0]);
|
||||
window.addEventListener(TAB_SELECTED_EVENT, handleTabSelectedEvent);
|
||||
handleTabSelectedEvent(
|
||||
new CustomEvent(TAB_SELECTED_EVENT, { detail: { defaultTab: labels[0] } })
|
||||
);
|
||||
window.addEventListener(
|
||||
TAB_SELECTED_EVENT,
|
||||
handleTabSelectedEvent as EventListener
|
||||
);
|
||||
return () =>
|
||||
window.removeEventListener(TAB_SELECTED_EVENT, handleTabSelectedEvent);
|
||||
window.removeEventListener(
|
||||
TAB_SELECTED_EVENT,
|
||||
handleTabSelectedEvent as EventListener
|
||||
);
|
||||
}, [labels]);
|
||||
|
||||
const handleTabClick = (label: string) => {
|
||||
localStorage.setItem(SELECTED_TAB_KEY, label);
|
||||
window.dispatchEvent(new Event(TAB_SELECTED_EVENT));
|
||||
window.dispatchEvent(new CustomEvent(TAB_SELECTED_EVENT, { detail: {} }));
|
||||
setCurrentTab(label);
|
||||
};
|
||||
|
||||
|
||||