Compare commits

...

64 Commits

Author SHA1 Message Date
Jonathan Cammisuli 315c766466 fix(core): only check if files are in sync if there are no records in the db (#28597)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-23 17:16:02 -04:00
Philip Fulcher d96ce5bf89 chore(nx-dev): remove duplicate blog post (#28570)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
Personal access token blog post appears twice

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Personal access token blog post appears once

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-23 17:15:59 -04:00
Jonathan Cammisuli 4a1737b237 fix(core): handle concurrent db connections better (#28544) 2024-10-23 15:39:22 -04:00
Jack Hsu 5da14f4dc4 cleanup(misc): remove unused migrations (#28591)
This PR removes migrations that are unused in our packages.

Other changes:

- Update the `remove-migrations` generator to remove all files inside
the migration directory, rather than just the implementation, spec file,
and `__snapshots__` directory. There were some helpers that were not
removed due to this problem.
- Add a check to the `assertValidMigrationPaths` test util (used in
`migrations.spec.ts` test files) to ensure that all paths inside
`./src/migrations` are included in `migrations.json` file. There were a
few migrations missing in the `@nx/expo` package, and we never run them
nor cleaned them up.


**Note:** This has no effect on users and is purely a clean-up.

## Current Behavior
<!-- This is the behavior we have today -->

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-23 15:18:50 -04:00
Isaac Mann a4f7b96708 chore(core): task distribution defaults to off (#28587)
- Updates workspace:ci-workflow generator to disable task distribution
by default
- Updates gradle:ci-workflow generator to disable task distribution by
default
- Updates all tutorials to reflect the new generator and adds a line
explaining how to enable task distribution
2024-10-23 15:18:47 -04:00
Juri 7c72733c8c fix(nx-dev): powerpack content update 2024-10-23 15:18:45 -04:00
Isaac Mann e194a00bd3 docs(core): single tenant section (#28548)
- Remove on-premise Nx Cloud docs from navigation
- Expand single tenant Nx Cloud documentation
2024-10-23 15:18:40 -04:00
MaxKless 5336aa0725 fix(core): make sure yarn berry correctly resolves latest version during nx add (#28580) 2024-10-23 15:18:37 -04:00
Benjamin Cabanes b50c8dbe8c docs(nx-dev): update powerpack features description (#28566) 2024-10-23 15:18:34 -04:00
Isaac Mann 7aca936f40 docs(core): ts project references in npm tutorial (#28504)
Update the npm workspaces tutorial to use typescript project references
2024-10-23 15:18:31 -04:00
Isaac Mann aa3d1d821f docs(core): move powerpack features to enterprise section (#28528)
- Makes a new Enterprise section under the Nx section of the docs
- Moves Powerpack docs into the Enterprise section
2024-10-23 15:18:27 -04:00
Isaac Mann 7284babfcb docs(core): remove reference to remote cache API (#28505)
Remove outdated reference to remote cache API
2024-10-23 15:18:24 -04:00
Emily Xiong ed350a4088 fix(core): not to cache entire workspace root (#28552)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
- if directory is workspace root, when walking through the directory, it
will include the directory root path, then will strip prefix, it will be
empty string. it will return "*" as a found path.
- When copying "*", it will run into a recursive loop because it will
try to copy the walkspace root with node_modules into
node_modules/.cache/nx

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes https://github.com/nrwl/nx/issues/28393
2024-10-23 15:18:20 -04:00
Juri c8620d1853 fix(nx-dev): cleanup 2024-10-23 15:18:18 -04:00
Mike Hartington b61be19477 docs(core): update release blog post (#28526)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-23 15:18:15 -04:00
Isaac Mann 7e326e5352 chore(nx-dev): ignore anchors on changelog page (#28540)
Do not check anchor links pointing to the changelog page
2024-10-23 15:18:12 -04:00
Phillip Barta 7f69f278d8 fix(rspack): removed webpack-sources import (#28447)
removed the webpack-sources import and replaced it with the sources
export from rspack

<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
`@nx/rspack` uses `webpack-sources` which is not listed as dependency.
The issue originated in PR #27676 but i decided to split it out. I also
opened #28225 to add the dependency-check rule for rspack.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
`@nx/rspack` uses the reexport from `@rspack/core` 

https://rspack.dev/api/javascript-api/#sources-object

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

#28225 #27676
2024-10-23 15:18:04 -04:00
Nicholas Cunningham c5f658b95d docs(nx-dev): Remove unused environment variables (#28521) 2024-10-18 14:32:53 -04:00
Colum Ferry 8fac5d79da fix(module-federation): normalize hypen names for runtime library control plugin #28497 (#28512)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
As part of the work to normalize `-` in MF project names for Federation,
setting the NX_MF_DEV_REMOTES env var was missed.
This causes issues with the RuntimeLibraryControlPlugin


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Remote names should be normalized correctly

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28497
2024-10-18 14:32:48 -04:00
Colum Ferry c3ed7f9f5d fix(react): ensure rspack react app is added to exclude on rspack plugin #28464 (#28515)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
When you create a react rspack app when there is a `@nx/rspack/plugin`
definition in the nx.json, it causes the project graph to fail to create
nodes.


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Ensure the projects created via @nx/react:app --bundler=rspack are added
to exclude array if the plugin exists

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28464
2024-10-18 14:32:45 -04:00
Benjamin Cabanes e337cb6de7 docs(nx-dev): update blog post (#28500) 2024-10-18 10:12:20 -04:00
Isaac Mann d082cd1610 docs(core): powerpack pricing clarification (#28473)
Clarify the powerpack pricing for small teams and OSS repos
2024-10-17 17:52:48 -04:00
Juri Strumpflohner fef174f509 feat(nx-dev): add contact link on powerpack page (#28458)
Co-authored-by: Benjamin Cabanes <3447705+bcabanes@users.noreply.github.com>
(cherry picked from commit 5cb2552daf)
2024-10-17 17:52:28 -04:00
Nicholas Cunningham a6a81cfc33 fix(core): neverConnectToCloud should disable connecting to nxCloud (#28501)
closed #28482, #28486

<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
If, `neverConnectToCloud` is set to `true`, there are still attempts
made to connect to NxCloud.
## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
if, `neverConnectToCloud` is set to `true`, we should not attempt to
connect to NxCloud.

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-17 17:51:09 -04:00
MaxKless a45cdd6f55 fix(core): repair SIGINT signals on windows (#28496)
using `windowsHide: true` is causing an issue on windows: Ctrl + C
handling isn't enabled and no `SIGINT` is sent to the child process when
users exit the process. See https://github.com/nodejs/node/issues/29837
and https://github.com/nodejs/node-v0.x-archive/issues/5054 for
reference. This will cause leftover processes throughout nx.

This PR sets `windowsHide: false` everywhere except for the plugin
workers and some short-lived utils. They `spawn` child processes but
have explicit handling to make sure they kill themselves when the parent
process dies, so the missing Ctrl + C handling doesn't cause issues.

We will follow up to make sure any other culprits that still cause
windows popups (especially when used through Nx Console) are handled.
Leaving no leftover processes running is more important for now, though.

Keep in mind the underlying tooling (like vite) might have some windows
popups themselves that Nx will inherit.
2024-10-17 17:51:05 -04:00
Igor Loskutov c0da413fb8 fix(expo): pnpm+workspace build (#28209)
## Current Behavior

build executors for expo crash when package manager pnpm and workspaces
are used

## Expected Behavior

no crashies

## Related Issue(s)

https://github.com/nrwl/nx/issues/28208

Fixes #28208

## FAQ

- why not handle the `undefined` by the calling code instead

The less the calling code knows about inner workings, the better: in
this case, doing this would add the implicit dependency on "pnpm and
workspaces" to the calling code

- but it's an empty function, my performance

We call it once per user interaction.

- but still, it's an empty function

We return an `empty array` when there are no elements; we don't return
`undefined` when the array is empty and `array` when array is non-empty.
Hopefully so.

- but,

The doc also says that this function returns a function.
2024-10-17 17:51:02 -04:00
Colum Ferry 7fc8a62880 fix(vite): use resolveConfig instead of loadConfigFromFile to ensure node env set #27627 (#28444)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
In the Vite Build Executor, we're using `loadConfigFromFile` from Vite
to get the config options.
The issue with this is that vite will not attempt to set `NODE_ENV`
which may be required by both the config file that is being loaded, and
other plugins.


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Use resolveConfig which does set NODE_ENV correctly


## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #27627
2024-10-17 17:50:59 -04:00
Nicholas Cunningham 88c2529dbc fix(react): update rspack to include styles in the main bundle (#28478)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
Currently, styles are not included in the main bundle by default.
## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Similar to webpack, styles should be included by default.
## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28465
2024-10-17 17:50:57 -04:00
Alan Pazetto c41de4b383 fix(js): change verdaccio childProcess kill order (#28364)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
`@nx/js:verdaccio` current call `npm config` to setup npm scopes in
global `.npmrc` file, which it's supposed to do.

However, when process is killed (using terminal exit command or any
other way), the process is killed and doesn't restore changed config.

In my case I'm changing scope to my private scope (using `scopes`
option), but after kill I need to restore manually.

## Expected Behavior
When process be killed, restore all configs that was set.

## Related Issue(s)
#28353

Fixes #28353
2024-10-17 17:50:54 -04:00
MaxKless 84ed1d728e fix(graph): make sure disabledTaskSyncGenerators can be set correctly from nx console (#28466)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-17 17:50:51 -04:00
Isaac Mann f371a6e217 fix(nx-dev): fix tabs logic (#28470)
Fix tabs being hidden when selecting a tab in a different tab group
2024-10-17 17:50:27 -04:00
Colum Ferry 8d0f277520 fix(vite): add vite temp files to gitignore #28371 (#28443)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
When Vite's tries to handle a `.ts` config file it builds it to JS with
a `.timestamp-` suffix. These files are still picked up by Nx when they
shouldn't as it's a temp file
(https://github.com/vitejs/vite/issues/13267).



## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Add these temp files to gitignore to prevent processing.


## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28371
2024-10-17 15:19:05 -04:00
Phillip Barta 6cb2af4e6f fix(rspack): add dependency-checks lint rule (#28225)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->

The rspack plugin has no dependency-checks in place. I discovered it
while working on #27676.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

The `@nx/dependency-checks` eslint rule should be used.

There are a few dependencies that I don't know how to proceed with:

```
The "rspack" project uses the following packages, but they are missing from "dependencies":
    - @nx/workspace
    - webpack-sources
    - @module-federation/sdk  @nx/dependency-checks

The "@rspack/plugin-minify" package is not used by "rspack" project
```

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

#27676

---------

Co-authored-by: Emily Xiong <xiongemi@gmail.com>
Co-authored-by: Colum Ferry <cferry09@gmail.com>
2024-10-17 15:19:01 -04:00
Isaac Mann f808ea86b0 docs(core): center specific markdown tables (#28459)
- Removes the hard-coded centering of markdown table cells.
- Centers specific tables that make sense to be centered
2024-10-17 15:18:57 -04:00
Sam Tsai a714301ad0 fix(rspack): make rspack dev server respect port (#28251)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
Port is not respected from `rspack.config.[jt]s` and needs to be
explicitly set in `project.json` options.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Port should be configurable via config, options, etc.

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->
Fixes #28040 (port portion)
2024-10-17 15:18:53 -04:00
Sam Tsai d59e8cc6af fix(rspack): replace DefinePlugin with EnvironmentPlugin (#28252)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
```
[webpack-dev-server] WARNING
  ⚠ DefinePlugin:
  │ Conflicting values for 'process.env.NODE_ENV' ("'development'" !== "\"development\"")
```

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
`process.env.NODE_ENV` should resolve to `'development'` and not a
quoted value: `"'development'"`

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28040 (NODE_ENV part)
2024-10-17 15:18:49 -04:00
James Henry 10405bcfe9 fix(release): ensure plan subcommand works with object config (#28460) 2024-10-17 15:18:44 -04:00
James Henry 07c07e4e86 chore(repo): fix npm-audit workflow, only run on origin (#28457) 2024-10-17 15:18:39 -04:00
Mike Hartington 7325b9ce28 docs(core): update release blog post (#28384)
Provide a recap of features from the previous release

<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-17 15:18:34 -04:00
Colum Ferry c83dd29c3c docs(rspack): remove incorrect information (#28383)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
The docs specify that the react library generator supports using rspack
as a bundler option.
The react library generator does not have rspack as an option.


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Remove misleading docs


## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-17 15:18:31 -04:00
Isaac Mann 399ee5b3bd docs(core): schema update to disable nx cloud (#28432)
Add `neverConnectToCloud` to the `nx-schema.json`

Fixes #28188
2024-10-17 15:18:25 -04:00
Isaac Mann 6f9e1477d4 docs(core): update data cache env var (#28431)
Fix data cache env var

Fixes #28389
2024-10-17 15:18:22 -04:00
Isaac Mann 1e39ba671f docs(core): add s3-cache github actions example (#28241)
Add a GitHub Actions example in the s3-cache plugin docs
2024-10-17 15:18:14 -04:00
Isaac Mann 7ead9a022f docs(core): redirect conf to monorepo.world (#28338)
Redirect `/conf` to `monorepo.world`
2024-10-17 15:17:34 -04:00
Benjamin Cabanes 99cfc14893 feat(nx-dev): update home hero & livestream notifier (#28403) 2024-10-17 15:17:30 -04:00
Nicholas Cunningham aa7b2b011d docs(nx-dev): update monorepo world notification (#28398) 2024-10-17 15:17:27 -04:00
Isaac Mann 245bed7a07 docs(core): update livestream links again 2024-10-17 15:17:24 -04:00
Isaac Mann e47b45b958 docs(core): update live stream links 2024-10-17 15:17:22 -04:00
Benjamin Cabanes 69ec3796fe feat(nx-dev): add live stream notifier (#28260)
Co-authored-by: Juri <juri.strumpflohner@gmail.com>
2024-10-17 15:17:17 -04:00
Jonathan Cammisuli 145fe01e3d fix(core): add migration to set useLegacyCache by default (#28454) 2024-10-15 16:06:41 -04:00
Jonathan Cammisuli afe0cecb1e fix(core): handle neverConnectToCloud property (#28452)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
`neverConnectToCloud` was not respected in the `isNxCloudUsed` function

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
`neverConnectToCloud` is now respected

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28287
2024-10-15 16:06:15 -04:00
Leosvel Pérez Espinosa 485090572c fix(js): improve @nx/js/typescript plugin and typescript-sync generator performance (#28379) 2024-10-15 12:44:57 -04:00
Jonathan Cammisuli e8ce99d234 fix(core): add busy handler for sqlite (#28390)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
When the sql database throws a busy signal, there is no handler in nx to
try the operation again.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
There is a handler to tell sqlite to handle the operation again, and try
up to N times.

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-15 11:22:52 -04:00
Jonathan Cammisuli 46eac466de fix(core): support NX_NO_CLOUD (#28366)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
Using `NX_NO_CLOUD` does not disable the remoteCache implementation for
Nx Cloud

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Using `NX_NO_CLOUD` will disable nx cloud remote cache

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-15 10:43:14 -04:00
Colum Ferry c006e90f97 fix(rspack): do not select char from string when mapping remotes (#28441)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
When global prefix is used, there is an issue with the mapping of string
remote usage.
It selects a single character from the string rather than using the full
string


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Use the full string as remote name when mapping remotes

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-15 10:43:10 -04:00
Colum Ferry c3f401ceda fix(module-federation): remote names should follow JS variable naming schema (#28401)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
We previously had a schema restriction on the characters allowed for
remote names. It was to prevent names that violated the JS spec for a
variable declaration.


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Ensure invalid project names fail error allowing the user to fix it at
generation


## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28354, #28408

---------

Co-authored-by: Jack Hsu <jack.hsu@gmail.com>
2024-10-14 19:49:45 -04:00
Colum Ferry 85bed15280 fix(rspack): log compilation errors #28179 (#28429)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
When running serve with Rspack, `stats: false` is being added to
`devMiddleware` preventing logs from being output to the terminal.


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Ensure logs are logged to the devServer

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28179
2024-10-14 19:49:42 -04:00
Colum Ferry 74777a1754 fix(module-federation): ensure mf-manifest supported and tspaths are added with snake_case (#28244)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
2024-10-14 19:49:39 -04:00
Leosvel Pérez Espinosa 11fe2a700e fix(angular): add missing package version bump for zone.js (#28430)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28046
2024-10-14 19:49:36 -04:00
Colum Ferry 926ade4270 fix(angular): ensure provideStore is provided before storeDevTools #28107 (#28428)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
The order of the `provide*` functions for NgRx matters and should
therefore be structured as such


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Ensure `provideStore` is first provider added

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28107
2024-10-14 19:49:33 -04:00
Colum Ferry 7231561c92 fix(react): depends on migration should ignore configs that point to @nx/react #28377 (#28382)
<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->
Some executors using `@nx/webpack:webpack` point to a webpack config
that is exported from the `@nx/react plugin.

We do not want to try modify this.


## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Skip the migration if the webpack config points to the exported plugin
from @nx/react.


## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #28377
2024-10-14 19:49:31 -04:00
Leosvel Pérez Espinosa e458ecf2b1 fix(linter): scope js and ts shared configs to js and ts files (#28381) 2024-10-14 19:49:29 -04:00
James Henry 371d20446f chore(repo): add new issue type to bug template (#28367) 2024-10-14 19:49:26 -04:00
Nicholas Cunningham 392d72e00d chore(nx-dev): Update LTS version for Nx 20 (#28259)
Co-authored-by: Jack Hsu <jack.hsu@gmail.com>
2024-10-14 19:49:23 -04:00
332 changed files with 8185 additions and 9612 deletions
+1
View File
@@ -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:
+4 -8
View File
@@ -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
+5
View File
@@ -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
Generated
+50
View File
@@ -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",
+7 -7
View File
@@ -61,13 +61,13 @@ Tasks can fail:
Lets 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
![Personal access token settings in Nx Cloud workspace](/blog/images/2024-09-05/workspace-settings.avif)
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/)
+8 -2
View File
@@ -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 Nxs 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, weve 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 were 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. Weve 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 Nxs 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. Weve 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 Nxs 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.
Theres 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 youre curious to learn more about these changes for Nx and how to get started, [check out our docs](/features/powerpack).
If youre 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
+79 -9
View File
@@ -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 its 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 its 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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 709 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

+1 -1
View File
@@ -1,4 +1,4 @@
# Nx 20
# [Nx 20.0 Blogpost](/blog/announcing-nx-20)
## Features
+11 -1
View File
@@ -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
+1 -1
View File
@@ -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
---
+1 -1
View File
@@ -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
+344
View File
@@ -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",
+383 -114
View File
@@ -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,
+11 -1
View File
@@ -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"
},
+157 -156
View File
@@ -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",
+43 -34
View File
@@ -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.
+85 -35
View File
@@ -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",
+1 -1
View File
@@ -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:
![GitHub username location](/nx-cloud/enterprise/on-premise/images/github-username.png)
## 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:
![Step 1](/nx-cloud/enterprise/on-premise/images/bitbucket_onprem_1.png)
Then "Application Links":
![Step 2](/nx-cloud/enterprise/on-premise/images/bitbucket_onprem_2.png)
And create a new link using the settings below (make sure the callback URL is pointed to your BitBucket installation):
![Step 3](/nx-cloud/enterprise/on-premise/images/bitbucket_onprem_3.png)
## 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:
![Step 1](/nx-cloud/enterprise/on-premise/images/bitbucket_1.png)
Then "Settings":
![Step 2](/nx-cloud/enterprise/on-premise/images/bitbucket_2.png)
Then "OAuth consumers":
![Step 3](/nx-cloud/enterprise/on-premise/images/bitbucket_3.png)
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)
![Step 4](/nx-cloud/enterprise/on-premise/images/bitbucket_4.png)
Ensure you grant it the `account:read` and `account:email` scopes:
![Step 5](/nx-cloud/enterprise/on-premise/images/bitbucket_5.png)
Save your changes.
Once you create, keep a note of the Key and the Secret:
![Step 6](/nx-cloud/enterprise/on-premise/images/bitbucket_6.png)
## 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":
![Step 1](/nx-cloud/enterprise/on-premise/images/github_auth_step_1.png)
Then "Developer settings" from the left-hand menu:
![Step 2](/nx-cloud/enterprise/on-premise/images/github_auth_step_2.png)
Then "OAuth Apps":
![Step 3](/nx-cloud/enterprise/on-premise/images/github_auth_step_3.png)
And create a new OAuth app:
![Step 4](/nx-cloud/enterprise/on-premise/images/github_auth_step_4.png)
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
```
![Step 5](/nx-cloud/enterprise/on-premise/images/github_auth_step_5.png)
Once you create, keep a note of the Client ID:
![Step 6](/nx-cloud/enterprise/on-premise/images/github_auth_step_6.png)
And then generate a new client secret, and save it somewhere secure (we'll use it in a bit):
![Step 7](/nx-cloud/enterprise/on-premise/images/github_auth_step_7.png)
## 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":
![Step 1](/nx-cloud/enterprise/on-premise/images/gitlab_step_1.png)
Then "Applications" from the left-hand menu:
![Step 2](/nx-cloud/enterprise/on-premise/images/gitlab_step_2.png)
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)
![Step 3](/nx-cloud/enterprise/on-premise/images/gitlab_step_3.png)
Ensure you grant it the "`read_user`" scope:
![Step 4](/nx-cloud/enterprise/on-premise/images/gitlab_step_4.png)
Click "Save application".
Once you create, keep a note of the Client ID and the Secret:
![Step 5](/nx-cloud/enterprise/on-premise/images/gitlab_step_5.png)
## 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
![Step 1](/nx-cloud/enterprise/on-premise/images/saml/azure_1.png)
![Step 2](/nx-cloud/enterprise/on-premise/images/saml/azure_2.png)
2. Choose “Create your own”:
![Step 3](/nx-cloud/enterprise/on-premise/images/saml/azure_3.png)
3. Give it a name
![Step 4](/nx-cloud/enterprise/on-premise/images/saml/azure_4.png)
4. Assign your users and/or groups to it:
![Step 5](/nx-cloud/enterprise/on-premise/images/saml/azure_5.png)
5. Then set-up SSO
![Step 6](/nx-cloud/enterprise/on-premise/images/saml/azure_6.png)
6. And choose SAML:
![Step 7](/nx-cloud/enterprise/on-premise/images/saml/azure_7.png)
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`
![Step 8](/nx-cloud/enterprise/on-premise/images/saml/azure_8.png)
8. Scroll down and manage claims:
![Step 9](/nx-cloud/enterprise/on-premise/images/saml/azure_9.png)
9. The first row should be the `email` claim, click to Edit it:
![Step 10](/nx-cloud/enterprise/on-premise/images/saml/azure_10.png)
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.
![Step 11](/nx-cloud/enterprise/on-premise/images/saml/azure_11.png)
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
![Step 12](/nx-cloud/enterprise/on-premise/images/saml/azure_12.png)
For **Signing Option**, select **Sign SAML response and assertion**
![Step 13](/nx-cloud/enterprise/on-premise/images/saml/azure_13.png)
Then click **Save** and close the popover.
12. Download the certificate in **Base64**:
![Step 14](/nx-cloud/enterprise/on-premise/images/saml/azure_14.png)
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. Well use this later
14. Copy the Login URL:
![Step 15](/nx-cloud/enterprise/on-premise/images/saml/azure_15.png)
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:
![Okta 1](/nx-cloud/enterprise/on-premise/images/saml/okta_1.png)
![Okta 2](/nx-cloud/enterprise/on-premise/images/saml/okta_2.png)
2. Give it a name:
![Okta 3](/nx-cloud/enterprise/on-premise/images/saml/okta_3.png)
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`
![Okta 4](/nx-cloud/enterprise/on-premise/images/saml/okta_4.png)
4. Scroll down to attribute statements and configure them as per below:
![Okta 5](/nx-cloud/enterprise/on-premise/images/saml/okta_5.png)
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.
![Okta 6](/nx-cloud/enterprise/on-premise/images/saml/okta_6.png)
7. Then in the Sign-On tab scroll down:
![Okta 7](/nx-cloud/enterprise/on-premise/images/saml/okta_7.png)
8. Scroll down and from the list of certificates, download the one with the “Active” status:
![Okta 8](/nx-cloud/enterprise/on-premise/images/saml/okta_8.png)
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:
![Okta 9](/nx-cloud/enterprise/on-premise/images/saml/okta_9.png)
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"
/>
```
![Okta 10](/nx-cloud/enterprise/on-premise/images/saml/okta_10.png)
## 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":
![Step 1](/nx-cloud/enterprise/on-premise/images/github_auth_step_1.png)
Then "Developer settings" from the left-hand menu:
![Step 2](/nx-cloud/enterprise/on-premise/images/github_auth_step_2.png)
Then "GitHub Apps":
![Step 3](/nx-cloud/enterprise/on-premise/images/github_custom_app_step_3.avif)
And create a new GitHub app:
![Step 4](/nx-cloud/enterprise/on-premise/images/github_custom_app_step_5.avif)
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:
![Step 6](/nx-cloud/enterprise/on-premise/images/github_custom_app_step_6.avif)
Then generate a new client secret, and save it somewhere secure (we'll use it in a bit):
![Step 7](/nx-cloud/enterprise/on-premise/images/github_auth_step_7.png)
## 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)
+7 -7
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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). Turborepos implementation is not customizable, so you have to use Turborepos 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 doesnt 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" /%}
+4 -4
View File
@@ -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 %}
+1 -1
View File
@@ -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" /%}
+2 -2
View File
@@ -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
+1 -7
View File
@@ -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" /%}
+30 -32
View File
@@ -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.
+5 -5
View File
@@ -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.
+16 -5
View File
@@ -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)
+3 -3
View File
@@ -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
+3 -3
View File
@@ -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
+3 -2
View File
@@ -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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+288 -44
View File
@@ -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"
}
]
+128 -103
View File
@@ -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
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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:
+3 -3
View File
@@ -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
+1 -1
View File
@@ -273,7 +273,7 @@ export function runCommandUntil(
...opts.env,
FORCE_COLOR: 'false',
},
windowsHide: true,
windowsHide: false,
});
return new Promise((res, rej) => {
let output = '';
+1 -1
View File
@@ -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;
}),
],
},
+13 -1
View File
@@ -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:
+2 -1
View File
@@ -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>
+2
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

+17
View File
@@ -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,
};
+1
View File
@@ -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';
+1 -1
View File
@@ -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>
</>
+9 -7
View File
@@ -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>
</>
)}
+95 -123
View File
@@ -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>
);
}
+3 -3
View File
@@ -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>
+12 -52
View File
@@ -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>
-2
View File
@@ -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);
};

Some files were not shown because too many files have changed in this diff Show More