Compare commits

..

538 Commits

Author SHA1 Message Date
Caleb Ukle 4e35839f63 docs(nx-dev): powerpack docs cleanup/deprecations (#33635)
CI / main-linux (push) Has been cancelled
CI / main-macos (push) Has been cancelled
closes: DOC-338

---------

Co-authored-by: Jack Hsu <jack.hsu@gmail.com>
(cherry picked from commit 5071217c30)
2025-11-27 12:56:35 -05:00
Leosvel Pérez Espinosa c419c2aa9e fix(core): kill child process tree in different running tasks (#33636)
## Current Behavior

When Nx commands finish or receive termination signals (SIGINT, SIGTERM,
SIGHUP), child processes spawned by continuous tasks (such as `nx
serve`) can remain orphaned in certain scenarios. This happens because
only the direct child process is killed using `childProcess.kill()`,
leaving grandchild processes running.

## Expected Behavior

When Nx terminates, all processes in the spawned process tree should be
properly terminated and no orphaned processes should remain.

## Related Issue(s)

Fixes #32438
Fixes #33460

## Changes

- Updated signal handlers in `RunningNodeProcess` to use `this.kill()`
instead of `this.childProcess.kill()`, leveraging the existing
`tree-kill` implementation
- Added `tree-kill` to `NodeChildProcessWithNonDirectOutput` and
`NodeChildProcessWithDirectOutput` kill methods to ensure entire process
trees are terminated

(cherry picked from commit 21783402b7)
2025-11-27 12:56:34 -05:00
Jack Hsu 54e1f68844 chore(repo): remove hack that enables legacy peer deps so we can catch errors (#33634)
We missed a peer dep error in the Nuxt 4 PR since CI allowed install to
go through, but in a real repo it would have failed.

We _may_ need to still have the `prefer-frozen-lockfile=false` option,
but let's let CI run with this first.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
(cherry picked from commit c08e83c73d)
2025-11-27 12:56:33 -05:00
Benjamin Cabanes 824217465b docs(nx-dev): rename "Nx Enterprise" to "Enterprise" (#33641)
Rename "Nx Enterprise" to "Enterprise" across UI Header components.

(cherry picked from commit 9fecf1416a)
2025-11-27 12:56:32 -05:00
Colum Ferry 62cd32ab91 fix(linter): base eslint config should ignore out-tsc directories (#33639)
## Current Behavior
The base `eslint` config will ignore `**/dist` but not `**/out-tsc`.
This can cause issues if lint is run after a `typecheck` which has
placed `.d.ts` files into an `out-tsc` directory.

## Expected Behavior
Base eslint config should ignore `**/out-tsc`

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Coly010 <Coly010@users.noreply.github.com>
(cherry picked from commit f87e20fe75)
2025-11-27 12:56:31 -05:00
Jack Hsu 4c2bfbe9f8 docs(testing): update atomizer documentation for Vite and Vitest plugins (#33620)
## Current Behavior

The atomizer/task splitting documentation for Vite and Vitest was
incomplete:
- The @nx/vite/plugin introduction page was missing the dual
configuration example for both E2E and unit tests
- The @nx/vitest introduction page was missing all atomizer-related
sections (splitting E2E tests, ciTargetName, ciGroupName)
- The split-e2e-tasks feature page only referenced @nx/vite for Vitest,
not the dedicated @nx/vitest plugin
- The @nx/vitest docs had incorrect option name (targetName instead of
testTargetName)

## Expected Behavior

- @nx/vitest introduction page now have complete atomizer documentation
- The split-e2e-tasks page now references both @nx/vitest and @nx/vite
options for Vitest users
- Configuration examples use the correct option names matching the
actual plugin interfaces
- Users can easily find how to configure task splitting for Vitest
whether they use @nx/vite or @nx/vitest
---

Affected pages:
-
https://deploy-preview-33620--nx-docs.netlify.app/docs/features/ci-features/split-e2e-tasks#update-an-existing-project-to-use-automated-task-splitting
-
https://deploy-preview-33620--nx-docs.netlify.app/docs/technologies/build-tools/vite/introduction
-
https://deploy-preview-33620--nx-docs.netlify.app/docs/technologies/test-tools/vitest/introduction

Closes DOC-346

Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 3558a4cdfe)
2025-11-27 12:56:30 -05:00
Jack Hsu 2ccf2ca903 chore(repo): add Node 24 to e2e nightly matrix (#33542)
- E2E nightly tests only run on Node 20 and 22.
- E2E nightly tests now also run on Node 24, 22, and 20 for linux. For
Windows and Mac run only 24.

Did a test run from this branch, and Node 24 passes where other versions
pass, and fails where other versions fail. It shouldn't make any golden
tests fail just due to Node 24, but it's possible that things will flake
more since the matrix has expanded. We just have to make them more
robust.

<img width="920" height="1089" alt="image"
src="https://github.com/user-attachments/assets/90ee4d04-68d5-4d0d-9729-60cacfbc99db"
/>

Close NXC-3491

(cherry picked from commit e3a4233cfe)
2025-11-27 12:56:29 -05:00
Colum Ferry a7d9e49f85 fix(nextjs): make migration to next 16 optional (#33627)
## Current Behavior
The Next 16 AI Migration Instructions are always created, regardless of
existing Next version

## Expected Behavior
Make the Next 16 Migration optional

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Coly010 <Coly010@users.noreply.github.com>
(cherry picked from commit 1ecbd8082c)
2025-11-27 12:56:17 -05:00
Colum Ferry 35c00e146d feat(nextjs): add migration to add AI instructions for upgrading to Next 16 (#33608)
## Current Behavior
We do not generate AI Instructions to aid with upgrading from Next 15 to
Next 16

## Expected Behavior
Add a migration generator to create a file containing instructions for
an LLM to upgrade Next 15 to Next 16

## Related Issue(s)

Closes NXC-3418

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
(cherry picked from commit 1eea5edb50)
2025-11-27 12:56:14 -05:00
Jack Hsu 0ab6baa1f7 docs(linter): add custom workspace eslint rules guide (#33618)
There is no documentation on how to create and use custom ESLint rules
in Nx workspaces.

Users can follow a guide to create custom ESLint rules using either:
1. Package Manager Workspaces (npm/yarn/pnpm/bun) - create a dedicated
ESLint plugin package that's symlinked via the package manager
2. `loadWorkspaceRules` utility from `@nx/eslint-plugin` - load rules
from any directory with automatic TypeScript transpilation

The guide includes:
- Comparison table for choosing the right approach
- Step-by-step instructions for both approaches
- TypeScript execution options (build first, Node.js native support,
tsx)
- Rule testing with `@typescript-eslint/rule-tester`
- Best practices and troubleshooting tips

Page:
https://deploy-preview-33618--nx-docs.netlify.app/docs/technologies/eslint/guides/custom-workspace-rules

Closes DOC-339

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: jaysoo <jaysoo@users.noreply.github.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
(cherry picked from commit b6958b3e88)
2025-11-27 12:54:22 -05:00
Jack Hsu 507bf10f75 fix(bundling): replace rollup-plugin-copy with nx copy assets plugin (#33601)
There's a problem when `@nx/rollup` is installed with yarn@1.22, and
typechecks.

This is caused by the transitive dependency chain:

```
rollup-plugin-copy@3.5.0 -> globby@10.0.1 -> @types/glob@7.2.0 -> @types/minimatch
```

When users run tsc without explicit `types` configuration, TypeScript
auto-discovers `@types/minimatch` from `node_modules` but can't properly
resolve it.

Note: This doesn't happen with NPM and PNPM, nor newer yarn versions.

Verified fix with this repro: https://github.com/jaysoo/rollup-251124

Fixes #32398

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: jaysoo <jaysoo@users.noreply.github.com>
(cherry picked from commit 017ad93d35)
2025-11-27 12:54:22 -05:00
Philip Fulcher 8bb0e4efcf docs(nx-dev): add 22.1 article and changlog (#33617)
https://nx-dev-git-philip-nx22-1-article-nrwl.vercel.app/blog/nx-22-1-release
2025-11-25 18:45:06 -05:00
Jack Hsu b073c22b22 docs(storybook): update Storybook docs for version 10 (#33619)
## Current Behavior
- Storybook generator docs banner says "Nx uses Storybook 7"
- Separate storybook-9-setup.mdoc page exists
- No documentation for migrate-10 generator

## Expected Behavior
- Update banner to "Nx uses Storybook 10"
- Consolidate storybook-9-setup into upgrading-storybook guide
- Add migrate-10-generator-examples.md with AI-assisted migration docs
- Update all references to point to new consolidated guide

---

Main content is here:
https://deploy-preview-33619--nx-docs.netlify.app/docs/technologies/test-tools/storybook/guides/upgrading-storybook

Need to follow-up on the sidebar ordering as it doesn't seem to take it
into account for technologies section.

Fixes DOC-347
2025-11-25 18:45:06 -05:00
Colum Ferry 2cb286b869 fix(storybook): remove upper bound of migration requires (#33613)
## Current Behavior
The upper bound of the requires is too restrictive and causing issues

## Expected Behavior
Remove the upper bound
2025-11-25 18:45:05 -05:00
Jason Jean 51eec9a6d0 chore(repo): update nx to 22.2.0-beta.0 (#33614)
Updating Nx from 22.1.0-rc.5 to 22.2.0-beta.0

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-11-25 18:45:05 -05:00
Leosvel Pérez Espinosa c3343498be fix(core): propagate continuous task failures to dependent tasks (#33492)
## Current Behavior

When a continuous task depends on another continuous task and the
dependent task exits with an error, the parent task continues running
indefinitely. The task execution never terminates, leaving processes
running in the background.

For example, if task `a` (continuous) depends on task `b` (continuous),
and task `b` exits with error code 1, task `a` will continue running
even though its dependency failed.

## Expected Behavior

When a continuous task exits (with any exit code), the failure should be
propagated to dependent tasks:

1. The failed continuous task should be marked as failed
2. Dependent continuous tasks should be marked as skipped
3. All affected continuous tasks should be killed
4. Task execution should terminate with an error

---

## Changes Made

### 1. Restore Error Handling in Continuous Task Exit Handlers

- Re-added the `cleaningUp` flag that was removed in a previous
TUI-related commit
- Modified `onExit` handlers for both regular and shared continuous
tasks to:
  - Check if the task exited during normal cleanup vs. unexpectedly
  - Call `complete()` with 'failure' status for unexpected exits
  - Log error messages for debugging

### 2. Fix `cleanUpUnneededContinuousTasks()` Logic

The previous implementation always added `initializingTaskIds` to the
needed set, even when those tasks were already completed. This prevented
dependency tasks from being killed when the top-level task exited.

Fixed by:

- Only adding tasks from `initializingTaskIds` if they are still
incomplete
- Keeping dependencies of incomplete tasks alive
- This ensures continuous tasks are killed when no longer needed,
whether a dependency fails or a top-level task exits

### 3. Prevent Status Overwrites

Added a check in `onExit` handlers to only set status to `Stopped` if
the task hasn't already been completed. This prevents the async `onExit`
callback from overwriting the correct status (like 'skipped' or
'failure') with 'Stopped'.

### 4. Fix Signal Handling in `PseudoTtyProcess.kill()`

The Rust pseudo-terminal defaults to SIGINT when no signal is provided,
which does not reliably terminate child processes in PTY sessions.

Fixed by:

- Defaulting to SIGTERM in the JavaScript wrapper (rather than changing
the Rust default)
- The JS wrapper is the API boundary that should match Node.js
semantics, where `childProcess.kill(undefined)` defaults to SIGTERM
- The Rust default of SIGINT is appropriate for interactive use
(Ctrl-C), while programmatic cleanup needs SIGTERM
- This ensures child processes are properly killed when
`runningTask.kill()` is called

**File:** `packages/nx/src/tasks-runner/pseudo-terminal.ts`

## Technical Details

The fix leverages the existing task failure propagation mechanism in
`complete()` instead of using `process.exit(1)`, which:

- Allows proper cleanup through normal execution flow
- Respects the `--bail` flag configuration
- Works correctly with both TUI and non-TUI modes
- Maintains consistency with how other task failures are handled
2025-11-25 18:45:04 -05:00
MaxKless e993d05e9b fix(core): use nx-mcp for older nx versions instead of nx mcp (#33553)
<!-- 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
Older versions don't support the `nx mcp` command yet - but they CAN use
the `nx-mcp` package via npx

## Expected Behavior
We generatee the proper command into their MCP config by matching on
their version

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

Fixes #
2025-11-25 18:45:04 -05:00
Jason Jean b9a7703f28 feat(core): add multiple Nx version detection to nx report (#33599)
## Current Behavior

When multiple versions of the `nx` package are installed in a workspace
(e.g., due to a third-party package incorrectly depending on nx), users
have no visibility into
  this issue through `nx report`.

  ## Expected Behavior

The `nx report` command now detects when other packages depend on a
different version of nx than the workspace version and reports this
clearly:

  ⚠️ Multiple Nx versions detected

Your workspace uses nx@20.0.0, but other packages depend on a different
version:
  - some-package → @scope/tool → nx@19.0.0

These packages should not have nx as a dependency. Please report this
issue to the package maintainers.
  Run pnpm why nx@19.0.0 for more details.

This helps users identify and report problematic packages that bundle
their own version of nx.

  ## Related Issue(s)

N/A - This is a proactive improvement to help users diagnose workspace
issues.
2025-11-25 18:45:03 -05:00
MaxKless 3f2d373b9a cleanup(gradle): fix nightly e2e test where verbose was being called (#33610)
<!-- 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
nightly tests fail on gradle because of gradle parsing

## Expected Behavior
nightly tests should pass
2025-11-25 18:45:02 -05:00
Colum Ferry cac7f6c3e8 fix(node): set generatePackageJson:false for TS Solution workspaces (#33606)
## Current Behavior
In TS Solution setups, we generate webpack config with
`generatePackageJson: true`. This is confusing and unneeded.
It should be set to false in TS Solution repos.

## Expected Behavior
Set `generatePackageJson: false` in webpack config for TS Solution
Setups


Closes NXC-3521
2025-11-25 08:13:22 -05:00
Kasper Christensen 3c5e40be68 fix(nest): set moduleResolution to node to prevent TS5095 error (#33607)
When generating NestJS applications in Angular workspaces, the base
tsconfig sets moduleResolution to 'bundler' which causes TS5095 errors
because 'bundler' requires module to be 'preserve' or 'es2015+'.

NestJS applications should use Node.js module resolution instead. This
fix sets moduleResolution to 'node' for NestJS applications (except when
using TS solution setup, which uses 'nodenext').

Fixes #33589
2025-11-25 12:23:25 +00:00
Colum Ferry 6c2b3ee37d fix(release): ensure emoji is not repeated in breaking changes summary (#33605)
## Current Behavior
The ⚠️ emoji at the beginning of bc commits is duplicated in the bc
section of the changelog.
This is unneeded.

## Expected Behavior
Ensure the ⚠️ is not repeated in the bc section of the changelog

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Coly010 <Coly010@users.noreply.github.com>
2025-11-25 11:14:48 +00:00
Chau Tran d70c888a93 fix(graph): surface task graph client error via error toast (#33600)
Close NXC-3516

<!-- 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 #
2025-11-25 09:12:40 +01:00
Jason Jean f31bef701a fix(core): make daemon socket path unique per process to prevent race condition (#33580)
## Current Behavior

1. **Socket Race Condition**: All daemon servers listen on the same
socket path, causing a race condition where shutting down daemons remove
sockets that newly started
  daemons are listening on.

2. **Daemon Console Check Blocks**: The daemon availability check runs
synchronously and blocks the main thread.

3. **Version Mismatch Issues**: Packages using a different nx version
than what's installed in the workspace could still use the daemon,
leading to potential issues.

  ## Expected Behavior

1. Each daemon server creates a unique socket path based on its process
ID, preventing race conditions.

  2. The daemon console check runs in the background without blocking.

3. The daemon is disabled when there's a version mismatch between the
running nx and the workspace's installed version.

  ## Changes

  ### 1. Unique Daemon Socket Paths
- Include `process.pid` in the socket directory hash to make each
daemon's path unique
- Store the socket path in `server-process.json` so clients know where
to connect
  - Clients read the socket path from the file instead of calculating it

  ### 2. Backgroundable Daemon Check
- Reapplied #33491 which makes the Nx Console install check run on the
daemon in the background
- This was previously reverted due to the socket race condition (now
fixed by change 1.)
- Running in background also allows pulling the latest check logic from
npm

  ### 3. Version Mismatch Check
  - Added `isNxVersionMismatch()` check in `DaemonClient.enabled()`
- Created shared utility `is-nx-version-mismatch.ts` for version
comparison
  - Refactored server.ts to use the shared utility
- Uses `require.resolve('nx/package.json', { paths: [workspaceRoot] })`
to properly resolve the workspace's installed nx version

  ## Related Issue(s)

Fixes daemon socket path race condition and improves daemon reliability.
2025-11-24 23:45:28 +00:00
Philip Fulcher 12f42ca798 chore(nx-dev): remove november webinar (#33598) 2025-11-24 16:17:39 -05:00
Colum Ferry 70bbbe9ff6 fix(js): ensure copy-workspace-modules copies transitive workspace dependencies (#33570)
## Current Behavior
`copy-workspace-modules` executor only copies workspace dependencies 1
level deep.
If that workspace library depends on another workspace library, it is
not copied correctly.

## Expected Behavior
Copy transitive workspace modules

## Related Issue(s)

Fixes NXC-3466
2025-11-24 09:16:37 -05:00
Jack Hsu b7cfee16e2 fix(testing): remove declare global wrapper from cypress commands.ts template (#33573)
When adding Cypress to a library, the generated commands.ts causes
TS2669 error because declare global requires the file to be a module.
Changed to use declare namespace Cypress directly.

Fixes #32930
2025-11-24 08:35:51 -05:00
Juri 8fcef1e81a docs(misc): fix listing of oxlint community plugin 2025-11-24 10:46:48 +01:00
Laney Pouzet 5fd57badb9 fix(core): filter out automated release commits in getCommitsRelevantToProjects (#33482) 2025-11-23 16:19:51 +04:00
Jason Jean 626fb0873e Revert "feat(core): make console daemon check backgroundable and pull… (#33578)
## Current Behavior
PR #33491 introduced a daemon call into every command and caused
unexpected issues...

  ## Expected Behavior
the change is reverted while we investigate a proper fix

  ## Changes
This reverts commit 9471207767 from PR
#33491.

  ## Related Issue(s)
  Fixes #33472
2025-11-21 23:14:11 +00:00
Austin Fahsl 68eee382dc docs(nx-cloud): use GitHub's default ref in manual DTE workflow (#33575)
## Current Behavior

The manual DTE workflow explicitly sets the `ref` parameter to `${{
github.event.pull_request.head.sha }}` to checkout the actual branch
HEAD instead of the merge commit.

## Expected Behavior

Use GitHub's default ref behavior instead of explicitly overriding it,
as the default behavior now handles this correctly.

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-21 14:47:52 -07:00
Jack Hsu 8750521b32 fix(react): exclude tailwind from CSS modules syntax in component generator (#33574)
## Current Behavior
When generating a React component with --style=tailwind, the component
template incorrectly includes `className={styles['container']}` and
attempts to import CSS modules.

## Expected Behavior
Components generated with --style=tailwind should not include CSS
modules imports or `styles['container']` references, since Tailwind
doesn't use CSS modules.

## Related Issue(s)
Closes NXC-3511

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-21 16:18:30 -05:00
Jason Jean 9a6c7adddf feat(nx-cloud): prepend nx version to stats metadata (#33568)
<!-- 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 -->

Stats don't come along with versions which makes it hard to see if it
was specific changes that make a difference.

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

Stats are tagged with the version so we can compare stats between
versions

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

Fixes #

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-11-21 12:19:58 -05:00
Jack Hsu 57f28bac5e fix(storybook): remove STORYBOOK_PROJECT_ROOT when running automigrate to prevent hanging (#33567)
This PR fixes an issue where migrations can hang due to out invocation
of `storybook automigrate`. We are passing both `--config-dir` and
`STORYBOOK_PROJECT_ROOT`, the latter causes hanging with Storybook v9.

https://www.loom.com/share/39bbb350595c4a13aef86ec29f4b748f

## Current Behavior
Hangs

## Expected Behavior
Does not hang

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

Fixes #32492
2025-11-21 11:34:29 -05:00
Jack Hsu 1c8796a4d7 docs(misc): update migration docs to use supported markdown syntax (#33563)
This PR cleans up the markdown files under `packages/`. We previously
had to support Next.js docs and translate it for astro docs with proper
markdown syntax. This applies to generators, executors, and migrations.

Also removes the function to do the translation in astro app since it's
no longer needed.

## Code block (migrations)
<img width="1086" height="800" alt="Screenshot 2025-11-20 at 1 23 53 PM"
src="https://github.com/user-attachments/assets/bd9acb9b-7960-4e41-9d26-22d29da6658e"
/>

## Aside (generators)
<img width="802" height="443" alt="Screenshot 2025-11-20 at 1 43 17 PM"
src="https://github.com/user-attachments/assets/e2999821-8783-46ed-a984-2193f6f8eafa"
/>
2025-11-21 09:25:34 -05:00
Craigory Coppola 1eecf46e4a fix(core): provide error when nested graph construction would occur invoked during createNodes (#33541)
## Current Behavior
During createNodes, if a file is imported and a function in said file
invokes the Nx project graph creation process, there's an infinite loop
that results in all nx commands hanging with little feedback.
Theoretically this loop would terminate at around the 10 minute mark,
but throughout the loop we would be digging deeper and deeper into
recursive territory so its possible that the node process could become
overwhelmed and hang.

## Expected Behavior
If recursive graph creation is detected, Nx terminates and logs the call
stack so it can be investigated properly.

## Related Issue(s)

Fixes #29618

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: AgentEnder <AgentEnder@users.noreply.github.com>
2025-11-21 01:37:19 -05:00
Jack Hsu 239a4dbb2d feat(linter): add util to load eslint rules from a directory (#33543)
This PR adds the ability for users to import ESLint rules from arbitrary
location in the workspace rather than storing them in
`tools/eslint-rules`. This is useful for monorepo not using
npm/yarn/pnpm workspaces and need a mechanism to load from any custom
rules location without them being installed/symlinked.

It also handles TS files automatically.

Demo: https://www.loom.com/share/3c32af4555614eeab4f81fce8db0c955

Example:

```js
import baseConfig from "../../eslint.config.mjs";
import { loadWorkspaceRules } from "@nx/eslint-plugin";

const customRules = await loadWorkspaceRules("foo/bar/eslint-rules");

export default [
  ...baseConfig,
  {
    ignores: ["**/out-tsc"],
  },
  {
    files: ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"],
    plugins: {
      custom: { rules: customRules },
    },
    rules: {
      "custom/valid-command-object": "error",
    },
  },
];
```

---------

Co-authored-by: Leosvel Pérez Espinosa <leosvel.perez.espinosa@gmail.com>
2025-11-20 17:16:03 -05:00
Craigory Coppola 9f7414e32a fix(core): daemon command should exit at end (#33547)
## Current Behavior
Daemon command hangs at end instead of exiting

## Expected Behavior
Daemon command exits

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

Fixes #
2025-11-20 16:54:32 -05:00
Craigory Coppola 236177b8a3 chore(repo): fixup some issues with jest config (#33549)
## Current Behavior
There's some issues with the jest configs in the repo, CJS files having
`import` in them, etc.

## Expected Behavior
CJS files don't have `import`

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

Fixes #
2025-11-20 16:49:18 -05:00
Craigory Coppola 0e500dc64f fix(core): don't presume a task is long running if its marked cacheable (#33545)
## Current Behavior
`cache: true` is overridden if task name is dev

## Expected Behavior
`cache: true` has priority

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

Fixes #32610

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-11-20 16:48:28 -05:00
MaxKless aa38b256a7 fix(graph): align exclude flag with others by using findMatchingProjects (#33550) 2025-11-19 18:18:51 -05:00
Jack Hsu 618c3344af fix(vite): generate .mts config files to force ESM (#33518)
Using .mts extension forces files to always be treated as ESM modules,
ensuring consistent behavior regardless of package.json or tsconfig
settings.

This matters for Node 24 because by default Node will strip types from
`.ts` files and then they are resolved through normal Node resolution.
In the past we can control CJS/ESM through tsconfig options, but now
only extension or `type` in `package.json` matters.

Changes:
- Updated all createOrEditViteConfig calls to pass useEsmExtension: true
- Updated normalizeViteConfigFilePathWithTree to check for .mts files
first
- Updated test files to expect .mts config files
- Updated snapshots to reflect new .mts extension

Closes NXC-3446
2025-11-19 16:49:25 -05:00
Jack Hsu 05bd3a4c16 fix(linter): handle various flat config override structures (#33548)
Flat config overrides util may fail when it isn't a plain JS object.
This PR makes the `hasOverrides` function more robust against these
cases.


Fixes #31796
2025-11-19 16:40:46 -05:00
MaxKless 3401c7ec78 cleanup(gradle): fix gradle dsl e2e test in verbose mode (#33546)
<!-- 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
the JSON parsing is broken because in verbose mode, the gradle plugin
returns more than just JSON.

## Expected Behavior
JSON parsing in the test should work

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

Fixes #
2025-11-19 14:59:07 -05:00
Colum Ferry 7b9970f499 fix(release): ensure file change calculation matches nx affected #33413 (#33539)
## Current Behavior
We naively mark WholeFileChange for commits when getting the relevant
commits for projects.
There is already logic to perform better diff checking for lock files,
especially in the case of pnpm catalog usage

## Expected Behavior
Reuse existing logic to determine file changes more accurately

## Related Issue(s)

Fixes #33413
2025-11-19 17:35:09 +00:00
Craigory Coppola 219e82d4cd fix(core): default input should indeed be default (#33533)
<!-- 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

If no inputs or named inputs are defined, this area of code was hit:

```
const DEFAULT_INPUTS: ReadonlyArray<InputDefinition> = [
  {
    fileset: '{projectRoot}/**/*',
  },
  {
    dependencies: true,
    input: 'default',
  },
];

export function getNamedInputs(
  nxJson: NxJsonConfiguration,
  project: ProjectGraphProjectNode
) {
  return {
    default: [{ fileset: '{projectRoot}/**/*' }],
    ...nxJson.namedInputs,
    ...project.data.namedInputs,
  };
}
```

This resulted in weird behavior when the user would define `default` in
named inputs, but it would seemingly only be applied to the project's
deps and not the project itself

## Expected Behavior
The `default` input is the default for both

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

Fixes #https://github.com/nrwl/nx/issues/32924
2025-11-19 10:28:58 -05:00
Craigory Coppola f5c876b82e fix(core): avoid leaking memory due by creating an unref'd interval for each daemon connection (#33532)
## Current Behavior
Every time a daemon connection is opened, we create a new interval and
unref it. This results in the daemon checking its process termination at
an ever increasing rate, which presents as increased memory usage and
practically means the daemon is just doing a lot more work than it needs
to in this area.

## Expected Behavior
The interval is registered only on initial server startup.

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

Fixes #29836
2025-11-19 10:28:30 -05:00
Jack Hsu 6b56665857 docs(js): update dual format guide with correct types and hint to check arethetypeswrong tool (#33531)
This PR updates the guide here to also include type entries (which we
generate by default):
https://nx.dev/docs/technologies/typescript/guides/compile-multiple-formats

Update the content to account for the new inferred `@nx/rollup/plugin`
setup, but still mentions the executor. And also link to a tool that can
be used to check for types correctness.

Closes #33258

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: jaysoo <jaysoo@users.noreply.github.com>
2025-11-18 18:22:41 -05:00
Caleb Ukle f5915fa165 docs(nx-cloud): update private registry example script (#33528) 2025-11-18 23:14:42 +00:00
Caleb Ukle e418217dde fix(nx-dev): error out when failing to parse plugin manifests (#33498)
if there is an error parsing a schema file for generators/executors then
we should fully error out to prevent caching a "bad" build even if the
site techincally works with missing plugin info.
2025-11-18 16:19:54 -06:00
Jason Jean 3206c35fb2 chore(repo): re-enable metrics collection (#33508)
## Current Behavior

Metrics collection is currently disabled in the CI workflow via the
`NX_CLOUD_ENABLE_METRICS_COLLECTION` environment variable set to
'false'.

## Expected Behavior

Metrics collection should be enabled to gather build and performance
data from CI runs.

## Related Issue(s)

Reverts the change from #33497

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-11-18 13:36:49 -05:00
Rares Matei 40b99940f9 chore(repo): use recommended pnpm cache location (#33529)
This also fixes pnpm caching on the nx repo.
2025-11-18 18:07:20 +00:00
Caleb Ukle 0d84a6788f docs(webpack): update externalDependencies comment to correct reflect the defalt value (#33461)
default is not 'none' is now 'all'

https://github.com/nrwl/nx/blob/master/packages/webpack/src/plugins/nx-webpack-plugin/lib/apply-base-config.ts#L53
2025-11-18 17:57:46 +00:00
Leosvel Pérez Espinosa 6b3b0c679b fix(js): sync external references to project's tsconfig.json file if it includes any files (#33524)
## Current Behavior

The `@nx/js:typescript-sync` generator never syncs external project
references to `tsconfig.json` files if a runtime tsconfig file exists.

## Expected Behavior

The `@nx/js:typescript-sync` generator should sync external project
references to `tsconfig.json` files if it includes any files or a
runtime tsconfig file doesn't exist.
2025-11-18 14:24:43 +01:00
Jason Jean 2dc4cb53ac chore(repo): update nx to 22.1.0-rc.5 (#33519)
Updating Nx from 22.1.0-rc.3 to 22.1.0-rc.5

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-11-17 19:49:59 -05:00
Jason Jean 41dec8ee78 fix(core): resolve all lock ordering deadlocks in metrics collector (#33513)
## Summary
This PR fixes a critical deadlock issue in the metrics collector that
occurred due to inconsistent lock acquisition order between the
collection thread and registration threads. The fix involved
restructuring lock scopes across multiple functions to maintain a
consistent lock hierarchy.

## Changes
- Fixed lock acquisition order in 4 registration functions
(register_main_cli_process, register_main_cli_subprocess,
register_task_process, register_batch)
- Restructured collect_metrics() to minimize system lock scope and
release it before acquiring other locks
- Fixed collection helper methods to read PIDs in scoped blocks without
holding system lock
- Added comprehensive trace logging for debugging lock contentions
- Added concurrent test case to verify no deadlocks occur under stress

## Testing
- All 12 metrics tests pass
- Comprehensive concurrent stress test added:
test_concurrent_group_creation_with_subprocess_updates
- Lock ordering consistency test added:
test_lock_order_consistency_across_registration_threads

## Lock Ordering Rule
Established and enforced this hierarchy across all threads:
1. Acquire system lock first
2. Release system lock
3. Then acquire registration/PID locks

This prevents circular wait conditions (A→B / B→A) that cause deadlocks.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-11-17 17:02:52 -05:00
Benjamin Cabanes 02e5c4af8e docs(nx-dev): add click event to header navigation links (#33516)
Added `sendCustomEvent` calls to track clicks on primary header and
mobile header navigation links.
2025-11-17 15:38:20 -05:00
Jack Hsu ed3ddebde5 fix(storybook): normalize version range before comparison (#33515)
When Storybook is installed with a version range like `^10.0.0` or
`~8.5.3`, the configuration generator fails with error:
```
NX   Invalid Version: ^10.0.0
TypeError: Invalid Version: ^10.0.0
```

This occurs because `gte()` from semver doesn't accept version ranges on
the left-hand side - only valid semver versions are allowed there.

The Storybook configuration generator should work with version ranges by
extracting the actual version number before comparison.

Fixes #33514
2025-11-17 14:55:30 -05:00
Jack Hsu e8576a8bb2 docs(angular): update dynamic module federation to use enhanced modules (#33512)
This updates the MF dynamic remotes docs for Angular to match new setup.

Closes DOC-327
2025-11-17 13:48:10 -05:00
Miroslav Jonaš 4bfc1e8e29 feat(core): apply parent env to atomized target (#33013)
<!-- 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
Env variables from the parent target are not propagated to the atomized
target e.g.
`.test-ci.env` will be only applied to **no-op** `test-ci` but not to
`test-ci--path/to/test/file`.

## Expected Behavior
Running an atomized target will load from the parent's env files.

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

Fixes #

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-11-17 17:30:07 +01:00
Nas3nmann 961e2379fe chore(core): nx plugin submission nx-oxlint 2025-11-17 17:10:10 +01:00
MaxKless de8a0205fd feat(gradle): allow specifying project and task configuration from gradle build files (#33264)
## Current Behavior 
Gradle projects in Nx workspaces can only configure metadata through
Gradle's built-in mechanisms. There's no way to specify Nx-specific
project metadata (like tags) or customize task target configurations
other than overriding with `project.json`

 ## Expected Behavior

Developers can now configure Nx-specific metadata for both projects and
tasks using a type-safe Kotlin/Groovy DSL:

 ### Project-level metadata (in build.gradle.kts):
  ```
nx {
    set("name", "my-service")
    array("tags", "scope:backend", "type:api")
    set("description", "Payment processing service")
  }
```

 ### Task-level metadata (in build.gradle.kts):
```
  tasks.named("integrationTest") {
    nx {
      set("cache", false)
      array("tags", "integration", "slow")
    }
  }
```

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: MaxKless <MaxKless@users.noreply.github.com>
2025-11-17 10:44:46 -05:00
Craigory Coppola d86fb5d244 fix(core): prevent hanging between command end and process exit (#33500)
## Current Behavior

In certain scenarios, Nx commands would hang between command completion
and process exit. This was caused by inefficient message end detection
in the
daemon socket communication, where the check for `MESSAGE_END_SEQ` could
fail when TCP packets were fragmented.

  ## Expected Behavior

With this PR, the message end detection is more robust and handles TCP
packet fragmentation correctly, preventing the hanging issue. The
changes also
add better performance tracking and logging to help diagnose similar
issues in the future.

  ## Changes Made

- **Improved message end detection**
(`consume-messages-from-socket.ts`): Added a preliminary check of the
last character's code point before checking
the full MESSAGE_END_SEQ, which prevents false negatives when TCP
packets are fragmented
- **Enhanced performance tracking** (`daemon/client/client.ts`,
`daemon-socket-messenger.ts`): Added message-type-specific performance
marks and
  measures for better debugging
- **Added server-side logging** (`daemon/server/server.ts`): Added
logging for message receipt, serialization, and response to help
diagnose
  communication issues

  ## Related Issue(s)

This fix addresses hanging issues observed in daemon communication when
commands complete but the process doesn't exit.
2025-11-17 09:57:34 -05:00
Colum Ferry b96b8e32e3 feat(docker): add skipDefaultTag option to build target (#33477) (#33506)
Add a skipDefaultTag option to the DockerTargetOptions interface that
allows users to opt out of the automatic default tag that is prepended
to build targets.

This is useful for multi-platform builds that need to push during build
(e.g., using --platform linux/amd64,linux/arm64 --push), where the
default tag causes build failures because it attempts to push a tag that
was not configured.

- Add skipDefaultTag?: boolean to DockerTargetOptions interface
- Modify buildTargetOptions to conditionally skip default tag when
skipDefaultTag is true
- Inherit skipDefaultTag from parent target in configurations
- Add comprehensive unit tests for skipDefaultTag functionality
- Add e2e test to verify skipDefaultTag works end-to-end
- Maintains backward compatibility (default behavior unchanged when
option not specified)

Fixes #33477
2025-11-17 09:55:31 -05:00
Jason Jean f54364eb67 chore(repo): update nx to 22.1.0-rc.3 (#33496)
Updating Nx from 22.1.0-rc.2 to 22.1.0-rc.3

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: FrozenPandaz <FrozenPandaz@users.noreply.github.com>
2025-11-15 11:29:32 -05:00
Craigory Coppola c1b942fd1c fix(core): include require paths when resolving specified plugins (#33495)
## Current Behavior
Loading local plugins that are relative paths from workspace root, that
point to a JS file, still require preliminary data from default plugins
despite being resolvable. This is because we aren't passing `paths` to
`require.resolve`, so it is trying to resolve relative to the nx package
instead of the workspace.

## Expected Behavior
The straight JS path resolves

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

Fixes #
2025-11-14 21:27:26 -05:00
Philip Fulcher a9def426a1 docs(nx-dev): add monorepo myths article (#32944)
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-11-14 16:35:05 -05:00
Chau Tran a1dcd09172 chore(repo): disable metrics collection (#33497)
<!-- 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 #
2025-11-14 16:09:16 -05:00
Jason Jean b3e6b03d82 chore(core): restructure metrics collector for performance and maintainability (#33483)
## Current Behavior

The metrics collector has several inefficiencies and architectural
issues:
- Complex hierarchical data structure (`ProcessTreeMetrics`) that
doesn't align with how the data is consumed
- Separate `MetadataStore` struct with unnecessary indirection
- Full metadata resent to all subscribers on every collection cycle
- Mutable parameters passed through collection functions instead of
functional return values
- Repeated allocations and clones across collection cycles
- `CollectionRunner` tightly coupled to NAPI, making it untestable in
pure Rust

## Expected Behavior

This PR restructures the metrics collector for better performance,
testability, and maintainability:

### Architectural Changes

1. **Flat Process Model**: Replaced hierarchical `ProcessTreeMetrics`
with a flat `Vec<ProcessMetrics>`, simplifying data flow

2. **Group-Based Organization**: Introduced `GroupInfo` and `GroupType`
to logically organize processes:
   - `MainCLI` - Nx CLI process and its subprocesses
   - `Daemon` - Nx daemon and its children
   - `Task` - Individual task execution processes
   - `Batch` - Batch execution with multiple tasks

3. **Incremental Metadata Updates**:
- Track which groups and processes have been sent using
`Arc<DashMap<String, GroupInfo>>` and `Arc<DashMap<String,
ProcessMetadata>>`
- Only send new metadata to subscribers instead of full state every
cycle
- New subscribers receive full metadata on first update via
`needs_full_metadata` flag
   - Automatic cleanup of dead process/group metadata

4. **Shared State with Arc**:
- Metadata maps shared between `ProcessMetricsCollector` and
`CollectionRunner` using `Arc<DashMap>`
   - Eliminated duplicate metadata storage
   - Single source of truth for all metadata

5. **Functional Programming Pattern**:
- Collection functions now return `Result<MetricsCollectionResult>`
instead of mutating parameters
   - Cleaner error handling with `inspect_err` and `map`
   - Easier to reason about data flow
   - Removed ~100 lines of code by consolidating logic

6. **Channel-Based Communication**:
   - Decoupled `CollectionRunner` from NAPI using `crossbeam_channel`
   - Collection thread sends metrics via channel to listener thread
   - Listener thread receives metrics and notifies NAPI subscribers
   - `CollectionRunner` is now NAPI-free and fully testable in pure Rust
- Non-blocking collection (subscriber callbacks don't block metrics
collection)

### Performance Optimizations

- Pre-allocated `Vec` capacity when combining metrics from different
sources
- Eliminated unnecessary `HashMap` clones during metadata updates
- Single-pass insertion into `DashMap` during string key conversion
- Reduced memory allocations in hot paths
- Collection thread never blocks on JavaScript callbacks

### Code Quality Improvements

- **Testability**: Added 7 pure Rust unit tests for `CollectionRunner`:
  - Group creation with different registration types
  - Incremental metadata updates
  - Dead group cleanup
  - All tests pass without requiring NAPI/Node.js runtime
- Clearer separation of concerns between collection and notification
- Better comments explaining incremental update strategy
- More idiomatic Rust patterns throughout
- Updated TypeScript type exports to match new structure

### Threading Model

**Before:**
```
CollectionRunner (mixed collection + NAPI notification)
```

**After:**
```
CollectionRunner (pure Rust, testable)
  └─> Channel
      └─> Listener Thread
          └─> NAPI ThreadsafeFunction
              └─> Subscribers
```

## Testing

-  241 Rust tests passing (including 7 new `CollectionRunner` tests)
-  Native module builds successfully
-  TypeScript types updated and exports verified

## Related Issue(s)

Part of ongoing metrics collector optimization work.
2025-11-14 16:56:51 +00:00
MaxKless 9471207767 feat(core): make console daemon check backgroundable and pulling from latest (#33491)
## Current Behavior
The Nx Console install check for the prompt happens in the main process,
adding some overhead to each invocation of nx.

## Expected Behavior
We want this check to happen on the daemon so that it's running in the
background. If it's still running when nx is invoked, we can just skip
the prompt since it's non-critical.
Running it in the background also allows us to pull the latest version
of the logic from npm when executing - that way we can keep the logic
older versions up-to-date even when ppl don't migrate to latest.
2025-11-14 16:14:13 +00:00
Jason Jean 7fd2cb4e3b chore(maven): bump Maven plugin version to 0.0.10 (#33485)
## Current Behavior

The Maven plugin is currently at version 0.0.9.

## Expected Behavior

This PR bumps the Maven plugin to version 0.0.10 and creates the
necessary migration for users to automatically update their pom.xml
files.

## Related Issue(s)

N/A - Routine version bump
2025-11-14 10:59:05 -05:00
MaxKless 2088eaaf22 fix(maven): skip maven plugin computation on vercel/netlify (#33486)
<!-- 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 #
2025-11-14 09:28:59 -05:00
Jack Hsu 001e2ba4bb fix(misc): handle ERR_USE_AFTER_CLOSE gracefully in nx init and create-nx-workspace (#33469)
https://www.loom.com/share/560ceccdad45462e9fd3e3f185fc9fa5

Node 24 has stricter readline behavior, and enquirer is not checking for
closed state when invoking operations, resulting in an
ERR_USE_AFTER_CLOSE error when users press Ctrl+C during interactive
prompts.

This commit fixes the issue by adding uncaughtException handler to
ignore ERR_USE_AFTER_CLOSE errors.

When users press Ctrl+C, the process now exits cleanly without showing
an ugly error stack trace.

Fixes NXC-3412

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-14 09:28:50 -05:00
Nicole Oliver 1ef2614519 docs(nx-cloud): remove references to standalone powerpack (#33471)
Updates the Nx Powerpack docs and marketing page to make it clear that
Powerpack packages are included with Nx Enterprise, and cannot be
purchased separately, and remove references to the Nx Powerpack trial.

<!-- 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. -->

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: Caleb Ukle <caleb@nrwl.io>
2025-11-13 14:37:40 -08:00
Jack Hsu 54f6206f1b docs(js): clarify non-buildable libs can be in devDependencies for TS… (#33481)
The recipe for switching to TS project references states "If you
reference a local library project with its own `build` task" which
caused confusion. Users thought only buildable libraries should be
included in devDependencies, leading them to create unnecessary path
aliases for non-buildable libraries.

Closes DOC-149

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-13 17:29:34 -05:00
Jason Jean 20653ab15a chore(misc): record stat for initial invocation of create-nx-workspace (#33480)
## Current Behavior
Currently, telemetry stats are only recorded when `create-nx-workspace`
completes successfully. This doesn't capture how many times the command
is invoked vs completed.

## Expected Behavior
Record a stat when `create-nx-workspace` is first invoked (before any
prompts), enabling analysis of drop-off between initial invocation and
workspace completion.

## Changes Made

### Telemetry
- Added `recordStat()` call in `normalizeArgsMiddleware()` immediately
after welcome message and before any user prompts
- Records with command name `create-nx-workspace` and metadata
`['start']` to distinguish from completion stat
- Allows correlation of invocation and completion events for drop-off
analysis

### AI Agents Prompt
- This is being temporarily disabled because we noticed a dip in
create-nx-workspace completions that lines up when this was released.
Disabling it temporarily to see if the dip is recovered by disabling the
prompt.

### React Framework Selection
- Added early returns in `determineReactFramework()` for cases where
framework is already provided or interactive mode is disabled
- Improves performance by avoiding unnecessary prompt interactions

### Code Quality
- Reorganized imports in alphabetical order for better maintainability
- Removed unused import (`printSocialInformation`)

## Related Issue(s)
WIP - Draft for discussion
2025-11-13 20:16:58 +00:00
Louie Weng 0014ae66d8 fix(gradle): bump gradle migration version (#33479)
Ensure that we bump up Nx plugin for Gradle version to 0.1.9 when going
from 22.1.0-rc.3
2025-11-13 10:43:09 -08:00
Jack Hsu 4e3f475f63 fix(vite): support vitest v4 (#33478)
This PR ports the vitest v4 logic back to `@nx/vite` even though users
should be using `@nx/vitest`, we still support it until v23. Otherwise
running `@nx/vite:configuration --includeVitest` will always fail.

Generator working:
https://www.loom.com/share/246c401e114348818b998e0abed8754e
Suppressing warning:
https://www.loom.com/share/f769507de6684d4e9cb720cdc277e56a
2025-11-13 12:44:17 -05:00
Jason Jean 76c030a82e fix(core): capture stderr in nx add command for better error messages (#33462)
## Current Behavior

When `nx add @nx/s3-cache` fails due to incompatible peer dependencies
or other installation errors, users see only a generic error message
without the actual error details from the package manager.

## Expected Behavior

The command should display complete error messages from the package
manager (both stdout and stderr), including peer dependency conflicts
and other important diagnostic information.

## Changes

Fixed the exec callback in the `installPackage` function to:
1. Capture the `stderr` parameter (was previously ignored)
2. Log both stdout and stderr with a newline separator for clarity
3. Ensure users see all error information from package managers

## Why It Matters

Package managers write installation errors and peer dependency warnings
to stderr. By ignoring stderr, users had no visibility into what
actually failed, making it difficult to diagnose and fix issues.

Fixes issue with `nx add` not showing proper error messages.
2025-11-13 09:25:42 -05:00
Jason Jean 50cf84f758 chore(repo): update nx to 22.1.0-rc.2 (#33464)
Updating Nx from 22.1.0-beta.8 to 22.1.0-rc.2
2025-11-13 08:53:58 -05:00
Rares Matei 37cbdee1a2 docs(nx-cloud): recommend set sha action in manual dte (#33476)
<!-- 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 #
2025-11-13 14:38:28 +01:00
Jason Jean 455891eaf5 fix(js): skip TS project references migration for non-TS-solution workspaces (#33467)
## Current Behavior

The `remove-redundant-ts-project-references` migration fails with an
error when run on workspaces that don't have a root `tsconfig.json`
file, such as nx-examples.

## Expected Behavior

The migration should skip workspaces that are not using TypeScript
solution setup instead of throwing an error.

## Related Issue(s)

Fixes the issue encountered when running the migration on
nrwl/nx-examples repo.

## Changes

- Added check to skip migration if workspace is not using TS solution
setup
- Updated test setup to properly configure TS solution for existing
tests
- Added new test cases to verify skip behavior

The migration now uses `isUsingTsSolutionSetup()` to detect if:
- `tsconfig.base.json` exists
- `tsconfig.json` exists and extends the base
- Package manager workspaces are configured
- Proper TS solution structure is in place

Workspaces missing any of these requirements will have the migration
skip silently.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-12 22:58:31 +00:00
Jack Hsu 1997d950af docs(misc): replace Java cup logo with Duke mascot (#33466)
Use Duke logo rather than the cup logo. Also fix an alignment issue for
sidebar icons.

<img width="1352" height="707" alt="image"
src="https://github.com/user-attachments/assets/dff634e8-3b51-48c6-bbdb-7898e671e118"
/>

<img width="1067" height="596" alt="image"
src="https://github.com/user-attachments/assets/3c2075fd-8577-4a99-bb6b-66f901dd8f1e"
/>


Closes DOC-297

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-12 16:37:14 -05:00
Jason Jean 26df170c54 chore(js): update migration version to 22.1.0-rc.1 (#33465)
## Current Behavior

The migration for removing redundant TypeScript project references is
set to version `22.1.0-beta.8`.

## Expected Behavior

The migration should be updated to version `22.1.0-rc.1` to align with
the release candidate version.

## Related Issue(s)

N/A - Version update as requested.
2025-11-12 20:17:27 +00:00
Leosvel Pérez Espinosa 36b9f7ab32 fix(js): remove redundant typescript project references (#33438)
## Current Behavior

The `@nx/js:typescript-sync` generator adds project dependencies as
TypeScript project references to each project's `tsconfig.json` and
runtime tsconfig file (e.g., `tsconfig.app.json`, `tsconfig.lib.json`,
etc.). This is redundant since projects' `tsconfig.json` files already
reference the runtime tsconfig file, which would reference the
dependencies.

## Expected Behavior

The `@nx/js:typescript-sync` generator should add project dependencies
as TypeScript project references to each project's runtime tsconfig file
(e.g., `tsconfig.app.json`, `tsconfig.lib.json`, etc.). If the project
only has a `tsconfig.json` file, it should add them to it.

We've observed some performance improvement with this change while
running the `typecheck` tasks.
2025-11-12 17:48:26 +00:00
Jason Jean 5c565ad37f fix(core): optimize batch task scheduling to prevent redundant traversals (#33455)
## Summary

This PR combines two critical performance optimizations for batch task
scheduling and task hashing:

### 1. Batch Scheduling Fix

Fixed a correctness bug in the batch scheduling optimization where the
`visitedInBatch` tracking happened too early. Now tasks are only marked
as visited AFTER all scheduling checks pass, ensuring tasks can be added
to the batch from any valid dependency path.

**Files Modified:**
- `packages/nx/src/tasks-runner/tasks-schedule.ts`

**Impact:**
- Prevents task splitting across unnecessary batch boundaries
- Maintains correctness while optimizing performance
- All batch scheduling tests pass

### 2. Task Output Hashing Optimization

Added a DashMap-based cache to the Rust TaskHasher to prevent redundant
hashing when multiple tasks depend on the same outputs.

**Files Modified:**
- `packages/nx/src/native/tasks/task_hasher.rs` - Added
task_output_cache field
- `packages/nx/src/native/tasks/hashers/hash_task_output.rs` - Implement
cache logic

## Root Cause of Issue #33366

Large project graphs with high dependency fanout exhibit slow
`hashMultipleTasks` because:
- 100+ tasks may depend on the same 10 build tasks' outputs  
- This generates 1,000+ separate `TaskOutput` hash instructions
- Each instruction independently:
  - Lists output files from disk (filesystem I/O)
  - Builds glob patterns
  - Hashes the same files
- Result: Same files hashed 100× redundantly

## Solution: Task Output Cache

The cache key combines glob pattern and sorted output paths. When
identical outputs are hashed with the same pattern:
- First task: computes hash (~milliseconds) and stores in cache
- Remaining 99 tasks: cache hits (~nanoseconds each)

### Cache Lifetime
- `TaskHasher` instantiated once per `hashMultipleTasks` call
- Cache persists for entire hashing session
- Discarded when `hashMultipleTasks` completes
- Optimal scope for cache hit maximization

## Performance Impact

**Expected Improvements:**
- Best case (100 tasks, 10 shared deps): 100× speedup
- Typical monorepo: 10-20× speedup
- No shared deps: No regression (cache lookup negligible)

**Issue #33366 Analysis:**
- Current: `Time for 'hashMultipleTasks' 49351.488518` (49 seconds)
- Expected with optimization: ~5-10 seconds (depending on actual
dependency structure)

## Testing

-  All task scheduling tests pass (2262 passed, 0 new failures)
-  Batch mode tests pass (6/6)
-  Native build completed successfully
-  No regressions in existing functionality

## Design Notes

- Task output cache follows same pattern as `workspace_files_cache`,
`external_cache`, `runtime_cache`
- Thread-safe using DashMap with Arc for Rayon parallel processing
- Instrumented with trace-level logging for cache hits/misses
- Cache automatically cleaned up when TaskHasher is dropped
2025-11-12 12:08:18 -05:00
Leosvel Pérez Espinosa ba893a13b0 cleanup(angular): handle ng-packagr changes to browserslist (#33457)
Updates the `ng-packagr` executors to support a breaking change in v21.
This needs to be done in advance because we use the published
`@nx/angular` executors to build the `@nx/angular` source code. To
update to Angular v21, we need this change to be merged, released, and
installed in the Nx repository so that we can build the `@nx/angular`
package containing the support for Angular v21.
2025-11-12 10:44:41 -05:00
Leosvel Pérez Espinosa 19dbf55206 fix(core): remove system metrics collection and reporting (#33456)
Removes system metrics collection and reporting.
2025-11-12 09:55:09 -05:00
Jack Hsu 3d48b75202 feat(core): export TypeScript schema definitions via wildcard patterns (#33454)
Users cannot import TypeScript schema definitions or schema.json files
from Nx packages due to strict package exports introduced in Nx 21.0.0.

Users can now import both TypeScript definitions and JSON schemas from
generator/executor/builder paths using wildcard export patterns. Both
first-level (`*`) and second-level (`*/*`) patterns are supported to
handle different import depths.

Note: For old plugins that had `src/...` deep imports we keep those in
`exports`, but for newer plugins that always used `exports` we skip
`src/` in the export path. So `@nx/nuxt/generators` instead of
`@nx/nuxt/src/generators`.

Fixes #33336
2025-11-12 09:43:12 -05:00
MaxKless 26a7e4fca7 feat(core): pull nx init from latest before executing (#33446)
## Current Behavior
nx init is executed with whatever version is installed globally by npm
(might be outdated)

## Expected Behavior
we pull down the latest version from npm (if it has provenance) and run
that when executing.
Also introduced a new `NX_USE_LOCAL` env var that will be respected by
all commands that have this pulling-from-latest behaviour.
2025-11-12 12:01:37 +01:00
Benjamin Cabanes 7ca6680e03 docs(nx-dev): add Pricing link to Nx Cloud navigation menus (#33452)
Added a "Pricing" link to the Nx Cloud navigation sections.
2025-11-11 20:11:11 +00:00
Jack Hsu 5fa1c18dea chore(repo): bump to Node 24 (#33441)
Update CI to Node 24. Note that the e2e-release changes are pulled from
the original PR.

Note: There are changes to NPM 11 (Node 24) to make it run slower than
NPM 10 (Node 20/22) for publish. (https://github.com/nrwl/nx/pull/31934)

e.g. https://github.com/npm/cli/releases/tag/v11.0.0-pre.1 (`Upon
publishing, in order to apply a default "latest" dist tag, the command
now retrieves all prior versions of the package.` which incurs more
network cost)
2025-11-11 15:10:09 -05:00
Jason Jean 647d75116b chore(repo): update nx to 22.1.0-beta.8 (#33451)
Updating Nx from 22.1.0-beta.7 to 22.1.0-beta.8
2025-11-11 14:26:09 -05:00
Jason Jean 12422ae3ea fix(graph): add nx:build-native dependency to typecheck target (#33428)
## Current Behavior

The typecheck target in graph/client/project.json only depends on
^typecheck targets from other projects.

## Expected Behavior

The typecheck target now includes nx:build-native as a dependency to
ensure native dependencies are built before type checking.

## Related Issue(s)

This fix resolves typecheck failures caused by missing native
dependencies.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: FrozenPandaz <FrozenPandaz@users.noreply.github.com>
2025-11-11 13:38:11 -05:00
Philip Fulcher db09e106e9 docs(nx-dev): add video link to task analytics article (#33450) 2025-11-11 12:20:24 -06:00
MaxKless ab7db78b04 feat(maven): add option to prefix all maven targets (#33420)
## Current Behavior
there is no way to generally influence how maven goals/phases are
represented as targets in nx. This could be useful though for organizing
targets in nx, for example through nx.json `targetDefaults`

## Expected Behavior
There's a `targetNamePrefix` plugin option that can be passed.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: MaxKless <MaxKless@users.noreply.github.com>
2025-11-11 13:16:01 -05:00
Jason Jean 6121a12368 chore(repo): update nx to 22.1.0-beta.7 (#33431)
Updating Nx from 22.1.0-beta.6 to 22.1.0-beta.7
2025-11-11 17:07:01 +00:00
Leosvel Pérez Espinosa 8f3b0b22a7 fix(core): resolve lockfile cache regression with keyMap state (#33448)
After PR #33256 split lockfile parsing into separate node and dependency
caches, a regression occurred where dependencies could be regenerated
without nodes, leaving a shared module-level variable (`keyMap`) empty
and causing incorrect dependency resolution.

Changes:
- Serialize `keyMap` with nodes cache to maintain state between phases
- Remove module-level shared state from pnpm, npm, and yarn parsers
- Move `keyMap` creation inside `getNodes` functions for better
encapsulation
- Update `readCachedExternalNodes` to deserialize `keyMap` internally
2025-11-11 16:52:05 +00:00
Jack Hsu 3c85af93af chore(misc): upgrade macOS GitHub Actions runners (#33444)
Update from the macos-13 is in brownout and will be gone soon.

- macos-15-intel for x86_64-apple-darwin (Intel) builds
- macos-latest for aarch64-apple-darwin (ARM64) builds

Closes NXC-3444
2025-11-11 11:51:49 -05:00
Colum Ferry 00a247be3f feat(vitest): support vitest 4 (#33424)
## Current Behavior
We currently only generate vitest projects using Vitest 3

## Expected Behavior
Use Vitest 4 when generating new projects

## Related Issue(s)

Closes NXC-3343
Closes NXC-3379

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-11-11 10:20:14 -05:00
Leosvel Pérez Espinosa 6d0523e326 fix(core): clean up dead processes from metrics (#33437)
Fixes a regression where dead processes were not being cleaned up from
the metrics reporting.
2025-11-11 09:53:37 -05:00
James Henry 3439ff10e7 feat(release): add resolveVersionPlans option to changelog CLI and API (#33435) 2025-11-11 18:53:14 +04:00
Nicole Oliver 806e9a83af docs(nx-cloud): clarify Github integration details (#33433)
Clarifies some details of the Nx Cloud GitHub integration, such as which
features are available when you use the base integration vs a GitHub
powered organization.

<!-- 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` -->
2025-11-11 09:33:43 -05:00
Colum Ferry 4509d95b3b fix(release): changelog renderer should render commit title with breaking changes (#33439)
## Current Behavior
We do not render the commit title in the BC section of generated
changelogs.

## Expected Behavior
We should render the commit title in the BC section of generated
changelogs along with the Remote Release Client reference to the commit.

## Related Issue(s)

Closes NXC-3290
2025-11-11 13:20:46 +00:00
Colum Ferry 9513a1f89c fix(vitest): do not fail when cleanedAngularVersion is of incorrect type (#33436)
## Current Behavior
There may be a scenario when `cleanedAngularVersion` is of type `object`
rather than `string` which proceeds to error when passed to
`semver.major()`.

## Expected Behavior
If `cleanedAngularVersion` is not `string`, assume the latest version
will be installed. Similar to how no found angular version is handled.

## Related Issue(s)

Fixes #33347
2025-11-11 11:25:33 +00:00
Leosvel Pérez Espinosa 843c041396 fix(js): improve typescript plugin performance (#33425)
- Fix for a bug with the external project references cache
- Add more caching for repeated operations
- Skip tsconfig files processing based on which targets should be
inferred

Fixes #33076
2025-11-11 10:04:43 +01:00
Jason Jean 93e0b21d97 fix(js): update vitest generator import in library generator (#33430)
## Current Behavior
The library generator has an unused import and incorrect import pattern
for the vitest generator.

## Expected Behavior
Clean imports with the correct way to access the configurationGenerator
from @nx/vitest.

## Changes
- Removed unused imports (logger, readJson)
- Updated vitest generator import to use direct require instead of
ensurePackage pattern for accessing the generator

Fixes #
2025-11-10 22:31:21 +00:00
Jack Hsu 98b2ab42e6 chore(repo): force storybook@9 so types resolve (#33429)
Master has v9 in lockfile, but it's not a guarantee. This forces v9
until we have a better solution to resolve v10 types.
2025-11-10 16:47:16 -05:00
Colum Ferry 6b54d6acf6 fix(storybook): remove optional nature of migration (#33427)
## Current Behavior
The Storybook 10 migration was originally intended to be optional.

## Expected Behavior
Make Storybook 10 migration add the migration generator to
migrations.json always. Users can remove it from here if they do not
want it, or they can use the Migrate UI from Nx Console to choose not to
run it.
2025-11-10 20:11:43 +00:00
Jason Jean 73ecb30491 chore(repo): update nx to 22.1.0-beta.6 (#33423)
Updating Nx from 22.1.0-beta.5 to 22.1.0-beta.6
2025-11-10 19:11:25 +00:00
Colum Ferry e581c3c437 feat(vitest): split entrypoint into plugin, generators, executors (#33426)
Split entry point of `@nx/vitest` into `index.ts` for the Inference
Plugin, `generators.ts` for Generators, `executors.ts` for the
Executors.
Ensure the `README.md` is copied to the correct output directory

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Coly010 <Coly010@users.noreply.github.com>
2025-11-10 18:29:37 +00:00
Colum Ferry 685e497c4f feat(vitest): split vitest into @nx/vitest plugin (#33311)
Split `vitest` out of `@nx/vite` and create a new `@nx/vitest`.

This allows for each plugin to have a single responsibility. One for
bundling, one for testing.

It should allow for lighter setups where Vite for Bundling is not
required, but users still want to use vitest for testing.

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Coly010 <Coly010@users.noreply.github.com>
2025-11-10 16:22:47 +00:00
Jason Jean 7a3179241e chore(repo): update storybook (#33422)
<!-- 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 -->

Storybook was accidentally downgraded to 9.1.9

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

Storybook is upgraded back to 10.0

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

Fixes #
2025-11-10 10:51:17 -05:00
Leosvel Pérez Espinosa 22618b6be9 feat(testing): support cypress v15 (#33393)
## Current Behavior

Cypress v15 is not supported.

## Expected Behavior

Cypress v15 should be supported.

## Related Issue(s)

Fixes #33304

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: leosvelperez <leosvelperez@users.noreply.github.com>
2025-11-10 10:50:50 -05:00
Jack Hsu 60089cc998 chore(expo): run export before e2e to mitigate timeout (#33414)
CI and nightlies can flake out during expo test if cypress or playwright
times out waiting for webserver. This makes is to the `export` that
powers `static-serve` is run before running e2e.

This is not usually a problem in new workspaces with inference, but this
legacy test uses executors so continuous task dependency isn't set up.
2025-11-10 10:19:57 -05:00
Louie Weng a0a3289112 chore(gradle): bump plugin for gradle version to 0.1.9 (#33419)
<!-- 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 plugin for Gradle is at version 0.1.8

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

Nx plugin for Gradle is at version 0.1.9

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

Fixes #
2025-11-10 09:53:48 -05:00
Leosvel Pérez Espinosa 373066a379 feat(core): track system metrics and link plugins to workers when possible (#33411)
- Track relevant CPU and memory system metrics.
- Link plugins to workers when possible.
- Refactor collector code by splitting it into two separate structs.
2025-11-07 23:29:36 +00:00
Caleb Ukle 7458b52b4e docs(nx-cloud): document new flaky tasks analytics (#33253)
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-11-07 16:10:30 -05:00
Jack Hsu 4170c2f82b docs(js): update node compat matrix (#33415)
Update it for v22.
2025-11-07 16:10:03 -05:00
Caleb Ukle 2182cea451 cleanup(repo): use mise for agent toolchain installs (#33299)
also dedupe agent launch templates with yaml anchors for better
readability
2025-11-07 14:01:48 -06:00
Philip Fulcher 777217618e docs(nx-dev): add task analytics article (#33407)
https://nx-dev-git-philip-task-analytics-article-nrwl.vercel.app/blog/nx-cloud-release-introducing-enterprise-task-analytics
2025-11-07 13:37:39 -06:00
Jason Jean 746b89a901 feat(maven): bump version from 0.0.8 to 0.0.9 (#33405)
## Current Behavior

Maven plugin is currently at version 0.0.8.

## Expected Behavior

Maven plugin should be bumped to version 0.0.9 with a corresponding
migration for users.

## Changes Made

- Updated parent POM version to 0.0.9
- Updated package.json version to 0.0.9  
- Updated mavenPluginVersion constant to 0.0.9
- Added new migration (0-0-9) to update user pom.xml files from 0.0.8 to
0.0.9
- Scheduled migration for Nx v22.1.0-beta.6

## Testing

-  Maven package tests pass
-  Build succeeds
-  Linting passes
2025-11-07 13:07:36 -05:00
MaxKless b395cec4cd feat(maven): add ci-workflow generator (#33346)
Co-authored-by: Jason Jean <jasonjean1993@gmail.com>
2025-11-07 16:21:15 +00:00
James Henry a6948665e6 fix(core): correctly identify local workspace dependencies on windows (#33408) 2025-11-07 15:08:45 +04:00
Philip Fulcher 790358af91 docs(nx-dev): add november 2025 webinar (#33403)
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: philipjfulcher <philipjfulcher@users.noreply.github.com>
2025-11-06 14:13:29 -06:00
MaxKless e9146c7862 fix(core): prevent args from being split by spaces when executing through nx wrapper (#33362)
<!-- 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
Because `./nx` is passing args with `$@`, args are being split by
spaces. Reference for this behaviour:
https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html#Special-Parameters-1

This results in this set of process args when running `./nx start-ci-run
--distribute-on="3 linux-medium-jvm"`

```
[
  "<user path>/.nvm/versions/node/v22.19.0/bin/node",
  "<user path>/Projects/OTW/mm-test/.nx/nxw.js",
  "start-ci-run",
  "--distribute-on=3",
  "linux-medium-jvm",
]
```

## Expected Behavior
the arg with whitespace should not be split before being passed to nx:
```
[
  "<user path>/.nvm/versions/node/v22.19.0/bin/node",
  "<user path>/.nx/nxw.js",
  "start-ci-run",
  "--distribute-on=3 linux-medium-jvm",
]
```
2025-11-06 13:42:07 -05:00
Jack Hsu 62d0ad7f25 chore(repo): rename jest.config.ts to jest.config.cts to be compat with Node 24 strip types (#33401)
This PR is just for the repo itself to use `.cts` to explicitly use CJS
for jest config. Node 24 strip types so having `.ts` files with ESM
syntax even though we're previously transpiling them to CJS is a
problem.
2025-11-06 13:36:44 -05:00
Leosvel Pérez Espinosa e470b2c64a feat(core): disable interactivity by default for run-one task outputs in tui (#33358)
Make run-one task terminal outputs in the TUI non-interactive by
default. Most tasks don't need interactivity, and it causes TUI to
ignore all its key bindings because it forwards them to the underlying
program. If interactivity is needed, users can press `i` to enable it.
2025-11-06 13:25:07 -05:00
Louie Weng 28e778a1f9 feat(gradle): use gitignore to determine dependant task output files (#33402)
<!-- 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 we detect if inputs are found in the build directory to
determine if they are considered dependent task output files. We can use
a simpler heuristic instead.

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

If an input is gitignored (and therefore not hashed by Nx), then we
consider it a dependant task output file. This gitignore classifier will
be a mirror of the class used within the Maven plugin. There will be
another PR to move this classifier into a shared kotlin project that can
be used between both projects.

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

Fixes #
2025-11-06 13:20:06 -05:00
Jason Jean 61442118cf fix(maven): forward parameters through target dependencies (#33365)
## Current Behavior

Maven target dependencies are defined as simple strings that reference
other targets. Currently, parameters are not forwarded through these
dependencies when Maven goals are executed.

## Expected Behavior

Target dependencies in Maven should forward parameters (args) to their
dependency targets, enabling better parameter propagation through the
build pipeline.

## Changes Made

Modified `NxTargetFactory.kt` to transform simple string dependency
references into structured dependency objects with explicit parameter
forwarding:

- Install dependencies now forward parameters
- Phase dependencies now forward parameters  
- Test dependencies now forward parameters
- CI target dependencies now forward parameters

This ensures that when a Maven goal executes, any parameters passed to
it are properly forwarded to all transitive target dependencies.

## Related Issue(s)

This change enables parameter passing through Maven target dependencies
via the new dependency object format with `"params": "forward"`.
2025-11-06 11:56:14 -05:00
Jack Hsu 9b5768e7fe fix(testing): use .cts config files for Jest 30+ to fix __dirname issues (#33349)
When using Jest 30 with SWC, users are seeing an error where `__dirname`
is not defined for ESM modules. This is because the `.ts` extension is
type-stripped by Node 22.17/24+ via checking for
[`process.features.typescript`](https://github.com/jestjs/jest/blob/fe7f28c9d1941f5c2726831cd9d9e479b401610e/packages/jest-config/src/readConfigFileAndSetRootDir.ts#L46).

This means that instead of using the `commonjs` we set for `ts-node`,
normal Node resolution kicks in, and is now treating `jest.config.ts` as
ESM.

This PR fixes this issue by using an explicit `.cts` extension, which
forces CommonJS that we assume for Jest configs.

Note: For Jest 29 or earlier we need to keep `jest.config.ts` since the
`.cts` extension is not supported prior to Jest 30.

There's also a fix for an existing issue where using `module.exports` of
anything else from `@types/node` will error out if `tsconfig.json` has a
`types` field but does not include `node`. See:
https://www.loom.com/share/7ebe3c90a70e4ec7bfa53cbcccaaea7d

Fixes #32236

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-06 10:25:39 -05:00
MaxKless cde5ee8c83 docs(misc): add information about nx console debug logging (#33398) 2025-11-06 15:42:01 +01:00
Colum Ferry f2072f01f2 feat(storybook): generate ai instructions for converting from CJS to ESM after migration (#33395)
## Current Behavior
Storybook 10 Changelog states that CJS is no longer supported.
The migration does not do this automatically.

https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#the-storybookmain-file-and-other-presets-must-be-valid-esm

## Expected Behavior
Generate instructions for an AI Agent to find and convert CJS Storybook
Config files to ESM.

## Related Issue(s)

Fixes NXC-3409
Fixes NXC-3336
2025-11-06 14:28:18 +00:00
Juri 2e5844c61b docs(module-federation): change terminal output to shell frame 2025-11-06 14:52:17 +01:00
Juri 58cbbf20bd docs(nx-dev): link nx 22 release video 2025-11-06 14:51:56 +01:00
Jack Hsu 603e7c0bb6 docs(misc): fix ToC overflow and height stretching issues (#33384)
This PR fixes the ToC so it does not overflow to the footer. It adjusts
the height calculation such that it takes up the entire height of the
main frame.

The extra top margin is removed from the footer to remove the extra gap
between main frame and footer.

BEFORE: 

<img width="1387" height="915" alt="image"
src="https://github.com/user-attachments/assets/e7f4d31c-a206-48ab-81e6-9fddfee11b18"
/>


AFTER:

<img width="1385" height="916" alt="image"
src="https://github.com/user-attachments/assets/cf6e2662-3c3d-4d37-9769-235b901cc188"
/>

<img width="1382" height="918" alt="image"
src="https://github.com/user-attachments/assets/9e142edf-259b-482a-b676-9333857ed776"
/>



Fixes DOC-224

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-06 08:43:56 -05:00
Jack Hsu f5d97e3047 fix(nx-dev): fix GitHub star button styling in mobile view (#33385)
This PR fixes the GitHub star widget in the left sidebar such that it
only shows in smaller screens (e.g. mobile). For desktop we have it in
the ToC.

Also styles it to be consistent with the login and sign up buttons.

Large screen, don't show:

<img width="1483" height="881" alt="image"
src="https://github.com/user-attachments/assets/d3c88d87-4905-4c3f-85c4-b7b4c14546d4"
/>


Smaller screen, show:

<img width="1136" height="811" alt="image"
src="https://github.com/user-attachments/assets/22aa652f-c523-493f-a01e-87e55934e1c9"
/>

Mobile view, show:

<img width="511" height="880" alt="image"
src="https://github.com/user-attachments/assets/283ffca2-4e4e-4706-811f-ce27b02e607b"
/>


Fixes DOC-325
2025-11-06 08:43:26 -05:00
Juri a032099138 docs(dotnet): add paragraph about adding a .net app 2025-11-06 14:40:40 +01:00
Colum Ferry f549ef290f feat(vite): add vitest 4 to peerDep range to prevent conflicts (#33394)
## Current Behavior
`@nx/vite` has a peerDep range of only `1 | 2 | 3` for `vitest`.
This will cause peer dep conflicts for using wishing to use Vitest 4.

## Expected Behavior
Add Vitest 4 to the peerDep range of `@nx/vite` to prevent conflicts.
2025-11-06 10:36:10 +00:00
MaxKless a020954987 fix(core): handle various directories when importing prettier (#33383)
<!-- 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
when trying to format with prettier while outside of the workspace (for
example in a `tmp` nx installation like is created during
`configure-ai-agents`), resolving prettier could fail even though it's
present in the actual workspace.

## Expected Behavior
resolving prettier works if it's available in either the proper
workspace or the tmp one by specifying `paths` in `require.resolve`
2025-11-05 17:02:32 -05:00
Jason Jean cfcf109450 chore(repo): enable NX_CLOUD_ENABLE_METRICS_COLLECTION in CI (#33387)
Enables NX_CLOUD_ENABLE_METRICS_COLLECTION in the CI workflow.
2025-11-05 16:48:03 -05:00
Jason Jean ba6ca6c5ae chore(repo): update nx to 22.1.0-beta.5 (#33386)
Updating Nx from 22.1.0-beta.4 to 22.1.0-beta.5
2025-11-05 15:40:45 -05:00
Leosvel Pérez Espinosa a98b524f06 feat(core): collect resource usage (#32946)
Adds resource usage collection while running tasks.
2025-11-05 18:56:12 +00:00
Colum Ferry f6bc122c0b feat(nextjs): add support for next 16 (#33296)
## Current Behavior
We currently support Next 14 and 15.

## Expected Behavior
Add support for Next 16, bringing support to 14, 15, 16.
Existing workspaces will continue to use the version they are on.
New workspaces will use Next 16.

Refer to Next 16 Migration Guide for migrating from Next 15 to 16

## Related Issue(s)

Fixes #33207

---------

Co-authored-by: Eric Büttner <eric.buettner@tuffz.com>
2025-11-05 17:31:31 +00:00
Craigory Coppola b97f666a4e chore(repo): remove --fix-tasks config that exists to exclude removed task (#33371)
This pull request makes a minor update to the CI workflow configuration.
The change simplifies the `Start CI Run` step by removing the
`--fix-tasks="!*check-commit*"` option from the `npx nx-cloud@next
start-ci-run` command.
2025-11-05 10:46:31 -05:00
Colum Ferry 1b7d0955a2 fix(module-federation): update @module-federation packages to fix Koa vulnerability (#33285) (#33380)
Updates @module-federation packages from 0.18.0 to 0.21.2 and
@module-federation/node from 2.7.11 to 2.7.21 to address Koa Open
Redirect vulnerability (CVE: GHSA-g8mr-fgfg-5qpc).

The vulnerability was in transitive dependencies:
@nx/react → @nx/module-federation → @module-federation/enhanced →
@module-federation/dts-plugin → koa@3.0.1-3.0.2

Changes:
- Updated package.json dependencies in @nx/module-federation and
@nx/rspack
- Updated version constants in Angular and React utils/versions.ts
- Added 22.2.0 migrations to all affected packages

Fixes #33285
2025-11-05 10:41:28 -05:00
Jack Hsu bc47ab8ce9 docs(react): update SVGR documentation for Nx 22 (#33370)
This PR clarifies that Nx 22 removed SVGR support from Next.js and React
(Webpack/Rspack).

<img width="942" height="1185" alt="image"
src="https://github.com/user-attachments/assets/6ea8393f-b037-489f-804b-eb06d8d07e4c"
/>

Previously we had this option `svgr: true` but was configurable and
didn't align with current best practices like `import Logo from
'./logo.svg?react'`. We removed it from Nx 22, provided a migration, but
users will be confused by the docs.

Fixes DOC-326
2025-11-05 10:21:50 -05:00
Juri Strumpflohner 26aca9e5ec docs(nx-dev): fix broken URL to monorepo tools (#33381)
<!-- 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 #
2025-11-05 09:32:30 -05:00
Juri Strumpflohner 18557f8af4 docs(misc): various updates embedding videos in docs pages 2025-11-04 21:54:36 +01:00
Leosvel Pérez Espinosa c933660b88 cleanup(core): remove unused mouse event listeners from tui (#33368)
Cleans up unused mouse event listeners from the TUI.
2025-11-04 13:21:10 -05:00
MaxKless c2fba1f6fc cleanup(core): update the nx orb version used in circle ci generators (#33364) 2025-11-04 14:47:56 +00:00
Colum Ferry 83051c5c62 fix(vite): ensure createVitest looks only from projectRoot (#33361)
## Current Behavior
`createVitest` is looking at the full workspace every time. It should
only look at the directory with the config file.

## Expected Behavior
Pass the root as the projectRoot of the config file found.
2025-11-04 09:11:45 -05:00
Jason Jean 2d78f571b4 chore(repo): update nx to 22.1.0-beta.4 (#33350)
Updating Nx from 22.1.0-beta.3 to 22.1.0-beta.4
2025-11-03 17:56:26 -05:00
Jason Jean 4017b61ede feat(core): add OSC 9;4 progress indicator support to TUI (#33325)
## Current Behavior

The Nx TUI doesn't provide any visual feedback about task progress
outside of the terminal window itself. Users need to keep the terminal
visible to see task completion status.

## Expected Behavior

With this PR, the TUI now displays real-time task completion progress in
the terminal window chrome (tabs, title bars, dock icons) using the OSC
9;4 escape sequence. This provides at-a-glance progress feedback even
when the terminal is minimized or in the background.

## Related Issue(s)

N/A - This is a new feature enhancement

## Implementation Details

### What is OSC 9;4?
OSC 9;4 is a terminal escape sequence for displaying progress
indicators, originally from ConEmu and now supported by multiple modern
terminals.

### Key Changes
- Added `update_ghostty_progress()` method to calculate and display task
completion percentage
- Added `clear_ghostty_progress()` method to hide progress when done
- Integrated progress updates into task lifecycle (start, status update,
exit)
- Uses ST terminator (`\x1b\\`) for maximum terminal compatibility
- Writes to stderr to avoid conflicts with TUI rendering on stdout

### Supported Terminals
- **Ghostty** - Full support
- **Windows Terminal** (v1.6+) - Full support
- **VTE-based terminals** (GNOME Terminal, Ptyxis) - Full support
- **Other terminals** - Gracefully ignore sequences (no errors)

### Terminal Compatibility Note
The implementation uses the ST (String Terminator) escape sequence
rather than BEL, as this is preferred by Ghostty and required by
VTE-based terminals, while remaining compatible with Windows Terminal.

## Testing

Tested with:
- Building the native module successfully
- Rust formatting and linting passes
- Running nx commands with the TUI active

The progress indicator updates in real-time as tasks complete and clears
automatically when the TUI exits.
2025-11-03 13:27:18 -05:00
Jason Jean 0acc8b0988 feat(core): batch hash tasks without custom hashers (#33327)
## Current Behavior

When processing scheduled batches, tasks are hashed one at a time even
though the hasher has a `hashTasks` method for batch hashing.

Results from a batch with 109 tasks.
```
hash batch: 8.297s
```

## Expected Behavior

Tasks without custom hashers should be batch-hashed using the hasher's
`hashTasks` method for better performance.

Results from a batch with 109 tasks.
```
hash batch: 991.725ms
```

## Related Issue(s)

This is a performance optimization for task hashing.

---

**Changes:**

- Added a new `hashTasks` function that intelligently separates tasks
with custom hashers from those without
- Tasks with custom hashers are hashed individually using `Promise.all`
- Tasks without custom hashers are batch-hashed using the hasher's
`hashTasks` method
- The function automatically filters out tasks that already have a hash
- Updated `processScheduledBatch` in task-orchestrator to use this new
function
2025-11-03 13:27:06 -05:00
Colum Ferry a084f205f9 fix(vite): ensure atomizer does not consider projects outside the project root (#33344)
## Current Behavior
Vitest's `createVitest` can be over-eager and include other projects in
the workspace when finding relevant test specifications.
This leads atomizer to look at relative paths outside the project root.

## Expected Behavior
Ensure that the plugin does not look at projects outside the project
root.
2025-11-03 16:46:57 +00:00
Jason Jean 8cc052f351 chore(repo): update nx to 22.1.0-beta.3 (#33341)
Updating Nx from 22.1.0-beta.2 to 22.1.0-beta.3
2025-11-03 11:30:25 -05:00
Jason Jean d64f45879b fix(maven): set migration version to 22.1.0-beta.4 (#33345)
## Current Behavior

The Maven migration version was incorrectly set to `0.0.8-beta.0` in the
migrations.json file.

## Expected Behavior

The migration version should be set to `22.1.0-beta.4` to align with the
Nx release version.

## Related Issue(s)

Fixes the migration version discrepancy in the Maven plugin.
2025-11-03 11:30:12 -05:00
Juri Strumpflohner 8f7c635894 docs(nx-cloud): embed self-healing ci videos (#33338)
Embeds videos about self-healing CI into the corresponding feature doc

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-11-03 11:25:03 -05:00
Jason Jean 7e0f66dbf3 feat(maven): upgrade to version 0.0.8 with automated migration (#33315)
## Current Behavior

The Maven plugin is at version 0.0.7 with no automated migration path
for users to upgrade their pom.xml files.

## Expected Behavior

Users can upgrade to Maven plugin 0.0.8 and have their pom.xml files
automatically updated via the Nx migration system.

## Changes Made

- Updated Maven plugin version from 0.0.7 to 0.0.8 in:
  - `packages/maven/package.json`
  - `packages/maven/src/utils/versions.ts`
  - `packages/maven/maven-plugin/pom.xml`

- Created `updateNxMavenPluginVersion()` utility function with:
  - Proper XML parsing using `@xmldom/xmldom` DOM API
  - Targeted updates only for `dev.nx.maven:nx-maven-plugin` elements
- Safe handling of all other version elements (dependencies, parent,
project, etc.)
  - Comprehensive error handling

- Added migration `0-0-8/update-pom-xml-version.ts` that:
  - Automatically runs when users upgrade to 0.0.8
  - Updates root pom.xml files via the utility function
  - Logs status of migrations performed

- Registered migration in `migrations.json`

- Added comprehensive unit tests (9 test cases):
  - Updates only the nx-maven-plugin version
  - Does not update other plugin versions
  - Handles missing files gracefully
  - Preserves XML formatting and structure
  - Handles multiple plugin references
  - Handles whitespace correctly
  - Only updates plugins, not parent/project versions
  - All tests passing (27/27)

## Test Plan

- [x] Unit tests pass (27 passing tests)
- [x] XML parsing correctly identifies and updates only
`dev.nx.maven:nx-maven-plugin`
- [x] Other version elements remain untouched
- [x] Migration registration validated
2025-11-03 10:49:18 -05:00
Craigory Coppola b401e6e348 feat(core): enable tui by default on windows (#33314)
## Current Behavior:

Tui is working, but only able to be enabled on windows via env vars or
explicit command line config

## Expected Behavior:

Tui is default on
2025-11-03 09:56:26 -05:00
Craigory Coppola a5d34fd9f9 chore(repo): add .NET format check + codeowners and unify native target handling (#33323)
## Current Behavior
Maven and .NET use a bespoke script to handle skipping an optional
native target in case a system is not setup on a dev's machine.

.NET isn't in codeowners

## Expected Behavior
This pull request introduces improvements to the build and formatting
workflows for the `.NET` and Maven plugins, streamlining the execution
of native targets and updating code ownership assignments. The changes
focus on refactoring build scripts to use a unified runner, adding new
formatting capabilities for .NET projects, and updating the CODEOWNERS
file for clearer team responsibilities.

**Build and Format Workflow Improvements**

* Refactored the `.NET` analyzer build command in
`packages/dotnet/project.json` to use the new `run-native-target.js`
script, replacing the previous direct script invocation.
[[1]](diffhunk://#diff-036c1a7f2e7d98f5a3207441f2ff1cb25b5b5a03343672ce473f4ff0189a5946L25-R25)
[[2]](diffhunk://#diff-42d990ddcbf8d3585553503097ee8b8d1fff8cb6e25e0cd545a87e11d64c03a8L1-L7)
* Added new `format-native` and `_format-native` targets to
`packages/dotnet/project.json`, enabling verification and fixing of code
formatting for the .NET analyzer using `dotnet format`.

**Unified Native Target Runner**

* Introduced the `scripts/run-native-target.js` script to standardize
running native build and install targets, controlled by environment
variables for skipping builds.

**Maven Plugin Build Refactor**

* Updated the Maven plugin's install workflow in
`packages/maven/maven-plugin/project.json` to use the new native target
runner, and removed the obsolete `scripts/build-maven-analyzer.js`
script.
[[1]](diffhunk://#diff-2763fe8a7c2989643f53370a14a08c06616e85c29340fd5bcfa1a67d0deaee7aL11-R11)
[[2]](diffhunk://#diff-972edab06956ad35145cbc20b8e250e7067fbb288b1f99c92661c24f64d3e69dL1-L7)

**Ownership Updates**

* Updated the `CODEOWNERS` file to assign `.NET`-related directories to
`@FrozenPandaz` and `@AgentEnder`, clarifying team responsibilities.

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

Fixes #
2025-11-01 13:30:41 -04:00
Colum Ferry 4507b5a03b feat(storybook): add support for storybook 10 (#33277)
## Current Behavior
We support Storybook 8 and 9


## Expected Behavior
Add support for Storybook 10, bringing Storybook support to 8, 9 and 10

## Related Issue(s)

Fixes #33141
2025-10-31 17:11:22 +00:00
Colum Ferry d7c8f6e772 chore(repo): add vitest scope (#33317) 2025-10-31 17:05:10 +04:00
Jason Jean 4fcdc9542e fix(maven): resolve maven dependencies from project roots (#33313)
## Current Behavior

Maven dependencies were not being resolved correctly from project roots,
which affected the dependency analysis in monorepos with Maven projects.

## Expected Behavior

Maven dependencies should be properly resolved from each project's root,
allowing Nx to correctly understand the project graph for Maven-based
projects.

## Changes Made

- Updated Maven plugin Kotlin code to properly resolve dependencies from
project roots
- Fixed devkit internal utilities to properly handle Maven dependency
resolution
- Updated TypeScript dependencies plugin to align with the new
resolution logic

## Files Changed

-
`packages/maven/maven-plugin/src/main/kotlin/dev/nx/maven/NxProjectAnalyzer.kt`
-
`packages/maven/maven-plugin/src/main/kotlin/dev/nx/maven/NxProjectAnalyzerMojo.kt`
- `packages/maven/src/plugins/dependencies.ts`
- `packages/dotnet/src/plugins/create-dependencies.ts`
- `packages/devkit/internal.ts`
- `packages/nx/src/devkit-internals.ts`

Fixes #XXXXX

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-30 18:17:48 -04:00
Craigory Coppola 29a61429a5 chore(repo): enable codeql for csharp code (#33301)
## Current Behavior
CodeQL is not enabled for C#, but C# is in the nx repo

## Expected Behavior
CodeQL is enabled on C#

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

Fixes #

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-30 17:33:30 -04:00
Jack Hsu b28366395f fix(vite): prevent race-condition when importing @vitejs/plugin-vue (#33307)
This PR primes the cache for `@vitejs/plugin-vue`, similar to how we
already do for `esbuild`. When `vite.config.ts` is compiled into CJS,
then doing `require('@vitejs/plugin-vue')` may error with a race
condition if an `import` of the same module is in progress.

Fixes #NXC-3289

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-30 12:33:47 -04:00
Colum Ferry 4ec3a99544 chore(node): do not have assertions around killPorts (#33294) 2025-10-30 10:35:33 -04:00
Jack Hsu 9c326bb8e9 chore(repo): use vitest.config.mts to force ESM (#33310)
If it is resolved as CJS it may run into issues?
2025-10-30 10:34:26 -04:00
MaxKless 0347e67334 feat(misc): remove CI investigation recommendations from agent rules (#33309)
<!-- 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
there are recommendations for using the CIPE fixing tools but they are
being removed

## Expected Behavior
removed tools should not be mentioned anymore.

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

Fixes #
2025-10-30 10:33:14 -04:00
Copilot ad0b44f05f docs(maven): add nx show projects, update command example to nx verify, and simplify configuration (#33302)
Completed Maven documentation updates:

- [x] Add `nx show projects` command to display Maven projects after
initialization
- [x] Change example from `nx build` to `nx verify` 
- [x] Simplify configuration section to use `plugins: ["@nx/maven"]`
with defaults
- [x] Update configuration description to accurately explain how targets
are created

## Summary

Successfully updated the Maven plugin documentation:

1. **Added `nx show projects` command** - Shows users how to list
discovered Maven projects after running `nx init`
2. **Changed example to `nx verify`** - Uses a more appropriate Maven
lifecycle phase that includes tests and verification
3. **Simplified configuration** - Updated the configuration section to
show the simpler string array syntax `plugins: ["@nx/maven"]`
4. **Corrected target creation description** - Updated the text to
accurately explain that `@nx/maven` automatically retrieves information
about projects from Maven and creates targets for each phase, goal, and
some additional targets for CI

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> Expand this section
https://nx.dev/docs/technologies/java/maven/introduction#add-nx-to-a-maven-workspace
> 
> With instructions to run the following
> 
> nx show projects
> 
> To see a list of Maven projects
> 
> And change nx build Maven project to nx verify Maven project
> 


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: FrozenPandaz <8104246+FrozenPandaz@users.noreply.github.com>
2025-10-30 10:05:00 -04:00
MaxKless ac8b58191a chore(repo): refactor dev container setup to work with mise (#33291)
<!-- 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
devcontainer wasn't working reliably

## Expected Behavior
devcontainer should work reliably and reuse the configuration setup we
have for all these different tools that are needed
2025-10-30 09:45:13 -04:00
MaxKless 56633a7b1b fix(core): also look in .nx installation when reading nx.json extends (#33306)
<!-- 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
in a `.nx` installation, `require.resolve` won't find the `extends`
preset nx.json file because there are no root `node_modules`

## Expected Behavior
in a `.nx` installation, the nested `.nx/installation/node_modules` are
also used to try and resolve the preset.
2025-10-30 09:10:50 -04:00
Eric Büttner 2f3b7d09b5 fix(nextjs): ensure eslint-config-next matches Next.js 14 and 15 versions (#30259)
This PR builds on the previous fix that ensured `eslint-config-next` was
correctly installed when using Next.js 15. #30258

Now, the logic has been further refined to dynamically determine the
installed Next.js version and install the corresponding
`eslint-config-next` version accordingly.

<!-- 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

- `next@~15.1.4` is installed
- `eslint-config-next@14.2.16` is installed (incorrect for Next.js 15)

### Expected Behavior

If Next.js 15 is detected -> eslint-config-next@15.1.4 is installed
If Next.js 14 is detected -> eslint-config-next@14.2.16 is installed

### GitHub Repo

https://github.com/tuffz/new-nx-with-preset-nextjs

### Steps to Reproduce

1. Run the following command from the official documentation:
`npx create-nx-workspace@latest --preset=next`
3. Open `package.json` and check the installed dependencies

- `next@~15.1.4` is installed
- `eslint-config-next@14.2.16` is installed

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

Fixes #30257 (& #30258)
2025-10-29 22:53:04 +00:00
Copilot 4a07faf15c docs(nx-dev): add GitHub star widget back to documentation sidebar (#33289)
Adds the "Give us a star" CTA back to the Astro documentation in both
the left navigation sidebar and right table of contents sidebar.

## Implementation

- **Middleware** (`github-stars.middleware.ts`): Fetches star count from
`nrwl/nx` via GitHub GraphQL API with 1-hour cache. Exports
`DEFAULT_STAR_COUNT` (23k) for fallback when `GITHUB_TOKEN` unavailable.

- **Components**: Integrated existing `GitHubStarWidget` React component
into `Sidebar.astro` (bottom of nav) and `TableOfContents.astro` (above
"On this page") using `client:load` hydration.

- **Configuration**: Added middleware to `astro.config.mjs` route
middleware chain.

## Screenshot

![GitHub star widget in
documentation](https://github.com/user-attachments/assets/3d746408-d05b-429d-98ec-1fc8c886646d)

Widget appears in both sidebars showing star count and linking to
https://github.com/nrwl/nx with analytics tracking.

Fixes https://linear.app/nxdev/issue/DOC-268/add-give-us-a-star-cta-back

> [!WARNING]
>
> <details>
> <summary>Firewall rules blocked me from connecting to one or more
addresses (expand for details)</summary>
>
> #### I tried to connect to the following addresses, but was blocked by
firewall rules:
>
> - `api.npmjs.org`
> - `repo.gradle.org`
> - `staging.nx.app`
> - `telemetry.astro.build`
>
> If you need me to access, download, or install something from one of
these locations, you can either:
>
> - Configure [Actions setup
steps](https://gh.io/copilot/actions-setup-steps) to set up my
environment, which run before the firewall is enabled
> - Add the appropriate URLs or hosts to the custom allowlist in this
repository's [Copilot coding agent
settings](https://github.com/nrwl/nx/settings/copilot/coding_agent)
(admins only)
>
> </details>

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> Issue Title: Add "Give us a star" CTA Back
> Issue Description: e.g.
`nx-dev/ui-common/src/lib/github-star-widget.tsx`
> 
> This goes in the sidebar, but we can also see if we want to put it
elsewhere in the new docs.
> Fixes
https://linear.app/nxdev/issue/DOC-268/add-give-us-a-star-cta-back
> 
> 
> Comment by User 5261ea6c-c70c-4295-a64f-a792be93af22:
> [https://github.com/nrwl/nx](https://github.com/nrwl/nx)
> 
> Comment by User d484ef82-7f7d-4a95-be09-9d82ca3905dc:
> 📋 I wasn't able to determine which GitHub repository to work in.
> 
> I think it's one of these, but can you tell me which one is right?
> 
> Comment by User d484ef82-7f7d-4a95-be09-9d82ca3905dc:
> Waiting for https://linear.app/nxdev/profiles/james to link their
GitHub account. [Click to authorize
→](https://linear.business.githubcopilot.com/linear/auth)
> 
> Comment by User :
> This thread is for an agent session with githubcopilot.
> 
> 


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/nrwl/nx/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: JamesHenry <900523+JamesHenry@users.noreply.github.com>
Co-authored-by: Jack Hsu <jack.hsu@gmail.com>
2025-10-29 14:50:12 -04:00
Caleb Ukle 84b0debba8 docs(nx-cloud): re-split out vcs guides to prevent header overlap in ToC (#33282)
guides couldn't be merged into one page w/ tabs and keep consistent
headers. so we're back to splitting them out. but all under a
source-control-integration parent route. so we don't need to do any
redirects and such as the index route will contain the links to each one
2025-10-29 13:15:19 -05:00
Philip Fulcher b876ced24f docs(nx-dev): revise Nx 22 release article (#33287)
---------

Co-authored-by: Juri <juri.strumpflohner@gmail.com>
2025-10-29 11:59:59 -04:00
Philip Fulcher f52d58675a docs(nx-dev): remove webinar notifier for October webinar (#33295) 2025-10-29 10:06:29 -05:00
Ajit Panigrahi e56abcf517 docs(core): remove duplicate install instructions (#33278)
Removed duplicate information about installing Nx globally.

<!-- 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 -->
Duplicate line.

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

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

Fixes #
2025-10-29 08:37:31 -05:00
Juri 6b95de3ede docs(nx-dev): add article about Storybook and watching buildable libs 2025-10-29 14:30:34 +01:00
Craigory Coppola 3e6e0681d0 chore(repo): remove files accidentally committed while investigating socket issues (#33284)
Some investigation files were accidentally included in a merge
2025-10-28 18:40:27 -04:00
Jason Jean e97b3fa0e3 chore(repo): update nx to 22.1.0-beta.2 (#33283)
Updating Nx from 22.1.0-beta.1 to 22.1.0-beta.2
2025-10-28 18:24:29 -04:00
Caleb Ukle 221ad580d8 docs(nx-cloud): document missing env vars (#33281)
- add `NX_CLOUD_API` (and nxCloudUrl for nx.json)
- add `NX_NO_CLOUD`

https://6900e6fdb1379200085c29ca--nx-docs.netlify.app/docs/reference/environment-variables#nx-cloud-environment-variables
2025-10-28 15:56:49 -04:00
MaxKless eb4281d7dd fix(core): make sure that gemini contextFileName is string before trying to resolve (#33280)
<!-- 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
the implementation is brittle and will fail if `contextFileName` is not
a string

## Expected Behavior
we should just not handle other things that folks are putting in there.
but not fail

---------

Co-authored-by: Jason Jean <jasonjean1993@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-10-28 19:34:07 +00:00
Leosvel Pérez Espinosa f76f1ce3df chore(repo): dogfood pnpm catalogs (#33232)
Dogfoods the Pnpm Catalogs feature in the Nx repo. This is the first
step to move all dependencies to Pnpm Catalogs definitions. More work
will be done incrementally later as we consolidate package versions
across the repository.

The initial list of dependencies moved to Pnpm Catalogs is:

- Angular packages
- React packages
- TypeScript packages
- Jest packages
- Rspack packages
- Some common utilities
2025-10-28 19:09:07 +00:00
Jason Jean 54a4eb4da7 chore(repo): update nx to 22.1.0-beta.1 (#33271)
Updating Nx from 22.1.0-beta.0 to 22.1.0-beta.1

---------

Co-authored-by: Craigory Coppola <craigorycoppola@gmail.com>
2025-10-28 14:04:53 -04:00
Craigory Coppola d1653eca05 fix(core): turn v8 serializer off by default but fallback to it if json serialization fails (#33274)
## Current Behavior
We have tried to enable v8 serialization again... but it still seems
problematic. We don't want to revert again... so we evaluated some
options:

1. Disable by default
2. Disable for the single client method we think may be problematic
3. Fall back to JSON if v8 fails
4. Disable by default and still fall back if JSON fails

## Expected Behavior
We decided to update Nx such that the default behavior will be a
combination of #4, and #2. So by default we use JSON, if that
serialization fails we'll try v8... but there's an exception so the
method we know to be an issue will never try v8.

If you opt in to v8 by default, the combo changes to #3 + #2. So, by
default we'd use v8... if it fails try json... never try v8 for
processInBackground

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

Fixes #
2025-10-28 14:03:58 -04:00
Juri Strumpflohner 160b4cce34 feat(nx-dev): add downloadable resources page and React book blog post 2025-10-28 16:12:39 +01:00
Emilio Heinzmann 1089ffc41b fix(docker): guard commitSha null in plugin interpolation (#33275)
## Current Behavior
Docker plugin assumed `commitSha` was always non-null; when `null`,
`shortCommitSha.slice` caused a runtime error during target
interpolation.

## Expected Behavior
Plugin should succeed even if latest commit SHA cannot be resolved,
simply omitting shortCommitSha-based substitutions.

## Changes
- Added null guard: `shortCommitSha` now set to `commitSha ?
commitSha.slice(0,7) : null`.
- Added test "should not throw when commitSha is null" verifying node /
target creation succeeds.
- No breaking changes; only broadens safe input surface.

## Additional notes
Logic only executes when `commitSha` was previously null (error case);
normal paths unchanged. If consumers interpolate `{shortCommitSha}`,
they should handle possible null (unchanged if interpolation is already
optional).
2025-10-28 13:43:06 +00:00
James Henry f2649cbaa6 feat(vite): add atomizer support for vitest (#33265) 2025-10-28 15:52:34 +04:00
Juri 43a5e163ce docs(nx-cloud): self-healing CI classification customization 2025-10-27 21:44:12 +01:00
Jack Hsu 39df8c9b76 chore(nx-dev): remove link checker from build so it is only checked during CI not deploy (#33272)
This PR removes the need to check links during deploy and instead
enforces it in CI. This removes the need to build astro-docs when
building next.js app.

Reduces Vercel build from 10-11 mins to 6.5 mins.

<img width="1231" height="94" alt="image"
src="https://github.com/user-attachments/assets/ad5d4459-f917-4609-8c00-151f61dc29d6"
/>
2025-10-27 15:58:15 -04:00
Louie Weng 29467dac05 docs(nx-cloud): edit release notes for 2025.07.3 (#33270)
<!-- 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
-->

Update release notes entry tor 2025.07.3 - short link support for DTE
summary

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

Fixes #
2025-10-27 17:08:15 +00:00
Rares Matei 18b3c52a3c chore(repo): run workspace create and rollup tests serially (#33252)
<!-- 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 -->

You can see the issue here:
https://staging.nx.app/cipes/68fba96042d3126ee8ec0d19/analysis?runGroup=18785923031-1-linux

## 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 BAC-1387
2025-10-27 16:35:43 +00:00
Jack Hsu f36c61f530 fix(webpack): prevent errors when importing @nx/webpack before typescript is installed (#33251)
This PR wraps one of the exports of `@nx/webpack` within a dynamic
function that ultimately requires `tsquery`. This causes an issue in
yarn v1 where `typescript` cannot be resolved thus causing an error when
`@nx/webpack` is imported.

The errors happens on every new workspace that starts from empty:

```
npx create-nx-workspace --preset=ts --pm=yarn
nx add @nx/web
nx g @nx/web:app apps/demo --bundler=webpack
```

Results in:

```

 NX   Cannot find module 'typescript'

Require stack:
- /private/var/folders/p4/6tvkdn_11xlc_2j999ybhbkr0000gn/T/tmp-59809-4kedkj5a1XsO/node_modules/@phenomnomnominal/tsquery/dist/src/ast.js
- /private/var/folders/p4/6tvkdn_11xlc_2j999ybhbkr0000gn/T/tmp-59809-4kedkj5a1XsO/node_modules/@phenomnomnominal/tsquery/dist/src/index.js
- /private/var/folders/p4/6tvkdn_11xlc_2j999ybhbkr0000gn/T/tmp-59809-4kedkj5a1XsO/node_modules/@nx/webpack/src/generators/convert-config-to-webpack-plugin/lib/extract-webpack-options.js
- /private/var/folders/p4/6tvkdn_11xlc_2j999ybhbkr0000gn/T/tmp-59809-4kedkj5a1XsO/node_modules/@nx/webpack/src/generators/convert-config-to-webpack-plugin/convert-config-to-webpack-plugin.js
- /private/var/folders/p4/6tvkdn_11xlc_2j999ybhbkr0000gn/T/tmp-59809-4kedkj5a1XsO/node_modules/@nx/webpack/index.js
- /private/tmp/web4/node_modules/@nx/devkit/src/utils/package-json.js
- /private/tmp/web4/node_modules/@nx/devkit/src/generators/to-js.js
- /private/tmp/web4/node_modules/@nx/devkit/public-api.js
- /private/tmp/web4/node_modules/@nx/devkit/index.js
- /private/tmp/web4/node_modules/@nx/web/src/generators/application/application.js
- /private/tmp/web4/node_modules/nx/src/config/schema-utils.js
- /private/tmp/web4/node_modules/nx/src/command-line/run/executor-utils.js
- /private/tmp/web4/node_modules/nx/src/project-graph/utils/project-configuration-utils.js
- /private/tmp/web4/node_modules/nx/src/utils/package-json.js
- /private/tmp/web4/node_modules/nx/bin/nx.js
Pass --verbose to see the stacktrace.

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

Note: Other generators like React/Vue are fine since they have
dependency on tsquery, which installs typescript.

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-10-27 12:31:56 -04:00
Craigory Coppola 98e510b47e fix(core): split lockfile cache and other performance improvements (#33256)
## Summary
This PR includes three performance and correctness improvements:

1. **Split lockfile cache into separate node and dependency caches** -
Previously, both createNodes and createDependencies would read/write the
entire cache. Now each manages its own cache independently:
   - `parsed-lock-file.nodes.json` for external nodes
   - `parsed-lock-file.dependencies.json` for dependencies

2. **Prevent duplicate plugin resolution calls with promise cache** -
Added a promise cache to prevent concurrent duplicate calls to
`retrieveProjectConfigurationsWithoutPluginInference` when multiple
plugins fail to resolve simultaneously

3. **Normalize targets in separate loop after validation** - Moved
target normalization out of the validation loop to ensure proper
sequencing

## Test plan
- [ ] Tests pass (currently failing in CI - needs investigation)
- [ ] Build succeeds
- [ ] Lint passes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-27 10:33:18 -04:00
Jack Hsu 514005a7c9 fix(core): prevent undefined importer crash in pnpm lockfile parsing (#33223)
When stringifying a pnpm v9 lockfile with workspace packages, Nx crashes
with: "Cannot destructure property 'specifiers' of 'projectSnapshot' as
it is undefined."

This occurs when:
- The lockfile has a root importer with `link:` references to workspace
packages
- But the lockfile is missing the workspace package importer entries
- The code tries to access `importers[importerPath]` which returns
undefined
- This undefined value gets added to the output lockfile
- During serialization, it crashes when trying to destructure undefined

Workspace packages with missing importers are now silently skipped
during lockfile serialization. This prevents the crash and allows Nx to
continue operating with out-of-sync lockfiles.

The fix adds a null check before adding workspace dependency importers
to the output lockfile.

Closes NXC-3244
2025-10-27 10:27:38 -04:00
Craigory Coppola a52e7b0f6e Reapply "fix(core): add option to use v8 for daemon message serialization (#33192)
This reverts commit 54db861b72.

## Current Behavior
Daemon messaging is all done over JSON messages

## Expected Behavior
Daemon messages use v8 serialization to avoid string length issues

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

Fixes #

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-27 10:11:54 -04:00
Sander Boelhouwers 3f7119a821 fix(core): add accept header to http remote cache get (#33093)
With the Accept header in place during the retrieval of cache, the
client always expects an octet-stream from the server.

<!-- 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
When the `Accept` header is missing, you might not get the correct data
depending on the underlying implementation of a self hosted cache
solution. We use AWS API Gateway which has a hard requirement for
`Accept` to determine how it should convert the data.


Fixes #33092
2025-10-26 20:52:04 -04:00
Juri a082693838 docs(misc): add webinar banner to astro docs 2025-10-25 19:06:57 +02:00
Caleb Ukle 630d227a5f docs(gradle): update gradle links and improve graph comps (#33255)
- **docs(gradle): make sure gradle refs point to /java/gradle now**
- **docs(gradle): add syntax highlighting for diff codeblock**
- **fix(nx-dev): improve graph loading behavior to prevent pop-in
flash**
2025-10-24 19:48:48 -04:00
Jack Hsu 66a437a42a docs(misc): add nx-cloud start-agent command to CLI reference (#33250)
This PR adds the `nx-cloud start-agent` command used for manual DTEs to
the reference page.

Also update table code elements such that they don't wrap.

<img width="872" height="584" alt="image"
src="https://github.com/user-attachments/assets/b73a038d-e0de-421a-b430-2d76c0ec4345"
/>


Closes DOC-273, DOC-310

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-24 16:08:49 -05:00
Philip Fulcher 7712d2a656 docs(nx-dev): update Nx 22 release article (#33245) 2025-10-24 13:35:31 -04:00
Louie Weng 215876c398 feat(gradle): add custom installation path to options (#33187)
<!-- 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 search for the gradle wrapper of a project by first looking at the
project root, then traversing upwards to the workspace root. If a
workspace has a separate gradle project defined that does not contain a
wrapper, then Nx will error.

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

Add a field to the gradle plugin that will allow users to specify a
custom gradle installation within their workspace. Nx will check for a
gradle wrapper that the specified location when executing gradle tasks.

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

Fixes NXC-3147
2025-10-24 17:14:33 +00:00
Craigory Coppola 7021056fae fix(core): ensure daemon writes project graph cache to disk consistently (#33217)
## Current Behavior

When the Nx daemon returns a cached project graph from memory (without
recomputing), it does not write the graph to disk. This creates a
cache/daemon mismatch scenario:

1. Daemon has valid project graph in memory
2. A non-daemon process (fallback when daemon fails) encounters errors
and writes cache to disk with those errors
3. Parent process gets clean graph from daemon
4. Forked executor processes read from disk cache which contains errors
5. The errors cause `readProjectGraphCache()` to return `null` (when no
`minimumComputedAt` is provided)
6. This triggers a misleading "No cached ProjectGraph is available"
error instead of surfacing the actual errors

This issue manifests intermittently in CI environments, especially when:
- Daemon connection timeouts occur
- Multiple concurrent processes are running (DTE scenarios)
- File system latency is high

## Expected Behavior

The daemon should always write its current project graph to disk
whenever it returns it, ensuring the disk cache stays synchronized with
the daemon's in-memory cache. This prevents stale or errored caches from
persisting when the daemon has a valid graph.

## Related Issue(s)

Fixes NXC-3030

## Implementation Details

Modified `getCachedSerializedProjectGraphPromise()` in
`packages/nx/src/daemon/server/project-graph-incremental-recomputation.ts`
to write the project graph cache to disk after retrieving the result,
even when reusing the in-memory cached graph.

The fix ensures that:
- Any errored cache written by a non-daemon process gets overwritten by
the daemon's valid graph
- Forked executor processes always read a consistent cache that matches
what the daemon served to the parent process
- Real errors are properly surfaced instead of being hidden by a generic
"no cache available" message

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-24 16:56:40 +00:00
Jack Hsu 442f745b23 fix(vite): nxViteTsPaths supports local path aliases (#33241)
<!-- 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
Local `tsconfig.app.json` is never picked up due to wrong resolved path.

## Expected Behavior
Local `tsconfig.app.json` is picked up and the path aliases are added to
Vite.

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

Fixes #33231
2025-10-24 12:53:57 -04:00
Benjamin Cabanes 7c978ed8c9 docs(nx-dev): sunset Explain with AI for Self-Healing CI (#33243)
Removed "Explain with AI" feature documentation and redirected all URLs
to Self-Healing CI. Added sunset notice to blog posts, updated
configuration files, and preserved historical content for reference.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-24 12:45:27 -04:00
Colum Ferry e57c8a71b2 fix(docker): handle dockerfile at project root tag (#33236)
## Current Behavior
When `Dockerfile` is at project root, we attempt to append `--tag .`
which is invalid for docker.

## Expected Behavior
Ensure that if `Dockerfile` is at project root, we use `workspaceRoot`
to determine the `--tag`.
Note, this tag is primarily used as a deterministic method for Nx to
find the correct docker image when calling `docker run` and `nx release`
2025-10-24 17:36:49 +01:00
Hugo Burton 4a4b780685 fix(core): stream without prefixes showing tui (#33194)
<!-- 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
When using `--output-style=stream-without-prefixes` nx incorrectly shows
the TUI instead of streaming

## Expected Behavior
When using `--output-style=stream-without-prefixes`, nx should stream
with no prefixes just like it does with `--output-style=stream`

## Related Issue(s)


Fixes #32535

Co-authored-by: Hugo Burton <hugo.burton@westpac.com.au>
2025-10-24 12:31:31 -04:00
Jason Jean 1cf2c6665f chore(core): improvements to native build and error handling (#33238)
## Current Behavior

`node_modules` are being copied during copy-local-native

## Expected Behavior

`node_modules` are not being copied during `copy-local-native`
2025-10-24 12:13:18 -04:00
Jason Jean 2f1712f894 chore(repo): update nx to 22.1.0-beta.0 (#33244)
Updating Nx from 22.0.0-rc.0 to 22.1.0-beta.0
2025-10-24 12:11:44 -04:00
Jason Jean 81fd8b4170 chore(maven): only run nx-maven-plugin:install for maven e2e tests (#33242)
## Current Behavior

Maven is installed as a global dependency for all e2e targets
(`e2e-local`, `e2e-ci--**/**`, and `e2e-macos-ci--**/*`), even when only
the Maven e2e tests need it.

## Expected Behavior

Maven should only be installed as a dependency for the Maven e2e tests
that actually use it, avoiding unnecessary installations for other e2e
test projects.

## Changes Made

- Removed `nx-maven-plugin:install` from the global e2e target defaults
in `nx.json`
- Added `nx-maven-plugin:install` as a specific dependency to the Maven
e2e project targets in `e2e/maven/project.json`

This optimization ensures Maven is only installed when needed, reducing
unnecessary build overhead for other e2e tests.
2025-10-24 11:39:20 -04:00
Colum Ferry 3047fbda9e fix(core): should find dockerfiles to suggest installing docker plugin (#33234)
## Current Behavior
`nx init` does not search for `Dockerfile` patterns to suggest adding
the `@nx/docker` plugin.

## Expected Behavior
`nx init` finds and suggests `@nx/docker` plugin

Fixes NXC-3319
2025-10-24 11:23:50 -04:00
Colum Ferry 09fb0b693a chore(repo): update codeowners for docker (#33240) 2025-10-24 15:45:13 +01:00
Leosvel Pérez Espinosa 6788fccbd6 fix(core): fix swapped arguments when resolving catalog references from the filesystem (#33237)
Fixes the order of the arguments in invocations to
`resolveCatalogReference` when resolving catalog references from the
filesystem (not using a `Tree`).
2025-10-24 13:52:58 +00:00
Leosvel Pérez Espinosa f1fe6c0e24 fix(misc): handle null exit codes from crashed child processes (#33163)
## Current Behavior

In some scenarios, when some processes terminate unexpectedly (e.g.
crashed due to OOM), the task runner will incorrectly determine their
exit code to be 0. This results in Nx storing the task results as a
success, which can cause cache hits with false positive successes.

## Expected Behavior

When processes terminate unexpectedly (e.g. crashed due to OOM), the
task runner should correctly determine their exit code from the signal,
and it should never be 0. The stored task result should not be marked as
successful.

## Related Issue(s)

Fixes #29204
2025-10-24 09:26:34 -04:00
Colum Ferry 54bd3c498f fix(docker): handle undefined options when creating graph (#33235)
## Current Behavior
When `@nx/docker` is registered via string only (`nxJson.plugins:
["@nx/docker"]`, project graph creation fails because we try to access
`options.buildTarget`.

## Expected Behavior
Handle undefined `options` gracefully, and still create the default
target.

## Related Issue(s)

Fixes NXC-3320
2025-10-24 09:13:08 -04:00
Craigory Coppola fa45d79e55 chore(repo): remove check commit (#33227)
check-commit is superceded by the pr title target
2025-10-23 22:51:23 +00:00
Jason Jean b1a33ee608 feat(core): update rust (#33220)
## Current Behavior
Dependencies are outdated and Rust tooling needs to be updated.

## Expected Behavior
Rust dependencies are updated to their latest compatible versions.

## Changes
- Updated Rust dependencies
- Rebased with latest `origin/master`
- Updated pnpm lock file

## Related Issue(s)
None
2025-10-23 18:45:00 -04:00
Craigory Coppola b9af6a74b8 docs(dotnet): add migration guide from @nx-dotnet/core (#33206)
## Current Behavior
No docs describing migration path

## Expected Behavior
Docs describing migration path

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

Fixes #

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Caleb Ukle <caleb@nrwl.io>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-23 18:20:14 -04:00
Craigory Coppola c4f1f53b70 chore(repo): mark dotnet e2e as parallel 1 (#33226)
## Current Behavior
.NET sometimes bails on a failed mutex in e2e

## Expected Behavior
it runs only 1 at a time

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

Fixes #
2025-10-23 17:27:22 -04:00
Craigory Coppola a4d9ad9c66 chore(gradle): format files (#33225) 2025-10-23 21:10:47 +00:00
Jack Hsu d3058a726f docs(core): update search filter on createnodes compat page (#33216)
This PR updates one filter from `Reference` to `References` to keep
consistency with our other pages.

Before (Both Reference and References show up):

<img width="137" height="206" alt="image"
src="https://github.com/user-attachments/assets/729379b6-0315-4b99-af90-fd96b3e96830"
/>


After (Just References, and every filter is plural):

<img width="736" height="535" alt="image"
src="https://github.com/user-attachments/assets/9c2ecbcd-67c4-4923-9d05-e2081b0e9dba"
/>

Closes DOC-309
2025-10-23 16:47:53 -04:00
Jack Hsu 97d38f75ee fix(nx-dev): add copy-docs back as a dep of serve (#33215)
It was removed when the scripts were cleaned up during next.js->astro
migration. Adding this back since blog posts need to be synced first
before serving.
2025-10-23 16:47:46 -04:00
Craigory Coppola d717414ec2 fix(core): prevent error message containing [object Object] for invalid {workspaceRoot} placement (#33203)
## Current Behavior

When project configuration errors occur due to invalid token usage
(e.g., `{workspaceRoot}` in the middle of a path), error messages don't
provide sufficient context about where the error occurred.

## Expected Behavior

Error messages should include:
- For project-level errors: the project and target context (e.g.,
"libs/my-app:build")
- For nx.json targetDefaults errors: the nx.json context (e.g.,
"nx.json[targetDefaults]:test")

This makes it much easier for users to locate and fix the configuration
issue.

## Changes

This PR adds comprehensive integration tests to verify the improved
error messaging:
- Test for project-level invalid token usage showing project:target
context
- Test for nx.json targetDefaults invalid token usage showing nx.json
context

Tests use mock plugins to simulate realistic scenarios where invalid
`{workspaceRoot}` token usage would occur, ensuring the error messages
contain the expected context information.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Jason Jean <jasonjean1993@gmail.com>
2025-10-23 20:41:38 +00:00
Chau Tran b59fb033b9 docs(nx-cloud): add SCIM section for SAML Okta (#33222)
- [x] add SCIM for SAML okta
- [x] break up SAML Auth into Azure SAML Auth and Okta SAML Auth

---
Azure SAML Auth and Okta SAML Auth as cards under Single Tenant
<img width="777" height="649" alt="image"
src="https://github.com/user-attachments/assets/3353e804-ea03-468b-82e5-acf28a76bddd"
/>

---
Azure SAML Auth and Okta SAML Auth on sidebar
<img width="242" height="286" alt="image"
src="https://github.com/user-attachments/assets/27365e7f-82ba-4335-9f8d-45b4d61aa3a4"
/>

---
Okta SCIM docs ToC
<img width="1023" height="872" alt="image"
src="https://github.com/user-attachments/assets/9221b31f-004b-4026-9430-9ed12fa7d0dc"
/>
2025-10-23 15:27:45 -05:00
Caleb Ukle 4073537270 fix(nx-dev): update docs code blocks usage (#32998)
by default code blocks will get text as the lang if not set or the lang
is not supported
but we should be so I don't have to look at the warnings in the terminal
output 😅
also remove the frame=none since the team preferred to have the terminal
frame

Example of invalid codeblock messages

![wm_2025-10-15T11-26-05@2x](https://github.com/user-attachments/assets/33161287-3fa3-4897-a5dd-0de3a47b37fe)

Also added conformance rule for validating image pages for public and
src/assets/ directory

examples of incorrect absolute path ref from "public" folder and
incorrect absolute path:


![wm_2025-10-15T10-23-41@2x](https://github.com/user-attachments/assets/354800a4-6628-4236-87d9-2590cb56fe54)



fixes DOC-242
fixes DOC-259
2025-10-23 16:22:20 -04:00
Philip Fulcher 59cf495fe1 docs(nx-dev): add nx 22 release article (#33219) 2025-10-23 19:09:10 +00:00
Colum Ferry 0a8272d7e7 feat(docker): support inferring additional args for targets with interpolation support (#32892)
## Current Behavior
Currently, when configuring the `@nx/docker` plugin, we only set the
target name and a basic command.
The intention was that targetDefaults might be able to be used to
configure additional args, but this falls short in some places.


## Expected Behavior
Allow setting additional args when configuring the `@nx/docker` plugin
that supports interpolated values, similar to `versionSchemes`.

This will allow additional flexibility when setting up the docker build
command such as:

```json
{
  "plugin": "@nx/docker",
  "options": {
     "buildTarget": {
       "name": "docker:build",
       "args": ["-t {projectName}"]
     }
  }
}
```

This means that we can use `nx run-many -t docker:build` and it will
successfully add the name of the projects into the tag.

This is one example, other examples include being able to set individual
Docker Layer Caching where each registry needs a unique name.
2025-10-23 14:48:47 -04:00
Jason Jean 500a4c92ee fix(maven): use File.isAbsolute for cross-platform path detection (#33195)
## Current Behavior

The Maven plugin currently checks if a path is absolute by using
`outputFile.startsWith("/")`. This only works on Unix-like systems and
fails on Windows where absolute paths start with a drive letter (e.g.,
`C:\`).

## Expected Behavior

The Maven plugin should correctly identify absolute paths on all
platforms (Windows, macOS, Linux) using the platform-agnostic
`File.isAbsolute()` method.

## Related Issue(s)

<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

N/A - This is a proactive bug fix for cross-platform compatibility.

---

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-23 14:04:48 -04:00
Emilio Heinzmann b2ba8c2770 feat(release): support {versionActionsVersion} in docker version scheme (#33178) 2025-10-23 21:00:47 +04:00
Colum Ferry 87c8d49b7e fix(core): continue execution when cloud client is unavailable (#33214)
## Current Behavior
When Nx Cloud is used, but the Nx Cloud client is unavailable, an error
is thrown and commands are not run.

## Expected Behavior
When Nx Cloud is used, but the client is unavailable, continue execution
without Nx Cloud.

## Related Issue(s)

Fixes NXC-3175
2025-10-23 17:48:47 +01:00
Rares Matei 516db5c43d chore(repo): fix task flakiness (#33109)
<!-- 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 -->

Tests either cause agents to run out of memory: 
<img width="956" height="358" alt="image"
src="https://github.com/user-attachments/assets/e55bae05-7757-46e7-88ed-158f72411195"
/>
<img width="1278" height="336" alt="image"
src="https://github.com/user-attachments/assets/40dc8dd6-4409-461e-b75a-5c1c36551da5"
/>

Or setup tasks fail due to network flakiness:
https://staging.nx.app/runs/J1qWVZA7K5



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

A fully affected, cache busted task graph should run without any
failures.

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

Fixes #
2025-10-23 12:32:07 -04:00
MaxKless 44187bde41 fix(misc): add explanatory footer to ai agents prompts (#33182) 2025-10-23 18:08:39 +02:00
Craigory Coppola a8d6b0ad65 docs(dotnet): improve dotnet docs around option types (#33210)
This pull request updates the documentation for configuring .NET target
types in the `nx.json` file to provide clearer instructions and
examples. The changes make it easier to understand how to customize
target names and configurations for the `@nx/dotnet` plugin.

Improvements to configuration documentation:

* Added a section describing how each target type can be configured,
including renaming targets, customizing options, disabling targets, and
specifying additional properties.
* Updated the example configuration to show how to rename targets (e.g.,
"build" to "compile"), add configurations (e.g., production
optimization), set dependencies between targets, and disable targets
(e.g., disabling "pack").
* Clarified that targets are created with the configuration specified in
the `nx.json` `plugins` array, rather than just with custom names.
2025-10-23 11:55:59 -04:00
Colum Ferry 1002ad5198 fix(node): migrate to koa 3.0.3 (#33208)
Update `koa` to `3.0.3`
2025-10-23 16:10:45 +01:00
Jack Hsu b3c3e40490 docs(misc): update nx release documentation for v22 changes (#33189)
Changes:
- Update all Nx Release guides to show the config for v22 and prior
verisons
- Update `nx.json` reference page to show `releaseTag` property and what
they are prior to v22
- Add example showing all releaseTag options in v22 and < v22 (pattern,
requireSemver, strictPreid, preferDockerVersion, checkAllBranchesWhen)
- Update asides to use "Nx 22 Changes" instead of "Breaking Changes"
(properties deprecated, not breaking until v23)
- Fix `version.generatorOptions.updateDependents` →
`version.updateDependents` reference

Closes DOC-261

<img width="781" height="513" alt="image"
src="https://github.com/user-attachments/assets/3b8a13c4-e863-40da-87cb-ae5a6264bb9e"
/>

<img width="866" height="626" alt="image"
src="https://github.com/user-attachments/assets/e02fd179-80d7-42ea-993c-5da0ed793eaa"
/>

<img width="796" height="408" alt="image"
src="https://github.com/user-attachments/assets/14bb5c54-089c-4ed3-8774-731cbdaa37a5"
/>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-23 10:30:29 -04:00
James Henry ab82c7b1be docs(nx-dev): add guides for Release Groups and Update Dependents (#33200)
<!-- 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 #

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-23 09:08:57 -04:00
James Henry 7c2f3511e2 docs(nx-dev): add dedicated guide for nx release programmatic API (#33198)
<!-- 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 first-class programmatic API of nx release is only documented within
the manage releases introduction and is incomplete (`ReleaseClient` is
not covered at all).

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

The programmatic API has its own in depth guide, which is then
cross-referenced from the manage releases guide. `ReleaseClient` is now
documented including its new Nx 22 features.

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

Fixes #
2025-10-23 08:47:17 -04:00
Colum Ferry 2402ecb576 docs(release): update docs to use correct releaseTag object notation (#33202)
Update docs to match new API

---------

Co-authored-by: James Henry <james@henry.sc>
2025-10-23 13:37:49 +01:00
James Henry 3847528d44 chore(repo): remove unused typedoc-theme (#33196)
Deletes the unused typedoc-theme project from the root of the workspace
2025-10-23 08:15:29 -04:00
James Henry b92df85b97 chore(repo): clean up images (#33197) 2025-10-23 15:55:12 +04:00
Craigory Coppola 083b97255a docs(dotnet): refresh docs after adding run / watch config (#33190)
## Current Behavior
`run`/`watch` are not mentioned in docs

## Expected Behavior
`run`/`watch` docs are accurate

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

Fixes #

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-10-22 18:29:37 -04:00
Jason Jean b9a0f36d5f fix(maven): add support for unbound goals in plugin targets (#33191)
## Current Behavior

Maven plugin targets are only created for goals explicitly bound to
executions in the POM. Goals defined in a plugin but not bound to any
execution are not available as Nx targets.

## Expected Behavior

All available Maven goals should be accessible as Nx targets, including:
- Goals bound to executions (existing behavior)
- Unbound goals defined in the plugin (new behavior)

## Changes Made

1. **Added unbound goal support**: The `NxTargetFactory` now creates
targets for goals defined in a plugin but not bound to any execution.
These targets are created with the format `goalPrefix:goalName` without
an execution ID.

2. **Added continuous build tracking**: 
- Added `continuous` property to `NxTarget` data class to track whether
a goal supports continuous builds
- Updated `MojoAnalyzer` to detect continuous goals from the cache
configuration
   - All targets now properly propagate continuous mode information

3. **Code improvements**:
   - Improved formatting and indentation for consistency
- Made `execution` parameter optional in `createSimpleGoalTarget` to
support both bound and unbound goals
   - Updated command generation to work with or without execution IDs

## Related Issue(s)

This change enables better Maven goal discovery and execution in Nx
monorepos.
2025-10-22 18:16:50 -04:00
Zachary DeRose 4fcd1d22b2 fix(core): adding output error reason (#33159)
<!-- 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 an invalid output exists we report:

```
 NX   The following outputs are invalid: 

 - foo.txt

Run `nx repair` to fix this.
```

Without specifying the reason, we tell to run `nx repair`.

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

More feedback provided to the user as to the error with their output:

```
 NX   The following outputs are invalid: 

 - foo.txt
   ** Reason: Outputs must start with either "{workspaceRoot}/" or "{projectRoot}/".

Run `nx repair` to fix this.
```

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

Fixes #
2025-10-22 16:04:37 -04:00
Jack Hsu 681825e6be docs(dotnet): add experimental warning for @nx/dotnet (#33188)
Closes DOC-308
2025-10-22 14:36:17 -04:00
Jack Hsu 1c3434fc32 docs(misc): update GitLab project ID location in integration guide (#33186)
This PR updates the GitLab integration guide to reflect where `Copy
Project ID` is in the updated GitLab UI.
<img width="758" height="572" alt="image"
src="https://github.com/user-attachments/assets/ea400064-f3d4-4cd8-b5ba-a6b0bc884e81"
/>

## Related Issue(s)
Closes DOC-269
2025-10-22 12:32:45 -04:00
Jack Hsu ce2586aed8 docs(misc): fix bad line higlighting in docs (#33185)
This PR fixes some pages that don't use the proper markdoc syntax for
line lighting in code blocks. The `{% meta %}` tag is needed and it is
missing in some places.

Closes DOC-2790
2025-10-22 12:32:37 -04:00
James Henry 420091d9df fix(release): breaking change contents extraction (#33184) 2025-10-22 15:11:45 +00:00
Jason Jean cddb2ef2d0 fix(core): store reason when marking daemon as disabled (#33172)
## Current Behavior

When the daemon is disabled due to an error, the reason isn't captured,
making it harder to debug why the daemon was disabled.

## Expected Behavior

The error message/reason is now stored when marking the daemon as
disabled, allowing better visibility into what caused the daemon to be
disabled.

## Related Issue(s)
2025-10-22 10:40:36 -04:00
Andrew Ovens 28e681b99c fix(js): ensure node execute completes before exit (#32629)
Node tool executions (non-watch) were exiting before completing. This
change ensures they complete before exit.

closes #32385

<!-- 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
Node tool executions are not completing since #32356 

## Expected Behavior
Node tool executions complete before exit

## Related Issue(s)
#32385 

Fixes #32385
2025-10-22 15:01:23 +01:00
Colum Ferry c9d20c78f1 chore(repo): update daily canary releases schedule to 1 hour earlier (#33181)
Update canary release schedule to 1 hour earlier
2025-10-22 09:22:49 -04:00
Colum Ferry da88c80a7f fix(angular-rspack): bubble errors correctly (#33183)
## Current Behavior
When errors happen in earlier stages of compilation process, such as
processing global styles, these errors are not printed and the rspack
build process hangs at the Sealing phase.

## Expected Behavior
Ensure that errors that have occurred that would cause the process to
hang are printed and process exits correctly.

Part of this happens because the usual printing of errors happens in the
`afterDone` hook, which is never reached when the above occurs.

## Related Issue(s)

Fixes NXC-3268
2025-10-22 13:14:43 +01:00
Philip Fulcher 585a8ef1a9 docs(nx-dev): fixes for blog and webinar banner (#33179)
- **docs(nx-dev): update copy on webinar banner**
- **fix(nx-dev): handle missing profile links for blog authors**
2025-10-22 07:42:57 -04:00
MaxKless 03cde99faa chore(repo): drop unused and outdated nx-mcp hard dependency in package.json (#33180) 2025-10-22 13:04:23 +02:00
James Henry 8819dccb94 fix(release)!: better respect version plan file contents for changelog entries (#33166)
BREAKING CHANGE: config.conventionalCommitsConfig for `DefaultChangelogRenderer` is no longer nullable.
2025-10-22 09:27:35 +00:00
Jason Jean bbfd0a3c12 chore(repo): prevent readme templates from being published (#33177)
## Current Behavior
Readme template files are being published to npm with inconsistent
naming conventions.

## Expected Behavior
Readme template files should be excluded from npm publication and
consistently named as `readme-template.md`.

## Changes
- Renamed all readme template files to `readme-template.md` across
angular-rspack-compiler, angular-rspack, dotnet, and maven packages
- Updated .npmignore files to exclude readme-template.md from npm
publication
- Updated package.json build commands to reference the new
readme-template.md paths
- Removed `!README.md__tpl__` exceptions from package.json files array
entries
2025-10-21 23:11:24 -04:00
Caleb Ukle 3d8658cbcd docs(devkit): document the createNodes compat for Nx versions (#33102)
add new page for the createNodes api compat
add callouts to extending project graph and tooling plugin page

fixes DOC-255

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-10-21 19:08:34 -05:00
Caleb Ukle 8dacb26ea1 docs(core): correctly parse alias args with single dash (#33176)
@alberturria fixed this issue for the old docs as we migrated to astro,
so applied their change to the astro part of the docs as well. Original
PR: https://github.com/nrwl/nx/pull/33085
made sure to co-author alberturria as well

Thanks! 

![wm_2025-10-21T16-07-56@2x](https://github.com/user-attachments/assets/8bfb8a8c-d8eb-4892-8642-06c3c882e958)

Fixes #32723

Co-authored-by: alberturria <albertoherreravargas@gmail.com>
2025-10-21 23:32:09 +00:00
Colum Ferry 042915418c chore(repo): remove unused @rspack/plugin-minify from root (#33161)
Remove unused @rspack/plugin-minify from root package.json
2025-10-21 18:06:26 -04:00
Leosvel Pérez Espinosa c4b063d403 chore(repo): fix the pnpm caching in the main-macos job (#33162)
Fixes the pnpm caching setup for the `main-macos` job. It can currently
fail when the pnpm cache directory doesn't exist. We need to handle the
pnpm cache conditionally and separately from the node setup.
2025-10-21 21:21:55 +00:00
Jason Jean 10c64c804d chore(repo): update nx to 22.0.0-rc.0 (#33165)
Updating Nx from 22.0.0-beta.8 to 22.0.0-rc.0
2025-10-21 16:43:46 -04:00
Craigory Coppola 6934445fd9 fix(dotnet): fixup various issues + missing functionality (#33132)
…as testing projects<!-- 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
- Microsoft.Testing.Platform projects are not detected as having a test
target
- `serve` does not have an equivalent

## Expected Behavior
- Test projects are properly detected
- `serve` has been split into 2 targets:
  -  `watch`
  - `run`
  
The split of `serve` mirrors the`dotnet` cli in the same way that we
mirrored `vite` when adding `preview` and `dev` targets when we moved
with project crystal. `watch` can be used for a variety of cases, but
provides hot reload + run a 'la `dev` / `serve`. `run` is more of a fire
and forget target that starts up the app. Both targets would only really
be used in local dev.

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

Fixes #
…as testing projects

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-21 16:31:55 -04:00
Jack Hsu 81da1e0ec4 docs(misc): add PNPM catalog support documentation (#33170)
<img width="784" height="196" alt="image"
src="https://github.com/user-attachments/assets/45702b02-a97f-4d75-a67b-76eacdfb56ff"
/>

## Current Behavior
The dependency management documentation does not mention PNPM catalogs
as an option for maintaining single version policy.

## Expected Behavior
Documentation includes information about PNPM catalogs, explaining how
they can be used to maintain a single version policy when using PNPM as
the package manager. This helps if user searches for PNPM catalogs.

## Related Issue(s)
Fixes DOC-302

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-21 16:15:48 -04:00
Jack Hsu 5cf5186ec9 docs(nx-dev): update Java introduction page structure (#33171)
This PR adds a bit more content to the Java intro page so users can see
how to install Nx, add the plugins, etc. Links to the Gradle and Maven
intro pages, and also the Gradle tutorial.

Fixes DOC-301

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-21 16:15:31 -04:00
James Henry 9eace13cee feat(release): allow conventional commit style aliases in version plan release types (#33167) 2025-10-21 20:14:36 +00:00
Caleb Ukle 8b88f61df6 fix(nx-dev): add docker to build-tools tech section (#33164)
- add docker to sidebar
- sidebar only shows when there are non-hidden
executor/generator/migration impls to prevent linking to 404 pages

fixes DOC-299

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-21 15:08:18 -05:00
Jack Hsu 86d1b39ba4 docs(nx-dev): fix redirect for gradle and java overview/intro pages (#33168)
This PR fixes a bad redirect where Java intro page went to Angular
Rspack. Also update original Gradle API redirect to go to the Gradle
page rather than the generic Java one.

Closes DOC-298

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-21 15:40:42 -04:00
Mike Cebrian 4b4ad66a01 fix(vite): add logic to prevent overwriting generated package.json (#30705)
The nxViteTsPaths plugin currently always copys the package.json file at
the end of the build and does not check if the file was generated from
the build process. This adds logic to check if the package.json file
already exists in the dist path before copying to prevent overwriting
generated files.

Closes #30312

<!-- 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
nxViteTsPaths always copies package.json at end of build.

## Expected Behavior
nxViteTsPaths only copies package.json at end of build if package.json
not generated during build.

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

Fixes #30312
2025-10-21 19:34:43 +01:00
Rares Matei 390343c16b chore(repo): revert nx back to staging (#33062)
This reverts commit d37d8252e4.

<!-- 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 #
2025-10-21 13:53:07 -04:00
Leosvel Pérez Espinosa 893ac599d2 fix(core): revert changes to the db connection initialization (#33156)
Revert changes to the DB connection initialization that don't consider
multiple processes holding a connection and, therefore, are not safe.
2025-10-21 17:28:56 +02:00
Jason Jean eaec2aaa2a docs(nx-dev): update Java landing page to include Maven support (#33157)
## Current Behavior

The Java landing page at nx.dev/java only mentions Gradle support and
indicates that Maven support is coming soon.

## Expected Behavior

The Java landing page should reflect that Maven is now available
alongside Gradle.

https://nx-dev-git-mvn-follow-nrwl.vercel.app/java

## Related Issue(s)

Updates the documentation to reflect the Maven plugin introduced in
#32947

---

**Changes:**
- Updated hero section to state "Nx supports both Gradle and Maven"
- Modified getting started instructions to mention both `@nx/gradle` and
`@nx/maven`
- Updated features description to include Maven builds
- Combined Gradle and Maven documentation links into a single "Learn
More" section with buttons for both
- Updated call-to-action links to point to
`/docs/technologies/java/{gradle,maven}/introduction`
2025-10-21 11:23:58 -04:00
Jason Jean 7c87157340 chore(maven): bump version to 0.0.6 (#33160)
## Summary

Update Maven plugin version from 0.0.6-SNAPSHOT to 0.0.6 for release.

## Changes

- Root pom.xml (nx-parent)
- packages/maven/maven-plugin/pom.xml
- packages/maven/src/utils/versions.ts

## Test plan

- Maven plugin builds correctly with the new version
- No breaking changes to Maven integration
2025-10-21 11:23:38 -04:00
Miroslav Jonaš 3d7e59a072 fix(core): add wrappers for start and stop agent nx-cloud commands (#33140)
<!-- 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 #
2025-10-21 11:18:25 -04:00
Leosvel Pérez Espinosa 2f2bbb4cf6 chore(repo): reduce computation in the macos job when there are no e2e tests to run (#33139)
## Current Behavior

The `main-macos` in the CI verification workflow runs some setup only
needed by the e2e tests unconditionally. This means that even when the
tests are not run, up to ~9 minutes can be spent setting up things that
will not be used.

## Expected Behavior

The `main-macos` in the CI verification workflow should only run the
minimal steps needed to verify whether the tests will be run. If the
tests are to be run, the job should proceed with the remaining required
setup steps; otherwise, it should skip them.

The job will now check whether tests will be run as early as possible
and gate the rest of the steps based on the result.

## Example similar runs

Before: 10m 48s
(https://github.com/nrwl/nx/actions/runs/18625394891/job/53102778452)
After: 1m 3s
(https://github.com/nrwl/nx/actions/runs/18654449747/job/53189013526)
2025-10-21 09:27:07 -04:00
Colum Ferry 6dd80b9578 fix(release): replace local dependency protocols of unchanged dependencies #30995 (#33151)
## Current Behavior
When independent versioning with conventional commits, and only one
project in a release group needs bumped, but it depends on another
project via local dependency protocols such as `file://` or `workspace:`
protocol, the local protocol dependency is not replaced.

## Expected Behavior
local protocol is replaced with the current version of the dependency.

## Related Issue(s)

Fixes #30995
2025-10-21 13:51:02 +01:00
Leosvel Pérez Espinosa 767aafa951 fix(core): do not print flaky tasks guidance when nx cloud is already enabled (#33149)
## Current Behavior

When there are flaky tasks in a local run for a workspace that has Nx
Cloud enabled, a help message is displayed, advising users to use Nx
Cloud and pointing them to documentation on how to do so. Given that the
workspace is already using Nx Cloud, the message is redundant.

## Expected Behavior

When there are flaky tasks in a local run for a workspace that has Nx
Cloud enabled, no help message should be shown advising users to use Nx
Cloud and pointing them to documentation on how to do so. If the
workspace doesn't have Nx Cloud set up, the message should still be
shown.
2025-10-21 11:34:06 +00:00
Colum Ferry 64fefe2d8f fix(angular): ensure ngpackagr tsconfig options set correctly based on version #33081 (#33150)
- **fix(angular): prevent outputting inline source maps when building an
Angular package**
- **fix(angular): set ng-packagr tsconfig options based on ng-packagr
version**

## Current Behavior
TsConfig options are being set based on older versions of ng-packagr.
These values changed in Angular 20.

## Expected Behavior
Ensure TsConfig options are set based on the version of `ng-packagr`
installed.

## Related Issue(s)

Fixes #33081


Kudos to @daiscog for the initial work on this 🚀

---------

Co-authored-by: David Scourfield <daiscog@users.noreply.github.com>
2025-10-21 10:56:12 +01:00
Leosvel Pérez Espinosa 84813dca53 fix(angular): improve message for unsupported typescript project references (#33148)
## Current Behavior

The `@nx/angular` plugin doesn't support generating any project or
artifact when the workspace is using TypeScript project references
because the Angular framework doesn't support it. The message logged to
the users is very generic and slightly misleading. It's not clear enough
and doesn't provide relevant information to allow users to understand
the exact limitation.

## Expected Behavior

The generators from the `@nx/angular` plugin should log a clear error
message with information pointing to the specific issue in the Angular
framework preventing the setup from working for Angular projects.
2025-10-21 11:10:33 +02:00
Leosvel Pérez Espinosa 6c03f624ff fix(core): do not remove wal files manually for existing databases (#33143)
- Remove problematic manual deletion of WAL files for existing
compatible database
- Simplified some code:
  - Reuse `set_busy_handler` and replace remaining duplicated logic
  - Inlined single-use helper functions
2025-10-21 07:56:20 +00:00
Jason Jean 823758f22e chore(repo): fix ai config (#33115)
<!-- 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 AI config is out of date.

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

The AI config is up to date

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

Fixes #
2025-10-20 21:38:08 -04:00
Jason Jean 135019b443 feat(maven): introduce maven plugin (#32947)
<!-- 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 -->

There is no first-party Maven support for Nx

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

Maven Support is ready for usage.

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

Fixes #

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Caleb Ukle <caleb@nrwl.io>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-20 18:52:31 -04:00
Colum Ferry 998fb98da8 fix(angular-rspack): ensure root node_modules included when resolving packages (#33144)
## Current Behavior
When configuring `resolve` config for the `rspack` config with Angular
Rspack, we only consider `node_modules` local to the application.

## Expected Behavior
Ensure workspace root node_modules are also considered and added to the
`resolve` config.

## Related Issue(s)

Closes NXC-3267
Fixes #33026
2025-10-20 17:14:39 +01:00
Miroslav Jonaš 16c4b2bd8c feat(core): enhance spinner handling and add spinner to inferred conversion (#33031)
This PR creates a global spinner handler and adds the runtime
information to the `convert-to-inferred` migration process.

The global spinner ensures a single instance of the `ora` spinner. The
ora cannot run several instances in parallel, so running multiple
instances causes flickering due to message deletion.

The `covert-to-inferred` plugin migration will now show the loading
spinner and progress indicator specifying how many projects have been
converted.

Additional changes:
- DelayedSpinner will not show if there is another (parent) spinner
already running.

## 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 #

---------

Co-authored-by: Craigory Coppola <craigorycoppola@gmail.com>
2025-10-20 17:35:49 +02:00
Jason Jean a61bef75bf chore(repo): update nx to 22.0.0-beta.8 (#33130)
Updating Nx from 22.0.0-beta.7 to 22.0.0-beta.8
2025-10-20 17:25:19 +02:00
Jason Jean ed1a03468b chore(repo): add mise config to simplify installing all the languages (#33129)
<!-- 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 -->

Developers may have to install several languages manually to work in the
Nx repo.

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

Developers can use https://mise.jdx.dev/ to automatically install the
versions of languages necessary to work in the nx repo

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

Fixes #
2025-10-20 10:37:47 -04:00
Leosvel Pérez Espinosa d17b7d1aab cleanup(misc): fix nightly e2e test failures due to npm peer deps conflicts (#33112)
Fix a few failing e2e nightly tests due to npm peer dep conflicts.

Reduced nightly run with the fixed test suites:
https://github.com/nrwl/nx/actions/runs/18651446735. Most of them still
fail, but with existing failures unrelated to npm peer deps issues.
These are not part of the Golden nightly tests yet.
2025-10-20 10:15:22 -04:00
Colum Ferry 23aabf78b4 fix(module-federation): ensure angular rspack module federation supports live reload (#33137)
## Current Behavior
Angular Rspack outputs to CJS for Module Federation. It also has
potential issues to cause infinite live reload loops.

## Expected Behavior
Angular Rspack with Module Federation should work as expected

This PR also adds:
- example of Module Federation with Angular Rspack in
`examples/angular-rspack/module-federation`
2025-10-20 09:14:55 -04:00
Leosvel Pérez Espinosa d01bcb4dd0 chore(repo): fix quotes in e2e matrix workflow (#33138)
Fixes wrong single quotes in the E2E matrix workflow file that were
preventing variable expansion in bash.
2025-10-20 08:46:08 -04:00
Craigory Coppola 3f7e152685 feat(dotnet): add initial draft of .NET plugin (#32869)
## Current Behavior
@nx-dotnet/core is recommended plugin for .NET

## Expected Behavior
@nx/dotnet is new .NET plugin

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

Fixes #

---------

Co-authored-by: Vijay Ramakrishnan <vramak@microsoft.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-18 01:46:46 -04:00
Craigory Coppola 6549d2a2d8 fix(core): avoid changing existing project name if a project.json file is added to a project (#33114)
## Current Behavior
When adding a `project.json` file to configure certain aspects of an
existing Nx project, that project's name will be changed. We had to fix
this for package-json based projects a while back, and as we expand
polyglot its coming up again.

## Expected Behavior
The "default name" behavior stamped into the project.json plugin doesn't
trample existing names. To do this, it had to be moved out of the
project.json plugin and into the validate + normalize flow

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

Fixes #
2025-10-17 23:21:48 +00:00
Craigory Coppola 678619f4a8 fix(core): restore migrations used by nx repair (#33124)
## Current Behavior
Some migrations used by `nx repair` are missing

## Expected Behavior
Migrations used by `nx repair` are only removed when deemed applicable.

This reverts a portion of commit
a637f9eef9.

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

Fixes #
2025-10-17 15:34:36 -04:00
Jason Jean 6d8694560d chore(repo): update nx to 22.0.0-beta.7 (#33118)
Updating Nx from 22.0.0-beta.6 to 22.0.0-beta.7
2025-10-17 15:19:40 -04:00
Jack Hsu d8e2a6b8f0 docs(misc): fix an issue where devkit types are not pointed to the latest d.ts files but what's installed in root node_modules (#33125)
Use tsconfig path aliases to point devkit to the `dist/packages/nx`
folder rather than `node_modules/nx` (which is installed from NPM).

Closes DOC-188
2025-10-17 15:19:18 -04:00
Jack Hsu 2e4d5d3167 fix(core): allow prerelease versions of nx to be used with devkit (#33123)
This PR fixes an issue where due to the removal or `--legacy-peer-deps`
for NPM, you can no longer install prerelease versions of Nx. This also
means `npx create-nx-workspace@next` cannot be used with NPM.

For example, if you have this `package.json`:

```json
{
  "dependencies": {
    "nx": "22.0.0-beta.4",
    "@nx/devkit": "22.0.0-beta.4"
  },
  "license": "MIT"
}
```

And tried `npm install`, it will error out with:

```
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: undefined@undefined
npm error Found: nx@22.0.0-beta.1
npm error node_modules/nx
npm error   nx@"22.0.0-beta.1" from the root project
npm error
npm error Could not resolve dependency:
npm error peer nx@">= 21 <= 23" from @nx/devkit@22.0.0-beta.1
npm error node_modules/@nx/devkit
npm error   @nx/devkit@"22.0.0-beta.1" from the root project
```

By allowing prereleases via `^22.0.0-0` NPM can work again.

Note: pnpm and yarn are fine.
2025-10-17 14:51:20 -04:00
Juri deb10f2818 feat(storybook): add watch-deps and build-deps targets 2025-10-17 20:17:15 +02:00
Jack Hsu ace274d58b fix(graph): prevent content from overflowing in the PDV component (#33120)
This PR fixes and issue where content was overflowing in PDV when the
command is too long.

<img width="809" height="518" alt="image"
src="https://github.com/user-attachments/assets/113285fe-8d93-4ad2-bbac-b2992a065a4e"
/>


Fixes DOC-243
2025-10-17 14:12:49 -04:00
Caleb Ukle 5f72bf3f36 docs(repo): update CONTRIBUTING.md w/ new docs info (#33121)
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Jack Hsu <jack.hsu@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-10-17 14:12:18 -04:00
Leosvel Pérez Espinosa c327a00b29 fix(core): format catalog definition files when appropriate in nx migrate (#33105)
Formats the `pnpm-workspace.yaml` when catalog definitions are updated
after running `nx migrate`. Like the rest of the Catalog feature, it's
agnostic to the package manager, allowing for an easier addition of
support for future package managers.
2025-10-17 12:17:27 -04:00
Jack Hsu 7d61470c15 docs(nx-dev): add package.json linking instructions to TypeScript tutorial (#33117)
The TypeScript packages tutorial shows how to import shared local
libraries but doesn't mention that users need to add dependencies to
package.json and run npm install.

This PR instructs users to link packages properly. Also fixes line
highlighting.

<img width="787" height="718" alt="image"
src="https://github.com/user-attachments/assets/03ec8cca-eab0-4514-8c07-c7d4d316a606"
/>
2025-10-17 11:23:47 -04:00
Leosvel Pérez Espinosa 3b69f0fccf fix(linter): install correct deps in eslint convert to flat config generator (#33078)
Installs the correct dependencies after converting to the ESLint Flat
configuration. This was highlighted after removing the npm
`--legacy-peer-deps` flag from default usage in Nx.

Additionally, it fixes nightly e2e failures:

- `e2e-esbuild`
- `e2e-eslint`
- `e2e-gradle`
- `e2e-js`
- `e2e-web`
- `e2e-webpack`

Nightly run where all pass:
https://github.com/nrwl/nx/actions/runs/18592750415
2025-10-17 10:16:59 -04:00
Juri c4a32560a0 docs(nx-cloud): update self-healing CI config instructions 2025-10-17 16:10:27 +02:00
Jack Hsu dce77c164d feat(nx-dev): add v22 to version picker (#33110)
In preparation for v22, add the new version to the docs header.
2025-10-17 10:06:59 -04:00
Craigory Coppola ebc46e3a7b fix(core): enhance tui summary output to fix misc issues (#33057)
<!-- 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
Terminal output is all logged in one chunk, resulting in a somewhat
jarring experience for lots of output that can cause issues in the
extreme cases.

Task cache status is missing from the run-many outputs

Outputs are sometimes missing

## Expected Behavior
The above are fixed.

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

Fixes #
2025-10-17 09:44:27 -04:00
Colum Ferry 6bd1a1835f feat(vue): migrate @vitejs/plugin-vue to 6.0.1 (#33097)
## Current Behavior

- We currently install `@vitejs/plugin-vue` verion `^5` which only
supports `Vite 5 | 6`. This causes peerDep conflicts with `Vite 7`.
- Vue and Nuxt always install v7 version of TypeScript ESLint packages.
This causes peer dep conflicts when ESLint v9 is installed.

## Expected Behavior

- Migrate to `@vitejs/plugin-vue` version `^6` which supports `Vite 5 |
6 | 7`.
- Vue and Nuxt should install a version of the TypeScript ESLint
packages that works for the installed ESLint version.

Nightly run where the previously failing `e2e-vue` tests pass with these
changes:
https://github.com/nrwl/nx/actions/runs/18591984947/job/53009089023

---------

Co-authored-by: Leosvel Pérez Espinosa <leosvel.perez.espinosa@gmail.com>
2025-10-17 15:33:55 +02:00
Colum Ferry ea63c79b52 chore(node): use nestjs/swagger@11 in e2e (#33108)
Update e2e to use `@nestjs/swagger@^11`
2025-10-17 12:37:57 +01:00
Jack Hsu 8c52f626bc chore(nx-dev): remove unused docs pages and scripts (#33101)
This PR removes `nx documentation` and old docs pages from the next.js
app. This improves CI times since we no longer need to check `nx
documentation`, and the next.js app is faster to build.

## Changes
- `.github/workflows/ci.yml` no longer runs `nx documentation`
- Remove `documentation` target from root `project.json` and
corresponding scripts in `scripts/documentation/generators`
- Remove old docs pages from next.js app (e.g.
`nx-dev/nx-dev/pages/[...segments].tsx`)
- Remove manifest JSON files for old docs
- Remove old `og:image` generator for docs (blog, and other pages handle
it differently, this was just for old docs).
- Update bad links in `docs/blog` and `docs/changelog` since we no
longer match them to their manifest JSON files -- the redirects were
already working so just pointed to the new Astro URL

## Notes
- There were some missing dependencies like `ai` for `nx-dev/nx-dev`
that worked previously due to hoisting, but was failing build in this PR
I fixed those.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 21:12:59 -04:00
Jack Hsu 849f356e65 docs(nx-dev): fix java og image url (#33103)
When we renamed the file earlier we did not update this page.
2025-10-16 16:28:24 -04:00
Juri Strumpflohner a20bbd5533 docs(nx-dev): update more blogs list rendering (#33071)
- **docs(nx-dev): show all blogs in the list below highlighted**
- **docs(nx-dev): adjust ai label on blog posts**
- **docs(nx-dev): adjust how labels are rendered on blog list**
- **docs(nx-dev): swap podcasts tag to ai tag**

Preview:
https://nx-dev-git-nxdev-update-blog-list-page-nrwl.vercel.app/blog
2025-10-16 21:19:04 +02:00
Leosvel Pérez Espinosa 4f31a03c52 fix(core): prioritize in-progress tasks section visibility in tui (#33053)
## Current Behavior

When a task is selected and its outputs are displayed in the terminal
pane, the TUI always tracks a task by name regardless of its status.

## Expected Behavior

- When a task is selected, its outputs are displayed in the terminal
pane, and the terminal pane is focused, we track the selected task by
name.
- When a task is in progress, the TUI should track it by name while in
progress.
- When it finishes, it should switch to track another in-progress task
at the same index or in a close index if there is none in progress at
the same index.
  - If it's the last task that finished, keep tracking it by name.
- When a task is pending or finished:
- When it's selected and its outputs are displayed in the terminal pane,
the TUI should track it by name.
- When it's selected and its outputs are not displayed in the terminal
pane, the TUI should track the index.

This allows the relevant in-progress section to be visible in more
scenarios than before. The TUI wouldn't blindly follow all tasks by
name.

Additionally, this PR updates the sorting of in-progress tasks to
prioritize start time first, followed by alphabetical order. This
stabilizes the section more (reduces extra movement due to alphabetical
sorting) and aligns with a similar sorting done for finished tasks
(based on the end time).
2025-10-16 15:12:40 -04:00
James Henry 449e396962 feat(release): allow ignoring nx.json release config with ReleaseClient (#33099) 2025-10-16 23:05:38 +04:00
James Henry c031db1721 feat(release): new replaceExistingContents CLI and API option for changelog (#33096) 2025-10-16 23:04:55 +04:00
Benjamin Cabanes 8aa2874452 docs(nx-dev): add what to expect video in contact sections (#33086)
Add new video explaining what to expect from Nx Enterprise, Nx Labs and
general Contact.
2025-10-16 12:52:15 -04:00
James Henry fd3c08724f feat(release): allow changelog.renderer to be set to an implementation directly (#33095) 2025-10-16 20:04:27 +04:00
Leosvel Pérez Espinosa 42b553cd2e fix(core): improve db connection initialization and error messages (#33054)
## Summary

Improved database initialization with better error handling, automatic
recovery from stale files, and cache preservation during error recovery.

## Changes Made

### 1. Iterative Retry Logic with Explicit State

Converted initialization from recursive calls to an iterative loop with
a state flag (`cleaned_up_stale_files`) that limits retries to 2
attempts. This makes retry conditions explicit and self-documenting
while preventing potential stack overflow.

### 2. Complete Auxiliary File Cleanup

Now removes all SQLite database files during cleanup (`.db`, `.db-wal`,
`.db-shm`) instead of just the main `.db` file. This prevents stale
Write-Ahead Logging auxiliary files from causing initialization failures
after version upgrades.

### 3. Smart Compatible Database Handling

Compatible databases (matching version) are now reconfigured based on
their current journal mode:

- **DELETE mode**: Attempts opportunistic upgrade to WAL for better
performance, cleans up any orphaned WAL files from previous runs
- **WAL mode**: Verifies WAL still works; if it fails, removes only
auxiliary files (preserving cache), retries, and falls back to DELETE
mode if still failing
- **Unknown/query failed**: Full reconfiguration with complete cleanup
on failure

This preserves cached build outputs when possible while recovering from
stale file issues automatically.

### 4. WSL1 Proactive Detection

Detects WSL1 environments by reading `/proc/version` and automatically
uses DELETE journal mode instead of attempting WAL (which WSL1 doesn't
support), preventing initialization failures.

### 5. Enhanced Error Messages

Replaced generic error messages with context-specific, platform-agnostic
guidance:

- Permission errors: Explains how to check file/directory permissions
and ownership without platform-specific commands
- Disk full: Suggests freeing space or moving workspace
- Missing directories: Explains unexpected condition with
troubleshooting steps
- All errors: Include debug instructions (`NX_NATIVE_LOGGING=trace`) and
reporting link

Error messages work consistently across Windows, macOS, and Linux
without suggesting commands that may not be available on the user's
platform.

### 6. Code Quality Improvements

Extracted helper functions to reduce duplication:

- `query_journal_mode()` - Query database's current journal mode
- `set_busy_handler()` - Configure connection-level busy handler
- `remove_wal_files()` - Remove only WAL auxiliary files
- `remove_all_database_files()` - Complete database cleanup
- `create_io_error()` / `create_db_error()` - Generate helpful error
messages

## Problems Solved

### Stale WAL Files After Version Upgrades

Leftover `.db-wal` and `.db-shm` files from previous versions no longer
cause initialization to fail. These files are now cleaned up
automatically during initialization.

### Cache Loss on Recoverable Errors

When WAL mode issues occur on otherwise healthy databases, only
auxiliary files are removed, preserving the main database and all cached
build outputs. Full wipes only happen for genuine corruption or version
mismatches.

### WSL1 Compatibility

WSL1 environments now work without initialization failures by
proactively detecting the environment and using DELETE mode instead of
attempting WAL.

### Performance Optimization

Databases in DELETE mode automatically attempt upgrading to WAL when the
environment supports it (e.g., after moving workspace from network drive
to local disk), providing better performance without manual
intervention.

### Poor Debugging Experience

Error messages now provide specific, actionable guidance based on the
error type, helping users resolve issues without needing to ask for
help.

## Impact

-  Users no longer need manual `nx reset` for stale file issues
-  Cache and build outputs preserved during error recovery
-  WSL1 works out of the box
-  Automatic performance improvements when environment changes
-  Better error messages reduce support burden

## Related Issue(s)

Fixes #28640 
Fixes #30856
Fixes #32894
2025-10-16 11:35:44 -04:00
Colum Ferry 45e420c55b fix(remix): ensure supported version of vite is used (#33089)
## Current Behavior
`@nx/remix` depends on `@nx/react` which depends on `@nx/vite`. 
`@nx/vite` has a `peerDependency` on `vite: 5 || 6 || 7`

This direct dependency chain causes an issue wherein vite 7 is installed
and causes a conflicting peer dependency between `@remix-run: 2`

## Expected Behavior
Remix should use `Vite 5 | 6`. Break the chain between `@nx/react` and
`@nx/vite` causing `Vite 7` to be installed.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-16 09:43:37 -04:00
Jason Jean 698e51b0d5 chore(repo): update nx to 22.0.0-beta.6 (#33087)
Updating Nx from 22.0.0-beta.4 to 22.0.0-beta.6
2025-10-16 09:32:36 -04:00
Leosvel Pérez Espinosa e8bd83e3e0 feat(core): add support for pnpm catalogs (#32978)
## Current Behavior

Pnpm Catalogs is not supported.

## Expected Behavior

Pnpm Catalogs should be supported.

## Related Issue(s)

Fixes #30035 
Fixes #29772
2025-10-15 18:54:16 -04:00
Benjamin Cabanes 3d1177fe06 docs(nx-dev): replace custom PlayButton with VideoPlayer integration (#33084)
Replaced legacy custom `PlayButton` with the `VideoPlayer` component for
a consistent video playback experience. Applied changes across multiple
components and integrations.
2025-10-15 17:06:40 -04:00
Jack Hsu f37c13b5a8 docs(nx-dev): add missing custom events back (#33082)
This PR adds 404 and header custom events back for docs. These were
previously in the Next.js docs pages, but were missing when we migrated
to Astro.

The `sendCustomEvent` and `sendPageEvent` functions did not account for
the way that Astro is configured via `window.__CONFIG` object, so this
PR fixes those too.

## Screenshots

I ran these in preview mode with the site built with
`COOKIEBOT_DISABlED=true`.

Custom page view on 404:

<img width="2672" height="1527" alt="Screenshot 2025-10-15 at 3 10
05 PM"
src="https://github.com/user-attachments/assets/5bbe30fc-56cb-4427-b138-56edcf3bbc71"
/>

Header docs CTA event:
<img width="2672" height="1527" alt="Screenshot 2025-10-15 at 3 13
02 PM"
src="https://github.com/user-attachments/assets/246cb99d-0a30-4d94-a4a3-8f8659062f23"
/>

Header `Try Cloud` CTA event:
<img width="2672" height="1527" alt="Screenshot 2025-10-15 at 3 10
10 PM"
src="https://github.com/user-attachments/assets/addd2645-cf3e-4c83-ae39-9f00a434a21d"
/>
2025-10-15 15:50:14 -04:00
Colum Ferry fde5908aa7 feat(module-federation): support TS Soln and Package Manager workspaces paradigms (#33056)
## Current Behavior
Using TS Soln Workspaces and/or Packaage Manager Workspaces, handling of
certain workflows and scenarios is not correct.

Detecting and Sharing Workspace Libraries relies entirely on TS Path
Aliases existing in the base TSConfig file.
All guidance also points towards adding Workspace Libraries as
dependencies or devDependencies within the consuming application's
package.json file.
This also does not allow correct configuration of sharing.

Meanwhile, TS Path Aliases are added for remote applications such that
TS can find them in consuming applications, while also being able to
provide Typing Support.
However, this has an increased build-time cost for TS compilation as it
will follow the path in source.

## Expected Behavior
Allow attaching Workspace Libraries as deps in the package.json of host
and remote applications.
Configure packages added in such a manner correctly for share scope in
Module Federation.

Attach Remote applications to Host applications via devDependencies in
package.json.
Configure the `exports` and `main, types` properties in the remote
application's package.json to point to the `src/remote-entry.ts` file
such that node resolution can correctly follow the paths.
Bundler will continue to strip this out of compilation and replace with
Module Federation Module Loading code.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-15 19:56:40 +01:00
Colum Ferry 762685ce88 fix(release): ensure multilines in breaking changes are rendered by changelog renderer (#33070)
## Current Behavior

When rendering changelogs for releases, breaking changes with multi-line
explanations
  are not formatted correctly:

1. Only the first line of a breaking change explanation is captured and
rendered
2. PR references (like `#33014`) are missing from breaking change
entries, making it
  difficult to trace back to the original PR
3. Multi-paragraph breaking changes lose their formatting and structure

  For example, a breaking change with this format:
  BREAKING CHANGE: The --legacy-peer-deps behavior is no longer forced.
  If you need it, configure your package manager to enforce it.

  Would only render the first line, and without the PR reference.

  ## Expected Behavior

  The changelog renderer should:

1. Capture and render all lines of a breaking change explanation, not
just the first
  line
  2. Include PR/commit references in the breaking change section (e.g.,
  `([#33014](url))`)
3. Properly indent multi-line and multi-paragraph breaking changes for
better
  readability
4. Maintain consistent formatting between the feature/fix entry and its
corresponding
  breaking change entry

  Example of correct output:
  ```markdown
  ### ⚠️  Breaking Changes

- **misc:** The `--legacy-peer-deps` behavior is no longer forced.
([#33014](url))

    If you need it, configure your package manager to enforce it.
```
2025-10-15 16:54:47 +01:00
Louie Weng ffe85e9a56 chore(gradle): add verbose logging flag specifically for gradle plguin (#33049)
<!-- 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_VERBOSE_LOGGING` turns on/off the debug logs for the gradle plugin

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

`NX_GRADLE_VERBOSE_LOGGING` turns on/off the debug logs for the gradle
plugin

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

Fixes #
2025-10-15 09:31:27 -04:00
Juri Strumpflohner 9cefa648f2 docs(nx-dev): restore GA event tracking (#33074)
<!-- 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 #

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-15 09:23:57 -04:00
Craigory Coppola 82acc84b3c fix(core): ensure --help works properly with infix notation (#32662)
## Current Behavior
Running `nx run nx:test --help` and `nx test nx --help` behave
differently

## Expected Behavior
They are equivalent

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

Fixes #
2025-10-14 17:17:50 -04:00
Craigory Coppola 60b353a54f fix(core): temporarily disable tui for run-one (#33048)
## Current Behavior
The tui is enabled even for a single task, and it currently doesn't
bring a lot of value for those single-task use cases

## Expected Behavior
The tui is disabled for single task runs.
2025-10-14 17:12:13 -04:00
Juri 807e2d2c24 docs(nx-dev): blog post about pr bottleneck problem 2025-10-14 18:46:43 +02:00
Leosvel Pérez Espinosa 8881e4233c fix(core): display bottom corner indicator of tui in progress section correctly (#32985)
## Current Behavior

The bottom corner indicator of the in-progress section in the TUI is not
displayed when there are more tasks in progress than the maximum
parallel capacity (this can occur when there are continuous tasks).

## Expected Behavior

The bottom corner indicator of the in-progress section in the TUI should
always be displayed at the end of the running tasks.
2025-10-14 11:45:20 -04:00
Leosvel Pérez Espinosa 6a104c520e fix(misc)!: don't set legacy-peer-deps by default (#33014)
## Current Behavior

The `--legacy-peer-deps` behavior is forced by Nx to try to account for
potential incompatible peer deps users might have.

## Expected Behavior

Nx shouldn't force the `--legacy-peer-deps` behavior. Users can easily
set this up by configuring the package manager they use.

## Related Issue(s)

Fixes #22066
Fixes #29537

BREAKING CHANGE: The `--legacy-peer-deps` behavior is no longer forced.
If you need it, configure your package manager to enforce it.
2025-10-14 11:42:57 -04:00
Caleb Ukle 61b2796257 fix(nx-dev): handle null github data (#33061)
technically the fix to plugin stats now showing up was expired GH token.
But refactored the plugin stats fetching to skip locally unless
NX_DOCS_PLUGIN_STATS env var is set to help speed up local serves/builds
since 99% of the time we're not concerned with the plugin-registry page.
along with trying to centralized the logic between 1st/3rd party plugins
since it was a little confusing from my initial impl.
2025-10-14 09:46:36 -05:00
Colum Ferry aac830971d fix(react): dynamic module federation should not initialize remoteUrlDefinitions to empty object (#33059)
## Current Behavior

The `remoteUrlDefinitions` variable in
`packages/react/mf/dynamic-federation.ts` is
  initialized as an empty object (`{}`), which causes:
1. The `resolveRemoteUrl` callback is never called because
`remoteUrlDefinitions` is
  always truthy
2. When `loadRemoteModule` is called before `setRemoteDefinitions`,
users get a cryptic
error "Cannot read properties of undefined (reading 'endsWith')" instead
of the
  helpful error message

  ## Expected Behavior

- `resolveRemoteUrl` should be called when provided and
`remoteUrlDefinitions` hasn't
  been set
- The helpful error message should be shown when `loadRemoteModule` is
called before
  setup

  ## Changes Made

Applied the same fix from PR #27927 (for Angular) to the React
implementation:
- Changed `remoteUrlDefinitions` initialization to be `undefined` by
default
- Added nullish coalescing operator (`??=`) in `setRemoteDefinition` to
initialize only
   when needed

  ## Related Issue(s)

  Fixes #33055

This follows the same pattern as PR #27927 which fixed #27793 and #27842
for Angular.
2025-10-14 15:04:16 +01:00
Juri a150d9fd4c docs(nx-dev): self-healing ci update blog post 2025-10-14 11:14:13 +02:00
Philip Fulcher c802c6f1e5 docs(nx-dev): fixes for recent posts (#33065)
- **docs(nx-dev): fix typo in webinar title**
- **docs(nx-dev): remove reference to right click context menu in
highlights article**
2025-10-13 17:11:00 -05:00
Philip Fulcher 14efeffb9d docs(nx-dev): add october 2025 webinar (#33064)
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-13 17:03:29 -04:00
Rares Matei ddccfaa549 docs(nx-cloud): update release notes (#33043)
<!-- 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 #

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-13 16:54:22 +00:00
Philip Fulcher af74f824ff docs(nx-dev): add 21.6 changelog and october highlights article (#33036) 2025-10-13 11:27:01 -04:00
Caleb Ukle f425526fd2 fix(nx-dev): respect NX_DEV_URL in sitemap checker (#33058)
Sitemap in CI can have different `NX_DEV_URL` values which can make the
link checker work locally but not in CI
2025-10-13 09:52:07 -05:00
Rares Matei d37d8252e4 chore(repo): temporarily point repo to snapshot (#33046)
<!-- 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 #
2025-10-13 13:03:55 +01:00
Rares Matei 31765c6995 docs(nx-cloud): remove note about saml license (#33034)
<!-- 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 #
2025-10-13 11:15:10 +01:00
Caleb Ukle bfaa91bbc3 fix(nx-dev): update nextjs internal-link-checker to include astro urls (#33045)
blog and marketing pages will still link to astro docs, so depend on the
astro sitemap to check all links available to be used.
NOTE: the specific header links (url fragments) are skipped for pages
that come from astro docs (prefixed with /docs) due to not having a
simple way to create these lists without parsing all the build html
files out and that's not the part we really care about

confirmed working https://github.com/nrwl/nx/pull/33042 and
https://github.com/nrwl/nx/pull/33036 which are blocked until this
change merges

Fixes DOC-264
2025-10-10 14:25:43 -04:00
Caleb Ukle f85fdff1a9 docs(angular): update ng tutorial to match nx cloud templates (#33027)
fixes DOC-233
2025-10-10 13:28:52 -04:00
James Henry f35cfc1c82 fix(release): skip filtered out groups when processing (#33044) 2025-10-10 20:41:08 +04:00
Colum Ferry 0ba5f2d9de feat(release)!: refactor releaseTag* properties to a releaseTag object (#33020)
## Current Behavior

The Nx release configuration currently uses 5 separate flat properties
for release tag
  configuration:
  - `releaseTagPattern`
  - `releaseTagPatternCheckAllBranchesWhen`
  - `releaseTagPatternRequireSemver`
  - `releaseTagPatternPreferDockerVersion`
  - `releaseTagPatternStrictPreid`

This flat structure makes the configuration verbose and harder to
organize, especially
  as more release tag options are added.

  Example of current configuration:
  ```json
  {
    "release": {
      "releaseTagPattern": "{projectName}@{version}",
      "releaseTagPatternRequireSemver": true,
      "releaseTagPatternStrictPreid": false
    }
  }
```

## Expected Behavior

  After this PR, all release tag-related configuration is consolidated into a single
  nested releaseTag object with the following structure:
  - releaseTag.pattern (was releaseTagPattern)
  - releaseTag.checkAllBranchesWhen (was releaseTagPatternCheckAllBranchesWhen)
  - releaseTag.requireSemver (was releaseTagPatternRequireSemver)
  - releaseTag.preferDockerVersion (was releaseTagPatternPreferDockerVersion)
  - releaseTag.strictPreid (was releaseTagPatternStrictPreid)

  Example of new configuration:
```
  {
    "release": {
      "releaseTag": {
        "pattern": "{projectName}@{version}",
        "requireSemver": true,
        "strictPreid": false
      }
    }
  }
```

  Migration & Backward Compatibility:
  - An automatic migration transforms old configurations to the new structure
  - Old flat properties are deprecated but still supported during the migration period
  - The deprecated properties will be removed in Nx 23
  - All internal code has been updated to use the new nested structure

BREAKING CHANGE: This is a breaking change in the preferred configuration structure. Existing configurations will continue to work through the migration period, but users should update to the new nested format.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-10 14:11:56 +01:00
Colum Ferry 6c024a2207 feat(release)!: set updateDependents to always by default (#33029)
## Current Behavior

When versioning independent projects in Nx release, the updateDependents
configuration
defaults to 'auto'. This means that dependents are updated (with a patch
version bump)
when a dependency is versioned, as long as a group or projects filter is
not applied
  that does not include them.

With 'auto', if you apply a filter that excludes dependents, they won't
be updated even
   though their dependencies have been versioned.

## Expected Behavior

The updateDependents configuration now defaults to 'always'. This means
that dependents
will always be updated (with a patch version bump) when a dependency is
versioned,
  even if they are not included in the group or projects filter.

This provides more predictable behavior and ensures that versioned
dependencies don't
cause version mismatches with their dependents, which could lead to
broken builds or
  runtime issues.

BREAKING CHANGE: Users who relied on the previous 'auto' behavior can
explicitly set `updateDependents: 'auto'` in their nx.json:
```json
  {
    "release": {
      "version": {
        "updateDependents": "auto"
      }
    }
  }
```
2025-10-10 14:11:35 +01:00
MaxKless 0050a811ab feat(core): expose registerProjectGraphRecomputationListener from daemon client (#33005) 2025-10-10 12:40:05 +02:00
Miroslav Jonaš a8c266f5b8 docs(nx-dev): improve stop-agents-on-failure info (#32969)
<!-- 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
The current `stop-agents-on-failure` description is confusing customers
as they are expecting agents to be shut down after the first failure

## Expected Behavior
The `stop-agents-on-failure` description clearly distincts between task
and command failure.

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

Fixes #

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-10 12:23:15 +02:00
Caleb Ukle 451572afd3 docs(nx-cloud): update docs for conformance v4 (#32988)
update docs to include information over conformance v4 including new
testing guide
fixes DOC-226
fixes DOC-182
2025-10-09 23:57:15 -05:00
Victor Savkin e2eb44ca40 chore(repo): auto apply more fixes (#33039)
<!-- 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 #
2025-10-09 21:36:37 -04:00
Jack Hsu d6a4caa9b5 docs(linter): show options for module boundary rule in flat config (#33038)
Show the same options for flat config as we do for legacy config.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-09 18:05:42 -04:00
Caleb Ukle 475e7277f6 docs(nx-dev): update merge-reports guide to account for stricter tsconfigs (#33037)
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-09 17:05:25 -05:00
Jack Hsu 4a62cbecd2 docs(misc): allow embeddings to generate from new docs (#33035)
This PR adds support for generating embeddings using docs in the
`astro-docs` folder. The embeddings are used for `docs_search` MCP tool,
and we currently do not populate new content into it.

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-10-09 17:51:18 -04:00
Jason Jean 3417e78460 chore(repo): update nx to 22.0.0-beta.4 (#33016)
Updating Nx from 22.0.0-beta.2 to 22.0.0-beta.4
2025-10-08 16:50:52 -04:00
Colum Ferry 05ab516eb7 chore(release): move workspace specific tests to own file (#33006)
Add additional e2e tests for Nx Release to ensure functionality with
both workspace-enabled repos and non-workspce enabled repos.
2025-10-08 17:56:44 +01:00
Jack Hsu 412a55d012 docs(nx-dev): skip check for NEXT_PUBLIC_ASTRO_URL during graph creation just in case (#33019)
This PR skips check for the required env var during graph creation.
Although it only happens when `NODE_ENV === 'production'` it is possible
that this is set as such, which would cause an error.
2025-10-08 12:49:46 -04:00
Jack Hsu ea1f1cb4d0 fix(testing): show warning instead of error when no blob outputs found during merge (#33022)
The blob outputs could be missing because CI or user ran `affected -t
e2e-ci` and the changeset did not affect e2e tests, thus no reports
generated. In this case, intead of erroring we should just log out a
warning so users know what happened.
<img width="1252" height="212" alt="image"
src="https://github.com/user-attachments/assets/a90f1f93-0d49-4976-8fa6-a40d2a46161a"
/>
2025-10-08 12:49:36 -04:00
Caleb Ukle c24a76bc3e docs(nx-cloud): fix invalid use of yaml anchors (#33017)
cannot use yaml anchors in merging arrays, only objects
init-steps is an array of steps therefore cannot use the `<<*` syntax

Fixes DOC-262
2025-10-08 10:23:18 -05:00
Jack Hsu 6cf618efaf docs(misc): update Tailwind CSS guides for React and Angular to not mention the generator (#33015)
The generator `setup-tailwind` is outdated and not necessary. You can
easily set up Tailwind yourself in 1 minute. Keep the pages around
because people do search for tailwind in our docs.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-08 11:12:49 -04:00
Craigory Coppola b7a291f8c1 chore(repo): add dotnet commit scope (#32975)
## Current Behavior
The PR to add the .NET plugin is failing because it uses the scope
`dotnet`, and that has to be present in master since the pr-title-checks
workflow validates against scopes in master.

## Expected Behavior
The scope is in master

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

Fixes #
2025-10-08 11:08:39 -04:00
Shai Reznik 82b26adb8a feat(vite): add buildable libs support for vitest (#32973)
<!-- 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
In the vite nxTsConfigPaths plugin, when using `buildLibsFromSource:
false`, it has no effect when running vitest.

This is an issue especially in large nx projects when running vitest
browser mode because it has a potential to load all the files from the
entire project using the vite dev server (if no modules mocking is being
used).

This increases the amount of time vitest runs substantially.

Plus, there is no way for vite plugin authors to reuse the same
generated tsconfig file (the one generated by nx that points to the
`dist/` folder path) and reuse this information to configure TypeScript
for example.

One example that comes to mind is analog's angular-vite-plugin, meaning
even if nx supported it, that plugin wouldn't be able to know where is
the generated tsconfig is.

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

I expect to be able to use `buildLibsFromSource: false` in my vitest
browser mode tests and reduce the amount of time it takes to run those
tests in large scale projects.

In one of my benchmarks I managed to reduce tests from over 1 minute to
9 seconds (!) with this option enabled.

In order to share the generated tsconfig path I've added another
environment variable called `process.env.NX_GENERATED_TSCONFIG_PATH`

Please let me know if this should be added to the documentation
somewhere and if so where, and I'll add it.

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->
2025-10-08 15:35:17 +01:00
James Henry 55c0ce2685 feat(release)!: release graph aware filtering, updateDependents can now be "always" (#32971)
When release groups changed to become more flexible and powerful, with
`updateDependents` tracing across any number of transitive release
groups, the logic for filtering (e.g. `--projects` and `--groups` on the
CLI) was never updated to reflect this new dynamism and complexity.

Now in this PR, release graph construction has been fully separated out
from the release-group-processor. It now lives in the new
`ReleaseGraph`. This is also now where filtering takes place so that the
filters can be fully graph aware.

There is additionally a new `always` option available for
`updateDependents` in addition to `auto` and `never` which are
unchanged. `always` means that a project's dependents will be updated
wherever they may live in the graph, regardless of whether or not they
were directly included within a project or graph filter. We feel that
this is what people want most of the time so this is also going to
become the default in a follow up breaking change PR. In order to be
easier to review, and to increase confidence in this refactor, this PR
does not yet make that change to leave as many tests as possible
untouched (other than utilities changing).

BREAKING CHANGE: The signature of `init()` on `VersionActions` has
changed, it no longer accepts a second argument. Validation of the
manifest files, if any, now takes place via a separate method
(`validate()`) call after construction of the new `ReleaseGraph`. For
the most part, users do not need custom `VersionActions` so only a small
percentage of consumers should be impacted.

Fixes https://github.com/nrwl/nx/issues/31273
2025-10-08 18:22:30 +04:00
Juri 897e2ea6f6 docs(nx-cloud): de-emphasize console because it is not a requirement 2025-10-08 14:09:48 +02:00
Colum Ferry fd0a1f65af fix(release): ensure schema for release.groups is correct (#33007)
## Current Behavior
Currently the `nx-schema.json` is enforcing a `groups: properites` type
when it should be `groups: Record<string, properties>`

## Expected Behavior
Update `nx-schema.json` to have `release.groups: Record<string,
propeties>`
2025-10-08 12:42:37 +01:00
Colum Ferry 58b666aa55 feat(release): add releaseTagPatternPreferDockerVersion to specify version to use for git tag #32900 (#32972) 2025-10-08 14:31:35 +04:00
Colum Ferry 90f908579e feat(nest): ensure dependencies are added to project's package.json #32548 (#32986)
## Current Behavior
NestJS dependencies are not added to the project's package.json leading
to issues when pruning lockfile for dockerfiles.

## Expected Behavior
Ensure NestJS dependencies are added to the project's package.json.

## Related Issue(s)

Fixes #32548
2025-10-08 10:30:36 +01:00
Nikola Kalinov 8f8f804823 fix(vite): enable build watch mode by default for preview (#31604) (#31623)
<!-- 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 preview <app>` does not enable watch mode on the build.
This used to be the case until (I think)
https://github.com/nrwl/nx/pull/20367

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
`nx preview <app>` should also enable watch mode and rebuild on files
change.

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

FYI: I also had to apply [this config
change](https://github.com/vitejs/vite/issues/19410#issuecomment-2655507784)
for Vite 6 to unstuck from "Rebuilding project...". Maybe it's just my
project, not sure but in any case those are 2 separate issues.

Fixes #31604
2025-10-08 09:32:22 +01:00
MaxKless 95fee9f718 feat(core): add --check=all flag to configure-ai-agents (#32968) 2025-10-08 09:17:24 +02:00
Jack Hsu 895d7da162 docs(nx-dev): remove NEXT_PUBLIC_ASTRO_URL environment variable checks (#32999)
The codebase contains conditional logic based on `NEXT_PUBLIC_ASTRO_URL`
environment variable to support both old Next.js docs and new Astro docs
paths.

Since the migration to Astro is complete, the checks aren't needed.

Also add support for different `NX_DEV_URL` avalues for the Astro docs
so canary docs don't point to prod website, for example. (`footer.tsx`
and `Header.astro`).

Note: The changes are largely just removing the var check. Some files of
interest are:
- astro-docs/src/components/layout/Header.astro
- nx-dev/ui-common/src/lib/footer.tsx
- nx-dev/nx-dev/next.config.js
- nx-dev/nx-dev/redirect-rules.js

Also note that plugin registry and doc viewer should no longer be used.
Once we don't need the Next.js app anymore, we can just delete the
project rather than removing it right now. For now, just set `noindex`.

Closes DOC-161, DOC-230

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-07 20:51:12 -04:00
Louie Weng 48f24566c2 feat(nx-cloud): update description on nx login and logout (#31344)
<!-- 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 -->

Fixed the description of the commands to not have raw markdown when
running `npx nx login help`. Also updated the description such that we
don't specifically mention `cloud.nx.app` as not all users will be using
this environment by default.

## 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 #
2025-10-07 22:02:42 +00:00
Leosvel Pérez Espinosa bcaeed7b3a fix(core): remove duplicated "Running" string from tui title (#32991)
## Current Behavior

The TUI title displays `Running Running ...` in its title.

## Expected Behavior

The TUI title should not display `Running` duplicated in its title.
2025-10-07 16:34:57 -04:00
Jason Jean 01d5f3fe42 fix(repo): fix pr releases to not depend on a broken range (#32993)
<!-- 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 -->

PR releases are being released with a range of `-1 - 1` which is
incorrect

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

PR releases have a peer dependency on just that PR release.

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

Fixes #
2025-10-07 19:25:25 +00:00
Craigory Coppola b96cfd325a feat(core)!: remove CreateNodes v1 types for Nx 22 (#32951)
Remove the old CreateNodes v1 signature and related types from the
public API.
This standardizes on CreateNodesV2 as the primary interface.

Related to Nx 22 createNodes v2 compatibility work.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com><!-- 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 #

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-07 15:22:47 -04:00
Juri 91f517e819 chore(repo): enable astro-docs validate-links to be autofixed 2025-10-07 21:19:29 +02:00
Jason Jean 756a538775 fix(core): remove requirement to be in a package manager workspace (#32992)
## Current Behavior
<!-- This is the behavior we have today -->

Workspaces that did not use package manager workspaces lost some
dependencies with the other fix.

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

Workspaces that do not use package manager workspaces will still get the
correct dependencies.

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

Fixes #
2025-10-07 15:14:27 -04:00
Colum Ferry ef563d80a6 fix(vite): ensure tsconfig file is resolved from workspaceRoot #31987 (#32990)
<!-- 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 resolving the tsconfig file, project root is always used,
regardless of cwd.
## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
Prepend workspaceRoot to force absolute path resolution 

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

Fixes #31987
2025-10-07 18:03:23 +01:00
Rares Matei 24a703e4b8 chore(repo): run hanging e2e tests serially (#32982)
- **chore(repo): split remaining long e2e tests (#32948)**
- **chore(repo): run hanging tests serially**
- **chore(repo): bust cache to test changes**

<!-- 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 #

https://linear.app/nxdev/issue/CLOUD-3753/hanging-tests

Fixes CLOUD-3753
2025-10-07 12:26:37 -04:00
Caleb Ukle 08b0dfd9c1 docs(testing): add generic guide over feature based testing (#32979)
- add feature based testing guide
- add option to show all nodes w/ affected styles
2025-10-07 11:35:49 -04:00
MaxKless 7ed71e58bc fix(core): repair repo root on setupAiAgents in nx init (#32984) 2025-10-07 14:39:09 +02:00
Colum Ferry ff4426205f feat(release)!: set preserveMatchingDependencyRanges to true by default (#32983) 2025-10-07 16:16:14 +04:00
Caleb Ukle 7d19ba7027 docs(nx-plugin): add callout for local plugin name (#32976)
Clarify which name should be used when calling a local plugin

Fixes DOC-232

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-06 15:29:29 -05:00
Jack Hsu 738b06b30a feat(bundling): add excludeFromExternal option to esbuild executor (#32980)
This PR adds an option to allow users to include certain third-party
deps in the bundle by specifying the `excludeFromExternal` option. There
is an existing `thirdParty: true` option that Nx Console uses to bundle
_all_ third-party deps in the bundle, but the new option is more
granular.

## Current Behavior
Nx automatically detects certain dependencies (like optional peer
dependencies) and marks them as external. Users have no way to override
this behavior when they want to bundle these packages instead.

## Expected Behavior
Users can specify an `excludeFromExternal` option to exclude specific
packages from the external list, allowing them to be bundled even if Nx
automatically detected them as external.

## Related Issue(s)
Closes #NXC-2532

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-06 20:12:48 +00:00
Rares Matei e642155ac5 chore(repo): split remaining long e2e tests (#32948)
e2e-react: 19m 44s → 11m 04s | -8m 40s (43.9% faster)
e2e-workspace-create: 9m 36s → 6m 27s | -3m 9s (32.8% faster)
e2e-esbuild: 7m 48s → 4m 34s | -3m 14s (41.5% faster)
2025-10-06 19:29:03 +01:00
Colum Ferry 8f2220036d fix(nextjs): update entrypoints for buildable library with vite to include server entry #31457 (#32977)
## Current Behavior
When creating a buildable library for Next w/ Vite, we do not configure
an additional entry point for server components.

## Expected Behavior
Ensure additional server entry point is configured.

## Related Issue(s)

Fixes #31457
2025-10-06 18:19:41 +01:00
Colum Ferry 975c4c387c feat(release)!: switch defaults for fixed release group tag pattern, preserve matching dependency ranges and strictPreid (#32878)
Behaviour changes introduced:
- `preserveMatchingDependencyRanges` set to `true` by default
- `releaseTagPatternStrictPreid` set to `true` by default
- `releaseTagPattern` for fixed release groups set to
`{releaseGroupName}-v{version}`

BREAKING CHANGE
2025-10-06 16:20:27 +01:00
nx-cloud[bot] 0149fac877 fix(nx-cloud): update broken documentation links to AI features 2025-10-06 16:37:15 +02:00
Juri 1e0bfc698e docs(nx-cloud): refactor nx-cloud ai concept page 2025-10-06 16:37:15 +02:00
Juri e77293876b docs(nx-cloud): update various AI docs pages 2025-10-06 16:37:15 +02:00
Juri 6e137262ea docs(core): update AI setup instructions 2025-10-06 16:37:15 +02:00
Colum Ferry 48e17bc53c fix(angular-rspack): do not parse json with babel #32690 (#32966)
## Current Behavior
JSON files are not being filtered from transform with the
JavascriptTransformer.

## Expected Behavior
Only handle JS/TS files with the JavascriptTransformer.

## Related Issue(s)

Fixes #32690
2025-10-06 13:02:40 +01:00
Colum Ferry a09bb0020e chore(release): cleanup leftovers after removing legacy versioning (#32964) 2025-10-06 14:45:06 +04:00
Terry Mun-Andersen 9ca711fb85 fix(core): upgrade axios to 1.12.0 to address CVE-2025-58754 (#32712)
<!-- 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 is currently using a vulnerable version of axios (<1.12.0) which has
a reported high-level vulnerability
[CVE-2025-58754](https://www.cve.org/CVERecord?id=CVE-2025-58754). This
is being flagged by GitHub Advanced Security on a Nx-powered monorepo:

<img width="1260" height="712" alt="Screenshot 2025-09-12 at 09 42 56"
src="https://github.com/user-attachments/assets/251b47c7-07d1-4c21-aafb-0811554d8861"
/>

## Expected Behavior
Nx should be using a patched version of axios (≥1.12.0) that addresses
said vulnerability.

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

Fixes #

---------

Co-authored-by: Colum Ferry <cferry09@gmail.com>
2025-10-06 11:20:34 +01:00
Mischa Fischer 8670f2df97 fix(remix): @nx/remix/package.json export typo fixed #32810 (#32940)
## Current Behavior
Error on install in node_modules folder.
[ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" main defined in
/Volumes/ssd/user/Dev/project/node_modules/@nx/remix/package.json
      at exportsNotFound (node:internal/modules/esm/resolve:313:10)

## Expected Behavior
Can install without error.

## Related Issue(s)
* [@nx/remix package.json is broken due to export
misspelling](https://github.com/nrwl/nx/issues/32810)

Fixes #32810
2025-10-06 10:32:17 +01:00
Jack Hsu 844bbb213d docs(linter): show flat config in docs (#32953)
We show legacy eslintrc format that's been deprecated and shouldn't be
used anymore. We still want to document the legacy format in case users
haven't switched yet.

---------

Co-authored-by: Caleb Ukle <caleb@nrwl.io>
2025-10-04 01:19:31 +00:00
Juri 1d687c4994 fix(nextjs): remove whitespace for newly generated server component 2025-10-03 19:25:39 +02:00
Colum Ferry 6f1086f1ec feat(release)!: remove deprecated legacy versioning (#32888)
Remove deprecated legacy versioning support

BREAKING CHANGE

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-03 12:01:01 -04:00
Jack Hsu 836034172c chore(repo): disable duplicated typecheck targets if the project already uses tsc to build (#32926)
This PR removes redundant `typecheck` targets from projects already
building with `tsc`.

- Add `addTypecheckTarget: false` to projects using `tsc` as
`build-base`.
- Exclude `e2e` and `nx-dev` projects from having `tsc` build inferred
but leave the `typecheck` target

Note: angular-rspack and angular-rspack-compiler has an issue where
`@nx/vite/plugin` is inferring the typecheck target. We may want to
check `addTypecheckTarget` for that plugin as well.

<!-- 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` -->
Closes NXC-3208
2025-10-03 11:38:05 -04:00
Colum Ferry a520306949 feat(release)!: match nx affected behavior to determine relevant conventional commits (#32915)
## Current Behavior
Nx Release currently only checks for commits with affected files changed
under the root of projects configured for release.
However, changes to other files may affect and invalidate these projects
also.

## Expected Behavior
Reuse Nx's affected logic to determine when commits contain changes that
affect the projects configured for release.

BREAKING CHANGE: More files are now being used to determine relevant
commits, meaning there is higher chance for projects to receive version
bumps

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-03 16:01:48 +01:00
Jack Hsu fcf01c9579 docs(core): align remote cache docs with implementation (#32945)
Fix docs so it aligns with remote cache implementation.
## 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 #32870
2025-10-03 10:28:49 -04:00
Jack Hsu edec724e5d docs(nx-dev): add missing redirect (#32941)
Add a redirect that we missed.

Closes #32532
2025-10-03 09:07:11 -04:00
Jason Jean c7e9941b4f chore(repo): fix task inputs for nx:build (#32939)
<!-- 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 inputs for nx:build did not have transitive true for it's node
inputs

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

The inputs for nx:build did not have transitive true for it's node
inputs

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

Fixes #
2025-10-03 08:13:21 -04:00
Jack Hsu 57d9ca98c7 chore(repo): prevent conflicts when more than one process runs npx playwright install (#32934)
The install command will fail on Linux machines due to `apt` command
only allowing one invocation at a time. This PR solves this by writing
lock and status files to coordinate between potentially many tests on
the same machine.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-02 21:13:55 -04:00
Jonathan Cammisuli c99ac81d39 chore(misc): do not ai fix "check-commit" tasks (#32925) 2025-10-02 17:45:39 -04:00
Jason Jean 2f55bcb70b chore(repo): update nx to 22.0.0-beta.2 (#32936)
Updating Nx from 22.0.0-beta.1 to 22.0.0-beta.2
2025-10-02 16:21:44 -04:00
Jack Hsu 3bac12451e docs(misc): add search tracking to replace Algolia analytics (#32937)
Set up search analytics for docs.
## 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. -->

Closes DOC-220

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-10-02 16:20:26 -04:00
Zoran Kokeza 07e3166ab6 fix(bundling): postcss-cli-resources should handle relative deploy url #32714 (#32762)
<!-- 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
Relative deploy URL is not being handled correctly in the
postcss-cli-resources Plugins for Webpack and Rspack after switching to
use WHATWG URL in favour of the url.resolve() method.

## Expected Behavior
Ensure the relative deploy URL is properly resolved when using relative
paths

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

Fixes #32714
2025-10-02 16:55:05 +01:00
Rares Matei 15e3ed53f5 chore(repo): split slow e2e tests (#32893)
<!-- 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 #
2025-10-02 09:17:09 -04:00
Leosvel Pérez Espinosa f198e9218a fix(core): ensure nx is published with the correct dependency version for the native packages (#32928)
## Current Behavior

The `nx` package is being published with the native package dependencies
using an invalid version range `"*"`.

## Expected Behavior

The `nx` package should be published with the native package
dependencies pointing to the same version as the `nx` package.

A recent change to `nx release` requires workspace packages to be
identified as such when deciding to replace the version.

## Related Issue(s)

Fixes #32898
2025-10-02 08:54:10 -04:00
MaxKless 359f08d6af fix(core): tweak configure-ai-agents prompt (#32914)
Co-authored-by: Juri <juri.strumpflohner@gmail.com>
2025-10-02 13:15:46 +02:00
Leosvel Pérez Espinosa f303577805 chore(repo): update binary versions in lockfile (#32927)
Update the outdated binary versions in the lockfile.
2025-10-02 09:03:03 +00:00
Jason Jean 385a62a918 chore(repo): update nx to 22.0.0-beta.0 (#32918)
Updating Nx from 21.6.1-rc.0 to 22.0.0-beta.0
2025-10-02 08:31:24 +02:00
Jason Jean e28a97aaeb cleanup(core): clean up file change type for affected (#32920)
<!-- 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 -->

These fields were not being used and it takes time to calculate.

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

The fields are removed.

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

Fixes #
2025-10-01 16:03:57 -04:00
Jack Hsu 58231a5a1a docs(misc): improve conformance documentation discoverability (#32922)
This PR updates our module boundary feature/rule pages such that:
- It is clear that the feature is for both JS/TS projects (ESLint) and
any language (conformance)
- Update links to the ESLint rule from feature page to the actual ESLint
rule page (since feature covers both ESLint and Conformance now)
- Add a "Why" section to the conformance overview page

The conformance page (`docs/enterprise/powerpack/conformance`) is meant
to be the main landing page that we send to users. Also updates the
Enterprise page so link to the overview page.

<img width="1024" height="459" alt="image"
src="https://github.com/user-attachments/assets/c24f110d-cc44-41c8-b448-56d4a246a7b6"
/>

## Updated Pages

- /docs/features/enforce-module-boundaries
- /docs/enterprise/powerpack/conformance
-
/docs/technologies/eslint/eslint-plugin/guides/enforce-module-boundaries
- /docs/reference/powerpack/conformance/overview
- /docs/enterprise/polygraph#conformance
- /enterprise

## Notes
The `/docs/enterprise/powerpack/conformance` and
`/docs/reference/powerpack/conformance/overview` have some overlaps,
where the latter documents all the API options. We should look at
cleaning both the conformance and owners reference pages such that they
are just API docs.

## Related Issue(s)
Closes DOC-206

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-01 15:50:30 -04:00
Jason Jean f04ac29215 cleanup(devkit): move the ignore object creation to nx (#32907)
<!-- 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 -->

Devkit creates the ignore object using the `ignore` package. Nx also
creates the ignore object.

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

Only `nx` creates the ignore object using the `ignore` package. Devkit
utilizes a util from nx.

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

Fixes #
2025-10-01 14:32:21 -04:00
Jason Jean e5ac4a8024 fix(core): optimize task hashing with BFS and performance logging (#32911)
## Summary

Optimizes `get_dep_output` by replacing recursive traversal with BFS +
parallel processing.

**Key optimization**: The old recursive implementation processed the
same task multiple times when it appeared in multiple dependency paths
(diamond dependencies). The new implementation:
- Uses BFS with a visited HashSet to process each task exactly once
- Collects all tasks first, then processes them in parallel with Rayon
- Returns task references directly, eliminating redundant HashMap
lookups

This deduplicates work and leverages parallelism, significantly
improving performance on large task graphs.

**Note**: Only processes regular dependencies, not
continuous_dependencies, since continuous tasks (like watch/serve) don't
produce outputs that need to be hashed.

The same test on my machine without these changes takes many minutes
before crashing my editor. Now it takes <3ms.

## Test plan

-  All Rust tests passing
-  Native module builds successfully  
-  Added 4 unit tests covering direct dependencies, transitive
dependencies, diamond deduplication, and task output filtering
-  Added performance test verifying large graphs (depth 30 = 90 tasks)
complete in <10ms
2025-10-01 13:27:28 -04:00
Jason Jean ac711feeaa chore(misc): remove committed tsbuildinfo files and add to gitignore (#32921)
## Current Behavior

TypeScript build info files (*.tsbuildinfo) are currently committed to
git in several e2e test directories:
- e2e/release/tsconfig.tsbuildinfo
- e2e/remix/tsconfig.tsbuildinfo
- e2e/rollup/tsconfig.tsbuildinfo
- e2e/storybook/tsconfig.tsbuildinfo

These are generated build artifacts that should not be tracked in
version control.

## Expected Behavior

Build info files should be ignored by git and not committed to the
repository.

## Related Issue(s)

N/A - General housekeeping to clean up committed build artifacts
2025-10-01 13:06:51 -04:00
MaxKless b863bc1686 fix(core): improve provenance error with custom registry information (#32903)
<!-- 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
The provenance error pops up frequently for custom registries and it can
be confusing.

## Expected Behavior
With an updated error message, it's clearer what's going on and how to
fix it. This is what it looks like for a custom registry:
``` 
NX   The migrate command failed.


NX   An error occurred while checking the provenance of nx@21.10.5-provenance.
This might be due to a custom registry configuration (http://localhost:4874/). Please check whether provenance is correctly configured for your registry. 
To disable this check at your own risk, you can set the NX_SKIP_PROVENANCE_CHECK environment variable to true.
 ```
2025-10-01 12:23:53 -04:00
Leosvel Pérez Espinosa c7400eb08c fix(js): temporarily hash all external dependencies for tasks inferred by the @nx/js/typescript plugin (#32912)
## Current Behavior

Tasks inferred by the `@nx/js/typescript` plugin can result in a cache
hit when the public API (`.d.ts` files) of external deps changes. This
is incorrect.

Those tasks correctly have an input `dependentTasksOutputFiles:
'**/*.d.ts'`, but that only covers local workspace dependencies, not
external dependencies.

## Expected Behavior

Tasks inferred by the `@nx/js/typescript` plugin should result in a
cache miss when the public API (`.d.ts` files) of external deps changes.
The `tsc -b` command would invalidate its own cache when any dependency
(local or external) `.d.ts` files change, and the Nx cache should do the
same.

This is a temporary workaround that will more aggressively invalidate
the cache, but it's safer than having false positives. We'll work on a
proper solution that will only hash `.d.ts` files from external
dependencies. Once we have it, we'll revert this change so that the
inputs are as surgical as possible while still being safe.
2025-10-01 16:22:43 +00:00
Caleb Ukle ecfc503532 fix(nx-dev): update credit pricing link to new docs page (#32899)
fix bad link to the credit pricing page from next site -> astro docs

Fixes DOC-245
2025-10-01 12:19:33 -04:00
Caleb Ukle 443b714095 fix(nx-dev): watch for theme changes for project/task graph components (#32885)
markdoc graph components were not updating the theme if the user changed
their theme preference causing contrast issues with graph content.
now the graph components will update the selected them when the system
theme or pages theme changes

also do not render title bar if no title is provided

fixes: DOC-237
2025-10-01 12:19:20 -04:00
Caleb Ukle a9b7ea5cd5 fix(nx-dev): provide message to check previous docs w/ empty migrations (#32919)
Since Nx only keeps the last 2 majors listed in a plugins
migration.json, it's possible migrations can be defined and a valid
link, but a new nx version will removed those migrations now causing the
page to 404 a link that previously worked.

instead of 404-ing when plugin migrations delete old versions of
migrations we provide a message stating that there are no migrations,
but you can check the previous versions of the docs to check if the
migration you need is listed here.

We still will not include the migrations link in the sidebar when the
migration.json does not contain any migrations.

Example:
<img width="780" height="425" alt="image"
src="https://github.com/user-attachments/assets/de27c4f7-1442-44e6-9005-970450cabe1e"
/>


Fixes DOC-251

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-10-01 14:34:26 +00:00
Colum Ferry 783380c801 chore(release): cleanup parseGitCommit to separate version plan commit into parseVersionPlanCommit (#32902)
Split `parseGitCommit` version plan functionality into
`parseVersionPlanCommit`
2025-10-01 15:18:13 +01:00
Caleb Ukle ae37f0bc39 fix(nx-dev): improve default zoom level of graph nodes in docs (#32910)
- remove side_by_side and the usage of cards grid for graph views
- re-center project/task graphs on render to better fit into view
- also updating the height of a few usages of the graph for when there
was a tall stack of nodes to better fit
- NOTE: we can still apply custom node styles if we want, but since the
complaint was just the default render size bc zoom level, I decided to
just resize the view for the elements.

before: 

![wm_2025-09-30T16-49-08@2x](https://github.com/user-attachments/assets/fb740063-6cff-4892-b164-e0a5cc168a8a)


after: 

![wm_2025-09-30T16-48-41@2x](https://github.com/user-attachments/assets/c2d54dd2-13bf-45bb-b8c0-153fb277526a)


fixes: DOC-248
2025-10-01 09:01:47 -05:00
Jack Hsu 0ef9be8295 feat(webpack)!: remove SVGR option and provide withSvgr composable function (#32917)
This reverts commit 5f4a0fe852.

The previous PR was erroneously merged into `master` for 21.6.x, so we
had to revert it. This PR brings it back for 22.
2025-10-01 09:54:56 -04:00
Jason Jean 54dc25978d feat(misc): remove migrations prior to v20 (#32904)
<!-- 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 -->

There are migrations for v19.

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

Migrations prior to v20 (v19 and below) are cleaned up. Users migrating
from Nx 19 will have to do it piece meal by going to Nx 20 first, then
they will be able to go straight to Nx 22.

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

Fixes #
2025-10-01 09:45:21 -04:00
Leosvel Pérez Espinosa 22c57e465c feat(misc)!: remove deprecated decorate-cli script and stop sorting tsconfig paths by default (#32781)
- Remove the deprecated `decorate-cli` script.
- Stop sorting TypeScript path mappings by default in `nx format` and
generators.

BREAKING CHANGE: The long-deprecated `decorate-cli` script has been
removed.
BREAKING CHANGE: The `nx format` command and generators no longer
default to sorting TypeScript path mappings. To keep the previous
behavior, pass the `--sort-root-tsconfig-paths` flag to the command or
set `NX_FORMAT_SORT_TSCONFIG_PATHS=true`.
2025-10-01 06:40:58 +00:00
Caleb Ukle 1bea9138b7 docs(nx-dev): require description for doc pages (#32908)
add description to all docs and make required to make index views not
render differently

<img width="804" height="669" alt="image"
src="https://github.com/user-attachments/assets/4ecf6a24-13b7-4223-bcd3-c3db50007740"
/>


closes: DOC-246
2025-09-30 16:48:13 -05:00
Leosvel Pérez Espinosa e14440857a feat(core)!: remove NX_DISABLE_DB environment variable (#32887) 2025-09-30 15:53:43 -04:00
Benjamin Cabanes 726594c286 docs(nx-dev): integrate Calendly forms with Hubspot forms (#32906)
Added support for Calendly form integration within Hubspot forms across
multiple components.
2025-09-30 19:43:03 +00:00
FrozenPandaz 6b86c33c30 feat(devkit): bump compatibility to Nx 21 - 23 2025-09-30 13:50:10 -04:00
MaxKless d651d17a06 feat(core): prompt for ai agent files on nx init (#32889) 2025-09-30 17:46:47 +00:00
Benjamin Cabanes 9a038e9b8e chore(nx-dev): update team (#32896)
Update the team.
2025-09-30 10:30:38 -04:00
Jack Hsu 9660df4352 docs(testing): update task splitting docs to be more generic rather t…han just for e2e tasks (#32897)
Update language on task splitting docs. Fix broken anchor link for
Java/Gradle test distribution.
2025-09-30 14:25:10 +00:00
Jack Hsu bcfdd01e85 docs(nx-dev): add missing redirects (#32895)
This PR adds redirects that we missed when we did the
technologies/core-api reorg, so now they're not redirecting correctly to
astro docs.
2025-09-30 10:02:14 -04:00
Colum Ferry a24f4167b7 chore(core): update workspace snapshot tests to be correct (#32890)
Fix snapshots
2025-09-30 12:17:53 +01:00
Leosvel Pérez Espinosa a9a17be0e0 feat(js)!: remove the experimental and deprecated inlining feature from the tsc and swc executors (#32783)
## Current Behavior

The experimental inlining feature in the `@nx/js:tsc` and `@nx/js:swc`
executors is deprecated.

## Expected Behavior

The experimental inlining feature in the `@nx/js:tsc` and `@nx/js:swc`
executors should be removed.

BREAKING CHANGE: The experimental inlining feature in the `@nx/js:tsc`
and `@nx/js:swc` executors was removed. A migration will remove the
related options (`external` and `externalBuildTargets`). Still, if you
use or rely on the feature, you need to make your dependencies buildable
or use a different build tool with bundling capabilities.
2025-09-29 18:24:57 -04:00
Colum Ferry 264593b46b fix(bundling): ensure tsconfig options are respected with rollup-typescript-plugin (#32816)
## Current Behavior
The configuration of the `@rollup/typescript-plugin` is incorrect and
overrides options provided by tsconfig.
It also doesn't respect options from the tsconfig file.

## Expected Behavior
Ensure tsconfig options are respected and not implicitly overriden.
2025-09-29 18:24:57 -04:00
Jack Hsu 4f9eeb4fb1 feat(webpack)!: remove deprecated deleteOutputPath and sassImplementation options (#32828)
The webpack package contains deprecated options that were marked with
TODO(v22) comments for removal:
- deleteOutputPath option
- sassImplementation option

These deprecated options were still being referenced in the codebase and
schema files, potentially causing confusion for users.

Remove the deprecated options from the webpack package to clean up the
API for v22:
- Remove deleteOutputPath option from the webpack executor and related
configurations (use Webpack's output.clean option instead)
- Remove sassImplementation option from the webpack executor and related
configurations (sass-embedded is now the default)
- Add a migration to automatically update existing workspaces that use
these deprecated options

Closes NXC-3108

---------

Co-authored-by: Colum Ferry <cferry09@gmail.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-09-29 18:24:57 -04:00
Colum Ferry 92ab08882c feat(rspack)!: remove deprecated deleteOutputPath and sassImplementation options (#32756)
## Current Behavior

The rspack package contains deprecated options that were marked with
TODO(v22) comments for
  removal:
- deleteOutputPath option in the rspack executor schema (Line 79 in
models.ts)
- sassImplementation option in the rspack executor schema (Line 164 in
models.ts)

These deprecated options were still being referenced in the codebase and
schema files,
  potentially causing confusion for users.

 ## Expected Behavior

Remove the deprecated options from the rspack package to clean up the
API for v22:
- Remove deleteOutputPath option from the rspack executor and related
configurations
- Remove sassImplementation option from the rspack executor and related
configurations
- Add a migration to automatically update existing workspaces that use
these deprecated options

##  Related Issue(s)
Resolves NXC-3112

---------

Co-authored-by: Jack Hsu <jack.hsu@gmail.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-09-29 18:24:57 -04:00
Jack Hsu 45681f30ba feat(react): keep deprecated @nx/react/bundle-rollup module since there is not a replacement when using @nx/rollup:rollup executor (#32821)
There isn't a replacement for `bundle-rollup` since the rollup executor
does not support isolated configs. This module ensures that existing
projects will continue to work.
2025-09-29 18:24:57 -04:00
Jack Hsu 29707d6e79 feat(react): remove support for non-isolated webpack config in ponentTestingPreset (#32787)
This PR removes an unnecessary logic for React component testing via
Cypress. We've made it not possible to have optional webpack configs a
while back (i.e. non-isolated config support). This means that even
legacy users _must_ have a webpack config using `composePlugin(...)`.
Thus, pass the options to that plugin function and things will continue
to work as usual for those users.
2025-09-29 18:24:57 -04:00
Colum Ferry 1b4b64d1d3 feat(rspack)!: remove application generator in favour of framework-specific options (#32755)
Remove the Rspack Application Generator in favour of generators from
`@nx/react`, `@nx/angular` and other plugins with app generators.

Resolves NXC-3109
2025-09-29 18:24:57 -04:00
Colum Ferry ccd33ba5c7 feat(bundling)!: change default useLegacyTypescriptPlugin to false for v22 (#32754)
The default TypeScript plugin for Rollup has changed from
rollup-plugin-typescript2 to @rollup/plugin-typescript. To continue
using the legacy plugin, explicitly set useLegacyTypescriptPlugin: true
in your configuration.

Resolves NXC-3094

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-09-29 18:24:57 -04:00
Jack Hsu 856d7d2b46 fix(core)!: remove deprecated simpleName option from library generators (#32716)
The deprecated simpleName option has been removed from the library
generators for Angular, React, Nest, and JS packages. Use the --name
option to provide the exact name for the library.

BREAKING CHANGE: simpleName option is no longer supported in library
generators

Closes NXC-3107, NXC-3098, NXC-3093, NXC-3111
2025-09-29 18:24:57 -04:00
Jack Hsu 5f4a0fe852 Revert "feat(webpack)!: remove SVGR option and provide withSvgr composable function (#32843) (#32882)
This reverts commit 2e9b5430bb. This is
meant for v22 not 21.6.
2025-09-29 16:35:12 -04:00
Jack Hsu 405d91d977 docs(misc): fix graph/pdv tags to not conflict with other code blocks (#32881)
This PR fixes an issue with new docs where graph or PDV tag with inner
JSON content will cause formatting issues with other code blocks on the
page.

Rather than using `<slot/>` to render the inner code fence, which seems
to not play well with the rest of the page, we instead skip rendering
the inner content altogether, and pass the data as `astroRawData` to the
underlying React component. This removes the need to handle
HTML/attribute parsing, so it is much cleaner in addition to resolving
conflicts.

Note: Also fixed some of the previous JSON content as they were invalid.
2025-09-29 15:43:05 -04:00
Jason Jean a8373f1a74 chore(repo): update nx to 21.6.1-rc.0 (#32873)
Updating Nx from 21.6.1-beta.4 to 21.6.1-rc.0
2025-09-29 13:54:37 -04:00
Jack Hsu 2e9b5430bb feat(webpack)!: remove SVGR option and provide withSvgr composable function (#32843)
BREAKING CHANGE: The svgr option has been removed from withReact,
NxReactWebpackPlugin, and withNx (for Next.js). Projects that need SVGR
support should now use the new withSvgr composable function from
@nx/react.

For React webpack projects:
- Import withSvgr from '@nx/react'
- Add withSvgr() to your composePlugins chain after withReact()

For Next.js projects:
- Add SVGR webpack configuration directly to your next.config.js

Migrations have been provided to automatically update existing
configurations.

Closes NXC-3106

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-09-29 13:48:58 -04:00
Jason Jean 8887ae0e08 fix(core): spinner shows correct plugin count during project graph creation (#32871)
## Current Behavior

The spinners shown during project graph creation display incorrect
plugin counts. They show the total number of registered plugins instead
of the actual number of plugins being processed for each specific phase.

For example, if there are 10 total plugins but only 3 have
`createDependencies`, the spinner would incorrectly show "Creating
project graph dependencies with 10 plugins" instead of "Creating project
graph dependencies with 3 plugins".

## Expected Behavior

Spinners should show accurate counts reflecting the actual number of
plugins being executed for each phase of project graph creation.

## Related Issue(s)

This fixes a misleading user experience where users see progress
indicators that don't match the actual work being performed.

## Changes Made

### 1. Dependencies Phase
- Use `createDependencyPlugins.length` instead of `plugins.length` for
spinner count

### 2. Metadata Phase  
- Filter plugins once for `createMetadata` capability
- Use filtered count for spinner
- Eliminate double filtering by using filtered array directly in
processing

### 3. Create Nodes Phase
- Filter plugins once for `createNodes[0]` pattern existence
- Use filtered count for spinner
- Eliminate redundant pattern check in loop

## Benefits

- **Accurate Progress**: Users see correct plugin counts during each
phase
- **Better Performance**: Eliminated redundant filtering operations
- **Consistent Code**: All three phases now follow the same pattern of
filter-once-use-everywhere
2025-09-29 13:47:07 -04:00
MaxKless cd32388903 fix(core): tweak messaging if vscode / cursor aren't installed (#32877)
<!-- 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
The messaging can be confusing if vscode/cursor are installed but not
added to PATH.

## Expected Behavior
The messaging is clearer.
2025-09-29 13:46:54 -04:00
Caleb Ukle d09b519d7a docs(nx-dev): cleanup nx-cloud cli ref doc (#32866)
- fix usage of asides mdoc syntax
- updated codeblock frames
- added assignment-rules arg
2025-09-29 10:10:16 -05:00
Colum Ferry 5be7b38619 fix(rspack): mark svgr support as deprecated (#32861)
## Current Behavior
`svgr` support has been deprecated in `webpack` for some time, but it
was never marked as deprecated for `rspack`.

## Expected Behavior
Mark `svgr` support as deprecated with aim for removal in v23
2025-09-29 14:15:38 +01:00
Jason Jean 7f4a8eaf86 fix(repo): remove duplicate permissions block in publish workflow (#32868)
## Current Behavior

The publish workflow has a duplicate `permissions` block incorrectly
nested under a GitHub script action step, which causes a syntax error in
the GitHub Actions workflow.

## Expected Behavior

The workflow should run without syntax errors. The `permissions` block
should only be defined at the job level, not within individual steps.

## Related Issue(s)

This fixes a GitHub Actions workflow syntax issue where permissions were
incorrectly nested under a step action.

The `pull-requests: write` permission is already correctly defined at
the job level (lines 510-513), so the duplicated permissions block under
the step was unnecessary and causing errors.

🤖 Generated with [Claude Code](https://claude.ai/code)
2025-09-26 15:38:38 -04:00
Colum Ferry ad032add38 fix(core): project graph creation processes project dependencies correctly (#32784)
## Current Behavior

The project graph build process incorrectly handles dependencies when
workspace projects have
different versions or are referenced via specific version ranges. This
causes several issues:

1. NPM lockfile parser crashes when encountering symlinked nested
dependencies in workspaces
  (which don't have versions)
2. Package.json dependencies that reference workspace projects with
specific versions (e.g.,
"proj4": "1.0.0" when workspace has "version": "2.0.0") incorrectly
resolve to the workspace
  project instead of the installed npm package
3. Version ranges and file references to workspace projects are not
properly validated

 ## Expected Behavior

  The dependency resolution should:
- Handle symlinked workspace packages in npm lockfiles without crashing
- Correctly differentiate between workspace projects and npm packages
when specific versions are
   referenced
- Properly validate version ranges against workspace package versions
using semver
- Support file references (e.g., "file:../proj6") for workspace
dependencies
- Only resolve to workspace projects when the version constraint is
satisfied or when using
  wildcards

## Notes
This has inadvertently caused issues when calculating which manifest
files need to be updated in the JSVersionActions / Nx Release for Npm
Packages

## Related Issues

Fixes #31454

---------

Co-authored-by: FrozenPandaz <jasonjean1993@gmail.com>
2025-09-26 14:13:11 -04:00
Colum Ferry 5d953a42c2 fix(nest): setup tsconfig to use decorators #30749 (#32859)
## Current Behavior
NestJS libraries using decorators in constructor, or otherwise, are
causing TS errors due to missing configuration for decorators.

## Expected Behavior
Ensure decorator config settings are set in `tsconfig.lib.json`.

## Related Issue(s)

Fixes #30749
2025-09-26 14:10:28 -04:00
Jack Hsu e2a79862a6 chore(repo): restore PR release functionality (#32839)
This PR brings back PR releases.

---------

Co-authored-by: Jason Jean <jasonjean1993@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-09-26 17:30:24 +00:00
MaxKless c54727dd53 feat(core): add configure-ai-agents command (#32825)
This pull request introduces support for configuring specific AI agents
in Nx workspaces, allowing users to select which agents to set up and
generating only the relevant configuration files for those agents. It
also updates documentation, schemas, and tests to reflect this new, more
flexible approach.

The most important changes are:

**Agent Selection and Configuration:**
* Added the ability to specify which AI agents to configure via an
`agents` array, both in the setup schema (`schema.json`) and the
`CreateWorkspaceOptions` type. The supported agents are: `claude`,
`gemini`, `codex`, `cursor`, and `copilot`. The generator only creates
configuration files for the selected agents, rather than all by default.
[[1]](diffhunk://#diff-f4d0a6778d70986b54028fb1a5a9338ad4db252edd6db4066e7ee87e8d7f28a5R22-R30)
[[2]](diffhunk://#diff-8141dbb37440f99a460b1e23d0c7229cd16338984832faf528d0ff23de179766R40-R50)
[[3]](diffhunk://#diff-ed4e3e85dbc5d3358491bcef52a8f403a9607df8c874ec9dadef7cd2a1eba6c7R89-R121)

* Implemented prompt logic for selecting AI agents interactively during
workspace creation, and exposed available agent types for use in prompts
and configuration.
[[1]](diffhunk://#diff-672af9097acda13d133130b660df34e6ddf6a61a74f9a6d66832255123e8f9b9R16)
[[2]](diffhunk://#diff-672af9097acda13d133130b660df34e6ddf6a61a74f9a6d66832255123e8f9b9R75-R119)

**File Generation Logic:**
* Refactored the `setupAiAgentsGenerator` implementation to generate
only the files relevant to the specified agents (e.g., `CLAUDE.md`,
`.mcp.json` for Claude; `.gemini/settings.json` for Gemini; `AGENTS.md`
for others), and to append to existing files rather than overwrite them.
[[1]](diffhunk://#diff-ed4e3e85dbc5d3358491bcef52a8f403a9607df8c874ec9dadef7cd2a1eba6c7R1-R45)
[[2]](diffhunk://#diff-ed4e3e85dbc5d3358491bcef52a8f403a9607df8c874ec9dadef7cd2a1eba6c7R89-R121)

* Added new utility functions for determining config file paths and
reading agent-specific configuration, improving maintainability and
clarity of file handling logic.
2025-09-26 13:17:43 -04:00
Miroslav Jonaš 05227d73c5 feat(core): add id, start and end time to lifecycle hooks (#32583)
<!-- 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
Pre and post hooks lack corellation Id which might make it difficult to
culculate stats for task using pre and post hooks.
Additionally, post hook does not expose the duration or time span for
the task. Using pre/post hook might not be precise enough.

## Expected Behavior
Hooks expose the unique taskId so we can corellate pre hook of a task to
the post hook of the same task. Post hook should expose start and end
time of the task run.

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

Resolves discussion
[31076](https://github.com/nrwl/nx/discussions/31076)
2025-09-26 17:55:51 +02:00
Benjamin Cabanes 65a216bfe2 feat(nx-dev): enhance UI animations & statistics display (#32863)
Refactored multiple components to integrate `motion` animations for a
smoother UI experience. Implemented `AnimateValue` for animated
statistic values across various sections and improved readability by
replacing `JSX.Element` with `ReactElement` where applicable.
2025-09-26 11:03:48 -04:00
Miroslav Jonaš 65fab5bb4c feat(core): improve split target to support Gradle format (#32766)
<!-- 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 #
2025-09-26 14:55:49 +00:00
Colum Ferry 3bcf014cb3 chore(web): ensure readme is published (#32858)
## Current Behavior
The `README.md` file for `@nx/web` is currently not copied into the
publish directory for release.

## Expected Behavior
Ensure the `README.md` file is copied into the publish directory.

## Related Issue(s)

Fixes NXC-3055
2025-09-26 14:54:20 +01:00
Leosvel Pérez Espinosa 6c109d2c20 fix(core): add env var to disable fetching migration metadata from registry (#32850)
Add a new `NX_MIGRATE_SKIP_REGISTRY_FETCH` environment variable to opt
out of fetching package versions and migrations metadata from the
registry and instead, use package installation to get the information.
2025-09-26 14:10:57 +02:00
Jonathan Gelin 5ea2e47acf fix(core): display prettier valid errors (#32771)
<!-- 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
When running `nx format:check`, if there is an error, it is considered
as files not formatted correctly
But if Prettier is throwing a real error, it is not diplayed. We just
see an empty result without information

For example:

Format check failing with empty result
```
nx format:check


```

But when running the command, we can see the error:
```
node "/node_modules/prettier/bin/prettier.cjs" --list-different "packages/lib/.spec.swcrc" 
packages/lib/.spec.swcrc
[error] No parser could be inferred for file "/packages/lib/.spec.swcrc".
```

## Expected Behavior
I should see the prettier error to understand why it is failing

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

Fixes #
2025-09-25 21:38:32 -04:00
Jack Hsu b6d5f38691 fix(gradle): skip targets on Netlify since the Java version is too old (#32852)
Building on Netlify fails.

```
3:03:48 PM: FAILURE: Build failed with an exception.
3:03:48 PM: * What went wrong:
3:03:48 PM: A problem occurred configuring root project 'nx'.
3:03:48 PM: > Could not resolve all artifacts for configuration 'classpath'.
3:03:48 PM:    > Could not resolve dev.nx.gradle:project-graph:0.1.7.
3:03:48 PM:      Required by:
3:03:48 PM:          root project : > dev.nx.gradle.project-graph:dev.nx.gradle.project-graph.gradle.plugin:0.1.7
3:03:48 PM:       > Dependency requires at least JVM runtime version 17. This build uses a Java 8 JVM.
3:03:48 PM:    > Could not resolve com.ncorti.ktfmt.gradle:plugin:0.24.0.
3:03:48 PM:      Required by:
3:03:48 PM:          root project : > com.ncorti.ktfmt.gradle:com.ncorti.ktfmt.gradle.gradle.plugin:0.24.0
3:03:48 PM:       > Dependency requires at least JVM runtime version 17. This build uses a Java 8 JVM.
3:03:48 PM: * Try:
3:03:48 PM: > Run this build using a Java 17 or newer JVM.
3:03:48 PM: > Run with --stacktrace option to get the stack trace.
3:03:48 PM: > Run with --debug option to get more log output.
3:03:48 PM: > Run with --scan to get full insights.
3:03:48 PM: > Get more help at https://help.gradle.org.
3:03:48 PM: BUILD FAILED in 30s
```

## Current Behavior
Gradle plugin needs Java 17, but Netlify uses 8.

## Expected Behavior
Skip targets on Netlify just like on Vercel.

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

Fixes #NXC-3175
2025-09-25 16:30:35 -04:00
Jason Jean 6480d3d6d1 chore(repo): update nx to 21.6.1-beta.4 (#32848)
Updating Nx from 21.6.1-beta.3 to 21.6.1-beta.4
2025-09-25 15:01:48 -04:00
Philip Fulcher a6755caff8 chore(nx-dev): remove September webinar notifiers (#32846) 2025-09-25 13:38:43 -05:00
Caleb Ukle 2a6bb23701 docs(nx-dev): explain how to correctly re-run jobs with manual DTE (#32844)
fixes: DOC-201
2025-09-25 10:34:37 -05:00
Caleb Ukle c0ad4843d1 docs(nx-dev): small docs cleanup (#32822)
- add prettier overrides for mdoc files to be treaded as markdown (along
with running format)
- update links to nx-commands refs to use correct header links
- fix link on quickstart page to point to CI feature overview
2025-09-24 15:39:08 -05:00
Louie Weng 5856e01a2c chore(repo): update publish pipelines with java (#32795)
<!-- 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
-->

- Bump version of gradle plugin to V2
- Add java to publish pipelines so that we can build the gradle plugin.
- Removed files from freeBSD VM to prevent disk storage limit issues
- Bumped up the kotlin version of gradle projects such that kotlin can
build on freeBSD

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

Fixes #
2025-09-24 13:07:16 -07:00
Jack Hsu bd1b689b06 docs(misc): minor styling fixes (#32840)
This PR fixes a few styling issues

## Anchor links colors being consistent inside asides:

https://github.com/user-attachments/assets/13ba7892-50ee-4429-b9f5-8587f65869de

## Mobile login border color on light theme (make it lighter and same as
other border colors):
<img width="325" height="279" alt="Screenshot 2025-09-24 at 10 34 56 AM"
src="https://github.com/user-attachments/assets/b2ca3246-5a11-491c-8240-68a0e4430c81"
/>

## Decrease font size for tabs:
<img width="676" height="319" alt="Screenshot 2025-09-24 at 10 38 38 AM"
src="https://github.com/user-attachments/assets/5a7dc828-f049-4b25-9b28-144969fd810f"
/>

## Remove extra margin-bottom for code lines in asides:
Before:

<img width="743" height="387" alt="image"
src="https://github.com/user-attachments/assets/55312f0a-acc5-48e2-bcb2-3370d00ed05f"
/>

After:
<img width="828" height="467" alt="image"
src="https://github.com/user-attachments/assets/537f688a-61cf-444a-a512-84c611b80c43"
/>


Closes #DOC-227 #DOC-225
2025-09-24 15:21:22 -04:00
Leosvel Pérez Espinosa c9aa288d11 fix(core): prevent terminal pane scrolling on tasks list events (#32818)
## Current Behavior

The TUI had two distinct scrolling issues:

1. **Tasks List Events Scrolling**: Any tasks list event (scrolling,
arrow keys, task status changes) would cause the terminal pane to scroll
down exactly 8 lines in two batches of 4 - one immediately and another
after ~200ms delay.

2. **New Task Initial Positioning**: When navigating to a task for the
first time, the task output would render 4 lines above the bottom
position, then automatically scroll to the correct bottom position after
a short delay.

## Expected Behavior

1. Tasks list navigation and events should not cause any scrolling in
the terminal pane
2. Task output should appear correctly positioned at the bottom from the
first render without any delayed scroll adjustments

---

## Technical Details

### Root Cause

**Issue 1 - Tasks List Events Scrolling (8 lines)**

- Task list events triggered `debounce_pty_resize()` calls
- This caused immediate resize + 200ms delayed resize
- Each resize applied 4-line scroll adjustments due to dimension
recalculations
- Result: 8 lines total scroll (4 immediate + 4 delayed)

**Issue 2 - New Task Initial Positioning (4 lines)**

- New PTY instances created with default dimensions (24×80)
- Terminal panes had different calculated dimensions (e.g., 22×137)
- Viewport height mismatch caused content to appear 4 lines up from
bottom
- Delayed resize would correct positioning, causing visible
scroll-to-bottom

### Solution

**Architectural Improvement**: Migrated from individual dimension fields
to shared dimensions using `Arc<RwLock<(u16, u16)>>` to ensure
consistency across all PTY references.

**Issue 1 Fix**: Removed redundant `debounce_pty_resize()` calls during
task navigation events, eliminating the double-resize pattern.

**Issue 2 Fix**: Added immediate dimension correction in
`render_terminal_pane_internal()` to ensure correct positioning from
first render.

### Changes Made

- **pty.rs**: Replaced individual `rows`/`cols` fields with shared
`dimensions: Arc<RwLock<(u16, u16)>>`
- **app.rs**: Added immediate resize in
`render_terminal_pane_internal()` for correct initial positioning
- **app.rs**: Removed redundant `debounce_pty_resize()` calls during
task navigation events
- Improved error handling and eliminated potential deadlock risks in
resize operations

### Performance Impact

- Eliminated double-resize pattern during navigation (~67% reduction in
resize operations)
- No more visible scrolling delays or positioning issues
- Maintained all layout change functionality while removing unnecessary
operations
2025-09-24 16:55:05 +00:00
Leosvel Pérez Espinosa 72dd9fe0b6 fix(core): do not add cache_outputs foreign key to task_details when NX_DISABLE_DB=true (#32824)
## Current Behavior

The `cache_outputs` table is always created with a foreign key to the
`task_details` table. When `NX_DISABLE_DB=true` is set, the
`task_details` table is not created, and this results in an error when
trying to insert any records in the `cache_outputs` table.

## Expected Behavior

When `NX_DISABLE_DB=true` is set, the `cache_outputs` table should not
have a foreign key to the non-existent `task_details` table.

## Related Issue(s)

Fixes #32208
2025-09-24 10:12:26 -04:00
Leosvel Pérez Espinosa a0e0e1ce1f fix(core): do not show placeholder parallel entries in tui when filtering (#32837) 2025-09-24 09:44:33 -04:00
MaxKless c915527eee fix(core): move from execFile to exec for windows support (#32836)
<!-- 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
provenance checks fail on latest on windows because `npm.cmd` is only
executable with a shell. That removes the entire security aspect of
using `execFile` so we just go back to `exec`.

## Expected Behavior
provenance checks shouldn't fail on windows.

## Related Issue(s)

Fixes #32713
2025-09-24 09:34:48 -04:00
Caleb Ukle 57c5c6acd2 docs(nx-dev): document playwright output merging w/ atomizer (#32830)
fixes: DOC-208

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-09-24 07:04:26 -05:00
Benjamin Cabanes 146f57748c chore(nx-dev): update active contributors (#32831)
Increased the maximum number of active contributors mentioned in the
pricing description from 30 to 50 in the `Pricing` component
(`nx-dev/ui-cloud/src/lib/pricing.tsx`).
2025-09-23 15:27:48 -04:00
Chau Tran 19fff53cd2 fix(graph): update graph package (#32829)
- update project list control to have checkbox style
- remove selection animation
2025-09-23 14:19:23 -05:00
Caleb Ukle 9e47fed9c9 docs(nx-dev): mention saml is ent feature in google auth doc (#32823)
fixes: DOC-228
2025-09-23 12:44:03 -05:00
Juri 5e0bcae9ef feat(nx-dev): change login button to try nx cloud 2025-09-23 18:09:37 +02:00
Juri 7fa83cd416 chore(repo): enable auto-apply fixes for self-healing 2025-09-23 16:44:40 +02:00
Colum Ferry e4ec3b3c97 fix(react): only add react router plugin when using react router #32525 (#32814)
## Current Behavior

The React init generator unconditionally adds the
@nx/react/router-plugin to the nx.json plugins
array whenever addPlugin is true. This causes the React Router plugin to
be added even for
React applications that don't use React Router, which is unnecessary and
can lead to unwanted
  behavior.

## Expected Behavior

  The React Router plugin should only be added to nx.json when:
1. The React application is actually using React Router (specifically
for SSR/RSC scenarios)
  2. The addPlugin option is true

  This ensures that:
  - Applications without React Router don't get the plugin unnecessarily
- Applications with React Router for SSR/RSC get the plugin
automatically when created with the
  --useReactRouter flag
  - Libraries never get the React Router plugin as they don't need it

## Related Issue(s)

  Fixes #32525
2025-09-23 14:17:01 +01:00
Leosvel Pérez Espinosa 79ac44d078 fix(misc): remove unnecessary bust property from plugin hashes (#32807)
Remove the manually maintained and unnecessary `bust` property from
plugin hashes.
2025-09-23 09:31:09 +02:00
Philip Fulcher ec07bfb843 docs(core): add changelogs for 21.4 and 21.5 (#32774)
https://nx-dev-git-philip-september-changelogs-nrwl.vercel.app/changelog
2025-09-22 20:49:07 -04:00
Caleb Ukle dbcafa0e8b docs(nx-dev): sync content from docs/ into astro docs (#32812)
- add missing NxModuleFederationPlugin page
2025-09-22 14:07:04 -05:00
Jack Hsu 4c17346bdb docs(misc): mark docs pages as noindex when using Astro docs (#32811)
If new docs are enabled, then mark the old ones as `noindex`. They
should already be redirected to new docs as well, but this helps
anything missed.
2025-09-22 14:06:18 -04:00
Jason Jean 5964b4a04c chore(repo): update nx to 21.6.1-beta.3 (#32799)
Updating Nx from 21.6.1-beta.2 to 21.6.1-beta.3

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-09-22 11:37:29 -04:00
Caleb Ukle ee6de8fae7 docs(nx-dev): initial round of search improvements (#32768)
update pagefind config to improve search hits
add weight and filter properties for docs to control individual pages

filter` allows selecting "type" of docs being searched

![wm_2025-09-18T16-48-23@2x](https://github.com/user-attachments/assets/13bc38b8-a52f-4efc-8eaf-3aef792357aa)

where weight can set the given pages search weight
unfortunately this will set the weight of the whole page content instead
which can make performance worse so important to use it sparingly.
current set values are trial and error based. and subject to change over
time really just depends on feedback over time of the search
performance.


fixes DOC-159
2025-09-22 13:38:24 +00:00
Juri f1b00ca610 fix(nx-dev): fix client-side redirect issue for OSS cloud plan form 2025-09-22 14:46:17 +02:00
MaxKless 6cf1d7a34d chore(repo): set up AGENTS.md with recommended rules (#32782)
<!-- 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
only claude has dedicated setup in the nx repo.

## Expected Behavior
Claude, Gemini and things that use AGENTS.md have dedicated setup in the
nx repo.
2025-09-19 22:27:46 -04:00
Miroslav Jonaš e3df4d2d86 chore(repo): add missing tsx (#32785)
## Current Behavior
The `tsx` package is missing causing TUI to hang in interactive mode.

## Expected Behavior
The `tsx` package is installed so commands running `npx tsx` don't need
to ask for a permission to install it.

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

Fixes #
2025-09-19 22:27:22 -04:00
Louie Weng 816fa2b9a9 chore(repo): revert gradle v2 plugin (#32797)
Reverting gradle v2 plugin from Nx due to issues with publish pipelines
not being able to handle the new changes. Will re-apply once the kinks
in publish are ironed out.
2025-09-19 23:04:31 +00:00
James Henry bd6d5c8e66 fix(core): update tui title text structure (#32793) 2025-09-19 18:12:57 -04:00
Jack Hsu 369f162474 docs(nx-dev): fix AI chat streaming parse error by pinning ai package to v3.0.19 (#32792)
The AI chat on nx.dev shows an error 'Failed to parse stream string. No
separator found.' after successfully receiving a response from the API.

The AI chat should work without showing streaming parse errors after
successful responses.

Also fixed tailwind pruning by including `feature-ai` in the globs to
check.



https://github.com/user-attachments/assets/2517d856-7a45-48f4-b71b-885f3714fb44



Fixes DOC-216
2025-09-19 15:39:30 -04:00
Jack Hsu 133730b276 docs(nx-dev): add Algolia search to blog index when Astro docs are enabled (#32794)
When NEXT_PUBLIC_ASTRO_URL is set, the blog index now includes a
dedicated search box that filters results to only blog posts. This
ensures blog search functionality is maintained when the main docs
search is moved to the Astro site.

Blog index page has no search functionality when Astro docs are enabled,
making it difficult to find specific blog posts.

Blog index page displays a search box that searches only within blog
posts (using Algolia facet filter for 'Nx | Blog') when Astro docs are
enabled, preserving the ability to search blog content.

Without astro docs:

<img width="1162" height="733" alt="Screenshot 2025-09-19 at 2 26 34 PM"
src="https://github.com/user-attachments/assets/a499fb03-ecc6-4a4f-9303-2198e32f9a77"
/>

With astro docs:

<img width="1143" height="784" alt="Screenshot 2025-09-19 at 2 27 42 PM"
src="https://github.com/user-attachments/assets/4d0bfa7e-0ca6-4694-bba0-fc5e63d1b140"
/>


https://github.com/user-attachments/assets/fe96bc49-dafe-4bc6-9b89-578f29f93cf7



Fixes DOC-221
2025-09-19 15:39:20 -04:00
Jack Hsu 4d57e62ce8 chore(repo): disable pnpm install cache resolve-required-data job (#32791)
Fix publish pipeline by running `pnpm install` when using `setup-node`.
2025-09-19 17:30:25 +00:00
Louie Weng 55a16e625f chore(gradle): move all dependencies into version catalog and update gradle plugin (#32773)
<!-- 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 were managing disparate versions across all gradle projects.

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

Centralize all plugins and dependencies into one location for easier
maintenance.

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

Fixes #
2025-09-19 12:39:27 -04:00
Jack Hsu 575e6a0534 feat(nx-dev): disable Algolia search on non-docs pages when Astro docs are enabled (#32789)
Algolia search appears on all nx-dev pages, including non-documentation
pages like AI chat and changelog, even when the new Astro documentation
site is enabled. This creates confusion as search should only be
available on documentation pages.

- When NEXT_PUBLIC_ASTRO_URL is set (indicating new docs are enabled),
Algolia search is disabled on all nx-dev pages
- Non-documentation pages (AI chat, changelog) use the non-documentation
header without search
- Documentation header only shows search when Astro docs are not enabled
- Clean up existing styling issues and ensure consistent header usage
across the site

- Updated documentation-header.tsx to conditionally hide search when
NEXT_PUBLIC_ASTRO_URL is set
- Updated header.tsx to pass showSearch prop based on
NEXT_PUBLIC_ASTRO_URL
- Modified AI chat page to use non-documentation header and fixed
styling issues
- Modified changelog page to use non-documentation header-
- Fixed astro header such that `Office Hours` and `Live Streams` are
replaced with `Nx Live` (already done on Next.js side)
- Fixed astro sidebar reference updater middleware formatting

## Examples

Non-docs headers (for homepage, blog, cloud, enterprise, etc.):

<img width="1349" height="103" alt="Screenshot 2025-09-19 at 11 49
06 AM"
src="https://github.com/user-attachments/assets/5a9e6355-43b9-4142-9c76-b30ccc4982b1"
/>

Changelog (with astro docs):

<img width="1467" height="1401" alt="Screenshot 2025-09-19 at 11 48
36 AM"
src="https://github.com/user-attachments/assets/8e135ca7-fe36-4b44-b181-633d3dc5890d"
/>

AI Chat (with astro docs):

<img width="1246" height="952" alt="Screenshot 2025-09-19 at 11 48
24 AM"
src="https://github.com/user-attachments/assets/866c7e4d-8eac-40ab-9c77-5d125135d4e9"
/>


Changelog (without astro docs);

<img width="1180" height="1132" alt="image"
src="https://github.com/user-attachments/assets/eccdeb17-08fc-4f90-949d-5c7879abe3d3"
/>

AI Chat (without astro docs):

<img width="1172" height="1407" alt="image"
src="https://github.com/user-attachments/assets/2ad6b797-32bc-498b-93cb-29cc368030f1"
/>


Astro docs header with updated `Nx Live` link:

<img width="685" height="434" alt="Screenshot 2025-09-19 at 11 48 51 AM"
src="https://github.com/user-attachments/assets/48facc87-2c90-4195-97c7-024b11112001"
/>




Fixes DOC-219

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-09-19 12:26:46 -04:00
Leosvel Pérez Espinosa af7ebee21e cleanup(graph): remove non-existent prop causing typecheck/build issues (#32780) 2025-09-19 09:10:56 -05:00
Jack Hsu fa5a1bf781 docs(misc): fix JSON parsing for project details with escaped quotes (#32778)
Fixed the `parseAstroHtmlWrappedJson` function used by PDV and graph tag
components to render code fence properly.

The problem was that inner HTML with code fence caused escaped
double-quotes (`\"`) to be improperly handled. By the time we read the
HTML via React props, the escape character is already done (`\`). Thus,
use code fence to let Starlight render the full block, and then parse
out the JSON object from the `[data-code]` attribute on the div.

For example, previously this would fail:

```
{% project_details %}
{ "foo": "\"bar\"" }
{% /project_details %}
```

That doesn't work because the HTML is just ""bar"", which is invalid.
But changing the above to this works:

````
{% project_details %}
```json
{ "foo": "\"bar\"" }
```
{% /project_details %}
````

This works because you get something like `data-code="&quot;foo&quot;:
&quot;\&quot;bar\&quot;&quot;"` set on the `div`. So we can use regexp
to match everything within that attribute and parse it out as JSON once
we convert some entities.

Check the
[`nx-dev/ui-markdoc/src/lib/utils/parse-astro-html-wrapped-json.ts`](https://github.com/nrwl/nx/pull/32778/files#diff-c3d8e90b624e30217beaa44c46a16b9053533cf9a8542a4f7301ccaf3dbdab58)
file for the full logic.

Also added JSON code fences to all graph tags in mdoc files to ensure
proper parsing.

<img width="709" height="866" alt="Screenshot 2025-09-18 at 3 41 26 PM"
src="https://github.com/user-attachments/assets/fdae86a6-929a-4a1f-82fe-7d4052de5db5"
/>

Closes #DOC-217
2025-09-19 09:01:48 -04:00
Caleb Ukle af12d6c1ee docs(nx-dev): fix broken blog/img links (#32777)
fixes DOC-218
2025-09-18 18:04:52 +00:00
Chau Tran c8ae15f08c feat(graph): unified graph UI and controls (#32724)
This PR migrates to the unified `@nx/graph` with UI and persisted url
graph state.
- new UI components 
- remove obsolete state machines code
- remove obsolete URL query parameters handling
2025-09-18 12:44:52 -05:00
Caleb Ukle befc6243b8 docs(nx-dev): small clean up items for styling and content (#32760)
remove duplicate installation tabs
<img width="826" height="598" alt="image"
src="https://github.com/user-attachments/assets/b3cef8e8-bb7e-4c5f-a734-fb7b3376dedc"
/>
add description to nx cloud getting started page
<img width="794" height="329" alt="image"
src="https://github.com/user-attachments/assets/6ea1ceeb-ab33-4a11-85b8-3073668d8bec"
/>
add spacing for graph component

![wm_2025-09-17T08-54-55@2x](https://github.com/user-attachments/assets/99aab88f-9dbc-4d29-8df2-dc42eb489b0e)
fix footer to link to correct site when astro url is configured

![wm_2025-09-17T08-58-47@2x](https://github.com/user-attachments/assets/3038d701-3bed-494a-9f8e-63d687b8fd7f)


Fixes DOC-211
Fixes DOC-214
Fixes DOC-212
2025-09-18 12:06:59 -05:00
Caleb Ukle 1542d9c822 docs(nx-dev): remove duplicated gh button (#32769)
![wm_2025-09-17T16-41-13@2x](https://github.com/user-attachments/assets/5e7cdd34-13b9-465b-92bc-ed5a577e86ba)


fixes DOC-215
2025-09-18 12:06:22 -05:00
Leosvel Pérez Espinosa dd5daeae0c fix(misc): add typescript output to the eslint ignore when needed (#32775)
## Current Behavior

When generating workspaces or projects with ESLint and using the TS
solution setup, the generated `out-tsc` directory for TS output is not
ignored in the ESLint configuration. This results in the lint task
processing and potentially reporting errors from that directory.

## Expected Behavior

When generating workspaces or projects with ESLint and using the TS
solution setup, the generated `out-tsc` directory for TS output should
be ignored in the ESLint configuration.
2025-09-18 16:57:21 +00:00
Leosvel Pérez Espinosa c73b2aada9 feat(testing): forward e2e-ci task options to their atomized tasks (#32765)
## Current Behavior

Options configured in the `e2e-ci` tasks are not forwarded to their
atomized tasks.

## Expected Behavior

Options configured in the `e2e-ci` tasks can be forwarded to their
atomized tasks.

The `@nx/cypress/plugin` and `@nx/playwright/plugin` plugins will infer
their `e2e-ci` dependencies to atomized tasks with `"options":
"forward"`.
2025-09-18 16:54:00 +00:00
Leosvel Pérez Espinosa 14e2bec60a fix(core): fix misc db-related issues (#32745)
This resolves multiple database-related race conditions that cause
"database is locked" errors and `BorrowMutError` panics during task
cleanup and service initialization.

## Issues Fixed

1. **Task cleanup race condition**: Exit handlers and cleanup methods in
the task orchestrator simultaneously attempted to remove the same task
record, causing SQLite lock contention
2. **Missing database retry logic**: Native operations bypassed the
existing retry mechanism, making them vulnerable to concurrent access
failures
3. **SQLite connection borrowing conflicts**: Direct connection access
in `NxTaskHistory::setup()` violated Rust's borrowing rules when other
services held concurrent borrows

## Solution

### Application-level coordination
- Added atomic check-and-remove pattern using `Map.delete()` return
value
- Only the process that successfully removes from the task map performs
the database operation
- Eliminates duplicate database calls entirely

### Database-level robustness
- Fixed `RunningTasksService` methods to use retry-enabled database
operations
- Replaced `prepare() + stmt.execute()` pattern with direct
`db.execute()` calls
- Ensures all operations benefit from exponential backoff retry logic
(up to 20 attempts)

### Connection access safety
- Moved `array::load_module` from service setup to centralized database
connection opening
- Removed direct `.conn` access that bypassed safe wrapper patterns
- Load array module once per connection instead of per service
instantiation

## Files Changed
- `packages/nx/src/tasks-runner/task-orchestrator.ts` - Race condition
prevention
- `packages/nx/src/native/tasks/running_tasks_service.rs` - Retry logic
fixes
- `packages/nx/src/native/db/initialize.rs` - Centralized array module
loading
- `packages/nx/src/native/tasks/task_history.rs` - Removed unsafe
connection access

Provides comprehensive concurrency safety through defense-in-depth:
prevents race conditions at the application level while ensuring
database operations are resilient to concurrent access.
2025-09-18 11:31:21 -04:00
Louie Weng 9d004a2783 fix(gradle): support custom test targets (#32728)
<!-- 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 we do not support overwriting the default test target since
with custom tests from Gradle. This means you cannot use a test suite
other than the default `test`.

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

- We can now detect custom test suites via the Gradle API, which
receives the test tasks via the task type rather than the test name.
- We can atomize against test targets without having to set these
targets in the gradle plugin configuration
- Setting a custom test target that conflicts with a defined test suite
in Gradle now throws an error
- Check-ci correctly depends on all atomized targets of test targets

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

Fixes #NXC-2962
2025-09-18 07:35:40 -07:00
Colum Ferry 36741d08d2 fix(angular-rspack): ensure assets extracted from stylesheets correctly #32487 (#32759)
## Current Behavior

When Angular components reference assets in their stylesheets using
`url()` (e.g., `background-image: url('../assets/test-pattern.svg')`),
the Nx Angular Rspack plugin processes the CSS but fails to extract and
copy the referenced asset files to the output directory. This results
in:

- CSS is processed and URLs may be rewritten to reference output paths
(e.g., `url('./media/test-pattern.svg')`)
- The actual asset files are never copied to the output directory
- Browser shows 404 errors for missing asset files when the application
runs
- No `media` directory is created in the build output

## Expected Behavior

With this fix, assets referenced in component stylesheets are now
properly extracted and emitted to the output directory:

- Asset files referenced in component stylesheets are extracted and
copied to the output directory
- CSS URLs are correctly rewritten to point to the copied assets
- No 404 errors occur for asset files
- A `media` directory is created in the output with the extracted assets
- Both inline and external component styles properly handle asset
extraction

## Related Issue(s)

Fixes #32487

## Changes Made

### Core Fix
- Modified the Angular Rspack plugin to properly collect and emit
stylesheet assets during the compilation process
- Added asset collection during both bundle file and inline style
processing in `setup-compilation.ts` and
`setup-with-angular-compilation.ts`
- Implemented asset emission in the `processAssets` hook of the Angular
Rspack plugin

### Test Coverage
- Added comprehensive example application
(`examples/angular-rspack/csr-css-assets`) that demonstrates:
  - External component stylesheets with asset references
  - Inline component styles with asset references
  - Various asset types (SVG, images)
  - Proper asset extraction and URL rewriting

### Technical Details
The fix addresses the gap between Angular's `ComponentStylesheetBundler`
which correctly processes assets and generates `outputFiles`, and the Nx
Angular Rspack plugin which now properly emits these files using
`compilation.emitAsset()` during the build process.
2025-09-18 11:19:36 +01:00
Jason Jean 63b5baae3a fix(core): do not shutdown daemon for project graph errors (#32764)
<!-- 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 -->

All errors.. even Project Graph errors cause the daemon to shutdown.
This meant that showing partial graphs in the graph application no
longer worked.

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

Shutting down the daemon won't help for project graph errors. In this
case, we should not shutdown the daemon. And showing partial project
graphs will work again.

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

Fixes #
2025-09-17 16:33:55 -04:00
Philip Fulcher 6eab2d0c71 docs(nx-dev): add biome plugin creation article (#32742) 2025-09-17 16:09:40 -04:00
Jason Jean 93fcc48344 chore(repo): update nx to 21.6.1-beta.2 (#32753)
Updating Nx from 21.6.1-beta.1 to 21.6.1-beta.2
2025-09-17 10:23:57 -04:00
Leosvel Pérez Espinosa e5a7460e65 cleanup(core): do not detect the terminal theme unnecessarily when running native tests (#32757)
## Current Behavior

When running `pnpm nx test-native nx`, OSC (Operating System Command)
escape sequences appear after the test completes, displaying as random
characters like `10;rgb:f8f8/f8f8/f2f2` and `11;rgb:0000/2b2b/3636`.

## Expected Behavior

Test execution should complete cleanly without any escape sequences
appearing in the terminal.

## Root Cause

The issue occurs because:
1. Tests in `tasks_list.rs` create `TasksList` components for testing UI
functionality
2. `TasksList` accesses the `THEME` static for styling (e.g.,
`THEME.secondary_fg`)
3. `THEME` is a `LazyLock` that initializes by calling `is_dark_mode()`
4. `is_dark_mode()` uses `terminal_colorsaurus::color_scheme()` which
sends OSC queries to detect terminal colors
5. The test process often exits before the terminal responds, leaving
orphaned responses that appear as escape sequences

## Solution

Added compile-time conditional compilation to skip terminal color
detection during tests:
- `#[cfg(test)]`: Returns `true` (dark mode) without sending OSC
queries. Tests run in virtual buffers and don't need the terminal theme.
It's also less deterministic to have tests relying on the terminal
theme.
- `#[cfg(not(test))]`: Performs normal terminal detection for production
use

This approach:
-  Eliminates OSC sequences during test execution
-  Preserves normal color detection in production
-  Provides deterministic test behavior regardless of terminal theme
-  Improves test performance by avoiding I/O operations
2025-09-17 10:23:42 -04:00
Colum Ferry e4f1d267fb fix(angular-rspack): show correct file sizes in build stats for i18n builds (#32758)
When i18n localization is enabled, rspack generates assets with locale
prefixes
(e.g., 'fr/main.abc123.js'), but chunk.files array is empty. This caused
the
stats reporting to show 0 bytes for all files.

Updated the asset filtering logic in stats.ts to:
- Try exact match first (preserves existing behavior for non-i18n
builds)
- Match assets by chunk names when chunk.files is empty (i18n builds)
- Handle assets with locale prefixes and hash values in filenames

Fixes #32277
2025-09-17 14:14:55 +01:00
Jack Hsu d345362bd6 docs(misc): strip Markdoc tags when processing API docs/examples (#32747)
Raw Markdoc tags ({% tabs %}, {% callout %}, {% graph %}) appear in
rendered Astro documentation pages, breaking the display.

Markdoc tags are transformed to Starlight-compatible syntax:
- {% tabs %} blocks converted to headers with content
- {% callout %} blocks converted to Starlight asides
- {% graph %} blocks removed entirely

Also fixed four example `.md` files that did not have closing `{% /tabs
%}` tag, which led to issues when stripping them.

## Callout example (swapped with aside)

BEFORE:
<img width="962" height="453" alt="Screenshot 2025-09-16 at 2 21 20 PM"
src="https://github.com/user-attachments/assets/12013b51-42dd-47f7-8290-cfa792532392"
/>

AFTER:
<img width="707" height="495" alt="Screenshot 2025-09-16 at 2 21 34 PM"
src="https://github.com/user-attachments/assets/f0d21811-e6cb-4189-b65d-43a0851fbf0f"
/>


## Tab example (inlined)

BEFORE:
<img width="971" height="464" alt="Screenshot 2025-09-16 at 2 20 15 PM"
src="https://github.com/user-attachments/assets/dcbc1491-762a-431d-891a-488b54bc7c36"
/>

AFTER:
<img width="681" height="1000" alt="Screenshot 2025-09-16 at 2 19 41 PM"
src="https://github.com/user-attachments/assets/898fff61-a553-420c-aa1e-4cfa46bfbd57"
/>

Fixes DOC-102
2025-09-17 08:42:13 -04:00
Jack Hsu 3334c9aa60 docs(misc): update header menu items per Linear task DOC-209 (#32749)
This PR fixes the header links so they don't point to old Next.js docs.
Also cleaned up outdated links.

<img width="805" height="671" alt="Screenshot 2025-09-16 at 4 06 11 PM"
src="https://github.com/user-attachments/assets/78123e6b-3421-4a0d-b114-0e43bc70356e"
/>


The sidebar is also updated to include links to Changelog and Plugin
Registry.
<img width="2672" height="1527" alt="Screenshot 2025-09-16 at 4 06
03 PM"
src="https://github.com/user-attachments/assets/dd097a40-666c-49d6-8a9b-9cf63523eb2f"
/>


## Related Issue(s)
Fixes DOC-209
2025-09-17 08:24:49 -04:00
Louie Weng 88f192827a chore(gradle): bump gradle plugin version to 0.1.8 (#32752)
<!-- 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
-->

Bump version of gradle plugin to 0.1.8

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

Fixes #
2025-09-16 21:56:59 +00:00
Jason Jean a429972481 Revert "feat(core): add NX_PROJECT_ROOT environment variable to runti… (#32736)
…me cache inputs (#31428)"

This reverts commit 5679b3ea

<!-- 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 -->

This commit caused a major perf regression.

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

This commit is reverted for now.

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

Fixes #
2025-09-16 15:10:27 -04:00
Caleb Ukle 08dcd682b8 docs(nx-dev): make sure ToC doesn't overflow page and is scrollable (#32746)
Fix pages with long ToC that overflow without scrolling and overlap with
footer

desktop:

https://github.com/user-attachments/assets/55065c70-dc16-4b72-be7d-e9dd919987c9

mobile:



https://github.com/user-attachments/assets/3fd225e8-c4f9-4caa-92a8-250c10736caa



Fixes DOC-191
2025-09-16 12:33:25 -05:00
Louie Weng 688ff139dd chore(gradle): bump version to 0.1.8 (#32741)
<!-- 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 -->

Gradle plugin is at version 0.1.7

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

Bump version to 0.1.8

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

Fixes #
2025-09-16 09:51:36 -07:00
Jack Hsu f87001cb66 docs(nx-dev): respect NEXT_PUBLIC_NO_INDEX variable for app router (#32667)
We already have `NEXT_PUBLIC_NO_INDEX` supported in pages router, so
canary.nx.dev does not get indexed. However, we missed this in the app
router, so `/blog` is not setting `noindex` in preview environments.
2025-09-16 11:46:47 -04:00
Leosvel Pérez Espinosa 5d7ba935d6 fix(core): kill child process correctly when run-script executor process is killed and not using pseudoterminal (#32699)
## Current Behavior

When running an npm script through nx and not using the PseudoTerminal,
child processes might not be killed when the `nx:run-script` executor is
killed.

## Expected Behavior

When running an npm script through nx and not using the PseudoTerminal,
child processes should be killed when the `nx:run-script` executor is
killed.
2025-09-16 09:44:32 -04:00
Leosvel Pérez Espinosa 040d7d7746 fix(angular): install a compatible version of jest for angular (#32744)
## Current Behavior

Generating Angular projects with Jest results in Jest v30 being used,
which is not supported by Angular and causes peer dependency errors.

## Expected Behavior

Generating Angular projects with Jest should install a compatible
version of Jest (Angular currently supports `^29.5.0`).
2025-09-16 14:50:29 +02:00
MaxKless 7ba9a24809 feat(core): generate AI files in create-nx-workspace (#32442) 2025-09-16 09:34:31 +00:00
Jack Hsu 98c47f004f docs(misc): add API docs for nx, workspace, web, plugin (#32739)
This PR adds the missing API docs for nx, workspace, web, and plugin.

## What's changed

- Added missing plugins to `astro-docs/src/pages/references/`
- Update sidebar with new API docs
- Hide deprecated docs from sidebar (these should not be shown)
- Redirects are updated with the new API docs

<img width="1379" height="1210" alt="image"
src="https://github.com/user-attachments/assets/e590a74a-d427-4c6c-b253-a96af9d2c7b3"
/>


<img width="1382" height="1207" alt="image"
src="https://github.com/user-attachments/assets/3c607cd3-9acd-4461-8c8f-9395228951d3"
/>

<img width="1363" height="1205" alt="image"
src="https://github.com/user-attachments/assets/4de36af2-9e58-4579-bca1-4e2a792ab79b"
/>


Closes #DOC-205
2025-09-15 19:24:36 +00:00
Jack Hsu afe5d17c9f chore(repo): fix slack notifcation to use mention_users (#32738)
It was incorrectly using `mention_groups` but should be `mention_users`.
2025-09-15 14:53:21 -04:00
Jack Hsu 86b3285b02 docs(misc): add missing guides and fix all redirects (#32735)
Add missing Nx Cloud documentation pages.

Files added:
- astro-docs/src/content/docs/reference/Nx Cloud/config.mdoc
- astro-docs/src/content/docs/reference/Nx Cloud/release-notes.mdoc
- astro-docs/src/content/docs/guides/Nx Cloud/optimize-your-ttg.mdoc

Redirects fixed:
- 8 CI/concepts pages now point to correct locations

Closes DOC-204

<!-- 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 #
2025-09-15 14:33:11 -04:00
Caleb Ukle 81010ac16a docs(nx-dev): update self-healing ci supported vcs providers (#32722)
clarify gh vcs required right now, with other providers coming soon.
2025-09-15 12:44:14 -04:00
Leosvel Pérez Espinosa 27b14a75c3 feat(testing): support inferring atomized tasks for cypress component tests (#32733)
## Current Behavior

There's no way to distribute Cypress Component Tests.

## Expected Behavior

Cypress Component Tests can be distributed.

Users can choose to infer individual tasks per Cypress Component Test
files that can be distributed across Nx Agents using DTE, by setting the
`ciComponentTestingTargetName` option for the `@nx/cypress/plugin`:

```json
// nx.json
{
  ...
  "plugins": [
    {
      "plugin": "@nx/cypress/plugin",
      "options": {
        ...
        "componentTestingTargetName": "component-test",
        "ciComponentTestingTargetName": "component-test-ci"
      }
    },
    ...
  ]
}
```
2025-09-15 11:57:23 -04:00
MaxKless 537bb4258c fix(gradle): use project configurations to determine project dependencies (#32704)
## Current Behavior
gradle dependencies are hardcoded to included builds & subprojects

## Expected Behavior
we use project configurations to determine dependencies like the tooling
api does

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

Fixes #

---------

Co-authored-by: lourw <56288712+lourw@users.noreply.github.com>
2025-09-15 10:42:20 -04:00
Rares Matei 910ea7cc44 docs(nx-cloud): add release notes (#32731)
<!-- 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 #
2025-09-15 15:36:09 +01:00
Leosvel Pérez Espinosa e574baf2aa feat(angular): support angular v20.3.0 (#32730)
## Current Behavior

Angular v20.3.0 is not supported.

## Expected Behavior

Angular v20.3.0 should be supported.
2025-09-15 10:07:43 -04:00
MaxKless 44fdc7ae6e fix(core): add missing view command to npm (#32729) 2025-09-15 08:56:12 +00:00
Caleb Ukle e3fcad3f30 docs(nx-dev): clean up duplicate docs for react and MF (#32710)
remove remix and react-native guides and redirect to their intro pages
since they functionally covered the same content already

remove the Module federation concepts since those were already
removed/redirected in the main nx.dev and didn't need to be copied over
to astro site.

fixes: DOC-183
2025-09-12 15:21:09 -05:00
Jack Hsu 99d3d2aebf docs(misc): fix tab alignment on mobile devices (#32720)
Tabs were not aligning properly on mobile, causing visual
inconsistencies. Added align-items: end to tablist elements to ensure
proper vertical alignment.

<img width="528" height="614" alt="image"
src="https://github.com/user-attachments/assets/b9a1d9b3-c051-43ac-9454-21b16c7f21b5"
/>


Fixes DOC-168

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-09-12 14:08:37 -04:00
Colum Ferry 67f60e729f feat(release): new option preserveMatchingDependencyRanges to not update matching version ranges (#32556)
## Current Behavior
When updating manifests, Nx Release will replace explicit peerDependency
ranges with the new version that is being created.
i.e.

```json
"peerDependencies": {
  "nx": ">= 20 <= 22"
}
```

`nx release version 21.6.0`

```json
"peerDependencies": {
  "nx": "21.6.0"
}
```

## Expected Behavior
When processing dependency updates, check for
`preserveMatchingDependencyRanges`.
If this is set to `true` or an array with explicit `dependencyTypes`
check if a valid range is set.
If so, do not update the range.

i.e.
`preserveMatchingDependencyRanges: true`

```json
"peerDependencies": {
  "nx": ">= 20 <= 22"
}
```

`nx release version 21.6.0`

```json
"peerDependencies": {
  "nx": ">= 20 <= 22"
}
```

If the new version breaks the range, throw an error asking user to
update the range.

i.e.

```json
"optionalDependencies": {
  "nx": ">= 20 <= 22"
}
```

`nx release version 23.2.0`

```
The version "23.2.0" is not a valid range for optionalDependencies "nx" in manifest "dist/packages/devkit/package.json". Please update to a valid range.
```

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-09-12 18:07:25 +01:00
Jack Hsu c193928f41 fix(nx-dev): implement client-side routing for documentation URLs (#32708)
Update all documentation links in nx-dev UI components to conditionally
use the new /docs
structure when NEXT_PUBLIC_ASTRO_URL is set. This prevents landing on
the old docs page due to the lack of redirect support in Next.js'
`<Link>` when used with pages router.

Note: Blog pages are not updated in `docs/blog` because blog is using
app router which supports redirects. For example, on
https://canary.nx.dev/blog/nx-self-healing-ci the link at the end for
`Nx AI Docs` point to https://canary.nx.dev/features/enhance-AI and is
correctly redirected to https://canary.nx.dev/docs/features/enhance-ai.

## Logic

- When NEXT_PUBLIC_ASTRO_URL is set: links point to /docs/* URLs
- When NEXT_PUBLIC_ASTRO_URL is not set: links use legacy URLs (current
production behavior)

## Pages and components updated

### Pages router pages and components

These are critical since pages router does not support redirects in next
config.

  - Homepage (/) components
  - AI Page (/ai) components
  - Enterprise Page (/enterprise) components
  - NX Cloud (/nx-cloud) components
  - Pricing (/pricing) components
  - Community (/community) components
  - Contact (/contact) components
  - Powerpack (/powerpack) components
  - Gradle pages components
  - Common UI components (footer, headers, sidebar)
  - Solution pages (engineering, leadership, management)
  - Changelog (/changelog)

### App router pages

These pages would have worked regardless since app router supports
redirects in next config.

  - React Page (/react):
    - ui-react/src/lib/hero.tsx - 1 link
    - ui-react/src/lib/features.tsx - 4 links
    - ui-react/src/lib/feature-sections.tsx - 3 links
  - Powerpack Page (/powerpack):
    - ui-powerpack/src/lib/powerpack-features.tsx - 2 links
  - Remote Cache Page (/remote-cache):
    - ui-remote-cache/src/lib/remote-cache-solutions.tsx - 2 links
    - ui-remote-cache/src/lib/faq.tsx - 1 link

---

Verified with NEXT_PUBLIC_ASTRO_URL=https://canary.nx.dev:
- All links now point to /docs URLs (no 308 redirects)
- Old URLs still redirect for backward compatibility
- Pages load successfully with updated links

Fixes DOC-184
2025-09-12 12:26:35 -04:00
Colum Ferry bb6f60b7c5 docs(module-federation): update outdated module federation docs (#32624)
## Current Behavior
The Module Federation docs had out of date code snippets

## Expected Behavior
Bring the Module Federation docs in line with recent developments
2025-09-12 17:20:45 +01:00
Colum Ferry 459dc88b4e feat(docker): ensure docker:build dependsOn build (#32697)
## Current Behavior
The inferred `docker:build` target does not depend on the build target.
Given that most `docker build` commands rely on the initial application
itself to be built first, it makes sense to depend on the build target.

## Expected Behavior
`docker:build` dependsOn `build`
2025-09-12 12:20:14 -04:00
Jack Hsu e1fb42327d docs(misc): mobile menu icon respects theme color (#32717)
The mobile menu icon (hamburger menu) in astro-docs does not properly
respect the theme color, making it hard to see in dark mode.

The mobile menu icon should be visible in both light and dark themes
with appropriate colors, transparent background, and no box shadow.

<img width="633" height="431" alt="image"
src="https://github.com/user-attachments/assets/30e170d7-4eac-4933-84ab-7f3150747721"
/>

<img width="632" height="375" alt="image"
src="https://github.com/user-attachments/assets/ad095dc9-8c9c-4b26-b13a-8cfabdd9ba99"
/>
<img width="597" height="430" alt="image"
src="https://github.com/user-attachments/assets/25caf367-aa10-4ddb-b08a-5ebaa662addc"
/>
<img width="596" height="391" alt="image"
src="https://github.com/user-attachments/assets/6dc566b7-3559-45a6-a4a8-c21a8121143e"
/>


Fixes DOC-169
2025-09-12 12:16:33 -04:00
MaxKless d02b7f46b0 fix(core): improve error messages for provenance checks (#32680) 2025-09-12 16:38:31 +02:00
4232 changed files with 110270 additions and 202277 deletions
+87
View File
@@ -0,0 +1,87 @@
---
name: run-nx-generator
description: Run Nx generators with prioritization for workspace-plugin generators. Use this when generating code, scaffolding new features, or automating repetitive tasks in the monorepo.
allowed-tools: Bash, Read, Glob, Grep, mcp__nx-mcp__nx_generators, mcp__nx-mcp__nx_generator_schema
---
# Run Nx Generator
This skill helps you execute Nx generators efficiently, with special focus on workspace-plugin generators from your internal tooling.
## Generator Priority List
Use the `mcp__nx-mcp__nx_generator_schema` tool to get more information about how to use the generator
Choose which generators to run in this priority order:
### 🔥 Workspace-Plugin Generators (High Priority)
These are your custom internal tools in `tools/workspace-plugin/`
### 📦 Core Nx Generators (Standard)
Only use these if workspace-plugin generators don't fit:
- `nx generate @nx/devkit:...` - DevKit utilities
- `nx generate @nx/node:...` - Node.js libraries
- `nx generate @nx/react:...` - React components and apps
- Framework-specific generators
## How to Run Generators
1. **List available generators**:
2. **Get generator schema** (to see available options):
Use the `mcp__nx-mcp__nx_generator_schema` tool to get more information about how to use the generator
3. **Run the generator**:
```bash
nx generate [generator-path] [options]
```
4. **Verify the changes**:
- Review generated files
- Run tests: `nx affected -t test`
- Format code: `npx prettier --write [files]`
## Best Practices
- ✅ Always check workspace-plugin first - it has your custom solutions
- ✅ Use `--dry-run` flag to preview changes before applying
- ✅ Format generated code immediately with Prettier
- ✅ Test affected projects after generation
- ✅ Commit generator changes separately from manual edits
## Examples
### Bumping Maven Version
When updating the Maven plugin version, use the workspace-plugin generator:
```bash
nx generate @nx/workspace-plugin:bump-maven-version \
--newVersion 0.0.10 \
--nxVersion 22.1.0-beta.7
```
This automates all the version bumping instead of manual file edits.
### Creating a New Plugin
For creating a new create-nodes plugin:
```bash
nx generate @nx/workspace-plugin:create-nodes-plugin \
--name my-custom-plugin
```
## When to Use This Skill
Use this skill when you need to:
- Generate new code or projects
- Scaffold new features or libraries
- Automate repetitive setup tasks
- Update internal tools and configurations
- Create migrations or version updates
+4 -4
View File
@@ -8,11 +8,11 @@
// Try a more recent distribution, if your are having build issues related to GLIBC version
// Here we use 'bookworm', which is based on `Debian-12`, which comes with `GLIBC v2.36`
// (Nx tools currenlty requires `GLIBC v2.33` or higher)
"image": "mcr.microsoft.com/devcontainers/typescript-node:20-bookworm",
// Note: Using base debian image instead of typescript-node since mise will manage all tools
"image": "mcr.microsoft.com/devcontainers/base:bookworm",
"features": {
"ghcr.io/devcontainers/features/rust:1": {}
},
// All tools (Node, Java, Rust, Dotnet) are managed by mise via mise.toml
"features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// 4211 = nx graph port
+23 -5
View File
@@ -1,12 +1,30 @@
#!/bin/sh
#!/bin/bash
# Update the underlying (Debian) OS, to make sure we have the latest security patches and libraries like 'GLIBC'
# Update the underlying (Debian) OS, to make sure we have the latest security patches and libraries like 'GLIBC'
echo "⚙️ Updating the underlying OS..."
sudo apt-get update && sudo apt-get -y upgrade
# Uninstall globally installed PNPM (required version will be reinstalled through corepack)
echo "❌ Uninstalling globally installed PNPM..."
npm uninstall -g pnpm
# Install mise for managing development tools (Node, Java, Rust, Dotnet)
echo "⚙️ Installing mise..."
curl https://mise.run | sh
# Add mise to PATH
export PATH="$HOME/.local/bin:$PATH"
# Trust the mise.toml configuration file
echo "⚙️ Trusting mise.toml configuration..."
mise trust
# Install all tools from mise.toml (node, java, rust, dotnet)
echo "⚙️ Installing tools via mise (node, java, rust, dotnet)..."
mise install
# Activate mise to make tools available in current shell
eval "$(mise activate bash)"
# Add mise activation to bashrc for future shell sessions
echo "⚙️ Configuring mise activation in shell..."
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
# Prevent corepack from prompting user before downloading PNPM
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
+1 -1
View File
@@ -9,7 +9,7 @@ end_of_line = lf
insert_final_newline = true
# 4 space indentation
[*.{js,ts,jsx,tsx}]
[*.{kts,kt,js,ts,jsx,tsx}]
indent_style = space
indent_size = 2
+10
View File
@@ -0,0 +1,10 @@
{
"mcpServers": {
"nx-mcp": {
"type": "stdio",
"command": "npx",
"args": ["nx", "mcp"]
}
},
"contextFileName": "AGENTS.md"
}
@@ -28,12 +28,12 @@ Note: We reserve the right to remove unmaintained plugins from the registry. If
## Steps to Submit Your Plugin
- Use the following commit message template: `chore(core): nx plugin submission [PLUGIN_NAME]`
- Update the `community/approved-plugins.json` file with a new entry for your plugin that includes `name`, `url`, `description`:
- Update the `astro-docs/src/content/approved-community-plugins.json` file with a new entry for your plugin that includes `name`, `url`, `description`:
Example:
```json
// community/approved-plugins.json
// astro-docs/src/content/approved-community-plugins.json
[{
"name": "@community/plugin",
@@ -42,7 +42,7 @@ Example:
}]
```
Once merged, your plugin will be available when running the `nx list` command, and will also be available in the Plugin Registry on [nx.dev](https://nx.dev/plugin-registry)
Once merged, your plugin will be available when running the `nx list` command, and will also be available in the Plugin Registry on [nx.dev](https://nx.dev/docs/plugin-registry)
-->
# Community Plugin Submission
+69 -38
View File
@@ -11,6 +11,7 @@ on:
env:
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
NX_CLOUD_ENABLE_METRICS_COLLECTION: 'true'
PNPM_HOME: ~/.pnpm
jobs:
@@ -46,7 +47,7 @@ jobs:
main-branch-name: 'master'
- name: Start CI Run
run: npx nx-cloud@next start-ci-run --distribute-on="./.nx/workflows/dynamic-changesets.yaml" --stop-agents-after="e2e"
run: npx nx-cloud@next start-ci-run --auto-apply-fixes="*format:check*,*sync:check*,*conformance:check*,*format-native*,*lint-native*,*lint*,*astro-docs:validate-links*" --distribute-on="./.nx/workflows/dynamic-changesets.yaml" --stop-agents-after="e2e"
- name: Install dependencies
run: |
@@ -64,7 +65,7 @@ jobs:
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: 20
node-version: 24
cache: 'pnpm'
- name: Install Rust
@@ -77,6 +78,7 @@ jobs:
with:
distribution: temurin
java-version: 17
cache: maven
- name: Setup Gradle
uses: gradle/actions/setup-gradle@48b5f213c81028ace310571dc5ec0fbbca0b2947 # v4.4.3
@@ -86,9 +88,9 @@ jobs:
pnpm install --frozen-lockfile
pnpm playwright install --with-deps
- name: Check Documentation
run: pnpm nx documentation
timeout-minutes: 20
- name: Nx Report
run:
pnpm nx report
- name: Run Checks/Lint/Test/Build
run: |
@@ -103,10 +105,10 @@ jobs:
pnpm nx-cloud record -- nx-cloud conformance:check
pids+=($!)
pnpm nx run-many -t check-imports check-commit check-lock-files check-codeowners --parallel=1 --no-dte &
pnpm nx run-many -t check-imports check-lock-files check-codeowners --parallel=1 --no-dte &
pids+=($!)
pnpm nx affected --targets=lint,test,build,e2e,e2e-ci,format-native,lint-native &
pnpm nx affected --targets=lint,test,test-kt,build,e2e,e2e-ci,format-native,lint-native &
pids+=($!)
for pid in "${pids[@]}"; do
@@ -148,7 +150,30 @@ jobs:
run: git fetch origin master:master
if: ${{ github.event_name == 'pull_request' }}
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: 24
package-manager-cache: false
- name: Set SHAs
uses: nrwl/nx-set-shas@1859e66a83ac9be0dceecbd9a023702e27ac47f4 # v4.3.3
with:
main-branch-name: 'master'
- name: Check for React Native changes
id: check-changes
run: |
HAS_CHANGED=$(node ./scripts/check-react-native-changes.js $NX_BASE $NX_HEAD);
if $HAS_CHANGED; then
echo "has_changes=true" >> $GITHUB_OUTPUT
echo "React Native projects are affected, will run macOS tests"
else
echo "has_changes=false" >> $GITHUB_OUTPUT
echo "No React Native projects affected, skipping macOS tests"
fi
- name: Restore Homebrew packages
if: steps.check-changes.outputs.has_changes == 'true'
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: |
@@ -157,11 +182,12 @@ jobs:
key: nrwl-nx-homebrew-packages
- name: Configure Detox Environment, Install applesimutils
if: steps.check-changes.outputs.has_changes == 'true'
run: |
# Ensure Xcode command line tools are installed and configured
xcode-select --print-path || sudo xcode-select --reset
sudo xcode-select -s /Applications/Xcode.app
# Install or update applesimutils with error handling
if ! brew list applesimutils &>/dev/null; then
echo "Installing applesimutils..."
@@ -175,44 +201,45 @@ jobs:
echo "Updating applesimutils..."
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade applesimutils || true
fi
# Verify applesimutils installation
applesimutils --version || (echo "applesimutils installation failed" && exit 1)
# Configure environment for M-series Mac
echo "DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer" >> $GITHUB_ENV
echo "PLATFORM_NAME=iOS Simulator" >> $GITHUB_ENV
# Set additional environment variables for better debugging
echo "DETOX_DISABLE_TELEMETRY=1" >> $GITHUB_ENV
echo "DETOX_LOG_LEVEL=trace" >> $GITHUB_ENV
# Verify Xcode installation
xcodebuild -version
# List available simulators
xcrun simctl list devices available
timeout-minutes: 10
continue-on-error: false
- name: Reset iOS Simulators
if: steps.check-changes.outputs.has_changes == 'true'
id: reset-simulators
run: |
echo "Resetting iOS Simulators..."
# Kill simulator processes
sudo killall -9 com.apple.CoreSimulator.CoreSimulatorService 2>/dev/null || true
killall "Simulator" 2>/dev/null || true
killall "iOS Simulator" 2>/dev/null || true
# Wait for processes to terminate
sleep 3
# Shutdown and erase all simulators (ignore failures)
xcrun simctl shutdown all 2>/dev/null || true
sleep 5
xcrun simctl erase all 2>/dev/null || true
# If erase failed, try the nuclear option
if xcrun simctl list devices | grep -q "Booted" 2>/dev/null; then
echo "Standard reset failed, using nuclear option..."
@@ -220,25 +247,25 @@ jobs:
launchctl remove com.apple.CoreSimulator.CoreSimulatorService 2>/dev/null || true
sleep 3
fi
# Clean up additional directories
rm -rf ~/Library/Developer/CoreSimulator/Caches/* 2>/dev/null || true
rm -rf ~/Library/Logs/CoreSimulator/* 2>/dev/null || true
rm -rf ~/Library/Developer/Xcode/DerivedData/* 2>/dev/null || true
echo "Simulator reset completed"
timeout-minutes: 5
continue-on-error: true
- name: Verify Simulator Reset
if: ${{ steps.reset-simulators.outcome == 'success' }}
if: steps.check-changes.outputs.has_changes == 'true' && steps.reset-simulators.outcome == 'success'
run: |
# Verify CoreSimulator service restarted
pgrep -fl "CoreSimulator" || (echo "CoreSimulator service not running" && exit 1)
# Check simulator list is clean
xcrun simctl list devices
# Verify simulator runtime paths exist and are writable
test -d ~/Library/Developer/CoreSimulator/Devices || (echo "Simulator devices directory missing" && exit 1)
touch ~/Library/Developer/CoreSimulator/Devices/test || (echo "Simulator devices directory not writable" && exit 1)
@@ -246,7 +273,7 @@ jobs:
timeout-minutes: 5
- name: Diagnose Simulator Reset Failure
if: ${{ steps.reset-simulators.outcome == 'failure' }}
if: steps.check-changes.outputs.has_changes == 'true' && steps.reset-simulators.outcome == 'failure'
run: |
echo "Simulator reset failed. Collecting diagnostic information..."
xcrun simctl list
@@ -254,6 +281,7 @@ jobs:
ls -la ~/Library/Logs/CoreSimulator/ || echo "No simulator logs found"
- name: Save Homebrew Cache
if: steps.check-changes.outputs.has_changes == 'true'
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: |
@@ -262,36 +290,39 @@ jobs:
key: nrwl-nx-homebrew-packages
- uses: pnpm/action-setup@7088e561eb65bb68695d245aa206f005ef30921d # v4.1.0
if: steps.check-changes.outputs.has_changes == 'true'
name: Install pnpm
with:
version: 10.11.1
run_install: false
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
- name: Get pnpm store directory
if: steps.check-changes.outputs.has_changes == 'true'
id: pnpm-cache
run: echo "path=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Cache pnpm store
if: steps.check-changes.outputs.has_changes == 'true'
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
node-version: 20
cache: 'pnpm'
path: ${{ steps.pnpm-cache.outputs.path }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install Rust
if: steps.check-changes.outputs.has_changes == 'true'
uses: actions-rust-lang/setup-rust-toolchain@ac90e63697ac2784f4ecfe2964e1a285c304003a # v1
with:
rustflags: ''
- name: Install project dependencies
if: steps.check-changes.outputs.has_changes == 'true'
run: |
pnpm install --frozen-lockfile
pnpm playwright install --with-deps
- name: Set SHAs
uses: nrwl/nx-set-shas@1859e66a83ac9be0dceecbd9a023702e27ac47f4 # v4.3.3
with:
main-branch-name: 'master'
- name: Run E2E Tests for macOS
if: steps.check-changes.outputs.has_changes == 'true'
run: |
HAS_CHANGED=$(node ./scripts/check-react-native-changes.js $NX_BASE $NX_HEAD);
if $HAS_CHANGED; then
pnpm nx affected -t e2e-macos-local --parallel=1 --base=$NX_BASE --head=$NX_HEAD
else
echo "Skip E2E tests for macOS as there are no changes in React Native projects."
fi
pnpm nx affected -t e2e-macos-local --parallel=1 --base=$NX_BASE --head=$NX_HEAD
+5
View File
@@ -51,6 +51,8 @@ jobs:
build-mode: none
- language: rust
build-mode: none
- language: csharp
build-mode: autobuild
# CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
# Use `c-cpp` to analyze code written in C, C++ or both
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
@@ -63,6 +65,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup Language Tooling
uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
# Add any setup steps before running the `github/codeql-action/init` action.
# This includes steps like installing compilers or runtimes (`actions/setup-node`
# or others). This is typically only required for manual builds.
+5
View File
@@ -46,6 +46,8 @@ jobs:
build-mode: none
- language: rust
build-mode: none
- language: csharp
build-mode: autobuild
# CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
# Use `c-cpp` to analyze code written in C, C++ or both
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
@@ -58,6 +60,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup Language Tooling
uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
# Add any setup steps before running the `github/codeql-action/init` action.
# This includes steps like installing compilers or runtimes (`actions/setup-node`
# or others). This is typically only required for manual builds.
+60 -55
View File
@@ -2,7 +2,7 @@ name: E2E matrix
on:
schedule:
- cron: "0 5 * * *"
- cron: '0 5 * * *'
workflow_dispatch:
inputs:
debug_enabled:
@@ -14,7 +14,7 @@ on:
env:
CYPRESS_CACHE_FOLDER: ${{ github.workspace }}/.cypress
permissions: { }
permissions: {}
jobs:
preinstall:
if: ${{ github.repository_owner == 'nrwl' }}
@@ -28,19 +28,20 @@ jobs:
# - windows-latest Windows fails to build gradle wrapper which always runs when we build nx.
## https://staging.nx.app/runs/LgD4vxGn8w?utm_source=pull-request&utm_medium=comment
node_version:
# TODO(v23): remove node 20 - EOL April 2026
- 20
- 22
# - 23
- 24
exclude:
# run just node v20 on macos and windows
# run just node v24 on macos and windows
- os: macos-latest
node_version: 20
- os: macos-latest
node_version: 22
# - os: macos-latest
# node_version: 23
# - os: windows-latest TODO (emily): Windows fails to build gradle wrapper which always runs when we build nx. Re-enable when we fix this.
# node_version: 22
# - os: windows-latest TODO (emily): Windows fails to build gradle wrapper which always runs when we build nx. Re-enable when we fix this.
# node_version: 23
# - os: windows-latest TODO(Jack): Windows fails to build gradle wrapper which always runs when we build nx. Re-enable when we fix this.
# node_version: 20
# - os: windows-latest TODO (Jack): Windows fails to build gradle wrapper which always runs when we build nx. Re-enable when we fix this.
# node_version: 22
name: Cache install (${{ matrix.os }}, node v${{ matrix.node_version }})
steps:
@@ -127,8 +128,7 @@ jobs:
- name: Process matrix data
id: process-json
run:
echo "MATRIX=$(npx tsx .github/workflows/nightly/process-matrix.ts | jq -c .)" >> $GITHUB_OUTPUT
run: echo "MATRIX=$(npx tsx .github/workflows/nightly/process-matrix.ts | jq -c .)" >> $GITHUB_OUTPUT
e2e:
if: ${{ github.repository_owner == 'nrwl' }}
@@ -138,7 +138,7 @@ jobs:
permissions:
contents: read
runs-on: ${{ matrix.os }}
timeout-minutes: 200 # <- cap each job to 200 minutes
timeout-minutes: 200 # <- cap each job to 200 minutes
strategy:
matrix: ${{fromJson(needs.prepare-matrix.outputs.matrix)}} # Load matrix from previous job
fail-fast: false
@@ -176,7 +176,12 @@ jobs:
- name: Load Cargo Env
if: ${{ matrix.os != 'windows-latest' }}
run: echo "PATH=$HOME/.cargo/bin:$PATH" >> $GITHUB_ENV
- name: Setup .NET 9
uses: actions/setup-dotnet@d4c94342e560b34958eacfc5d055d21461ed1c5d # v5.0.0
with:
dotnet-version: '9.0.x'
- name: Install bun
if: ${{ matrix.os != 'windows-latest' }}
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2
@@ -195,7 +200,7 @@ jobs:
# https://github.com/actions/virtual-environments/issues/2840
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf '/usr/local/share/boost'
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
sudo apt-get install lsof
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
@@ -231,35 +236,35 @@ jobs:
# Ensure Xcode command line tools are installed and configured
xcode-select --print-path || sudo xcode-select --reset
sudo xcode-select -s /Applications/Xcode.app
# Install or update applesimutils with error handling
if ! brew list applesimutils &>/dev/null; then
echo "Installing applesimutils..."
echo 'Installing applesimutils...'
HOMEBREW_NO_AUTO_UPDATE=1 brew tap wix/brew >/dev/null
HOMEBREW_NO_AUTO_UPDATE=1 brew install applesimutils >/dev/null || {
echo "Failed to install applesimutils, retrying with update..."
echo 'Failed to install applesimutils, retrying with update...'
brew update
HOMEBREW_NO_AUTO_UPDATE=1 brew install applesimutils
}
else
echo "Updating applesimutils..."
echo 'Updating applesimutils...'
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade applesimutils || true
fi
# Verify applesimutils installation
applesimutils --version || (echo "applesimutils installation failed" && exit 1)
applesimutils --version || (echo 'applesimutils installation failed' && exit 1)
# Configure environment for M-series Mac
echo "DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer" >> $GITHUB_ENV
echo "PLATFORM_NAME=iOS Simulator" >> $GITHUB_ENV
echo 'DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer' >> $GITHUB_ENV
echo 'PLATFORM_NAME=iOS Simulator' >> $GITHUB_ENV
# Set additional environment variables for better debugging
echo "DETOX_DISABLE_TELEMETRY=1" >> $GITHUB_ENV
echo "DETOX_LOG_LEVEL=trace" >> $GITHUB_ENV
echo 'DETOX_DISABLE_TELEMETRY=1' >> $GITHUB_ENV
echo 'DETOX_LOG_LEVEL=trace' >> $GITHUB_ENV
# Verify Xcode installation
xcodebuild -version
timeout-minutes: 10
continue-on-error: false
@@ -267,35 +272,35 @@ jobs:
if: ${{ matrix.os == 'macos-latest' }}
id: reset-simulators
run: |
echo "Resetting iOS Simulators..."
echo 'Resetting iOS Simulators...'
# Kill simulator processes
sudo killall -9 com.apple.CoreSimulator.CoreSimulatorService 2>/dev/null || true
killall "Simulator" 2>/dev/null || true
killall "iOS Simulator" 2>/dev/null || true
killall 'Simulator' 2>/dev/null || true
killall 'iOS Simulator' 2>/dev/null || true
# Wait for processes to terminate
sleep 3
# Shutdown and erase all simulators (ignore failures)
xcrun simctl shutdown all 2>/dev/null || true
sleep 5
xcrun simctl erase all 2>/dev/null || true
# If erase failed, try the nuclear option
if xcrun simctl list devices | grep -q "Booted" 2>/dev/null; then
echo "Standard reset failed, using nuclear option..."
if xcrun simctl list devices | grep -q 'Booted' 2>/dev/null; then
echo 'Standard reset failed, using nuclear option...'
rm -rf ~/Library/Developer/CoreSimulator/Devices/* 2>/dev/null || true
launchctl remove com.apple.CoreSimulator.CoreSimulatorService 2>/dev/null || true
sleep 3
fi
# Clean up additional directories
rm -rf ~/Library/Developer/CoreSimulator/Caches/* 2>/dev/null || true
rm -rf ~/Library/Logs/CoreSimulator/* 2>/dev/null || true
rm -rf ~/Library/Developer/Xcode/DerivedData/* 2>/dev/null || true
echo "Simulator reset completed"
echo 'Simulator reset completed'
timeout-minutes: 5
continue-on-error: true
@@ -303,27 +308,27 @@ jobs:
if: ${{ matrix.os == 'macos-latest' && steps.reset-simulators.outcome == 'success' }}
run: |
# Verify CoreSimulator service restarted
pgrep -fl "CoreSimulator" || (echo "CoreSimulator service not running" && exit 1)
pgrep -fl 'CoreSimulator' || (echo 'CoreSimulator service not running' && exit 1)
# Verify simulator runtime paths exist and are writable
test -d ~/Library/Developer/CoreSimulator/Devices || (echo "Simulator devices directory missing" && exit 1)
touch ~/Library/Developer/CoreSimulator/Devices/test || (echo "Simulator devices directory not writable" && exit 1)
test -d ~/Library/Developer/CoreSimulator/Devices || (echo 'Simulator devices directory missing' && exit 1)
touch ~/Library/Developer/CoreSimulator/Devices/test || (echo 'Simulator devices directory not writable' && exit 1)
rm ~/Library/Developer/CoreSimulator/Devices/test
timeout-minutes: 5
- name: Diagnose Simulator Reset Failure
if: ${{ matrix.os == 'macos-latest' && steps.reset-simulators.outcome == 'failure' }}
run: |
echo "Simulator reset failed. Collecting diagnostic information..."
echo 'Simulator reset failed. Collecting diagnostic information...'
xcrun simctl list
echo "Checking simulator logs..."
ls -la ~/Library/Logs/CoreSimulator/ || echo "No simulator logs found"
echo 'Checking simulator logs...'
ls -la ~/Library/Logs/CoreSimulator/ || echo 'No simulator logs found'
- name: Configure git metadata (needed for lerna smoke tests)
if: ${{ (matrix.os != 'macos-latest') || (matrix.os == 'macos-latest' && steps.reset-simulators.outcome == 'success') }}
run: |
git config --global user.email test@test.com
git config --global user.name "Test Test"
git config --global user.name 'Test Test'
- name: Set starting timestamp
if: ${{ (matrix.os != 'macos-latest') || (matrix.os == 'macos-latest' && steps.reset-simulators.outcome == 'success') }}
@@ -352,18 +357,18 @@ jobs:
npm_config_registry: http://localhost:4872
YARN_REGISTRY: http://localhost:4872
CI: true
- name: Run e2e tests with npm (macOS)
id: e2e-run-npm
if: ${{ matrix.os == 'macos-latest' && steps.reset-simulators.outcome == 'success' }}
run: |
# Run the tests
if [[ "${{ matrix.project }}" == "e2e-detox" ]] || [[ "${{ matrix.project }}" == "e2e-react-native" ]] || [[ "${{ matrix.project }}" == "e2e-expo" ]]; then
if [[ '${{ matrix.project }}' == 'e2e-detox' ]] || [[ '${{ matrix.project }}' == 'e2e-react-native' ]] || [[ '${{ matrix.project }}' == 'e2e-expo' ]]; then
NX_E2E_VERBOSE_DEBUG=1 pnpm nx run ${{ matrix.project }}:e2e-macos-local
else
NX_E2E_VERBOSE_DEBUG=1 pnpm nx run ${{ matrix.project }}:e2e-local
fi
env:
NX_E2E_CI_CACHE_KEY: e2e-gha-${{ matrix.os }}-${{ matrix.node_version }}-${{ matrix.package_manager }}
NX_PERF_LOGGING: 'false'
@@ -387,10 +392,10 @@ jobs:
before=${{ steps.before-e2e.outputs.timestamp }}
now=$(date +%s)
delta=$(($now - $before))
# Determine the outcome based on which step ran
outcome="${{ matrix.os == 'macos-latest' && steps.e2e-run-npm.outcome || steps.e2e-run-pnpm.outcome }}"
outcome='${{ matrix.os == 'macos-latest' && steps.e2e-run-npm.outcome || steps.e2e-run-pnpm.outcome }}'
matrix=$((
echo '${{ toJSON(matrix) }}'
) | jq --argjson delta $delta -c '. + { "status": "'"$outcome"'", "duration": $delta }')
+8 -4
View File
@@ -3,14 +3,14 @@ name: Generate embeddings
on:
schedule:
- cron: "0 5 * * 0,4" # sunday, thursday 5AM
workflow_dispatch:
jobs:
cache-and-install:
if: github.repository == 'nrwl/nx'
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['20.19.0']
node-version: ['24']
steps:
- name: Checkout
@@ -19,7 +19,8 @@ jobs:
- name: Install Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: '20.19.0'
node-version: '24'
package-manager-cache: false
- name: Install pnpm
uses: pnpm/action-setup@7088e561eb65bb68695d245aa206f005ef30921d # v4.1.0
@@ -45,8 +46,11 @@ jobs:
- name: Install dependencies
run: pnpm install --no-frozen-lockfile
- name: Build docs
run: npx nx build astro-docs
- name: Run embeddings script
run: pnpm exec nx run tools-documentation-create-embeddings:run-node
run: node --import tsx tools/documentation/create-embeddings/src/main.mts --mode=astro
env:
NX_NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NX_NEXT_PUBLIC_SUPABASE_URL }}
NX_SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.NX_SUPABASE_SERVICE_ROLE_KEY }}
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: '20.19.0'
node-version: '24'
cache: 'pnpm'
- name: Cache node_modules
+5 -4
View File
@@ -67,6 +67,7 @@ const matrixData: MatrixData = {
{ name: 'e2e-storybook', codeowners: 'S04SVQ8H0G5' },
{ name: 'e2e-nuxt', codeowners: 'S04SJ6PL98X' }
],
// TODO(v23): remove node 20 - EOL April 2026
nodeTLS: 20,
setup: [
{
@@ -74,12 +75,12 @@ const matrixData: MatrixData = {
os_name: 'Linux',
os_timeout: 60,
package_managers: ['npm', 'pnpm', 'yarn'],
node_versions: ['20.19.0', '22.12.0'],
node_versions: ['20.19.0', '22.12.0', '24.0.0'],
excluded: ['e2e-detox', 'e2e-react-native', 'e2e-expo']
},
{ os: 'macos-latest', os_name: 'MacOS', os_timeout: 90, package_managers: ['npm'], node_versions: ['20.19.0'] }
// TODO (emily): Fix Windows support as gradle fails when running nx build https://staging.nx.app/runs/LgD4vxGn8w?utm_source=pull-request&utm_medium=comment
// { os: 'windows-latest', os_name: 'WinOS', os_timeout: 180, package_managers: ['npm'], node_versions: ['20.19.0'], excluded: ['e2e-detox', 'e2e-react-native', 'e2e-expo'] }
{ os: 'macos-latest', os_name: 'MacOS', os_timeout: 90, package_managers: ['npm'], node_versions: ['24.0.0'] }
// TODO (Jack): Fix Windows support as gradle fails when running nx build https://staging.nx.app/runs/LgD4vxGn8w?utm_source=pull-request&utm_medium=comment
// { os: 'windows-latest', os_name: 'WinOS', os_timeout: 180, package_managers: ['npm'], node_versions: ['24.0.0'], excluded: ['e2e-detox', 'e2e-react-native', 'e2e-expo'] }
]
};
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: 20
node-version: 24
package-manager-cache: false
- name: Validate PR title
+207 -35
View File
@@ -3,7 +3,14 @@ name: publish
on:
# Automated schedule - canary releases from master
schedule:
- cron: "0 20 * * 1-5" # Monday - Friday, at 20:00 UTC (8pm UTC)
- cron: "0 19 * * 1-5" # Monday - Friday, at 19:00 UTC (7pm UTC)
# Manual trigger - PR releases or dry-runs (based on workflow inputs)
workflow_dispatch:
inputs:
pr:
description: "PR Number - If set, a real release will be created for the branch associated with the given PR number. If blank, a dry-run of the currently selected branch will be performed."
required: false
type: number
release:
types: [ published ]
@@ -28,6 +35,11 @@ jobs:
# - release:
# - We are running a full release which is based on the tag that triggered the release event, we can use default
# ref resolution in actions/checkout. The exact version will be generated within scripts/nx-release.ts.
#
# - workflow_dispatch:
# - We are either running a dry-run on the current branch, in which case the version will be static and we can use
# default ref resolution in actions/checkout, or we are creating a PR release for the given PR number, in which case
# we should generate an applicable version number within publish-resolve-data.js and use a custom ref of the PR branch name.
resolve-required-data:
name: Resolve Required Data
if: ${{ github.repository_owner == 'nrwl' }}
@@ -35,21 +47,23 @@ jobs:
outputs:
version: ${{ steps.script.outputs.version }}
dry_run_flag: ${{ steps.script.outputs.dry_run_flag }}
success_comment: ${{ steps.script.outputs.success_comment }}
publish_branch: ${{ steps.script.outputs.publish_branch }}
ref: ${{ steps.script.outputs.ref }}
repo: ${{ steps.script.outputs.repo }}
pr_number: ${{ steps.script.outputs.pr_number }}
pr_author: ${{ steps.script.outputs.pr_author }}
steps:
# Default checkout on the triggering branch so that the latest publish-resolve-data.js script is available
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: pnpm/action-setup@7088e561eb65bb68695d245aa206f005ef30921d # v4.1.0
with:
version: ${{ env.PNPM_VERSION }}
- name: Setup node
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: 'https://registry.npmjs.org'
check-latest: true
package-manager-cache: false
- name: Resolve and set checkout and version data to use for release
id: script
@@ -62,6 +76,43 @@ jobs:
const script = require('${{ github.workspace }}/scripts/publish-resolve-data.js');
await script({ github, context, core });
- name: (PR Release Only) Check out latest master
if: ${{ steps.script.outputs.ref != '' }}
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
# Check out the latest master branch to get its copy of nx-release.ts
repository: nrwl/nx
ref: master
path: latest-master-checkout
- name: (PR Release Only) Check out PR branch
if: ${{ steps.script.outputs.ref != '' }}
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
# Check out the PR branch to get its copy of nx-release.ts
repository: ${{ steps.script.outputs.repo }}
ref: ${{ steps.script.outputs.ref }}
path: pr-branch-checkout
- name: (PR Release Only) Ensure that release scripts have not changed in the PR being released
if: ${{ steps.script.outputs.ref != '' }}
run: |
# List of files that must not change in PR releases
FILES_TO_CHECK=(
"scripts/nx-release.ts"
"scripts/publish-resolve-data.js"
)
for FILE in "${FILES_TO_CHECK[@]}"; do
if ! cmp -s "latest-master-checkout/$FILE" "pr-branch-checkout/$FILE"; then
echo "🛑 Error: The file $FILE is different on the ${{ steps.script.outputs.ref }} branch on ${{ steps.script.outputs.repo }} vs latest master on nrwl/nx, cancelling workflow."
echo "If you did not modify the file, then you likely just need to rebase/merge latest master."
exit 1
else
echo "✅ The file $FILE is identical between the ${{ steps.script.outputs.ref }} branch on ${{ steps.script.outputs.repo }} and latest master on nrwl/nx."
fi
done
build:
needs: [ resolve-required-data ]
if: ${{ github.repository_owner == 'nrwl' }}
@@ -69,7 +120,7 @@ jobs:
fail-fast: false
matrix:
settings:
- host: macos-13
- host: macos-latest
target: x86_64-apple-darwin
setup: |-
rustup target add aarch64-apple-darwin
@@ -77,8 +128,13 @@ jobs:
pnpm nx run-many --target=build-native -- --target=x86_64-apple-darwin
- host: windows-latest
setup: |-
choco install openjdk --version=21.0.0 -y
rustup target add aarch64-pc-windows-msvc
build: pnpm nx run-many --target=build-native -- --target=x86_64-pc-windows-msvc
build: |
export JAVA_HOME="C:\Program Files\OpenJDK\jdk-21"
export PATH="$JAVA_HOME\bin:$PATH"
java -version
pnpm nx run-many --target=build-native -- --target=x86_64-pc-windows-msvc
target: x86_64-pc-windows-msvc
# Windows 32bit (not needed)
# - host: windows-latest
@@ -92,16 +148,22 @@ jobs:
set -e
apt-get update
# Install Java 21
apt-get install -y openjdk-21-jdk
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"
java --version
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs=22.16.0-1nodesource1
export PATH="/usr/local/bin:$PATH"
node --version
npm --version
npm i -g pnpm@${PNPM_VERSION} --force
pnpm --version
pnpm install --frozen-lockfile
rustup target add x86_64-unknown-linux-gnu
pnpm nx run-many --verbose --target=build-native -- --target=x86_64-unknown-linux-gnu
@@ -112,27 +174,32 @@ jobs:
bash -c "
set -e
echo 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories
apk add --no-cache curl xz
apk add --no-cache curl xz openjdk21
# Set up Java 21
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
export PATH=\"\$JAVA_HOME/bin:\$PATH\"
java --version
curl -fsSL https://unofficial-builds.nodejs.org/download/release/v22.16.0/node-v22.16.0-linux-x64-musl.tar.xz -o node.tar.xz
tar -xJf node.tar.xz
mv node-v22.16.0-linux-x64-musl /usr/local/node
export PATH=\"/usr/local/node/bin:\$PATH\"
echo Node: \$(node -v)
echo NPM: \$(npm -v)
# Install PNPM
npm i -g pnpm@${PNPM_VERSION} --force
pnpm --version
# Install deps and run native build
pnpm install --frozen-lockfile
rustup target add x86_64-unknown-linux-musl
pnpm nx run-many --verbose --target=build-native -- --target=x86_64-unknown-linux-musl
"
- host: macos-13
- host: macos-latest
target: aarch64-apple-darwin
setup: |-
rustup target add aarch64-apple-darwin
@@ -149,17 +216,23 @@ jobs:
build: |
set -e
apt-get update
# Install Java 21
apt-get install -y openjdk-21-jdk
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"
java --version
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs=22.16.0-1nodesource1
export PATH="/usr/local/bin:$PATH"
node --version
npm --version
npm i -g pnpm@${PNPM_VERSION} --force
pnpm --version
pnpm install --frozen-lockfile
rustup target add aarch64-unknown-linux-gnu
pnpm nx run-many --verbose --target=build-native -- --target=aarch64-unknown-linux-gnu
@@ -187,35 +260,48 @@ jobs:
bash -c "
set -e
echo 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories
apk add --no-cache curl xz
apk add --no-cache curl xz openjdk21
# Set up Java 21
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
export PATH=\"\$JAVA_HOME/bin:\$PATH\"
java --version
curl -fsSL https://unofficial-builds.nodejs.org/download/release/v22.16.0/node-v22.16.0-linux-x64-musl.tar.xz -o node.tar.xz
tar -xJf node.tar.xz
mv node-v22.16.0-linux-x64-musl /usr/local/node
export PATH=\"/usr/local/node/bin:\$PATH\"
echo Node: \$(node -v)
echo NPM: \$(npm -v)
# Install PNPM
npm i -g pnpm@${PNPM_VERSION} --force
pnpm --version
# Install deps and run native build
pnpm install --frozen-lockfile
rustup target add aarch64-unknown-linux-musl
pnpm nx run-many --verbose --target=build-native -- --target=aarch64-unknown-linux-musl
rustup target add aarch64-unknown-linux-musl
pnpm nx run-many --verbose --target=build-native -- --target=aarch64-unknown-linux-musl
"
- host: windows-latest
target: aarch64-pc-windows-msvc
setup: |-
choco install openjdk --version=21.0.0 -y
rustup target add aarch64-pc-windows-msvc
build: pnpm nx run-many --target=build-native -- --target=aarch64-pc-windows-msvc
build: |
export JAVA_HOME="C:\Program Files\OpenJDK\jdk-21"
export PATH="$JAVA_HOME\bin:$PATH"
java -version
pnpm nx run-many --target=build-native -- --target=aarch64-pc-windows-msvc
name: stable - ${{ matrix.settings.target }} - node@22.16.0
runs-on: ${{ matrix.settings.host }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
repository: ${{ needs.resolve-required-data.outputs.repo || github.repository }}
ref: ${{ needs.resolve-required-data.outputs.ref || github.ref }}
- uses: pnpm/action-setup@7088e561eb65bb68695d245aa206f005ef30921d # v4.1.0
with:
@@ -306,6 +392,9 @@ jobs:
timeout-minutes: 45
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
repository: ${{ needs.resolve-required-data.outputs.repo || github.repository }}
ref: ${{ needs.resolve-required-data.outputs.ref || github.ref }}
- name: Build
id: build
@@ -325,8 +414,12 @@ jobs:
run: |
env
whoami
sudo pkg install -y -f node libnghttp2 www/npm git
sudo pkg install -y -f node libnghttp2 www/npm git openjdk17
sudo npm install --location=global --ignore-scripts pnpm@10.11.1
# Set up Java 17
export JAVA_HOME=/usr/local/openjdk17
export PATH="$JAVA_HOME/bin:$PATH"
java --version
curl https://sh.rustup.rs -sSf --output rustup.sh
sh rustup.sh -y --profile minimal --default-toolchain stable
source "$HOME/.cargo/env"
@@ -343,6 +436,54 @@ jobs:
freebsd-version
echo "Installing dependencies"
pnpm install --frozen-lockfile --ignore-scripts
echo "Checking disk space before cleanup"
df -h
echo "Removing unnecessary preinstalled packages"
# List all packages first to see what's installed
sudo pkg info -a
echo "Cleaning up to free disk space"
# Clean package caches
sudo pkg clean -a -y
sudo pkg autoremove -y
# Remove unnecessary system files
sudo rm -rf /usr/local/lib/*.a
sudo rm -rf /usr/local/share/doc/*
sudo rm -rf /usr/local/share/man/*
sudo rm -rf /usr/local/share/examples/*
sudo rm -rf /usr/local/share/locale/*
sudo rm -rf /usr/local/share/gtk-doc/*
sudo rm -rf /usr/local/share/info/*
sudo rm -rf /usr/src/*
sudo rm -rf /usr/obj/*
sudo rm -rf /usr/tests/*
sudo rm -rf /usr/lib/debug/*
# Clean var directories
sudo rm -rf /var/cache/pkg/*
sudo rm -rf /var/db/pkg/*.tbz
sudo rm -rf /var/log/*.log
sudo rm -rf /var/log/*.old
# Clean temporary files
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*
# Remove Python cache if present
sudo find /usr/local -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
sudo find /usr/local -name "*.pyc" -delete 2>/dev/null || true
sudo find /usr/local -name "*.pyo" -delete 2>/dev/null || true
# Clean npm/pnpm caches
npm cache clean --force || true
pnpm store prune || true
rm -rf ~/.npm || true
rm -rf ~/.pnpm-store || true
# Remove Rust build artifacts if any
rm -rf ~/.cargo/registry || true
rm -rf ~/.cargo/git || true
rm -rf ~/.rustup/toolchains/*/share || true
# Remove other development tool caches
rm -rf ~/.cache/* || true
echo "Checking disk space after cleanup"
df -h
echo "Building FreeBSD bindings"
pnpm nx run-many --verbose --outputStyle stream --target=build-native -- --target=x86_64-unknown-freebsd
echo "Cleaning up"
@@ -378,6 +519,9 @@ jobs:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
repository: ${{ needs.resolve-required-data.outputs.repo || github.repository }}
ref: ${{ needs.resolve-required-data.outputs.ref || github.ref }}
- uses: pnpm/action-setup@7088e561eb65bb68695d245aa206f005ef30921d # v4.1.0
with:
@@ -432,6 +576,22 @@ jobs:
if: ${{ !github.event.release.prerelease && github.event_name == 'release' }}
run: npx ts-node -P ./scripts/tsconfig.scripts.json ./scripts/release-docs.ts
- name: (PR Release Only) Create comment for successful PR release
if: success() && github.event.inputs.pr
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
SUCCESS_COMMENT: ${{ needs.resolve-required-data.outputs.success_comment }}
with:
# github-token defaults to ${{ github.token }} so we don't need to specify it
script: |
const successComment = JSON.parse(process.env.SUCCESS_COMMENT);
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: ${{ github.event.inputs.pr }},
body: successComment
});
report-pending-publish:
name: Report Pending Publish to Slack
if: ${{ github.repository_owner == 'nrwl' }}
@@ -447,10 +607,20 @@ jobs:
uses: ravsamhq/notify-slack-action@be814b201e233b2dc673608aa46e5447c8ab13f2 # v11
with:
status: ${{ job.status }}
notification_title: '📦 Publish Pending Review'
message_format: ${{ format('Version `{0}` is being published to NPM - manual review is required', needs.resolve-required-data.outputs.version) }}
notification_title: >-
${{ needs.resolve-required-data.outputs.pr_number &&
format('📦 PR #{0} Publish Pending Review', needs.resolve-required-data.outputs.pr_number) ||
'📦 Publish Pending Review' }}
message_format: >-
${{ needs.resolve-required-data.outputs.pr_number &&
format('Version {0} from PR #{1} by @{2} is being published to NPM - manual review is required',
needs.resolve-required-data.outputs.version,
needs.resolve-required-data.outputs.pr_number,
needs.resolve-required-data.outputs.pr_author) ||
format('Version {0} is being published to NPM - manual review is required',
needs.resolve-required-data.outputs.version) }}
footer: '<{run_url}|View Workflow Run>'
mention_groups: 'U9NPA6C90' # Jason
mention_users: 'U9NPA6C90' # Jason
env:
SLACK_WEBHOOK_URL: ${{ secrets.ACTION_MONITORING_SLACK }}
@@ -460,16 +630,17 @@ jobs:
needs: [ resolve-required-data, build, build-freebsd, publish ]
name: (PR Release Failure Only) Create comment for failed PR release
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Create comment for failed PR release
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
# This script is intentionally kept inline (and e.g. not generated in publish-resolve-data.js)
# to ensure that an error within the data generation itself is not missed.
script: |
const message = `
Failed to publish a PR release of this pull request, triggered by @${{ github.triggering_actor }}.
Failed to publish a PR release of this pull request, triggered by @${{ github.triggering_actor }}.
See the failed workflow run at: https://github.com/nrwl/nx/actions/runs/${{ github.run_id }}
`;
await github.rest.issues.createComment({
@@ -478,3 +649,4 @@ jobs:
issue_number: ${{ github.event.inputs.pr }},
body: message
});
+15 -1
View File
@@ -62,6 +62,7 @@ out
.profile
.rustup/
target
.flattened-pom.xml
*.wasm
/wasi-sdk*
@@ -90,6 +91,7 @@ dev-debug.log
node_modules/
# Environment variables
.env
!e2e/dotnet/.env
# Editor directories and files
.idea
.vscode
@@ -110,12 +112,24 @@ node_modules/
astro-docs/.netlify
coverage
# Angular Rspack Specific Options
packages/angular-rspack/coverage
packages/angular-rspack-compiler/coverage
# Angular Rspack Packages use a template to generate the correct README
# Some Packages use a template to generate the correct README
packages/angular-rspack/README.md
packages/angular-rspack-compiler/README.md
packages/dotnet/README.md
packages/maven/README.md
test-output
test-results
# TypeScript build info files
*.tsbuildinfo
# .NET build output
/packages/dotnet/analyzer/bin
/packages/dotnet/analyzer/obj
+1
View File
@@ -0,0 +1 @@
NX_USE_V8_SERIALIZER=false
+4 -4
View File
@@ -1,9 +1,9 @@
{
"mcpServers": {
"nx": {
"command": "pnpm",
"args": ["nx-mcp"],
"env": {}
"nx-mcp": {
"type": "stdio",
"command": "npx",
"args": ["nx", "mcp"]
}
}
}
+3
View File
@@ -0,0 +1,3 @@
wrapperVersion=3.3.4
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
+68 -155
View File
@@ -1,163 +1,76 @@
common-env-vars: &common-env-vars
GIT_AUTHOR_EMAIL: test@test.com
GIT_AUTHOR_NAME: Test
GIT_COMMITTER_EMAIL: test@test.com
GIT_COMMITTER_NAME: Test
SELECTED_PM: 'pnpm'
NX_NATIVE_LOGGING: 'nx::native::db'
# These are need for build and link validation for next.js and astro apps
NEXT_PUBLIC_ASTRO_URL: 'https://master--nx-docs.netlify.app'
NX_DEV_URL: 'https://canary.nx.dev'
common-init-steps: &common-init-steps
- name: Checkout
uses: 'nrwl/nx-cloud-workflows/v5/workflow-steps/checkout/main.yaml'
- name: Cache restore
uses: 'nrwl/nx-cloud-workflows/v5/workflow-steps/cache/main.yaml'
inputs:
key: 'pnpm-lock.yaml'
paths: ~/.local/share/pnpm/store
base-branch: 'master'
# reads mise.toml and installs toolchains needed for repo
- name: Setup toolchains
uses: 'nrwl/nx-cloud-workflows/v5/workflow-steps/install-mise/main.yaml'
- name: Verify toolchain versions
script: |
echo "mise: $(mise --version)"
echo "node: $(node --version)"
echo "pnpm: $(pnpm --version)"
echo "bun: $(bun --version)"
echo "rust: $(rustc --version) - $(cargo --version)"
echo "dotnet: $(dotnet --version)"
echo "java: $(javac --version)"
- name: Install system deps
script: |
sudo apt-get update
sudo apt-get install -y ca-certificates lsof libvips-dev libglib2.0-dev libgirepository1.0-dev zip unzip
- name: Pnpm Install from lockfile
script: |
pnpm install --frozen-lockfile
- name: Install browsers
script: |
pnpm exec cypress install
pnpm exec playwright install --with-deps
- name: Install rust deps
script: |
cargo fetch
- name: Setup gradle
script: |
./gradlew wrapper
./gradlew --version
- name: Configure git metadata (needed for lerna smoke tests)
script: |
git config --global user.email test@test.com
git config --global user.name "Test Test"
launch-templates:
linux-large:
resource-class: 'docker_linux_amd64/large'
image: 'us-east1-docker.pkg.dev/nxcloudoperations/nx-cloud/nx-agents-base-images:ubuntu22.04-node20.19-v1'
env:
GIT_AUTHOR_EMAIL: test@test.com
GIT_AUTHOR_NAME: Test
GIT_COMMITTER_EMAIL: test@test.com
GIT_COMMITTER_NAME: Test
SELECTED_PM: 'pnpm'
NX_NATIVE_LOGGING: 'nx::native::db'
init-steps:
- name: Checkout
uses: 'nrwl/nx-cloud-workflows/v5/workflow-steps/checkout/main.yaml'
- name: Check Node Version
script: node --version
- name: Cache restore
uses: 'nrwl/nx-cloud-workflows/v5/workflow-steps/cache/main.yaml'
inputs:
key: 'pnpm-lock.yaml'
paths: .pnpm-store
base-branch: 'master'
- name: Install zip and unzip
script: sudo apt-get -yqq install zip unzip
- name: Install bun
script: |
curl -fsSL https://bun.sh/install | bash
echo "BUN_INSTALL=$HOME/.bun" >> $NX_CLOUD_ENV
echo "PATH=$HOME/.bun/bin:$PATH" >> $NX_CLOUD_ENV
- name: Check bun
script: |
bun --version
- name: Install e2e deps
script: |
sudo apt-get update
sudo apt-get install -y ca-certificates lsof libvips-dev libglib2.0-dev libgirepository1.0-dev
- name: Pnpm Install from lockfile
script: |
pnpm install --frozen-lockfile
- name: Install Browsers
script: |
pnpm exec cypress install
pnpm exec playwright install --with-deps
- name: Install Rust
script: |
curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh -s -- -y
source "$HOME/.cargo/env"
rustup toolchain install 1.70.0
- name: Configure git metadata (needed for lerna smoke tests)
script: |
git config --global user.email test@test.com
git config --global user.name "Test Test"
- name: Load Cargo Env
script: echo "PATH=$HOME/.cargo/bin:$PATH" >> $NX_CLOUD_ENV
- name: Install Rust Dependencies
script: |
cargo fetch
- name: Setup Java 21
script: |
sudo apt update
sudo apt install -y openjdk-21-jdk
sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java
java -version
- name: Setup Gradle
script: |
./gradlew wrapper
./gradlew --version
env: *common-env-vars
init-steps: *common-init-steps
linux-extra-large:
resource-class: 'docker_linux_amd64/extra_large'
image: 'us-east1-docker.pkg.dev/nxcloudoperations/nx-cloud/nx-agents-base-images:ubuntu22.04-node20.19-v1'
env:
GIT_AUTHOR_EMAIL: test@test.com
GIT_AUTHOR_NAME: Test
GIT_COMMITTER_EMAIL: test@test.com
GIT_COMMITTER_NAME: Test
SELECTED_PM: 'pnpm'
NX_NATIVE_LOGGING: 'nx::native::db'
init-steps:
- name: Checkout
uses: 'nrwl/nx-cloud-workflows/v5/workflow-steps/checkout/main.yaml'
- name: Check Node Version
script: node --version
- name: Cache restore
uses: 'nrwl/nx-cloud-workflows/v5/workflow-steps/cache/main.yaml'
inputs:
key: 'pnpm-lock.yaml'
paths: .pnpm-store
base-branch: 'master'
- name: Install zip and unzip
script: sudo apt-get -yqq install zip unzip
- name: Install bun
script: |
curl -fsSL https://bun.sh/install | bash
echo "BUN_INSTALL=$HOME/.bun" >> $NX_CLOUD_ENV
echo "PATH=$HOME/.bun/bin:$PATH" >> $NX_CLOUD_ENV
- name: Check bun
script: |
bun --version
- name: Install e2e deps
script: |
sudo apt-get update
sudo apt-get install -y ca-certificates lsof libvips-dev libglib2.0-dev libgirepository1.0-dev
- name: Pnpm Install from lockfile
script: |
pnpm install --frozen-lockfile
- name: Install Browsers
script: |
pnpm exec cypress install
pnpm exec playwright install --with-deps
- name: Install Rust
script: |
curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh -s -- -y
source "$HOME/.cargo/env"
rustup toolchain install 1.70.0
- name: Configure git metadata (needed for lerna smoke tests)
script: |
git config --global user.email test@test.com
git config --global user.name "Test Test"
- name: Load Cargo Env
script: echo "PATH=$HOME/.cargo/bin:$PATH" >> $NX_CLOUD_ENV
- name: Install Rust Dependencies
script: |
cargo fetch
- name: Setup Java 21
script: |
sudo apt update
sudo apt install -y openjdk-21-jdk
sudo update-alternatives --set java /usr/lib/jvm/java-21-openjdk-amd64/bin/java
java -version
- name: Setup Gradle
script: |
./gradlew wrapper
./gradlew --version
env: *common-env-vars
init-steps: *common-init-steps
+43 -15
View File
@@ -1,24 +1,50 @@
distribute-on:
default: auto linux-large, 1 linux-extra-large
default: auto linux-large, 3 linux-extra-large
assignment-rules:
# e2e-release tests must run sequentially due to shared git state and publishing operations
- projects:
- e2e-release
targets:
- e2e-ci**
run-on:
- agent: linux-large
parallelism: 1
- projects:
- e2e-gradle
targets:
- e2e-ci**
run-on:
- agent: linux-large
parallelism: 1
- agent: linux-extra-large
parallelism: 1
- agent: linux-extra-large
parallelism: 1
- projects:
- nx
- workspace
- remix
- nx-maven-plugin
targets:
- install
- test
run-on:
- agent: linux-large
parallelism: 1
- agent: linux-extra-large
parallelism: 1
- projects:
- e2e-release
- e2e-angular
- e2e-react
- e2e-next
- e2e-web
- e2e-eslint
- e2e-remix
- e2e-cypress
- e2e-docker
- e2e-js
- e2e-nx-init
- e2e-dotnet
- e2e-workspace-create
- e2e-rollup
targets:
- e2e-ci**
run-on:
- agent: linux-large
parallelism: 1
- agent: linux-extra-large
parallelism: 1
# All other e2e tests can run in parallel
- targets:
@@ -51,9 +77,11 @@ assignment-rules:
run-on:
- agent: linux-large
parallelism: 6
- agent: linux-extra-large
parallelism: 6
- targets:
- '*'
- "*"
run-on:
- agent: linux-large
parallelism: 3
+9 -1
View File
@@ -1,5 +1,13 @@
{
"singleQuote": true,
"endOfLine": "lf",
"plugins": ["prettier-plugin-tailwindcss"]
"plugins": ["prettier-plugin-tailwindcss"],
"overrides": [
{
"files": "*.mdoc",
"options": {
"parser": "markdown"
}
}
]
}
+204
View File
@@ -0,0 +1,204 @@
When responding to queries about this repository:
1. Suggest relevant commands from the "Essential Commands" section when applicable
2. Highlight Nx's focus on monorepos and its key features like smart task execution, code generation, and project graph
analysis
3. Mention the plugin ecosystem and support for various frameworks when relevant
4. Emphasize the importance of running the full validation suite before committing changes
Always strive to provide accurate, helpful responses that align with the best practices and workflows described in this
file.
## GitHub Issue Response Mode
When responding to GitHub issues, determine your approach based on how the request is phrased:
### Plan-First Mode (Default)
Use this approach when users ask you to:
- "analyze", "investigate", "assess", "review", "examine", or "plan"
- Or when the request is ambiguous
In this mode:
1. Provide a detailed analysis of the issue
2. Create a comprehensive implementation plan
3. Break down the solution into clear steps
4. Then please post the plan as a comment on the issue
### Immediate Implementation Mode
Use this approach when users ask you to:
- "fix", "implement", "solve", "build", "create", "update", or "add"
- Or when they explicitly request immediate action
In this mode:
1. Analyze the issue quickly
2. Implement the complete solution immediately
3. Make all necessary code changes. Please make multiple commits so that the changes are easier to review.
4. Run appropriate tests and validation
5. If the tests, are not passing, please fix the issues and continue doing this up to 3 more times until the tests pass
6. Once the tests pass, push a branch and then suggest opening a PR which has a description of the changes made, and
that
it make sure that it explicitly says "Fixes #ISSUE_NUMBER" to automatically close the issue when the PR is merged.
## Avoid making changes to generated files
Files under `generated` directories are generated based on a different source file and should not be modified directly.
Find the underlying source and modify that instead.
## Essential Commands
### Code Formatting
After code changes are made, please make sure to format the files with prettier via `npx prettier -- FILE_NAME`
### Pre-push Validation
```bash
# Full validation suite - run before committing
nx prepush
```
If the prepush validation suite fails, please fix the issues before proceeding with your work. This ensures that all
code adheres to the project's standards and passes all tests. DO NOT make a new commit to fix these issues. Instead,
amend the current commit.
### Testing Changes
After code changes are made, first test the specific project where the changes were made:
```bash
nx run-many -t test,build,lint -p PROJECT_NAME
```
After verifying the individual project, validate that the changes in projects which have been affected:
```bash
# Test only affected projects (recommended for development)
nx affected -t build,test,lint
```
As the last step, run the e2e tests to fully ensure that changes are valid:
```bash
# Run affected e2e tests (recommended for development)
nx affected -t e2e-local
```
## Fixing GitHub Issues
When working on a GitHub issue, follow this systematic approach:
### 1. Get Issue Details
```bash
# Get issue details using GitHub CLI (replace ISSUE_NUMBER with actual number)
gh issue view ISSUE_NUMBER
# View multiple issues efficiently in one command
gh issue list --limit 50 --json number,title,state,labels,assignees,updatedAt,body --jq '.[] | select(.number == 123 or .number == 456 or .number == 789)'
# Or filter by specific criteria to get multiple related issues
gh issue list --label "bug" --state "open" --json number,title,body,labels --jq '.[]'
gh issue list --assignee "@me" --json number,title,body,state --jq '.[]'
```
**Tip**: Instead of running `gh issue view` multiple times, use `gh issue list` with JSON output and filtering to gather
information about multiple issues in a single command. This is much more efficient than viewing issues one at a time.
**Always provide clickable links**: When discussing GitHub issues or PRs, always include the full GitHub URL so the user
can easily open them in their browser. For example:
- Issue #12345: https://github.com/nrwl/nx/issues/12345
- PR #67890: https://github.com/nrwl/nx/pull/67890
When cloning reproduction repos, please clone within `./tmp/claude/repro-ISSUE_NUMBER`
### 2. Analyze the Plan
- Look for a plan or implementation details in the issue description
- Check comments for additional context or clarification
- Identify affected projects and components
### 3. Implement the Solution
- Follow the plan outlined in the issue
- Make focused changes that address the specific problem
- Ensure code follows existing patterns and conventions
### 4. Run Full Validation
Use the testing workflow from the "Essential Commands" section.
### 5. Submit Pull Request
- Create a descriptive PR title that references the issue
- **Always fill in the PR template** - don't leave it empty
- Include "Fixes #ISSUE_NUMBER" in the PR description
- Provide a clear summary of changes made
- Request appropriate reviewers
## Pull Request Template
**IMPORTANT**: When creating a pull request, you MUST fill in the template found in `.github/PULL_REQUEST_TEMPLATE.md`.
Do not leave the template sections empty. The template includes:
### Required Sections
1. **Current Behavior**: Describe the behavior we have today
2. **Expected Behavior**: Describe the behavior we should expect with the changes in this PR
3. **Related Issue(s)**: Link the issue being fixed so it gets closed when the PR is merged
### Template Format
```markdown
## 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 #ISSUE_NUMBER
```
### Guidelines
- Ensure your commit message follows the conventional commit format (use `pnpm commit`)
- Use `fix:`, `feat:`, `chore:`, etc. as appropriate types.
- Scope is **required** for all commits. Possible scopes are listed in `scripts/commitizen.js`.
- Read the submission guidelines in CONTRIBUTING.md before posting
- For complex changes, you can request a dedicated Nx release by mentioning the Nx team
- Always link the related issue using "Fixes #ISSUE_NUMBER" to automatically close it when merged
<!-- nx configuration start-->
<!-- Leave the start & end comments to automatically receive updates. -->
# General Guidelines for working with Nx
- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly
- You have access to the Nx MCP server and its tools, use them to help the user
- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable.
- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies
- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration
- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors
# CI Error Guidelines
If the user wants help with fixing an error in their CI pipeline, use the following flow:
- Retrieve the list of current CI Pipeline Executions (CIPEs) using the `nx_cloud_cipe_details` tool
- If there are any errors, use the `nx_cloud_fix_cipe_failure` tool to retrieve the logs for a specific task
- Use the task logs to see what's wrong and help the user fix their problem. Use the appropriate tools if necessary
- Make sure that the problem is fixed by running the task that you passed into the `nx_cloud_fix_cipe_failure` tool
<!-- nx configuration end-->
+27 -7
View File
@@ -1,13 +1,10 @@
When responding to queries about this repository:
1. Use the `nx_workspace` mcp tool for understanding the workspace architecture when appropriate
2. When working in projects, use the `nx_project` mcp tool to analyze and understand the specific project structure and
dependencies
3. Suggest relevant commands from the "Essential Commands" section when applicable
4. Highlight Nx's focus on monorepos and its key features like smart task execution, code generation, and project graph
1. Suggest relevant commands from the "Essential Commands" section when applicable
2. Highlight Nx's focus on monorepos and its key features like smart task execution, code generation, and project graph
analysis
5. Mention the plugin ecosystem and support for various frameworks when relevant
6. Emphasize the importance of running the full validation suite before committing changes
3. Mention the plugin ecosystem and support for various frameworks when relevant
4. Emphasize the importance of running the full validation suite before committing changes
Always strive to provide accurate, helpful responses that align with the best practices and workflows described in this
file.
@@ -182,3 +179,26 @@ Fixes #ISSUE_NUMBER
- Read the submission guidelines in CONTRIBUTING.md before posting
- For complex changes, you can request a dedicated Nx release by mentioning the Nx team
- Always link the related issue using "Fixes #ISSUE_NUMBER" to automatically close it when merged
<!-- nx configuration start-->
<!-- Leave the start & end comments to automatically receive updates. -->
# General Guidelines for working with Nx
- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly
- You have access to the Nx MCP server and its tools, use them to help the user
- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable.
- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies
- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration
- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors
# CI Error Guidelines
If the user wants help with fixing an error in their CI pipeline, use the following flow:
- Retrieve the list of current CI Pipeline Executions (CIPEs) using the `nx_cloud_cipe_details` tool
- If there are any errors, use the `nx_cloud_fix_cipe_failure` tool to retrieve the logs for a specific task
- Use the task logs to see what's wrong and help the user fix their problem. Use the appropriate tools if necessary
- Make sure that the problem is fixed by running the task that you passed into the `nx_cloud_fix_cipe_failure` tool
<!-- nx configuration end-->
+11 -54
View File
@@ -11,17 +11,13 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
# Docs Site + Graph
/astro-docs @nrwl/nx-docs-reviewers
/docs @nrwl/nx-docs-reviewers
/docs/nx-cloud @StalkAltan @rarmatei @nixallover @nrwl/nx-docs-reviewers
/graph/** @philipjfulcher @FrozenPandaz @bcabanes @MaxKless @Coly010 @jaysoo @nartc
/images @nrwl/nx-docs-reviewers
/nx-dev/** @nrwl/nx-docs-reviewers
/typedoc-theme @nrwl/nx-docs-reviewers
# Plugin Verticals
## Angular
/docs/generated/packages/angular/** @nrwl/nx-angular-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/angular/** @nrwl/nx-angular-reviewers @nrwl/nx-docs-reviewers
/packages/angular/** @nrwl/nx-angular-reviewers
/packages/angular-rspack/** @nrwl/nx-angular-reviewers
/packages/angular-rspack-compiler/** @nrwl/nx-angular-reviewers
@@ -32,10 +28,6 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/packages/angular/src/generators/component-test/** @nrwl/nx-angular-reviewers @nrwl/nx-testing-tools-reviewers
## React
/docs/generated/packages/react/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/next/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/react/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/next/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/packages/react/** @nrwl/nx-react-reviewers
/e2e/react/** @nrwl/nx-react-reviewers
/packages/next/** @nrwl/nx-react-reviewers
@@ -45,10 +37,6 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/packages/react/src/generators/component-test/** @nrwl/nx-react-reviewers @nrwl/nx-testing-tools-reviewers
# React Native
/docs/generated/packages/detox/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/expo/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/react-native/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/react-native/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers
/packages/detox/** @nrwl/nx-react-reviewers
/e2e/detox/** @nrwl/nx-react-reviewers
/packages/expo/** @nrwl/nx-react-reviewers
@@ -57,7 +45,6 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/e2e/react-native/** @nrwl/nx-react-reviewers
## remix
/docs/generated/packages/remix/** @nrwl/nx-react-reviewers @nrwl/nx-docs-reviewers @Coly010
/packages/remix/** @nrwl/nx-react-reviewers @Coly010
/e2e/remix/** @nrwl/nx-react-reviewers @Coly010
@@ -68,31 +55,12 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/e2e/nuxt/** @nrwl/nx-vue-reviewers
## Node
/docs/generated/packages/node/** @nrwl/nx-node-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/nest/** @nrwl/nx-node-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/express/** @nrwl/nx-node-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/node/** @nrwl/nx-node-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/express/** @nrwl/nx-node-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/nest/** @nrwl/nx-node-reviewers @FrozenPandaz @nrwl/nx-docs-reviewers
/packages/node/** @nrwl/nx-node-reviewers
/packages/express/** @nrwl/nx-node-reviewers
/packages/nest/** @nrwl/nx-node-reviewers
/e2e/node/** @nrwl/nx-node-reviewers
## JS
/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
/e2e/js/** @nrwl/nx-js-reviewers
/packages/web/** @nrwl/nx-js-reviewers
@@ -108,17 +76,12 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/e2e/rollup/** @nrwl/nx-js-reviewers
/packages/vite/** @nrwl/nx-js-reviewers
/e2e/vite/** @nrwl/nx-js-reviewers
/packages/vitest/** @nrwl/nx-js-reviewers
## Module Federation
/packages/module-federation/** @nrwl/nx-js-reviewers
## Tools
/docs/generated/packages/cypress/** @nrwl/nx-testing-tools-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/cypress/** @nrwl/nx-testing-tools-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/jest/** @nrwl/nx-testing-tools-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/jest/** @nrwl/nx-testing-tools-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/playwright/** @nrwl/nx-testing-tools-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/playwright/** @nrwl/nx-testing-tools-reviewers @nrwl/nx-docs-reviewers
/packages/cypress/** @nrwl/nx-testing-tools-reviewers
/e2e/cypress/** @nrwl/nx-testing-tools-reviewers
/packages/jest/** @nrwl/nx-testing-tools-reviewers
@@ -127,26 +90,19 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/e2e/playwright/** @nrwl/nx-testing-tools-reviewers
# Linter
/docs/generated/packages/eslint-plugin/** @nrwl/nx-linter-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/eslint/** @nrwl/nx-linter-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/eslint/** @nrwl/nx-linter-reviewers @nrwl/nx-docs-reviewers
/packages/eslint-plugin/** @nrwl/nx-linter-reviewers
/packages/eslint/** @nrwl/nx-linter-reviewers
/e2e/eslint/** @nrwl/nx-linter-reviewers
.eslint* @nrwl/nx-linter-reviewers
# Storybook
/docs/generated/packages/storybook/** @nrwl/nx-storybook-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/storybook/** @nrwl/nx-storybook-reviewers @nrwl/nx-docs-reviewers
/packages/storybook/** @nrwl/nx-storybook-reviewers
/e2e/storybook/** @nrwl/nx-storybook-reviewers
# Docker
/packages/docker/** @nrwl/nx-core-reviewers @Coly010
/packages/docker/** @nrwl/nx-core-reviewers @Coly010 @jaysoo
## Devkit
/docs/generated/devkit/** @nrwl/nx-devkit-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/devkit/** @nrwl/nx-devkit-reviewers @nrwl/nx-docs-reviewers
/packages/devkit/** @nrwl/nx-devkit-reviewers
/packages/devkit/index.ts @FrozenPandaz @vsavkin
/packages/devkit/public-api.ts @FrozenPandaz @vsavkin
@@ -155,16 +111,15 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/packages/gradle/** @FrozenPandaz @MaxKless @lourw
/e2e/gradle/** @FrozenPandaz @MaxKless @lourw
# Maven
/packages/maven/** @FrozenPandaz @MaxKless @lourw
/e2e/maven/** @FrozenPandaz @MaxKless @lourw
# Nx-Plugin
/docs/generated/packages/plugin/** @nrwl/nx-devkit-reviewers @nrwl/nx-docs-reviewers
/docs/shared/packages/plugin/** @nrwl/nx-devkit-reviewers @nrwl/nx-docs-reviewers
/packages/plugin/** @nrwl/nx-devkit-reviewers
/e2e/plugin/** @nrwl/nx-devkit-reviewers
## Core
/docs/generated/cli/** @nrwl/nx-core-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/nx/** @nrwl/nx-core-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/workspace/** @nrwl/nx-core-reviewers @nrwl/nx-docs-reviewers
/packages/nx/** @nrwl/nx-core-reviewers
/packages/nx/src/adapter @nrwl/nx-core-reviewers @leosvelperez
/packages/nx/src/native @nrwl/nx-core-reviewers @nrwl/nx-native-reviewers
@@ -179,6 +134,10 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/e2e/workspace-create/** @nrwl/nx-core-reviewers
/e2e/release/** @nrwl/nx-core-reviewers
# .NET
/packages/dotnet/** @FrozenPandaz @AgentEnder
/e2e/dotnet/** @FrozenPandaz @AgentEnder
# Misc
/e2e/lerna-smoke-tests/** @vsavkin @JamesHenry
/e2e/utils/** @meeroslav @nrwl/nx-testing-tools-reviewers @vsavkin
@@ -194,6 +153,7 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
# CI
/.nx/workflows/** @nrwl/nx-pipelines-reviewers
mise.toml @nrwl/nx-pipelines-reviewers @FrozenPandaz
/.github/** @nrwl/nx-pipelines-reviewers
/.husky/** @nrwl/nx-pipelines-reviewers
/packages/workspace/src/generators/ci-workflow/** @nrwl/nx-pipelines-reviewers
@@ -208,6 +168,3 @@ project.json @FrozenPandaz @vsavkin
jest.config.ts @nrwl/nx-testing-tools-reviewers @FrozenPandaz
jest.preset.js @nrwl/nx-testing-tools-reviewers @FrozenPandaz
# Overrides - These are applied last, so override any matches above.
docs/generated/manifests/* @nrwl/nrwlians
docs/generated/packages-metadata.json @FrozenPandaz @jaysoo @AgentEnder @nrwl/nx-docs-reviewers
+31 -34
View File
@@ -7,7 +7,7 @@ We would love for you to contribute to Nx! Read this document to see how to do i
Watch this 5-minute video:
<a href="https://www.youtube.com/watch?v=8LCA_4qxc08" target="_blank" rel="noreferrer">
<p style="text-align: center;"><img src="https://raw.githubusercontent.com/nrwl/nx/master/images/how-to-contribute.png" width="600" alt="Nx - How to contribute"></p>
<p style="text-align: center;"><img src="./images/how-to-contribute.png" width="600" alt="Nx - How to contribute"></p>
</a>
## Got a Question?
@@ -194,76 +194,73 @@ To build Nx on Windows, you need to use WSL.
## Documentation Contributions
We would love for you to contribute to our documentation as well! Please feel welcome to submit fixes or enhancements to
our existing documentation pages and the `nx-dev` application in this repo.
our existing documentation pages, `astro-docs` and the `nx-dev` application in this repo.
### Documentation Structure
#### Documentation Pages
Our documentation pages can be found within this repo under the `docs` directory.
Our documentation pages can be found within this repo under the `astro-docs/src/content/docs` directory.
The `docs/map.json` file is considered our source of truth for our site's structure, and should be updated when adding a
new page to our documentation to ensure that it is included in the documentation site. We also run automated scripts
based on this `map.json` data to safeguard against common human errors that could break our site.
Documentation is written in `.mdoc` (Markdoc) or `.mdx` (MDX) format and supports custom Markdoc tags for rich content
such as videos, graphs, interactive components, and more. See the `astro-docs/README.md` for a full list of available
custom tags and their usage.
When you make a change to the `map.json` file, make sure to run `pnpm documentation` to propagate your changes to the `nx-dev` application.
The sidebar structure is defined in `astro-docs/sidebar.mts` and should be updated when adding new sections or pages
to ensure proper navigation.
#### Astro-Docs Application
Our public `nx.dev/docs` documentation site is built with [Astro](https://astro.build) and [Starlight](https://starlight.astro.build),
and can be found in the `astro-docs` directory of this repo. See [docs README for more details](./astro-docs/README.md)
#### Nx-Dev Application
Our public `nx.dev` documentation site is a [Next.js](https://nextjs.org/) application, that can be found in
the `nx-dev` directory of this repo.
The documentation site is consuming the `docs/` directly by copy-ing its content while deploying, so the website is
always in sync and reflects the latest version of `docs/`.
The `nx-dev` directory contains a [Next.js](https://nextjs.org/) application used for blog posts and landing pages.
Jump to [Running the Documentation Site Locally](#running-the-documentation-site-locally) to see how to preview your
changes while serving.
### Changing Generated API documentation
`.md` files documenting the API for our CLI (including executor and generator API docs) are generated via the
corresponding `schema.json` file for the given command.
API documentation for CLI commands, executors, and generators is automatically generated during the build process from
the corresponding `schema.json` files in each package.
After adjusting the `schema.json` file, `.md` files for these commands can be generated by running:
The documentation is generated using content loaders in the `astro-docs` application and requires a rebuild to reflect
changes. After adjusting a `schema.json` file:
```bash
pnpm documentation
```
This will update the corresponding contents of the `docs` directory. These are generated automatically on push (via
husky) as well.
1. Restart the development server with `nx serve astro-docs` to see the changes
2. Or run `nx preview astro-docs` to view the built site locally
Note that adjusting the `schema.json` files will also affect the CLI manuals and Nx Console behavior, in addition to
adjusting the docs.
the generated documentation.
### Running the Documentation Site Locally
To run `nx-dev` locally, run the command:
To run the documentation site locally, run the command:
```bash
npx nx serve-docs nx-dev
```shell
nx serve astro-docs
```
You can then access the application locally at `localhost:4200`. Changes to markdown documentation files will be automatically applied to the site when you refresh the browser.
You can then access the application locally at `localhost:4321`. Changes to markdoc files should reflect automatically in the browser on save.
#### Troubleshooting: `JavaScript heap out of memory`
#### Working with Plugin Registry
If you see an error that states: `FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory`,
you need
to [increase the max memory size of V8's old memory section](https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes):
To view plugin registry statistics (GitHub stars, npm downloads, etc.) during local development:
```bash
export NODE_OPTIONS="--max-old-space-size=4096"
NX_DOCS_PLUGIN_STATS=true nx serve astro-docs
```
After configuring this, try to run `npx nx serve nx-dev` again.
Note: Plugin stats are disabled by default in development to improve performance.
### PR Preview
When submitting a PR, this repo will automatically generate a preview of the `nx-dev` application based on the contents
When submitting a PR, this repo will automatically generate a preview of the documentation site based on the contents
of your pull request.
Once the preview site is launched, a comment will automatically be added to your PR with the link your PR's preview. To
check your docs changes, make sure to select `Preview` from the version selection box of the site.
Once the preview site is launched, a comment will automatically be added to your PR with the link to your PR's preview.
## Submission Guidelines
+3 -3
View File
@@ -1,7 +1,7 @@
<p style="text-align: center;">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-dark.svg">
<img alt="Nx - Smart Repos · Fast Builds" src="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-light.svg" width="100%">
<source media="(prefers-color-scheme: dark)" srcset="./images/nx-dark.svg">
<img alt="Nx - Smart Repos · Fast Builds" src="./images/nx-light.svg" width="100%">
</picture>
</p>
@@ -67,7 +67,7 @@ our [guidelines for contributing](https://github.com/nrwl/nx/blob/master/CONTRIB
help you get started.
<a href="https://www.youtube.com/watch?v=8LCA_4qxc08" target="_blank" rel="noreferrer">
<p style="text-align: center;"><img src="https://raw.githubusercontent.com/nrwl/nx/master/images/how-to-contribute.png" width="600" alt="Nx - How to contribute video"></p>
<p style="text-align: center;"><img src="./images/how-to-contribute.png" width="600" alt="Nx - How to contribute video"></p>
</a>
## Core Team
+6
View File
@@ -6,6 +6,12 @@
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["**/*.spec.ts", "**/*.test.ts", "**/*.spec.js", "**/*.test.js"],
"rules": {
"playwright/no-standalone-expect": "off"
}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
+26
View File
@@ -9,6 +9,7 @@ import { sidebar } from './sidebar.mts';
const BASE = '/docs';
// This is exposed as window.__CONFIG
const PUBLIC_CONFIG = {
cookiebotDisabled: process.env.COOKIEBOT_DISABLED === 'true',
cookiebotId: process.env.COOKIEBOT_ID ?? null,
@@ -49,6 +50,7 @@ export default defineConfig({
dark: './src/assets/nx/Nx-light.png',
replacesTitle: true,
},
disable404Route: true,
head: [
{
tag: 'script',
@@ -88,6 +90,7 @@ export default defineConfig({
'./src/plugins/sidebar-reference-updater.middleware.ts',
'./src/plugins/sidebar-icons.middleware.ts',
'./src/plugins/og.middleware.ts',
'./src/plugins/github-stars.middleware.ts',
],
markdown: {
// this breaks the renderMarkdown function in the plugin loader due to starlight path normalization
@@ -124,6 +127,29 @@ export default defineConfig({
Sidebar: './src/components/layout/Sidebar.astro',
TwoColumnContent: './src/components/layout/TwoColumnContent.astro',
PageTitle: './src/components/layout/PageTitle.astro',
TableOfContents: './src/components/layout/TableOfContents.astro',
},
pagefind: {
ranking: {
// termFrequency changes the ranking balance between
// frequency of the term relative to document length
// versus weighted term count.
// default is 1.0
termFrequency: 0.75,
// pageLength changes the way ranking compares page lengths with the average page lengths on your site.
// default 0.75
pageLength: 0.5,
// termSaturation controls how quickly a term “saturates” on a page.
// Once a term has appeared on a page many times,
// further appearances have a reduced impact on the page rank.
// default: 1.4
// termSaturation: 1.4,
// termSimilarity changes the ranking based on
// similarity of terms to the search query.
// Currently this only takes the length of the term into account.
// default is 1.0
// termSimilarity: 1.0,
},
},
}),
react(),
+71
View File
@@ -0,0 +1,71 @@
import { test, expect } from '@playwright/test';
test('should apply system theme by default', async ({ page }) => {
await page.goto('/docs/getting-started/intro');
await expect(
page.getByRole('heading', { name: 'What is Nx?' })
).toBeVisible();
const themeSelector = page.getByRole('combobox', {
name: /theme/i,
});
await expect(themeSelector).toBeVisible();
await expect(themeSelector).toHaveValue('auto');
const dataTheme = await page.evaluate(
() => document.documentElement.dataset.theme
);
// The data-theme should be either 'light' or 'dark' based on system preference
// It won't be 'auto' on the document element
expect(['light', 'dark']).toContain(dataTheme);
});
test('should switch to between light and dark theme', async ({ page }) => {
await page.goto('/docs/getting-started/intro');
await expect(
page.getByRole('heading', { name: 'What is Nx?' })
).toBeVisible();
const themeSelector = page.getByRole('combobox', {
name: /theme/i,
});
await test.step('light theme renders', async () => {
await expect(themeSelector).toBeVisible();
await themeSelector.selectOption('light');
await expect(themeSelector).toHaveValue('light');
const dataTheme = await page.evaluate(
() => document.documentElement.dataset.theme
);
expect(dataTheme).toBe('light');
});
await test.step('dark theme renders', async () => {
await themeSelector.selectOption('dark');
await expect(themeSelector).toHaveValue('dark');
const dataTheme = await page.evaluate(
() => document.documentElement.dataset.theme
);
expect(dataTheme).toBe('dark');
});
await test.step('switch back to auto', async () => {
await themeSelector.selectOption('auto');
await expect(themeSelector).toHaveValue('auto');
const dataTheme = await page.evaluate(
() => document.documentElement.dataset.theme
);
expect(['light', 'dark']).toContain(dataTheme);
});
});
+41 -11
View File
@@ -1,4 +1,8 @@
import { defineMarkdocConfig, component } from '@astrojs/markdoc/config';
import {
defineMarkdocConfig,
component,
Markdoc,
} from '@astrojs/markdoc/config';
import starlightMarkdoc from '@astrojs/starlight-markdoc';
export default defineMarkdocConfig({
@@ -143,7 +147,6 @@ export default defineMarkdocConfig({
},
graph: {
render: component('./src/components/markdoc/Graph.astro'),
children: [],
attributes: {
jsonFile: {
type: 'String',
@@ -161,6 +164,24 @@ export default defineMarkdocConfig({
required: true,
},
},
transform(node, config) {
const attributes = node.transformAttributes(config);
let rawContent = null;
for (const child of node.children) {
if (child.type === 'fence') {
rawContent = child.attributes.content;
break;
}
}
return new Markdoc.Tag(
this.render,
{
...attributes,
astroRawData: rawContent,
},
[]
);
},
},
iframe: {
render: component('./src/components/markdoc/Iframe.astro'),
@@ -284,6 +305,24 @@ export default defineMarkdocConfig({
type: 'Array',
},
},
transform(node, config) {
const attributes = node.transformAttributes(config);
let rawContent = null;
for (const child of node.children) {
if (child.type === 'fence') {
rawContent = child.attributes.content;
break;
}
}
return new Markdoc.Tag(
this.render,
{
...attributes,
astroRawData: rawContent,
},
[]
);
},
},
stackblitz_button: {
render: component('./src/components/markdoc/StackblitzButton.astro'),
@@ -384,14 +423,5 @@ export default defineMarkdocConfig({
},
},
},
side_by_side: {
render: component('./src/components/markdoc/SideBySide.astro'),
attributes: {
align: {
type: 'String',
default: 'center',
},
},
},
},
});
+6
View File
@@ -1,4 +1,10 @@
# Permanent redirects (301 by default)
# Storybook docs consolidation
[[redirects]]
from = "/docs/technologies/test-tools/storybook/guides/storybook-9-setup"
to = "/docs/technologies/test-tools/storybook/guides/upgrading-storybook"
[[redirects]]
from = "/"
to = "/docs/getting-started/intro"
+3
View File
@@ -10,6 +10,8 @@
"@astrojs/starlight": "0.34.6",
"@astrojs/starlight-markdoc": "^0.4.0",
"@astrojs/starlight-tailwind": "^4.0.1",
"@nx/nx-dev-feature-analytics": "workspace:*",
"@nx/nx-dev-ui-animations": "workspace:*",
"@nx/nx-dev-ui-common": "workspace:*",
"@nx/nx-dev-ui-icons": "workspace:*",
"@nx/nx-dev-ui-markdoc": "workspace:*",
@@ -17,6 +19,7 @@
"astro": "^5.10.1",
"astro-og-canvas": "^0.7.0",
"canvaskit-wasm": "^0.40.0",
"octokit": "^2.0.14",
"tailwindcss": "4.1.11"
}
}
+17 -6
View File
@@ -7,7 +7,7 @@
"continuous": true,
"dependsOn": [
{
"projects": ["devkit", "create-nx-workspace"],
"projects": ["devkit", "create-nx-workspace", "dotnet", "maven"],
"target": "build"
}
],
@@ -19,7 +19,7 @@
"build": {
"dependsOn": [
{
"projects": ["devkit", "create-nx-workspace"],
"projects": ["devkit", "create-nx-workspace", "dotnet", "maven"],
"target": "build"
}
],
@@ -48,8 +48,8 @@
}
},
"test": {
"dependsOn": ["validate-links"],
"command": "echo done"
"executor": "nx:noop",
"dependsOn": ["vite:test", "validate-links", "format"]
},
"pw-e2e": {
"dependsOn": ["serve"],
@@ -57,7 +57,10 @@
},
"e2e-ci--**/*": {
"dependsOn": ["preview"],
"parallelism": true
"parallelism": true,
"options": {
"args": []
}
},
"show-report": {
"command": "playwright show-report dist/astro-docs/playwright-report"
@@ -73,10 +76,18 @@
"{projectRoot}/tsconfig.json",
"{projectRoot}/package.json"
],
"command": "npx tsx validate-links.ts",
"command": "tsx validate-links.ts",
"options": {
"cwd": "astro-docs"
}
},
"format": {
"cache": true,
"//": "nx format doesn't respect overrides, so we manually run prettier for mdoc files",
"command": "prettier **/*.mdoc --check"
},
"format:write": {
"command": "prettier **/*.mdoc --write"
}
}
}
+62 -1
View File
@@ -108,16 +108,77 @@
window.twq('config', 'obtp4');
};
const SEARCH_DEBOUNCE_MS = 1000;
let searchDebounceTimer;
let lastSearchQuery = '';
let currentSearchInput = null;
let inputHandler = null;
function sendSearchEvent(eventType, data) {
if (typeof window.gtag !== 'undefined')
window.gtag('event', eventType, data);
}
function trackSearchQuery(query) {
if (!query || query === lastSearchQuery) return;
clearTimeout(searchDebounceTimer);
searchDebounceTimer = setTimeout(() => {
lastSearchQuery = query;
sendSearchEvent('search_query', {
query: query,
});
}, SEARCH_DEBOUNCE_MS);
}
function setupSearchTracking() {
const observer = new MutationObserver(() => {
const searchDialog = document.querySelector(
'dialog[open] .search-container'
);
// If dialog is found, then set up tracking
if (searchDialog) {
if (currentSearchInput && inputHandler) return; // Already tracking
const searchInput = searchDialog.querySelector(
'input[type="search"], input[type="text"]'
);
if (searchInput) {
inputHandler = (e) => {
const query = e.target.value.trim();
trackSearchQuery(query);
};
searchInput.addEventListener('input', inputHandler);
currentSearchInput = searchInput;
}
}
// If dialog is not found but we have handler, etc. then it must be closed and we should clean up
else if (currentSearchInput && inputHandler) {
currentSearchInput.removeEventListener('input', inputHandler);
currentSearchInput = null;
inputHandler = null;
}
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['open'],
});
}
const checkAndLoadScripts = () => {
if (isCookiebotDisabled) {
loadGoogleAnalytics();
loadGTM();
loadHubSpot();
setupSearchTracking();
} else if (window.Cookiebot && window.Cookiebot.consent) {
// Statistics cookies (Google Analytics, GTM)
// Statistics cookies (Google Analytics, GTM, Search Tracking)
if (window.Cookiebot.consent.statistics) {
loadGoogleAnalytics();
loadGTM();
setupSearchTracking();
}
// Marketing cookies (HubSpot, Apollo, Hotjar, Twitter)
@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>C#</title><path d="M1.194 7.543v8.913c0 1.103.588 2.122 1.544 2.674l7.718 4.456a3.086 3.086 0 0 0 3.088 0l7.718-4.456a3.087 3.087 0 0 0 1.544-2.674V7.543a3.084 3.084 0 0 0-1.544-2.673L13.544.414a3.086 3.086 0 0 0-3.088 0L2.738 4.87a3.085 3.085 0 0 0-1.544 2.673Zm5.403 2.914v3.087a.77.77 0 0 0 .772.772.773.773 0 0 0 .772-.772.773.773 0 0 1 1.317-.546.775.775 0 0 1 .226.546 2.314 2.314 0 1 1-4.631 0v-3.087c0-.615.244-1.203.679-1.637a2.312 2.312 0 0 1 3.274 0c.434.434.678 1.023.678 1.637a.769.769 0 0 1-.226.545.767.767 0 0 1-1.091 0 .77.77 0 0 1-.226-.545.77.77 0 0 0-.772-.772.771.771 0 0 0-.772.772Zm12.35 3.087a.77.77 0 0 1-.772.772h-.772v.772a.773.773 0 0 1-1.544 0v-.772h-1.544v.772a.773.773 0 0 1-1.317.546.775.775 0 0 1-.226-.546v-.772H12a.771.771 0 1 1 0-1.544h.772v-1.543H12a.77.77 0 1 1 0-1.544h.772v-.772a.773.773 0 0 1 1.317-.546.775.775 0 0 1 .226.546v.772h1.544v-.772a.773.773 0 0 1 1.544 0v.772h.772a.772.772 0 0 1 0 1.544h-.772v1.543h.772a.776.776 0 0 1 .772.772Zm-3.088-2.315h-1.544v1.543h1.544v-1.543Z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>.NET</title><path d="M24 8.77h-2.468v7.565h-1.425V8.77h-2.462V7.53H24zm-6.852 7.565h-4.821V7.53h4.63v1.24h-3.205v2.494h2.953v1.234h-2.953v2.604h3.396zm-6.708 0H8.882L4.78 9.863a2.896 2.896 0 0 1-.258-.51h-.036c.032.189.048.592.048 1.21v5.772H3.157V7.53h1.659l3.965 6.32c.167.261.275.442.323.54h.024c-.04-.233-.06-.629-.06-1.185V7.529h1.372zm-8.703-.693a.868.829 0 0 1-.869.829.868.829 0 0 1-.868-.83.868.829 0 0 1 .868-.828.868.829 0 0 1 .869.829Z"/></svg>

After

Width:  |  Height:  |  Size: 534 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>F#</title><path d="M0 12 11.39.61v5.695L5.695 12l5.695 5.695v5.695L0 12zm7.322 0 4.068-4.068v8.136L7.322 12zM24 12 12.203.61v5.695L17.898 12l-5.695 5.695v5.695L24 12z"/></svg>

After

Width:  |  Height:  |  Size: 253 B

+1 -9
View File
@@ -1,9 +1 @@
<svg
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
fill="currentColor"
>
<title>Java</title>
<path d="m16.5093 4.9869-.0607-.0347c-1.1014.369-4.4915 1.707-4.4915 4.202 0 1.411 1.378 2.1925 1.378 3.5158 0 .472-.2666.9146-.4836 1.1791l.1091.063c.5735-.3728 1.589-1.18 1.589-2.2222 0-.8825-1.2216-1.943-1.2216-3.0774 0-1.7875 2.357-3.1899 3.1813-3.6256zm-1.6642-3.27c0 3.6925-5.0604 5.1055-5.0604 7.7309 0 1.843 1.2222 2.9987 1.8983 3.7293l-.055.0317c-.8536-.534-3.0995-1.876-3.0995-4.0927 0-3.112 5.8123-4.599 5.8123-8.134 0-.435-.0644-.7683-.1095-.9482L14.2901 0c.1842.2315.555.8102.555 1.7168m.514 14.9392c-.5962.1688-1.9389.4441-3.859.4441-1.8844 0-3.424-.3226-3.4289-.7024-.0032-.2527.3024-.3628.3024-.3628l-.0544-.0316c-.9023.1595-1.7406.406-1.7357.7752.0084.6698 2.5697 1.1728 4.9129 1.1728 1.992 0 3.9053-.3343 4.7684-.7722zm-6.368 2.0708c-.4185.0832-1.3305.2926-1.3305.7361 0 .6144 1.9513 1.085 3.835 1.085 2.5922 0 3.6539-.667 3.702-.7016l-1.078-.6235c-.4583.1092-1.2306.2808-2.6214.2808-1.5521 0-2.5634-.2658-2.5634-.5569 0-.0617.0386-.135.1106-.1886zm10.5923-4.1337c-.0725 1.3911-1.3577 2.2573-2.6423 2.9893l.1164.067c1.3708-.3855 3.8166-1.5085 3.6144-3.2346-.1007-.8608-.8875-1.4758-1.9133-1.4758-.3194 0-.6036.0563-.834.1265l-.0007.0022-.0486.1224c.9175-.1796 1.7558.4904 1.7082 1.403zm-8.1232 8.1638c3.6058-.0313 7.6402-.737 7.6298-1.9232-.0019-.215-.1418-.3622-.2635-.4513l-.0592.034c-.3333.9188-3.1508 1.5977-7.3132 1.634-2.6859.0234-6.4063-.62-6.4128-1.3636-.0065-.7455 1.7625-1.1552 1.7625-1.1552l-.125-.0714c-1.1854.1632-3.3697.731-3.3625 1.5506.0104 1.185 5.0304 1.7734 8.1439 1.7461zm-.375.847c-1.4333.0126-3.1833-.1061-4.6555-.3535l-.1363.0784c1.4664.43 3.508.6896 5.7514.6702 4.4059-.0386 7.9779-1.1311 8.0485-2.446l-.051-.0297c-.2953.3604-2.2009 2.0216-8.9572 2.0806zm-5.5195-9.328c0-.6646 2.521-1.0374 3.6947-1.1277l.112.0647c-.451.082-2.26.401-2.26.8172 0 .4532 2.7747.7501 4.3853.7501 2.7355 0 4.595-.414 5.095-.5505l.6997.4072c-.4792.2346-2.5362.8495-5.7945.8495-3.6214 0-5.9322-.7086-5.9322-1.2105" />
</svg>
<svg fill="#000000" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M 16.921875 2.25 C 16.71679725 2.26171875 16.4970705 2.3408205 16.2890625 2.5078125 C 15.40722675 3.2138669999999996 15.541992 3.5771482499999996 15.1171875 4.4296875 C 14.973633 4.9248045 14.736328499999999 4.962891 14.53125 4.5234375 C 14.28515625 4.08691425 14.16503925 3.5419919999999996 13.78125 3.2109375 C 13.16308575 2.67773475 12.4658205 3.0791017500000004 12.84375 3.6796875 C 13.2216795 4.28027325 13.376953499999999 4.91308575 13.5234375 5.90625 C 13.74316425 7.3857420000000005 13.125 9.03222675 12.3046875 9.8203125 C 10.822266 6.7880857500000005 8.885742 4.53808575 7.5234375 3.84375 C 7.1103517499999995 3.6328125 6.984375 3.80859375 6.984375 4.0078125 C 7.2421875 6.978516000000001 7.3359375 9.02929725 7.171875 10.546875 C 7.0986329999999995 11.2265625 5.49609375 13.734375 5.578125 14.3203125 C 5.66015625 14.9033205 6.12890625 15.817383 6.4453125 16.2890625 C 6.31640625 16.1953125 5.99121075 16.4091795 6.0703125 16.7109375 C 5.49902325 17.03027325 5.551758 17.51953125 6.140625 17.6484375 C 6.29296875 18.0439455 6.3251954999999995 18.24023475 6.75 18.421875 C 6.66796875 19.25683575 6.580078500000001 20.11523475 6.4921875 21.046875 C 6.873047250000001 22.921875 9.776367 19.67871075 10.1484375 19.40625 C 12.161133 17.9296875 12.46875 21.15234375 13.875 21.65625 C 16.2421875 22.5029295 15.474609749999999 17.52246075 13.5703125 12.6328125 C 13.34472675 9.489258 14.40234375 8.59277325 15.421875 8.1796875 C 15.958008 8.00390625 16.3564455 7.96875 17.0859375 8.1796875 C 18.33984375 8.54003925 18.60058575 7.11328125 17.484375 6.9375 C 17.0595705 6.8701170000000005 16.7519535 6.8759767499999995 16.359375 6.703125 C 16.5175785 6.0732420000000005 17.14453125 6.041016000000001 17.765625 5.953125 C 19.17773475 5.75390625 19.0546875 4.23046875 17.484375 4.59375 C 16.7988285 4.754883 16.49121075 5.16210975 16.2421875 5.15625 C 16.56152325 4.573242 17.10058575 4.072266 17.625 3.328125 C 18.0175785 2.7685545 17.5341795 2.21484375 16.921875 2.25 Z M 9.6328125 7.734375 C 9.817383 7.7109375 9.978516 7.72265625 10.1484375 7.78125 C 10.8251955 8.009766 11.05371075 8.87109375 10.640625 9.6796875 C 10.22753925 10.48828125 9.3251955 10.9394535 8.6484375 10.7109375 C 7.9716795000000005 10.48242225 7.7666017499999995 9.64453125 8.1796875 8.8359375 C 8.49023475 8.229492 9.07910175 7.8076170000000005 9.6328125 7.734375 Z M 8.90625 8.8359375 C 8.80371075 8.838867 8.698242 8.89746075 8.6015625 9 C 8.4082035 9.208008 8.34375 9.55078125 8.4609375 9.75 C 8.5810545 9.94921875 8.8300785 9.9345705 9.0234375 9.7265625 C 9.21679725 9.5185545 9.2841795 9.17578125 9.1640625 8.9765625 C 9.10546875 8.8769535 9.00878925 8.833008 8.90625 8.8359375 Z M 11.390625 10.7578125 C 12.521484749999999 12.919922249999999 13.587890999999999 15.48046875 13.8046875 18.3984375 C 13.90722675 19.78710975 12.791015999999999 18.28710975 12.65625 18.046875 C 10.359375 13.91015625 7.4091795000000005 22.40625 7.9921875 17.0859375 C 8.2939455 14.89453125 8.4404295 14.604492 8.5078125 12.046875 C 8.5078125 12.046875 10.265625 12.963867 11.390625 10.7578125 Z M 7.21875 13.2890625 C 7.1630857500000005 14.0126955 7.1484375 14.490234749999999 7.078125 15.234375 C 6.9228517499999995 14.830078499999999 6.7177732500000005 14.7890625 6.609375 14.4140625 C 6.8349607500000005 14.16796875 6.990234750000001 13.6875 7.21875 13.2890625 Z"/></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Visual Basic</title><path d="M6.363 17.719a7.57 7.57 0 0 1 .34-1.348L10.887 4.5h1.863l-5.473 15h-1.91L0 4.5h1.934l4.09 11.895c.078.218.14.437.187.656s.098.441.152.668zM20.66 11.53c.5.063.957.188 1.371.375s.766.442 1.055.762.512.691.668 1.113.238.89.246 1.406c0 .696-.133 1.31-.398 1.84s-.622.98-1.067 1.348-.96.645-1.547.832-1.203.285-1.851.293h-4.371v-15h4.265c.54 0 1.059.066 1.559.2s.95.335 1.348.609.714.628.949 1.066.355.957.363 1.559c0 .859-.227 1.601-.68 2.226s-1.09 1.067-1.91 1.324v.047zm-4.137-.597h1.793c.43 0 .832-.051 1.207-.153s.704-.258.985-.469.5-.488.656-.832.238-.746.246-1.207c0-.43-.078-.785-.234-1.066s-.367-.504-.633-.668-.57-.277-.914-.34-.707-.097-1.09-.105h-2.016v4.84zm2.38 6.972c.437 0 .85-.05 1.242-.152s.738-.262 1.043-.48.539-.5.703-.844.254-.762.27-1.254c0-.54-.102-.98-.306-1.324s-.476-.614-.82-.809-.73-.332-1.16-.41-.875-.117-1.336-.117h-2.016v5.39h2.38z"/></svg>

After

Width:  |  Height:  |  Size: 975 B

+31 -2
View File
@@ -108,8 +108,27 @@ export const sidebar: StarlightUserConfig['sidebar'] = [
{
label: 'Java',
collapsed: true,
// when we have maven this will change to not have gradle as the top docs for Java
items: getPluginItems('gradle', 'java'),
items: [
{
label: 'Introduction',
link: 'technologies/java/introduction',
},
{
label: 'Gradle',
collapsed: true,
items: getPluginItems('gradle', 'java'),
},
{
label: 'Maven',
collapsed: true,
items: getPluginItems('maven', 'java'),
},
],
},
{
label: '.NET',
collapsed: true,
items: getPluginItems('dotnet'),
},
{
label: 'Module Federation',
@@ -162,6 +181,11 @@ export const sidebar: StarlightUserConfig['sidebar'] = [
collapsed: true,
items: getPluginItems('rsbuild', 'build-tools'),
},
{
label: 'Docker',
collapsed: true,
items: getPluginItems('docker', 'build-tools'),
},
],
},
{
@@ -173,6 +197,11 @@ export const sidebar: StarlightUserConfig['sidebar'] = [
collapsed: true,
items: getPluginItems('cypress', 'test-tools'),
},
{
label: 'Vitest',
collapsed: true,
items: getPluginItems('vitest', 'test-tools'),
},
{
label: 'Jest',
collapsed: true,
@@ -5385,11 +5385,6 @@
"hash": "04d21c10923d481ce024556edc1c49f845e225d1",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-13-10-0/update-decorate-cli.ts",
"hash": "9334b9a991673222b3ed0282b748a6de9eca2ced",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-13-10-0/update-tasks-runner.ts",
"hash": "37f930864bf0d5ff771eb4d691ab8cfcb9673802",
@@ -5425,11 +5420,6 @@
"hash": "addea9c1bc5a5eef2d856439b8f9bc4e4d0993e4",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-13-9-0/update-decorate-cli.ts",
"hash": "eae7efc8c2562ec1948245df2a84223d41e63bce",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-14-0-0/change-npm-script-executor.spec.ts",
"hash": "ba26be4f1b2644f191bfa3cb9ae4b0c8f8f75e9c",
@@ -20656,11 +20646,6 @@
"file": "packages/cli/jest.config.ts",
"hash": "5a6bcdc5c0f2540e13206f7276ef09ccf886a305"
},
{
"file": "packages/cli/lib/decorate-cli.ts",
"hash": "fbb9636c447e0e8a3af4c1f6446ffd7103388431",
"deps": ["nx"]
},
{
"file": "packages/cli/package.json",
"hash": "9c5ad8ce7142606dc835b87ea36c40c649d5910f",
@@ -22580,10 +22565,6 @@
"npm:@angular-devkit/core"
]
},
{
"file": "packages/nx/src/adapter/decorate-cli.ts",
"hash": "7126a16e8c98f8cb4c2eec1b80a3f8db3c65bff0"
},
{
"file": "packages/nx/src/adapter/ngcli-adapter.ts",
"hash": "16fd0f04b1dd33aee828d543d8a941e0a934905e",
Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

-19
View File
@@ -5385,11 +5385,6 @@
"hash": "04d21c10923d481ce024556edc1c49f845e225d1",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-13-10-0/update-decorate-cli.ts",
"hash": "9334b9a991673222b3ed0282b748a6de9eca2ced",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-13-10-0/update-tasks-runner.ts",
"hash": "37f930864bf0d5ff771eb4d691ab8cfcb9673802",
@@ -5425,11 +5420,6 @@
"hash": "addea9c1bc5a5eef2d856439b8f9bc4e4d0993e4",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-13-9-0/update-decorate-cli.ts",
"hash": "eae7efc8c2562ec1948245df2a84223d41e63bce",
"deps": ["devkit"]
},
{
"file": "packages/workspace/src/migrations/update-14-0-0/change-npm-script-executor.spec.ts",
"hash": "ba26be4f1b2644f191bfa3cb9ae4b0c8f8f75e9c",
@@ -20656,11 +20646,6 @@
"file": "packages/cli/jest.config.ts",
"hash": "5a6bcdc5c0f2540e13206f7276ef09ccf886a305"
},
{
"file": "packages/cli/lib/decorate-cli.ts",
"hash": "fbb9636c447e0e8a3af4c1f6446ffd7103388431",
"deps": ["nx"]
},
{
"file": "packages/cli/package.json",
"hash": "9c5ad8ce7142606dc835b87ea36c40c649d5910f",
@@ -22580,10 +22565,6 @@
"npm:@angular-devkit/core"
]
},
{
"file": "packages/nx/src/adapter/decorate-cli.ts",
"hash": "7126a16e8c98f8cb4c2eec1b80a3f8db3c65bff0"
},
{
"file": "packages/nx/src/adapter/ngcli-adapter.ts",
"hash": "16fd0f04b1dd33aee828d543d8a941e0a934905e",
@@ -18,8 +18,9 @@ type Crumb = {
}
function findDocByPath (path: string) {
return allDocs.find(d => d.id === `${path}.mdoc`)
?? allDocs.find(d => d.id === `${path}/index.mdoc`);
path = path.replace(/^docs\//, '');
return allDocs.find(d => d.id === `${path}`)
?? allDocs.find(d => d.id === `${path}/index`);
}
function createNameFromSegment(segment: string): string {
+682 -275
View File
@@ -11,291 +11,698 @@ import nxLogoLight from '../../assets/nx/Nx-light.svg';
* Render the `Search` component if Pagefind is enabled or the default search component has been overridden.
*/
const shouldRenderSearch =
config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro';
config.pagefind ||
config.components.Search !== '@astrojs/starlight/components/Search.astro';
// Get the base URL from environment
const nxDevUrl = import.meta.env.SITE || 'https://nx.dev';
// Version options
const versions = [
{ version: 'v21', href: '/docs/getting-started/intro', current: true },
{ version: 'v20', href: 'https://20.nx.dev/docs' },
{ version: 'v19', href: 'https://19.nx.dev/docs' },
{ version: 'v22', href: '/docs/getting-started/intro', current: true },
{ version: 'v21', href: 'https://21.nx.dev/docs' },
{ version: 'v20', href: 'https://20.nx.dev/docs' },
{ version: 'v19', href: 'https://19.nx.dev/docs' },
];
const currentVersion = versions.find(v => v.current);
const currentVersion = versions.find((v) => v.current);
---
<div class="flex items-center justify-between h-full gap-4">
<div class="flex items-center gap-2 flex-shrink-0">
<div class="flex items-center gap-2 flex-shrink-0">
<a href={import.meta.env.SITE} class="flex items-center no-underline">
<Image src={nxLogoDark} alt="Nx" class="h-12 w-auto dark:hidden" />
<Image src={nxLogoLight} alt="Nx" class="h-12 w-auto hidden dark:block" />
</a>
<a href="/docs/getting-started/intro" class="px-3.5 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500">
Docs
</a>
<!-- Version Switcher -->
<div class="relative ml-1">
<button class="version-trigger flex items-center gap-1 px-2 py-1 text-sm bg-transparent hover:text-blue-500" aria-expanded="false" aria-haspopup="true">
<span>{currentVersion?.version}</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-3 h-3 transition-transform version-icon">
<path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" />
</svg>
</button>
<div class="version-menu absolute top-full left-0 mt-1 min-w-[8rem] bg-white border border-slate-200 rounded-md shadow-lg opacity-0 invisible translate-y-1 transition-all z-50 dark:bg-slate-900 dark:border-slate-800">
<div class="py-1">
{versions.map((item) => (
<a
href={item.href}
class={`block px-4 py-2 text-sm no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60 ${item.current ? 'text-blue-600 font-semibold dark:text-sky-400' : 'text-slate-700 dark:text-slate-300'}`}
aria-current={item.current ? 'page' : undefined}
>
<span class="flex items-center justify-between">
{item.version}
{item.current && <span class="text-blue-600 dark:text-sky-400">✓</span>}
</span>
</a>
))}
</div>
</div>
</div>
</div>
<nav class="hidden lg:flex items-center gap-1 ml-8 flex-shrink-0">
<a href="https://nx.dev/blog" class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500">
Blog
</a>
<!-- Resources Dropdown -->
<div class="relative nav-dropdown">
<button class="dropdown-trigger flex items-center gap-1 px-3 py-2 text-sm bg-transparent hover:text-blue-500 rounded-md transition-colors whitespace-nowrap dark:text-slate-200 dark:hover:text-sky-500" aria-expanded="false" aria-haspopup="true">
<span>Resources</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-4 h-4 transition-transform dropdown-icon">
<path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" />
</svg>
</button>
<div class="dropdown-menu absolute top-full left-0 mt-2 w-[32rem] bg-slate-50/95 backdrop-blur-sm rounded-lg shadow-lg ring-1 ring-slate-200/40 opacity-0 invisible translate-y-1 transition-all z-50 dark:bg-slate-950/95 dark:ring-slate-800/60">
<div class="grid grid-cols-2 gap-6 p-6">
<!-- Learn Section -->
<div class="space-y-1">
<h5 class="text-xs font-semibold uppercase tracking-wider text-slate-500 px-2 pb-2 dark:text-slate-400">Learn</h5>
<a href="https://nx.dev/podcast" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Podcasts</span>
</a>
<a href="https://nx.dev/webinar" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Webinars</span>
</a>
<a href="https://nx.dev/courses" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M15.91 11.672a.375.375 0 0 1 0 .656l-5.603 3.113a.375.375 0 0 1-.557-.328V8.887c0-.286.307-.466.557-.327l5.603 3.112Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Nx Video Courses</span>
</a>
<a href="https://go.nrwl.io/nx-newsletter" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 0 1-2.25 2.25M16.5 7.5V18a2.25 2.25 0 0 0 2.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 0 0 2.25 2.25h13.5M6 7.5h3v3H6v-3Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Newsletter</span>
</a>
<a href="https://nx.dev/community" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 0 1 .865-.501 48.172 48.172 0 0 0 3.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0 0 12 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Community</span>
</a>
<a href="https://go.nx.dev/community" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Discord</span>
</a>
</div>
<!-- Right Column -->
<div class="space-y-4">
<!-- Events Section -->
<div class="space-y-1">
<h5 class="text-xs font-semibold uppercase tracking-wider text-slate-500 px-2 pb-2 dark:text-slate-400">Events</h5>
<a href="https://go.nx.dev/office-hours" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Office Hours</span>
</a>
<a href="https://www.youtube.com/@nxdevtools/streams" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" d="m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Live Streams</span>
</a>
</div>
<!-- Company Section -->
<div class="space-y-1">
<h5 class="text-xs font-semibold uppercase tracking-wider text-slate-500 px-2 pb-2 dark:text-slate-400">Company</h5>
<a href="https://nx.dev/company" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">About Us</span>
</a>
<a href="https://nx.dev/customers" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 21h19.5m-18-18v18m10.5-18v18m6-13.5V21M6.75 6.75h.75m-.75 3h.75m-.75 3h.75m3-6h.75m-.75 3h.75m-.75 3h.75M6.75 21v-3.375c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21M3 3h12m-.75 4.5H21m-3.75 3.75h.008v.008h-.008v-.008Zm0 3h.008v.008h-.008v-.008Zm0 3h.008v.008h-.008v-.008Z" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Customers</span>
</a>
<a href="https://nx.dev/partners" class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60">
<svg class="w-5 h-5 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.712 4.33a9.027 9.027 0 0 1 1.652 1.306c.51.51.944 1.064 1.306 1.652M16.712 4.33l-3.448 4.138m3.448-4.138a9.014 9.014 0 0 0-9.424 0M19.67 7.288l-4.138 3.448m4.138-3.448a9.014 9.014 0 0 1 0 9.424m-1.306 1.652a9.027 9.027 0 0 1-1.652 1.306m0 0-3.448-4.138m3.448 4.138a9.014 9.014 0 0 1-9.424 0m5.976-4.138a3.765 3.765 0 0 1-2.528 0m0 0a3.736 3.736 0 0 1-1.388-.88 3.737 3.737 0 0 1-.88-1.388m2.268 2.268L7.288 19.67m0 0a9.024 9.024 0 0 1-1.652-1.306 9.027 9.027 0 0 1-1.306-1.652m0 0 4.138-3.448M4.33 16.712a9.014 9.014 0 0 1 0-9.424m4.138-3.448A9.027 9.027 0 0 1 7.162 5.146a9.024 9.024 0 0 1 1.306 1.652M4.33 7.288 8.468 10.736m0 0a3.736 3.736 0 0 1 .88-1.388 3.737 3.737 0 0 1 1.388-.88m-2.268 2.268L4.33 7.288m6.406 1.18L7.288 4.33m0 0a9.024 9.024 0 0 0-1.652 1.306A9.025 9.025 0 0 0 4.33 7.288" />
</svg>
<span class="text-sm font-medium text-slate-900 dark:text-slate-200">Partners</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="h-6 w-px bg-slate-200 mx-1 dark:bg-slate-700"></div>
<a href="https://nx.dev/ai" class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500">
AI
</a>
<a href="https://nx.dev/nx-cloud" class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500">
Nx Cloud
</a>
<div class="h-6 w-px bg-slate-200 mx-1 dark:bg-slate-700"></div>
<a href="https://nx.dev/enterprise" class="px-3 py-2 text-sm font-semibold text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500">
Nx Enterprise
</a>
</nav>
<div class="flex-1 max-w-sm mx-4 print:hidden">
{shouldRenderSearch && <Search />}
</div>
<div class="hidden md:flex items-center gap-4 print:hidden">
<!-- CTA Buttons - Hide on screens smaller than xl (1280px) -->
<div class="hidden xl:flex items-center gap-2">
<a
href="https://nx.dev/contact"
class="inline-flex items-center justify-center px-2.5 py-1.5 text-sm font-medium rounded-md transition no-underline border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200 hover:bg-slate-50 dark:hover:bg-slate-700 shadow-sm"
title="Contact Us"
>
Contact
</a>
<a
href="https://cloud.nx.app?utm_source=nx-dev&utm_medium=header"
target="_blank"
rel="noopener noreferrer"
class="inline-flex items-center justify-center px-2.5 py-1.5 text-sm font-medium rounded-md transition no-underline bg-blue-500 dark:bg-sky-500 text-white hover:bg-blue-600 dark:hover:bg-sky-600 shadow-sm"
title="Login to Nx Cloud"
>
Login
</a>
</div>
<!-- Social Icons - Hide on screens smaller than 2xl (1536px) -->
<div class="hidden 2xl:flex items-center gap-4">
<SocialIcons />
</div>
<div class="after:content-[''] after:h-8 after:border-l after:border-slate-200 dark:after:border-slate-700"></div>
<!-- Theme Switcher - Always visible (highest priority) -->
<ThemeSelect />
</div>
<Image src={nxLogoDark} alt="Nx" class="h-12 w-auto dark:hidden" />
<Image src={nxLogoLight} alt="Nx" class="h-12 w-auto hidden dark:block" />
</a>
<a
id="header-docs-home-link"
href="/docs/getting-started/intro"
class="px-3.5 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500"
>
Docs
</a>
<!-- Version Switcher -->
<div class="relative ml-1">
<button
class="version-trigger flex items-center gap-1 px-2 py-1 text-sm bg-transparent hover:text-blue-500"
aria-expanded="false"
aria-haspopup="true"
>
<span>{currentVersion?.version}</span>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-3 h-3 transition-transform version-icon"
>
<path
fill-rule="evenodd"
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
clip-rule="evenodd"></path>
</svg>
</button>
<div
class="version-menu absolute top-full left-0 mt-1 min-w-[8rem] bg-white border border-slate-200 rounded-md shadow-lg opacity-0 invisible translate-y-1 transition-all z-50 dark:bg-slate-900 dark:border-slate-800"
>
<div class="py-1">
{
versions.map((item) => (
<a
href={item.href}
class={`block px-4 py-2 text-sm no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60 ${item.current ? 'text-blue-600 font-semibold dark:text-sky-400' : 'text-slate-700 dark:text-slate-300'}`}
aria-current={item.current ? 'page' : undefined}
>
<span class="flex items-center justify-between">
{item.version}
{item.current && (
<span class="text-blue-600 dark:text-sky-400">✓</span>
)}
</span>
</a>
))
}
</div>
</div>
</div>
</div>
<nav class="hidden lg:flex items-center gap-1 ml-8 flex-shrink-0">
<a
href={`${nxDevUrl}/blog`}
class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500"
>
Blog
</a>
<!-- Resources Dropdown -->
<div class="relative nav-dropdown">
<button
class="dropdown-trigger flex items-center gap-1 px-3 py-2 text-sm bg-transparent hover:text-blue-500 rounded-md transition-colors whitespace-nowrap dark:text-slate-200 dark:hover:text-sky-500"
aria-expanded="false"
aria-haspopup="true"
>
<span>Resources</span>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4 transition-transform dropdown-icon"
>
<path
fill-rule="evenodd"
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
clip-rule="evenodd"></path>
</svg>
</button>
<div
class="dropdown-menu absolute top-full left-0 mt-2 w-[32rem] bg-slate-50/95 backdrop-blur-sm rounded-lg shadow-lg ring-1 ring-slate-200/40 opacity-0 invisible translate-y-1 transition-all z-50 dark:bg-slate-950/95 dark:ring-slate-800/60"
>
<div class="grid grid-cols-2 gap-6 p-6">
<!-- Learn Section -->
<div class="space-y-1">
<h5
class="text-xs font-semibold uppercase tracking-wider text-slate-500 px-2 pb-2 dark:text-slate-400"
>
Learn
</h5>
<a
href={`${nxDevUrl}/podcast`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Podcasts</span
>
</a>
<a
href={`${nxDevUrl}/webinar`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Webinars</span
>
</a>
<a
href={`${nxDevUrl}/courses`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"></path>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M15.91 11.672a.375.375 0 0 1 0 .656l-5.603 3.113a.375.375 0 0 1-.557-.328V8.887c0-.286.307-.466.557-.327l5.603 3.112Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Nx Video Courses</span
>
</a>
<a
href="https://go.nrwl.io/nx-newsletter"
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 0 1-2.25 2.25M16.5 7.5V18a2.25 2.25 0 0 0 2.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 0 0 2.25 2.25h13.5M6 7.5h3v3H6v-3Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Newsletter</span
>
</a>
<a
href={`${nxDevUrl}/community`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 0 1 .865-.501 48.172 48.172 0 0 0 3.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0 0 12 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Community</span
>
</a>
<a
href="https://go.nx.dev/community"
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
>
<path
d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Discord</span
>
</a>
<a
href={`${nxDevUrl}/resources-library?filterBy=book`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Books</span
>
</a>
<a
href={`${nxDevUrl}/resources-library?filterBy=case-study`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Case Studies</span
>
</a>
<a
href={`${nxDevUrl}/resources-library?filterBy=whitepaper`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Whitepapers</span
>
</a>
</div>
<!-- Right Column -->
<div class="space-y-4">
<!-- Events Section -->
<div class="space-y-1">
<h5
class="text-xs font-semibold uppercase tracking-wider text-slate-500 px-2 pb-2 dark:text-slate-400"
>
Events
</h5>
<a
href="https://www.youtube.com/playlist?list=PLakNactNC1dE8KLQ5zd3fQwu_yQHjTmR5"
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
d="m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Nx Live</span
>
</a>
</div>
<!-- Company Section -->
<div class="space-y-1">
<h5
class="text-xs font-semibold uppercase tracking-wider text-slate-500 px-2 pb-2 dark:text-slate-400"
>
Company
</h5>
<a
href={`${nxDevUrl}/company`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>About Us</span
>
</a>
<a
href={`${nxDevUrl}/customers`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M2.25 21h19.5m-18-18v18m10.5-18v18m6-13.5V21M6.75 6.75h.75m-.75 3h.75m-.75 3h.75m3-6h.75m-.75 3h.75m-.75 3h.75M6.75 21v-3.375c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21M3 3h12m-.75 4.5H21m-3.75 3.75h.008v.008h-.008v-.008Zm0 3h.008v.008h-.008v-.008Zm0 3h.008v.008h-.008v-.008Z"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Customers</span
>
</a>
<a
href={`${nxDevUrl}/partners`}
class="flex items-center gap-3 px-2 py-2 rounded-md no-underline hover:bg-slate-50 transition-colors dark:hover:bg-slate-800/60"
>
<svg
class="w-5 h-5 text-slate-400 dark:text-slate-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.712 4.33a9.027 9.027 0 0 1 1.652 1.306c.51.51.944 1.064 1.306 1.652M16.712 4.33l-3.448 4.138m3.448-4.138a9.014 9.014 0 0 0-9.424 0M19.67 7.288l-4.138 3.448m4.138-3.448a9.014 9.014 0 0 1 0 9.424m-1.306 1.652a9.027 9.027 0 0 1-1.652 1.306m0 0-3.448-4.138m3.448 4.138a9.014 9.014 0 0 1-9.424 0m5.976-4.138a3.765 3.765 0 0 1-2.528 0m0 0a3.736 3.736 0 0 1-1.388-.88 3.737 3.737 0 0 1-.88-1.388m2.268 2.268L7.288 19.67m0 0a9.024 9.024 0 0 1-1.652-1.306 9.027 9.027 0 0 1-1.306-1.652m0 0 4.138-3.448M4.33 16.712a9.014 9.014 0 0 1 0-9.424m4.138-3.448A9.027 9.027 0 0 1 7.162 5.146a9.024 9.024 0 0 1 1.306 1.652M4.33 7.288 8.468 10.736m0 0a3.736 3.736 0 0 1 .88-1.388 3.737 3.737 0 0 1 1.388-.88m-2.268 2.268L4.33 7.288m6.406 1.18L7.288 4.33m0 0a9.024 9.024 0 0 0-1.652 1.306A9.025 9.025 0 0 0 4.33 7.288"
></path>
</svg>
<span
class="text-sm font-medium text-slate-900 dark:text-slate-200"
>Partners</span
>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="h-6 w-px bg-slate-200 mx-1 dark:bg-slate-700"></div>
<a
id="header-ai-link"
href={`${nxDevUrl}/ai`}
class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500"
>
AI
</a>
<a
id="header-nx-cloud-link"
href={`${nxDevUrl}/nx-cloud`}
class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500"
>
Nx Cloud
</a>
<a
id="header-pricing-link"
href={`${nxDevUrl}/nx-cloud#plans`}
class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500"
>
Pricing
</a>
<div class="h-6 w-px bg-slate-200 mx-1 dark:bg-slate-700"></div>
<a
id="header-enterprise-link"
href={`${nxDevUrl}/enterprise`}
class="px-3 py-2 text-sm font-semibold text-slate-600 hover:text-blue-500 rounded-md transition-colors whitespace-nowrap no-underline dark:text-slate-200 dark:hover:text-sky-500"
>
Enterprise
</a>
</nav>
<div class="flex-1 max-w-sm mx-4 print:hidden">
{shouldRenderSearch && <Search />}
</div>
<div class="hidden md:flex items-center gap-4 print:hidden">
<!-- CTA Buttons - Hide on screens smaller than xl (1280px) -->
<div class="hidden xl:flex items-center gap-2">
<a
id="header-contact-btn"
href={`${nxDevUrl}/contact`}
class="inline-flex items-center justify-center px-2.5 py-1.5 text-sm font-medium rounded-md transition no-underline border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200 hover:bg-slate-50 dark:hover:bg-slate-700 shadow-sm"
title="Contact Us"
>
Contact
</a>
<a
id="header-try-nx-cloud-btn"
href="https://cloud.nx.app/get-started?utm_source=nx-dev&utm_medium=documentation-header&utm_campaign=try-nx-cloud"
target="_blank"
rel="noopener noreferrer"
class="inline-flex items-center justify-center px-2.5 py-1.5 text-sm font-medium rounded-md transition no-underline bg-blue-500 dark:bg-sky-500 text-white hover:bg-blue-600 dark:hover:bg-sky-600 shadow-sm"
title="Try Nx Cloud for free"
>
Try Nx Cloud for free
</a>
</div>
<!-- Social Icons - Hide on screens smaller than 2xl (1536px) -->
<div class="hidden 2xl:flex items-center gap-4">
<SocialIcons />
</div>
<div
class="after:content-[''] after:h-8 after:border-l after:border-slate-200 dark:after:border-slate-700"
>
</div>
<!-- Theme Switcher - Always visible (highest priority) -->
<ThemeSelect />
</div>
</div>
<script>
// Handle dropdown interactions
document.addEventListener('DOMContentLoaded', () => {
const dropdowns = document.querySelectorAll('.nav-dropdown');
dropdowns.forEach(dropdown => {
const trigger = dropdown.querySelector('.dropdown-trigger');
const menu = dropdown.querySelector('.dropdown-menu');
let closeTimeout: number;
// Mouse interactions
trigger?.addEventListener('mouseenter', () => {
clearTimeout(closeTimeout);
trigger.setAttribute('aria-expanded', 'true');
menu?.classList.remove('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.add('opacity-100', 'visible', 'translate-y-0');
trigger.querySelector('.dropdown-icon')?.classList.add('rotate-180');
});
dropdown.addEventListener('mouseleave', () => {
closeTimeout = window.setTimeout(() => {
trigger?.setAttribute('aria-expanded', 'false');
menu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
trigger?.querySelector('.dropdown-icon')?.classList.remove('rotate-180');
}, 150);
});
dropdown.addEventListener('mouseenter', () => {
clearTimeout(closeTimeout);
});
// Keyboard interactions
trigger?.addEventListener('click', (e) => {
e.preventDefault();
const isOpen = trigger.getAttribute('aria-expanded') === 'true';
trigger.setAttribute('aria-expanded', (!isOpen).toString());
if (isOpen) {
menu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
trigger.querySelector('.dropdown-icon')?.classList.remove('rotate-180');
} else {
menu?.classList.remove('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.add('opacity-100', 'visible', 'translate-y-0');
trigger.querySelector('.dropdown-icon')?.classList.add('rotate-180');
}
});
});
// Version switcher
const versionSwitcher = document.querySelector('.version-trigger')?.parentElement;
const versionTrigger = versionSwitcher?.querySelector('.version-trigger');
const versionMenu = versionSwitcher?.querySelector('.version-menu');
versionTrigger?.addEventListener('click', (e) => {
e.stopPropagation();
const isOpen = versionTrigger.getAttribute('aria-expanded') === 'true';
versionTrigger.setAttribute('aria-expanded', (!isOpen).toString());
if (isOpen) {
versionMenu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
versionMenu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
versionTrigger.querySelector('.version-icon')?.classList.remove('rotate-180');
} else {
versionMenu?.classList.remove('opacity-0', 'invisible', 'translate-y-1');
versionMenu?.classList.add('opacity-100', 'visible', 'translate-y-0');
versionTrigger.querySelector('.version-icon')?.classList.add('rotate-180');
}
});
// Close dropdowns when clicking outside
document.addEventListener('click', (e) => {
const target = e.target as HTMLElement;
// Close nav dropdowns
if (!target.closest('.nav-dropdown')) {
dropdowns.forEach(dropdown => {
const trigger = dropdown.querySelector('.dropdown-trigger');
const menu = dropdown.querySelector('.dropdown-menu');
trigger?.setAttribute('aria-expanded', 'false');
menu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
trigger?.querySelector('.dropdown-icon')?.classList.remove('rotate-180');
});
}
// Close version switcher
if (!target.closest('.version-trigger') && !target.closest('.version-menu')) {
versionTrigger?.setAttribute('aria-expanded', 'false');
versionMenu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
versionMenu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
versionTrigger?.querySelector('.version-icon')?.classList.remove('rotate-180');
}
});
});
import { sendCustomEvent } from '@nx/nx-dev-feature-analytics';
function setupAnalyticsTracking() {
const docsHomeLink = document.getElementById('header-docs-home-link');
const aiLink = document.getElementById('header-ai-link');
const nxCloudLink = document.getElementById('header-nx-cloud-link');
const pricingLink = document.getElementById('header-pricing-link');
const enterpriseLink = document.getElementById('header-enterprise-link');
const contactBtn = document.getElementById('header-contact-btn');
const tryNxCloudBtn = document.getElementById('header-try-nx-cloud-btn');
docsHomeLink?.addEventListener('click', () => {
sendCustomEvent(
'documentation-click',
'header-navigation',
'documentation-header'
);
});
aiLink?.addEventListener('click', () => {
sendCustomEvent(
'ai-click',
'header-navigation',
'documentation-header'
);
});
nxCloudLink?.addEventListener('click', () => {
sendCustomEvent(
'nx-cloud-click',
'header-navigation',
'documentation-header'
);
});
pricingLink?.addEventListener('click', () => {
sendCustomEvent(
'pricing-click',
'header-navigation',
'documentation-header'
);
});
enterpriseLink?.addEventListener('click', () => {
sendCustomEvent(
'enterprise-click',
'header-navigation',
'documentation-header'
);
});
contactBtn?.addEventListener('click', () => {
sendCustomEvent('contact-click', 'header-cta', 'documentation-header');
});
tryNxCloudBtn?.addEventListener('click', () => {
sendCustomEvent('login-click', 'header-cta', 'documentation-header');
});
}
function setupDropdowns() {
const dropdowns = document.querySelectorAll('.nav-dropdown');
dropdowns.forEach((dropdown) => {
const trigger = dropdown.querySelector('.dropdown-trigger');
const menu = dropdown.querySelector('.dropdown-menu');
let closeTimeout: number;
// Mouse interactions
trigger?.addEventListener('mouseenter', () => {
clearTimeout(closeTimeout);
trigger.setAttribute('aria-expanded', 'true');
menu?.classList.remove('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.add('opacity-100', 'visible', 'translate-y-0');
trigger.querySelector('.dropdown-icon')?.classList.add('rotate-180');
});
dropdown.addEventListener('mouseleave', () => {
closeTimeout = window.setTimeout(() => {
trigger?.setAttribute('aria-expanded', 'false');
menu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
trigger
?.querySelector('.dropdown-icon')
?.classList.remove('rotate-180');
}, 150);
});
dropdown.addEventListener('mouseenter', () => {
clearTimeout(closeTimeout);
});
// Keyboard interactions
trigger?.addEventListener('click', (e) => {
e.preventDefault();
const isOpen = trigger.getAttribute('aria-expanded') === 'true';
trigger.setAttribute('aria-expanded', (!isOpen).toString());
if (isOpen) {
menu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
trigger
.querySelector('.dropdown-icon')
?.classList.remove('rotate-180');
} else {
menu?.classList.remove('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.add('opacity-100', 'visible', 'translate-y-0');
trigger.querySelector('.dropdown-icon')?.classList.add('rotate-180');
}
});
});
// Close dropdowns when clicking outside
document.addEventListener('click', (e) => {
const target = e.target as HTMLElement;
if (!target.closest('.nav-dropdown')) {
dropdowns.forEach((dropdown) => {
const trigger = dropdown.querySelector('.dropdown-trigger');
const menu = dropdown.querySelector('.dropdown-menu');
trigger?.setAttribute('aria-expanded', 'false');
menu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
menu?.classList.remove('opacity-100', 'visible', 'translate-y-0');
trigger
?.querySelector('.dropdown-icon')
?.classList.remove('rotate-180');
});
}
});
}
function setupVersionSwitcher() {
const versionSwitcher =
document.querySelector('.version-trigger')?.parentElement;
const versionTrigger =
versionSwitcher?.querySelector('.version-trigger') ?? null;
const versionMenu = versionSwitcher?.querySelector('.version-menu') ?? null;
versionTrigger?.addEventListener('click', (e) => {
e.stopPropagation();
const isOpen = versionTrigger.getAttribute('aria-expanded') === 'true';
versionTrigger.setAttribute('aria-expanded', (!isOpen).toString());
if (isOpen) {
versionMenu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
versionMenu?.classList.remove(
'opacity-100',
'visible',
'translate-y-0'
);
versionTrigger
.querySelector('.version-icon')
?.classList.remove('rotate-180');
} else {
versionMenu?.classList.remove(
'opacity-0',
'invisible',
'translate-y-1'
);
versionMenu?.classList.add('opacity-100', 'visible', 'translate-y-0');
versionTrigger
.querySelector('.version-icon')
?.classList.add('rotate-180');
}
});
// Close version switcher when clicking outside
document.addEventListener('click', (e) => {
const target = e.target as HTMLElement;
if (
!target.closest('.version-trigger') &&
!target.closest('.version-menu')
) {
versionTrigger?.setAttribute('aria-expanded', 'false');
versionMenu?.classList.add('opacity-0', 'invisible', 'translate-y-1');
versionMenu?.classList.remove(
'opacity-100',
'visible',
'translate-y-0'
);
versionTrigger
?.querySelector('.version-icon')
?.classList.remove('rotate-180');
}
});
}
document.addEventListener('DOMContentLoaded', () => {
setupAnalyticsTracking();
setupDropdowns();
setupVersionSwitcher();
});
</script>
@@ -1,9 +1,11 @@
---
// Copied from https://github.com/withastro/starlight/blob/f14eb0c/packages/starlight/components/PageFrame.astro with modifications.
import MobileMenuToggle from '@astrojs/starlight/components/MobileMenuToggle.astro';
import { Footer } from '@nx/nx-dev-ui-common';
import { Footer, GitHubStarWidget } from '@nx/nx-dev-ui-common';
import { WebinarNotifier } from '@nx/nx-dev-ui-common/src/lib/webinar-notifier';
const { hasSidebar } = Astro.locals.starlightRoute;
const githubStarsCount = Astro.locals.githubStarsCount ?? 0;
---
<div class="page sl-flex">
@@ -18,22 +20,25 @@ const { hasSidebar } = Astro.locals.starlightRoute;
<!-- CTA Buttons for Mobile Menu - Show when not in header (below xl breakpoint) -->
<div class="mobile-cta-buttons xl:hidden mt-auto pt-4 pb-4 border-t border-slate-800 dark:border-slate-700">
<div class="flex flex-col gap-2">
<a
href="https://nx.dev/contact"
class="w-full inline-flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition no-underline border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200 hover:bg-slate-50 dark:hover:bg-slate-700 shadow-sm"
title="Contact Us"
>
Contact
</a>
<a
href="https://cloud.nx.app?utm_source=nx-dev&utm_medium=header"
target="_blank"
rel="noopener noreferrer"
class="w-full inline-flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition no-underline bg-blue-500 dark:bg-sky-500 text-white hover:bg-blue-600 dark:hover:bg-sky-600 shadow-sm"
title="Login to Nx Cloud"
>
Login
</a>
<GitHubStarWidget starsCount={githubStarsCount} client:load />
<div class="flex flex-col mx-2 gap-2">
<a
href="https://nx.dev/contact"
class="w-full inline-flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition no-underline border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200 hover:bg-slate-50 dark:hover:bg-slate-700 shadow-sm"
title="Contact Us"
>
Contact
</a>
<a
href="https://cloud.nx.app?utm_source=nx-dev&utm_medium=header"
target="_blank"
rel="noopener noreferrer"
class="w-full inline-flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition no-underline bg-blue-500 dark:bg-sky-500 text-white hover:bg-blue-600 dark:hover:bg-sky-600 shadow-sm"
title="Login to Nx Cloud"
>
Login
</a>
</div>
</div>
</div>
</div>
@@ -42,7 +47,8 @@ const { hasSidebar } = Astro.locals.starlightRoute;
)
}
<div class="main-frame"><slot /></div>
<Footer disableThemeSwitcher={true} useDomainPrefix={true} className="mt-32 dark:bg-slate-900" />
<Footer disableThemeSwitcher={true} useDomainPrefix={true} className="dark:bg-slate-900" />
<WebinarNotifier client:load />
</div>
<style>
@@ -2,8 +2,10 @@
import MobileMenuFooter from '@astrojs/starlight/components/MobileMenuFooter.astro'
import SidebarPersister from '@astrojs/starlight/components/SidebarPersister.astro'
import SidebarSublist from './SidebarSublist.astro'
import { GitHubStarWidget } from '@nx/nx-dev-ui-common';
const { sidebar } = Astro.locals.starlightRoute
const githubStarsCount = Astro.locals.githubStarsCount ?? 0;
---
<div class="sidebar-wrapper" data-testid="sidebar-wrapper">
@@ -0,0 +1,215 @@
---
// recreated from https://github.com/withastro/starlight/blob/main/packages/starlight/components/TableOfContents.astro
import TableOfContentsList from './TableOfContentsList.astro';
import { GitHubStarWidget } from '@nx/nx-dev-ui-common';
const { toc } = Astro.locals.starlightRoute;
const githubStarsCount = Astro.locals.githubStarsCount ?? 0;
---
{
toc && (
<custom-toc data-min-h={toc.minHeadingLevel} data-max-h={toc.maxHeadingLevel}>
<div class="github-star-widget-container">
<GitHubStarWidget starsCount={githubStarsCount} client:load />
</div>
<nav aria-labelledby="starlight__on-this-page">
<h2 id="starlight__on-this-page">{Astro.locals.t('tableOfContents.onThisPage')}</h2>
<div class="toc-container">
<TableOfContentsList toc={toc.items} />
</div>
</nav>
</custom-toc>
)
}
<script>
// Define the constant locally since it's not exported from @astrojs/starlight
const PAGE_TITLE_ID = 'starlight__overview';
class CustomTOC extends HTMLElement {
private _current = this.querySelector<HTMLAnchorElement>('a[aria-current="true"]');
private minH = parseInt(this.dataset.minH || '2', 10);
private maxH = parseInt(this.dataset.maxH || '3', 10);
private tocContainer: HTMLElement | null = null;
protected set current(link: HTMLAnchorElement) {
if (link === this._current) return;
if (this._current) this._current.removeAttribute('aria-current');
link.setAttribute('aria-current', 'true');
this._current = link;
// Auto-scroll the active item into view within the TOC container
this.scrollActiveIntoView(link);
}
private onIdle = (cb: IdleRequestCallback) =>
(window.requestIdleCallback || ((cb) => setTimeout(cb, 1)))(cb);
constructor() {
super();
this.tocContainer = this.querySelector('.toc-container');
this.onIdle(() => this.init());
}
private scrollActiveIntoView(link: HTMLAnchorElement): void {
if (!this.tocContainer) return;
// Check if user prefers reduced motion
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
// Get the position of the link relative to the TOC container
const containerRect = this.tocContainer.getBoundingClientRect();
const linkRect = link.getBoundingClientRect();
// Calculate if the link is outside the visible area
const isAboveView = linkRect.top < containerRect.top;
const isBelowView = linkRect.bottom > containerRect.bottom;
if (isAboveView || isBelowView) {
// Scroll the link into view with some padding
const offsetTop = link.offsetTop - this.tocContainer.offsetTop;
const scrollPosition = offsetTop - this.tocContainer.clientHeight / 2 + link.clientHeight / 2;
this.tocContainer.scrollTo({
top: Math.max(0, scrollPosition),
behavior: prefersReducedMotion ? 'auto' : 'smooth'
});
}
}
private init = (): void => {
const links = Array.from(this.querySelectorAll('a'))
const getElementHeading = (el: Element): HTMLHeadingElement | null => {
if (!el) return null;
const isHeading = (el: Element): el is HTMLHeadingElement => {
if (el instanceof HTMLHeadingElement) {
if (el.id === PAGE_TITLE_ID) return true;
const level = el.tagName[1];
if (level) {
const int = parseInt(level, 10);
if (int >= this.minH && int <= this.maxH) return true;
}
}
return false;
};
return isHeading(el) ? el : getElementHeading(el.parentElement!);
};
const setCurrent: IntersectionObserverCallback = (entries) => {
for (const { isIntersecting, target } of entries) {
if (!isIntersecting) continue;
const heading = getElementHeading(target);
if (!heading) continue;
const link = links.find((link) => link.hash === '#' + encodeURIComponent(heading.id));
if (link) {
this.current = link;
break;
}
}
};
const toObserve = document.querySelectorAll('main [id], main [id] ~ *, main .content > *');
let observer: IntersectionObserver | undefined;
const observe = () => {
if (observer) observer.disconnect();
observer = new IntersectionObserver(setCurrent, { rootMargin: this.getRootMargin() });
toObserve.forEach((h) => observer!.observe(h));
};
observe();
let timeout: NodeJS.Timeout;
// Re-observe on resize to adjust for layout changes
window.addEventListener('resize', () => {
if(observer) {
observer.disconnect();
observer = undefined;
}
clearTimeout(timeout);
timeout = setTimeout(() => this.onIdle(observe), 200)
});
};
private getRootMargin(): `-${number}px 0% ${number}px` {
const navBarHeight = document.querySelector('header')?.getBoundingClientRect().height || 0;
const mobileTocHeight = this.querySelector('summary')?.getBoundingClientRect().height || 0;
// Account for footer by reducing bottom margin
const footerHeight = document.querySelector('footer')?.getBoundingClientRect().height || 0;
const top = navBarHeight + mobileTocHeight + 32;
const bottom = top + 53;
const height = document.documentElement.clientHeight;
// Adjust for footer
return `-${top}px 0% ${bottom - height + footerHeight}px`;
}
}
customElements.define('custom-toc', CustomTOC);
</script>
<style>
@layer starlight.core {
custom-toc {
display: block;
}
custom-toc nav {
display: block;
}
custom-toc h2 {
color: var(--sl-color-text);
font-size: var(--sl-text-sm);
font-weight: 600;
line-height: var(--sl-line-height-headings);
margin: 0 0 0.5rem 0;
padding: 0;
}
/* GitHub star widget styling */
.github-star-widget-container {
margin-bottom: 1rem;
}
/* Container with proper scrolling */
.toc-container {
/* Allow ToC to be its natural height - parent sticky container handles viewport constraints */
max-height: calc(100vh - var(--sl-nav-height) - 4rem);
overflow-y: auto;
overflow-x: hidden;
}
/* Only enable smooth scrolling if user doesn't prefer reduced motion */
@media (prefers-reduced-motion: no-preference) {
.toc-container {
scroll-behavior: smooth;
}
}
/* Scrollbar styling */
.toc-container::-webkit-scrollbar {
width: 4px;
}
.toc-container::-webkit-scrollbar-track {
background: transparent;
}
.toc-container::-webkit-scrollbar-thumb {
background: var(--sl-color-gray-5);
border-radius: 2px;
}
.toc-container:hover::-webkit-scrollbar-thumb {
background: var(--sl-color-gray-4);
}
/* Firefox scrollbar */
.toc-container {
scrollbar-width: thin;
scrollbar-color: var(--sl-color-gray-5) transparent;
}
}
</style>
@@ -0,0 +1,68 @@
---
import type { TocItem } from '@astrojs/starlight/utils/generateToC';
interface Props {
toc: TocItem[];
depth?: number;
isMobile?: boolean;
}
const { toc, isMobile = false, depth = 0 } = Astro.props;
---
<ul class:list={{ isMobile }}>
{
toc.map((heading) => (
<li>
<a href={'#' + heading.slug}>
<span>{heading.text}</span>
</a>
{heading.children.length > 0 && (
<Astro.self toc={heading.children} depth={depth + 1} isMobile={isMobile} />
)}
</li>
))
}
</ul>
<style define:vars={{ depth }}>
@layer starlight.core {
ul {
padding: 0;
list-style: none;
}
a {
--pad-inline: 0.5rem;
display: block;
border-radius: 0.25rem;
padding-block: 0.25rem;
padding-inline: calc(1rem * var(--depth) + var(--pad-inline)) var(--pad-inline);
line-height: 1.25;
color: var(--sl-color-gray-3);
text-decoration: none;
outline: none;
font-size: var(--sl-text-sm);
}
a:hover {
color: var(--sl-color-gray-2);
}
a[aria-current='true'] {
color: var(--sl-color-text-accent);
font-weight: 600;
}
a:focus-visible {
outline: 2px solid var(--sl-color-accent);
outline-offset: 2px;
}
@media (min-width: 50rem) {
a {
padding-inline-start: calc(1rem * var(--depth) + var(--pad-inline));
}
}
}
</style>
@@ -1,5 +1,6 @@
---
// Copied from https://github.com/withastro/starlight/blob/f14eb0c/packages/starlight/components/TwoColumnContent.astro with modifications.
const { data} = Astro.locals.starlightRoute.entry;
---
<div class="lg:sl-flex">
@@ -12,7 +13,8 @@
</aside>
)
}
<div class="main-pane" data-testid="main-pane"><slot /></div>
<div class="main-pane" data-testid="main-pane" data-pagefind-weight={data.weight} data-pagefind-filter={data.filter}
><slot /></div>
</div>
<style>
@@ -22,21 +24,27 @@
}
@media (min-width: 72rem) {
.lg\:sl-flex {
align-items: stretch;
}
.right-sidebar-container {
order: 2;
position: relative;
width: calc(
var(--sl-sidebar-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2
);
display: flex;
flex-direction: column;
}
.right-sidebar {
position: fixed;
top: 0;
position: sticky;
top: var(--sl-nav-height);
border-inline-start: 1px solid var(--sl-color-hairline);
padding-top: var(--sl-nav-height);
padding-top: 1rem;
width: 100%;
height: auto; // MODIFIED: full height conflicts with footer
max-height: calc(100vh - var(--sl-nav-height));
overflow-y: auto;
scrollbar-width: none;
}
@@ -3,6 +3,4 @@ import { type GraphProps, Graph as Default } from '@nx/nx-dev-ui-markdoc/src/lib
type Props = GraphProps;
---
<Default client:visible {...Astro.props} isAstro={true}>
<slot />
</Default>
<Default client:visible={{rootMargin:"100px"}} {...Astro.props} />
@@ -48,10 +48,7 @@ const sortedPages = childPages.sort((a, b) => {
const processedPages = sortedPages.map(page => {
let href = `/${page.id.replace('.mdoc', '')}`;
// Check if this is a subdirectory index page
const fileName = page.id.split('/').pop()?.replace('.mdoc', '');
const isIndexPage = fileName === 'index';
// Check if this is a subdirectory index page
const title = page.data.sidebar?.label || page.data.title || 'Untitled';
// Ensure href is never undefined
@@ -68,7 +65,6 @@ const processedPages = sortedPages.map(page => {
};
}).filter(page => page.href !== '#'); // Filter out any pages with invalid hrefs
---
{processedPages.length > 0 ? (
<Cards>
{processedPages.map(page => (
@@ -4,9 +4,7 @@ type Props = ProjectDetailsProps;
---
<div class="pdv">
<Default client:visible {...Astro.props} isAstro={true}>
<slot />
</Default>
<Default client:visible {...Astro.props} />
</div>
@@ -1,3 +0,0 @@
<div class="not-content grid grid-auto-col md:grid-flow-row md:grid-cols-2 gap-4">
<slot />
</div>
+27 -7
View File
@@ -6,17 +6,37 @@ import { PluginLoader } from './plugins/plugin.loader';
import { NxReferencePackagesLoader } from './plugins/nx-reference-packages.loader';
import { CommunityPluginsLoader } from './plugins/community-plugins.loader';
const baseSchema = z.object({
title: z.string(),
/**
* Slug should be from the root route without any prefix requirements i.e. `/docs`
**/
slug: z.string(),
const searchSchema = z.object({
weight: z
.number()
.min(0, 'Search weight cannot be lower than 0')
.max(10, 'Search weight cannot be higher than 10')
.optional(),
filter: z.string().optional(),
});
const customDocsSchema = z
.object({
title: z.string(),
description: z.string(),
})
.and(searchSchema);
const baseSchema = z
.object({
/**
* Slug should be from the root route without any prefix requirements i.e. `/docs`
**/
slug: z.string(),
})
.and(customDocsSchema);
// Default docs collection handled by Starlight
const docs = defineCollection({
loader: docsLoader(),
schema: docsSchema(),
schema: docsSchema({
extend: customDocsSchema,
}),
});
const nxReferencePackages = defineCollection({
@@ -533,5 +533,10 @@
"name": "@aws/nx-plugin",
"description": "Nx Plugin for AWS: Accelerate building cloud-native applications with AWS",
"url": "https://github.com/awslabs/nx-plugin-for-aws"
},
{
"name": "nx-oxlint",
"description": "Nx plugin for oxlint - a fast linter written in Rust",
"url": "https://github.com/Nas3nmann/nx-oxlint"
}
]
@@ -1,54 +0,0 @@
---
title: Nx Cloud AI
sidebar:
order: 100
---
Nx Cloud AI offers a suite of features designed to **enhance your development workflow with AI-driven capabilities**. These tools assist in troubleshooting, optimizing resource allocation, and improving your overall development process.
- **[Explain with AI](/docs/features/ci-features/explain-with-ai)** - This feature uses AI to provide detailed explanations about failed tasks.
## Enable Nx Cloud AI Features
To enable AI features for your organization, go to your organization's settings on [Nx Cloud](https://cloud.nx.app/orgs?utm_source=nx.dev&utm_campaign=ai) and select the organization where you want to enable AI.
In the **settings** menu, find the "AI Features" section and toggle it to "On".
![enable ai features](../../../../assets/features/ci-features/ai-features.png)
Ensure that you **accept the AI terms** to start using the AI features.
{% aside type="note" title="AI Features Availability" %}
AI features are available only for the [Nx Cloud Team plan](https://nx.dev/pricing).
{% /aside %}
### Enable AI Features for Enterprise On-Prem Installations
To enable AI features for enterprise on-prem installations, add the following configuration to your `helm-values.yaml` file:
```yaml
nxApi
deployment:
env:
- name: NX_CLOUD_AI_ENABLED
value: 'true'
frontend
deployment:
env:
- name: OPENAI_SECRET_KEY
valueFrom:
secretKeyRef:
name: open-ai-secrets
key: OPENAI_SECRET_KEY
- name: NX_CLOUD_AI_ENABLED
value: 'true'
```
Ensure your OpenAI secret key is correctly configured to provide the necessary credits for `gpt-3.5-turbo` and `gpt-4`.
### Regional Availability
This feature is not available for the EU cluster in public cloud installations due to regional restrictions. However, on-prem customers in the EU can still use this feature by providing their own OpenAI secret key and enabling the required environment variables.
@@ -1,5 +1,7 @@
---
title: Building Blocks of Fast CI
description: Learn how Nx features combine to create optimized CI pipelines through fast tools, reduced waste, and efficient task distribution
filter: 'type:Concepts'
---
Nx has many features that make your CI faster. Each of these features speeds up your CI in a different way, so that enabling an individual feature will have an immediate impact. These features are also designed to complement each other so that you can use them together to create a fully optimized CI pipeline.
@@ -1,5 +1,7 @@
---
title: Cache Security
description: Best practices for securing your remote cache and preventing cache poisoning in Nx Cloud
filter: 'type:Concepts'
---
{% aside type="caution" title="Use Caution With Read-Write Tokens" %}
@@ -53,7 +55,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](/docs/troubleshooting/unknown-local-cache). Instead, use Nx Cloud [remote caching](/docs/features/ci-features/remote-cache). If you want share your local cache anyway, you can [activate Nx Powerpack](/docs/enterprise/activate-powerpack) and use the [`@nx/shared-fs-cache`](/docs/reference/remote-cache-plugins/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](/docs/troubleshooting/unknown-local-cache). Instead, use Nx Cloud [remote caching](/docs/features/ci-features/remote-cache). If you want share your local cache anyway, you can use the [`@nx/shared-fs-cache`](/docs/reference/remote-cache-plugins/shared-fs-cache) plugin.
### Configure End to End Encryption
@@ -1,5 +1,7 @@
---
title: Heartbeat and Main Job Completion Handling
description: How Nx Cloud tracks main job completion and manages agent shutdown through the heartbeat process
filter: 'type:Concepts'
---
### What is the heartbeat process?
@@ -3,6 +3,7 @@ title: CI Concepts
sidebar:
hidden: true
description: Continuous Integration concepts and best practices
pagefind: false
---
{% index_page_cards path="concepts/ci-concepts" /%}
@@ -1,5 +1,7 @@
---
title: Parallelization and Distribution
description: Understanding task parallelization strategies and distributed task execution with Nx Agents
filter: 'type:Concepts'
---
Nx speeds up your CI in several ways. One method is to reduce wasted calculations with the [affected command](/docs/features/ci-features/affected) and [remote caching](/docs/features/ci-features/remote-cache). No matter how effective you are at eliminating wasted calculations in CI, there will always be some tasks that really do need to be executed and sometimes that list of tasks will be everything in the repository.
@@ -32,7 +34,7 @@ You can either distribute tasks across machines manually, or use Nx Cloud distri
One way to manually distribute tasks is to use binning. Binning is a distribution strategy where there is a main job that divides the work into bins, one for each agent machine. Then every agent executes the work prepared for it. Here is a simplified version of the binning strategy.
```yaml
```yaml
// main-job.yml
# Get the list of affected projects
- nx show projects --affected --json > affected-projects.json
@@ -41,13 +43,13 @@ One way to manually distribute tasks is to use binning. Binning is a distributio
- node storeAffectedProjects.js
```
```yaml
```yaml
// lint-agent.yml
# Run lint for all projects defined in PROJECTS
- nx run-many --projects=$PROJECTS -t lint
```
```yaml
```yaml
// test-agent.yml
# Run test for all projects defined in PROJECTS
- nx run-many --projects=$PROJECTS -t test
@@ -105,6 +107,6 @@ In the same way that Nx efficiently assigns tasks to parallel processes on a sin
## Conclusion
If your repo is starting to grow large enough that CI times are suffering, or if your parallelization strategy is growing too complex to manage effectively, try [setting up Nx Agents](/docs/features/ci-features/distribute-task-execution). You can [generate a simple workflow](/docs/reference/core-api/workspace/generators/ci-workflow) for common CI providers with a `nx g ci-workflow` or follow one of the [CI setup recipes](/docs/guides/nx-cloud/setup-ci).
If your repo is starting to grow large enough that CI times are suffering, or if your parallelization strategy is growing too complex to manage effectively, try [setting up Nx Agents](/docs/features/ci-features/distribute-task-execution). You can [generate a simple workflow](/docs/reference/workspace/generators#ci-workflow) for common CI providers with a `nx g ci-workflow` or follow one of the [CI setup recipes](/docs/guides/nx-cloud/setup-ci).
Organizations that want extra help setting up Nx Cloud or getting the most out of Nx can [sign up for Nx Enterprise](https://nx.dev/enterprise). This package comes with extra support from the Nx team and the option to host Nx Cloud on your own servers.
@@ -1,5 +1,7 @@
---
title: Reduce Wasted Time in CI
description: How the affected command and remote caching eliminate wasted time in CI pipelines
filter: 'type:Concepts'
---
This article explores two ways that Nx improves the average speed of your CI pipeline - `nx affected` and remote caching. Using the `nx affected` command speeds up the first CI run for a PR and remote caching speeds up every CI run after that. Both `nx affected` and remote caching provide more benefits to repositories with more projects and a flatter project structure.
@@ -16,9 +18,9 @@ How much benefit you gain from this is different for each repository, but there
If we look at these two trivial examples, you can see that the repository with more projects gains more value from the affected command.
{% cards smCols=2 mdCols=2 lgCols=2 %}
{% graph title="One Project" height="200px" %}
```json
{
"hash": "85fd0561bd88f0bcd8703a9e9369592e2805f390d04982fb2401e700dc9ebc59",
"projects": [
@@ -41,10 +43,13 @@ If we look at these two trivial examples, you can see that the repository with m
"groupByFolder": false,
"exclude": []
}
```
{% /graph %}
{% graph title="Four Projects" height="200px" %}
```json
{
"hash": "85fd0561bd88f0bcd8703a9e9369592e2805f390d04982fb2401e700dc9ebc59",
"projects": [
@@ -89,9 +94,9 @@ If we look at these two trivial examples, you can see that the repository with m
"groupByFolder": false,
"exclude": []
}
{% /graph %}
```
{% /cards %}
{% /graph %}
In the one project example, every PR will affect the entire repository. In the four project example, modifying one project only affects 25% of the repository. For the one project repository `nx affected -t build` is identical to `nx run-many -t build`, whereas for the four project repository, `nx affected -t build` cuts out the 75% of wasted work.
@@ -101,9 +106,9 @@ With this principle in mind, you can add more applications to the repository to
Consider the following example repo structures.
{% cards mdCols=3 lgCols=3 %}
{% graph title="Stacked" height="350px" %}
{% graph title="Stacked" height="200px" %}
```json
{
"hash": "85fd0561bd88f0bcd8703a9e9369592e2805f390d04982fb2401e700dc9ebc59",
"projects": [
@@ -140,9 +145,13 @@ Consider the following example repo structures.
"groupByFolder": false,
"exclude": []
}
```
{% /graph %}
{% graph title="Grouped" height="200px" %}
```json
{
"hash": "85fd0561bd88f0bcd8703a9e9369592e2805f390d04982fb2401e700dc9ebc59",
"projects": [
@@ -179,10 +188,13 @@ Consider the following example repo structures.
"groupByFolder": false,
"exclude": []
}
```
{% /graph %}
{% graph title="Flat" height="200px" %}
```json
{
"hash": "85fd0561bd88f0bcd8703a9e9369592e2805f390d04982fb2401e700dc9ebc59",
"projects": [
@@ -219,9 +231,9 @@ Consider the following example repo structures.
"groupByFolder": false,
"exclude": []
}
{% /graph %}
```
{% /cards %}
{% /graph %}
If we assume that each project has an independent 50% chance of being modified on a given PR, we can calculate the expected average number of affected projects. Intuitively, the flat structure should have less affected projects than the stacked structure and the grouped structure should fall somewhere in between. That is, in fact, the case.
@@ -288,8 +300,9 @@ The first time CI runs for a particular PR, affected is doing most of the work t
Take a look at the example below. The projects are setup in the suboptimal stacked arrangement from before. On the first CI run, `project3` was modified, so every project is affected. Then the developer realizes that `project2` should be changed as well and pushes a new commit. For the second CI run, every project is still affected when compared against the `main` branch, but `project3` hasn't changed between the first CI run and the second, so the cache from the first CI run can be used instead of re-running that task. `project2` tasks need to be re-run since it was modified and `project1` tasks need to be re-run since it depends on a project that was modified.
{% cards smCols=2 mdCols=2 lgCols=2 %}
{% graph title="First CI Run" height="200px" %}
{% graph title="First CI Run" height="300px" %}
```json
{
"hash": "85fd0561bd88f0bcd8703a9e9369592e2805f390d04982fb2401e700dc9ebc59",
"projects": [
@@ -326,9 +339,13 @@ Take a look at the example below. The projects are setup in the suboptimal stack
"groupByFolder": false,
"exclude": []
}
```
{% /graph %}
{% graph title="Second CI Run (project2 Changed)" height="200px" %}
{% graph title="Second CI Run (project2 Changed)" height="300px" %}
```json
{
"hash": "85fd0561bd88f0bcd8703a9e9369592e2805f390d04982fb2401e700dc9ebc59",
"projects": [
@@ -365,9 +382,9 @@ Take a look at the example below. The projects are setup in the suboptimal stack
"groupByFolder": false,
"exclude": []
}
{% /graph %}
```
{% /cards %}
{% /graph %}
### Caching Provides More Value When There are More Projects and a Flatter Structure
@@ -3,6 +3,7 @@ title: Code Ownership
description: Learn about code ownership challenges in monorepos and how Nx helps manage shared code with tools like CODEOWNERS and module boundary rules.
sidebar:
order: 100
filter: 'type:Concepts'
---
One of the most obvious benefits of having a monorepo is that you can easily share code across projects. This enables you to apply the Don't Repeat Yourself principle across the whole codebase. Code sharing could mean using a function or a component in multiple projects. Or code sharing could mean using a typescript interface to define the network API interface for both the front end and back end applications.
@@ -1,6 +1,7 @@
---
title: Dependency Management Strategies
description: Compare independently maintained dependencies versus single version policy approaches for monorepos, with guidance on choosing the right strategy for your team.
filter: 'type:Concepts'
---
When working with a monorepo, one of the key architectural decisions is how to manage dependencies across your projects. This document outlines two main strategies and helps you choose the right approach for your team.
@@ -44,6 +45,10 @@ For building and deployment, you'll need to ensure each project only includes it
The main challenge with this approach is coordinating dependency updates across independent teams. When multiple teams work on different, or even the same, applications within the same repo, they need to align on dependency upgrades. While this requires more coordination, it often results in less total work - upgrading a dependency once across all projects is typically more efficient than managing multiple separate upgrades over time.
{% aside type="tip" title="PNPM Catalog Support" %}
When using PNPM, use [PNPM catalogs](https://pnpm.io/catalogs) to maintain single version policy. Define versions in `pnpm-workspace.yaml` and reference them as `"<package>": "catalog:"` in project `package.json` files (Nx 22+).
{% /aside %}
**Pros:**
- Ensures consistent dependency versions, preventing runtime conflicts
@@ -1,6 +1,7 @@
---
title: Folder Structure
description: Learn about organizing your Nx monorepo with effective folder structures, and how to easily move or remove projects as your organization evolves.
filter: 'type:Concepts'
---
Nx can work with any folder structure you choose, but it is good to have a plan in place for the folder structure of your monorepo.
@@ -9,19 +10,19 @@ Projects are often grouped by _scope_. A project's scope is either the applicati
## Move Generator
Don't be too anxious about choosing the exact right folder structure from the beginning. Projects can be moved or renamed using the [`@nx/workspace:move` generator](/docs/reference/core-api/workspace/generators/move).
Don't be too anxious about choosing the exact right folder structure from the beginning. Projects can be moved or renamed using the [`@nx/workspace:move` generator](/docs/reference/workspace/generators#move).
For instance, if a project under the `booking` folder is now being shared by multiple apps, you can move it to the shared folder like this:
```shell {% frame="none" %}
```shell
nx g move --project booking-some-project shared/some-project
```
## Remove Generator
Similarly, if you no longer need a project, you can remove it with the [`@nx/workspace:remove` generator](/docs/reference/core-api/workspace/generators/remove).
Similarly, if you no longer need a project, you can remove it with the [`@nx/workspace:remove` generator](/docs/reference/workspace/generators#remove).
```shell {% frame="none" %}
```shell
nx g remove booking-some-project
```
@@ -32,6 +33,7 @@ Let's use Nrwl Airlines as an example organization. This organization has two ap
The purpose of these folders is to help with organizing by scope. We recommend grouping projects together which are (usually) updated together. It helps minimize the amount of time a developer spends navigating the folder tree to find the right file.
{% filetree %}
- apps/
- booking/
- check-in/
@@ -45,6 +47,7 @@ The purpose of these folders is to help with organizing by scope. We recommend g
- seatmap/ <---- grouping folder
- data-access/ <---- project
- feature-seatmap/ <---- project
{% /filetree %}
## Sharing Projects
@@ -54,6 +57,7 @@ One of the main advantages of using a monorepo is that there is more visibility
Let's consider our reference monorepo. The `shared-data-access` project contains the code needed to communicate with the back-end (for example, the URL prefix). We know that this would be the same for all libs; therefore, we should place this in the shared lib and properly document it so that all projects can use it instead of writing their own versions.
{% filetree %}
- libs/
- booking/
- data-access/ <---- app-specific project
@@ -62,4 +66,5 @@ Let's consider our reference monorepo. The `shared-data-access` project contains
- seatmap/
- data-access/ <---- shared project
- feature-seatmap/ <---- shared project
{% /filetree %}
@@ -3,6 +3,7 @@ title: Architectural Decisions
sidebar:
hidden: true
description: Key architectural decisions and patterns
pagefind: false
---
{% index_page_cards path="concepts/decisions" /%}
@@ -1,6 +1,7 @@
---
title: Monorepo or Polyrepo
description: Evaluate the organizational considerations for choosing between monorepo and polyrepo approaches, including team agreements on code management and workflows.
filter: 'type:Concepts'
---
Monorepos have a lot of benefits, but there are also some costs involved. We feel strongly that the [technical challenges](/docs/concepts/decisions/why-monorepos) involved in maintaining large monorepos are fully addressed through the efficient use of Nx and Nx Cloud. Rather, the limiting factors in how large your monorepo grows are interpersonal.

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