Compare commits

...

143 Commits

Author SHA1 Message Date
Jack Hsu d4988b8683 fix(node): node application generator sets up docker correctly 2025-07-29 21:06:14 -04:00
Jack Hsu 8ef7d0e312 docs(misc): make sure "npx nx@latest" is used when calling init or coonnect (#32128)
Documentation instructs users to run `npx nx init` and `npx nx connect`,
which may use cached outdated versions of
Nx.

## Expected Behavior

Documentation now uses `npx nx@latest` to ensure users always get the
latest version, preventing issues from outdated
cached versions.

Updated 27 command occurrences across 23 documentation files:
- `npx nx init` → `npx nx@latest init`
- `npx nx connect` → `npx nx@latest connect`
- `npx nx connect-to-nx-cloud` → `npx nx@latest connect-to-nx-cloud`

## Related Issue(s)

Fixes #
2025-07-29 14:13:49 -04:00
Mike Hartington bcc850205a docs(misc): add spring boot blog post (#32123)
<!-- 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-07-29 10:40:10 -04:00
Colum Ferry d4b1ee8644 feat(node): add prune target to node apps (#32119)
## Current Behavior
The `@nx/node:app` generator does not set up `prune` as a target to
prune the lockfile for TS Solution based repos. Nor does it handle
workspace modules that may be used by the application.

## Expected Behavior
Create the following targets when generating a node application
- `copy-workspace-modules`
- `prune-lockfile`
- `prune`

The latter should act as a noop, depending on the other two targets to
ensure a fully pruned output
2025-07-29 13:45:12 +01:00
Juri c2d0ecfd82 feat(nx-dev): make payfit testimonial clickable on nx cloud page 2025-07-29 00:20:49 +02:00
Mike Hartington f04e36afec docs(misc): add nx gradle blog post (#32106)
<!-- 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-07-28 12:18:56 -04:00
Nicholas Cunningham 4cd1a4dfd7 fix(nx-dev): reenable YouTube, and Tweet components to markdoc configuration (#32109)
This PR add Tweets and YouTube components back to the markdoc
configuration so that they can be rendered.
2025-07-28 11:04:18 -05:00
Nicholas Cunningham 38c7506d13 fix(misc): critical severity for form-data package (#32108)
### Currently
The `form-data` version we are using contains a critical issue which can
be reproduce by running.
```
pnpm dlx audit-ci --critical --report-type summary
```
https://github.com/advisories/GHSA-fjxv-7rqg-78g4

We should update our `form-data` version that contains the patch to
address the vulnerability.

### Misc
This also addresses our nightly audit failures:
https://github.com/nrwl/nx/actions/runs/16545241633/job/46791870646
2025-07-28 16:00:53 +00:00
Colum Ferry 536279bdf8 fix(docker): format current date to UTC (#32103)
## Current Behavior
Docker Version Utils will interpolate `{currentDate|YY.MM.DD}` with the
local timezone.

## Expected Behavior
Force the formatting to be UTC
2025-07-28 09:20:32 -04:00
Victor Savkin f03f68a536 cleanup(core): clean up onboarding url generation (#32101)
<!-- 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-07-28 08:18:01 -04:00
Emily Xiong 5578728f01 fix(react-native): add release option to publisable react-native library (#29817) 2025-07-28 14:40:42 +04:00
Leosvel Pérez Espinosa e5ef717a63 feat(core): add bun parser (#31973)
## Current Behavior

Bun's text-based lockfile is not parsed correctly when collecting nodes
and dependencies for the project graph.

## Expected Behavior

Bun's text-based lockfile should be parsed correctly when collecting
nodes and dependencies for the project graph.

## Related Issue(s)

Fixes #31862 
Fixes #31433 
Fixes #31338 
Fixes #30607 
Fixes #30603 
Fixes #30466 
Fixes #30460 
Fixes #30362 
Fixes #30302
2025-07-28 12:38:08 +02:00
Craigory Coppola 06ffc84682 fix(core): remove graph creation from postinstall hook (#32027)
## Current Behavior
The post install hook creates the project graph... which contains quite
a bit of work and appears to be hanging at times.

## Expected Behavior
The post install hook is slimmer, and has a hard timeout of 30s to avoid
hanging.

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

Fixes #31694
2025-07-27 17:56:09 -04:00
Colum Ferry 64897b7e33 feat(docker): add docker plugin (#31634)
## Current Behavior
We do not currently have a plugin for docker to infer targets such as
- build
- run

## Expected Behavior
The Docker Plugin should remain agnostic between tech stacks, but should
allow for the containerization of projects.

It should support initially the ability to build and run images by
inferring targets on projects that contain a Dockerfile.

`nx release` should be expanded to support releasing Docker images to
registries
2025-07-25 20:40:15 +01:00
Caleb Ukle cd5e38150f docs(misc): change tutorial CTA copy (#32094) 2025-07-25 13:32:40 -05:00
Victor Savkin 587d643008 fix(core): cloud commands should be handled before loading local (#32090)
<!-- 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-07-25 13:45:15 -04:00
Jack Hsu 1aa7212651 fix(core): prevent --skipInstall from being passed from create-nx-workspace to new generator (#32086)
<!-- 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 you run `npx -y create-nx-workspace@latest nameofmyrepo-monorepo
--preset=apps --nxCloud=skip --skip-install --skip-prettier --verbose`
it fails because `--skip-install` is passed to the `new` generator (even
though it's not an CNW option), which means no `node_modules` to resolve
`nx/bin/nx`.

## Expected Behavior
Running CNW should not skip install ever.

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

Fixes #31834
2025-07-25 12:37:30 -04:00
Leosvel Pérez Espinosa 6488c37403 feat(core): display estimated task durations in the tui terminal pane when available (#31972)
- Add a label to the TUI terminal pane with the live/actual task
execution duration and estimated duration based on available task
history
- Consolidate the `INTERACTIVE`/`NON-INTERACTIVE` information at the
bottom alongside the instructions to toggle
- Handle smaller available width and hide labels accordingly, with a
priority of Task Name, Duration, Tab to Focus help label when deciding
what to show
- Increase the tick rate to calculate live times every 100ms
2025-07-25 12:05:12 -04:00
Leosvel Pérez Espinosa a626ee17f7 fix(linter): handle negative numbers in flat config AST generation (#32085)
## Current Behavior

The ESLint flat config generator crashes with "Debug Failure. False
expression: Negative numbers should be created in combination with
createPrefixUnaryExpression" when running `nx g
@nx/eslint:convert-to-flat-config`.

## Expected Behavior

The generator should handle negative numbers properly and complete
without errors.

## Related Issue(s)

Fixes #31955


Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Leosvel Pérez Espinosa <leosvelperez@users.noreply.github.com>
2025-07-25 15:28:37 +00:00
Jack Hsu df2463ef99 docs(misc): add tailwind to astro site (#32077)
This PR adds Tailwind support to the Astro docs site so we can reuse
existing UI components.
2025-07-25 11:24:42 -04:00
Colum Ferry 8fe17d43a9 fix(core): pnpm lockfile parser handles undefined dependencies (#32084)
## Current Behavior
The `pnpm-parser` does not handle when `importerSnapshot.dependencies`
is undefined and is trying to access indexes of the object.

## Expected Behavior
Add a check to make usre `importerSnapshot.dependencies` exists before
accessing values within it
2025-07-25 16:23:37 +01:00
Leosvel Pérez Espinosa 6a2e1804da fix(misc): allow scoped package names in application generators (#31957)
Allow application names starting with @ symbol to support scoped
packages like @myorg/myapp.

Updated the validation pattern to match the library generator pattern
that already supports this.

Fixes #31229

Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Leosvel Pérez Espinosa <leosvelperez@users.noreply.github.com>
2025-07-25 16:22:19 +02:00
Leosvel Pérez Espinosa 1b1de90100 feat(core): log out-of-sync details returned by sync generators when running nx sync:check (#32072)
## Current Behavior

The `@nx/js:typescript-sync` generator does not provide details about
the out-of-sync files. It only returns a generic message.

<img width="1155" height="107" alt="image"
src="https://github.com/user-attachments/assets/6fc170cc-6aab-49cd-b17d-764da57b840a"
/>

## Expected Behavior

The `nx sync:check` command should display additional details about the
out-of-sync files if provided by the sync generators. The
`@nx/js:typescript-sync` generator should provide details about the
out-of-sync files.

<img width="1140" height="214" alt="image"
src="https://github.com/user-attachments/assets/3c74df6c-7dc3-4462-b0c9-75bce5bf81b4"
/>

Note: the `nx sync` command will still only display the generic message
to avoid cluttering the logs and the details can be seen in the changes
made to files.
2025-07-25 12:20:49 +00:00
Leosvel Pérez Espinosa b5b4cd569b fix(core): derive graph node type correctly when projectType is not set (#32018)
## Current Behavior

When building the project graph nodes, the node `type` is always
inferred as `lib` when `projectType` is not set.

## Expected Behavior

When building the project graph nodes, the node `type` should be derived
correctly using the same logic used by generators when `projectType` is
not set.

## Related Issue(s)

Fixes #31983
2025-07-25 14:13:56 +02:00
Victor Savkin a8900e4425 chore(misc): temporarily hide social card (#32080)
<!-- 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-07-25 08:09:46 -04:00
Juri 95e9eb596c docs(nx-dev): update payfit blog post 2025-07-25 14:01:48 +02:00
Rares Matei 76ab229299 docs(nx-cloud): update release notes (#32054)
<!-- 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: Caleb Ukle <caleb.ukle+github@pm.me>
2025-07-25 10:57:29 +01:00
Jason Jean 0359f0d39a fix(core): disable TUI on ai agents (#31480)
## Current Behavior

The TUI (Terminal User Interface) is enabled for all environments,
including AI agents like Claude Code, which can cause issues with
AI-driven development workflows.

## Expected Behavior

When an AI agent is detected through environment variables, the TUI
should be automatically disabled to prevent interference with AI-driven
interactions.

## Related Issue(s)

This change improves the developer experience when using AI agents by
automatically detecting their presence and adjusting the interface
accordingly.

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: FrozenPandaz <FrozenPandaz@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-24 18:30:33 -04:00
Jason Jean f420522477 fix(core): prevent thread leaks in nx_walker and logger (#32061)
## Current Behavior

The native Rust code in nx_walker and logger components was creating
threads that weren't being properly cleaned up, leading to resource
leaks over time.

## Expected Behavior

With these changes, threads are properly managed and cleaned up to
prevent resource leaks, improving the overall stability and performance
of Nx operations.

## Related Issue(s)

This addresses native thread leak issues discovered during development.

Fixes thread leaks in native components
2025-07-24 21:43:15 +00:00
Jason Jean 1ddd4d40c5 fix(core): improve arrow key detection for interactive programs (#32075)
## Current Behavior

The TUI's arrow key handling uses only alternate screen mode detection
to determine whether to send arrow key sequences to programs or handle
scrolling locally. This works for programs like vim, less, and git log,
but fails for enquirer-style prompts that use cursor positioning without
alternate screen mode.

## Expected Behavior

Arrow key handling should properly detect when interactive programs like
enquirer are running and send arrow key sequences to them for
navigation, while maintaining TUI scrolling for regular command output.

## Related Issue(s)

This improves the TUI's interaction with enquirer prompts and similar
interactive programs that don't use alternate screen mode but still need
to receive arrow key input.

## Changes Made

- **Enhanced Detection Logic**: Added `handles_arrow_keys()` method that
detects interactive programs using:
  - Alternate screen mode detection (vim, less, git log, htop)
  - Cursor movement sequence detection (enquirer-style programs)
- **Refactored Arrow Key Handling**: Updated `handle_arrow_keys()` to
use improved detection
- **Consistent Mouse Event Handling**: Updated `send_mouse_event()` to
use same detection logic
- **Comprehensive Tests**: Added tests for interactive program detection
patterns

## Technical Details

The new `handles_arrow_keys()` method checks for:
1. **Alternate screen mode** - Strong indicator for programs like vim,
less
2. **Cursor control sequences** - Detects enquirer-style programs that
use:
   - `\x1b[?25l` / `\x1b[?25h` (hide/show cursor)
   - `\x1b[H` (cursor positioning)
   - `\x1b[A/B/C/D` (cursor movement)

This ensures enquirer prompts receive proper arrow key navigation while
maintaining backward compatibility with existing TUI scrolling behavior.

Fixes arrow key navigation in enquirer prompts and similar interactive
programs.

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-24 19:45:57 +00:00
Juri e25ec83d57 docs(nx-dev): customer success story about payfit 2025-07-24 21:26:21 +02:00
Leosvel Pérez Espinosa 643b818309 fix(core): make tasks list columns in the tui more compact (#32074)
## Current Behavior

The Tasks List pane in the TUI is not too compact. It has some wide
spaces and long texts that do not allow for a better use of the
available space.

<img width="1079" height="450" alt="image"
src="https://github.com/user-attachments/assets/f814df3c-0623-413b-9473-48e16f752e0f"
/>

<img width="1368" height="455" alt="image"
src="https://github.com/user-attachments/assets/2436da03-3812-4cfc-8152-756eb99607d2"
/>

## Expected Behavior

The Tasks List pane in the TUI should be more compact:

- `Kept Existing` value in the Cache column should be renamed to `Match`
- The Duration column should not reserve as much space as it does
currently

<img width="1077" height="455" alt="image"
src="https://github.com/user-attachments/assets/bfe6ee33-09c3-4cd7-bd36-15c4b673c9e9"
/>
2025-07-24 14:37:27 -04:00
Jason Jean 9990b1e14c fix(js): resolve relative imports correctly in nested projects (#31978)
## Current Behavior

When resolving "./" imports from a nested project, the target project
locator incorrectly resolves to the parent project instead of the
current project.

For example, given:
- `parent-project` at `libs/parent-path`
- `child-project` at `libs/parent-path/child-path` (nested 1 level under
parent)

When importing "./" from `libs/parent-path/child-path/module.ts`, it
incorrectly resolves to `parent-project` instead of `child-project`.

## Expected Behavior

"./" imports from within a nested project should resolve to that
project, not its parent.

## Related Issue(s)

Fixes #31980
2025-07-24 14:14:07 -04:00
Nicholas Cunningham adbfaf8b74 feat(core): add tsBuildInfoFile option all packages tsconfig.lib.json (#32030)
### Changes
- add `tsBuildInfoFile` option all packages `tsconfig.lib.json`
- fix `legacy-post-build` executor via `copy-asset-handler` to ignore
dirs that we won't be copying from to improve glob search efficiency.
2025-07-24 13:22:16 -04:00
Jack Hsu 82690be4c1 docs(misc): add base astro setup for docs (#32058)
Add the base docs website built with Astro.

---------

Co-authored-by: Caleb Ukle <caleb@nrwl.io>
2025-07-24 12:55:37 -04:00
Leosvel Pérez Espinosa d0cbfec240 fix(core): improve tui minimal view display and prevent flashing scrollbar (#32045)
## Current Behavior

- When the minimal view in the TUI is shown, some borders are initially
shown for a fraction of a second.
- When rendering terminal panes, the scrollbar can be wrongly shown for
a fraction of a second when the PTY dimensions are stale. This looks
like the scrollbar flashes.

## Expected Behavior

- When the minimal view in the TUI is shown, no borders should ever be
shown.
- The scrollbar should only be shown when rendering terminal panes when
needed.
2025-07-24 17:14:30 +02:00
Juri 0e8d449971 docs(misc): update nx-mcp install instructions 2025-07-24 16:58:10 +02:00
Jason Jean f24f1d62ad chore(repo): isolate angular tests which seem to take more memory (#32028)
## Current Behavior

Angular tests run with other tests in parallel causing memory issues.

## Expected Behavior  

Angular tests are isolated to run on their own agent to prevent memory
issues.

## Related Issue(s)

This is a maintenance improvement to prevent CI memory issues.

Fixes nrwl/nx internal issue
2025-07-24 09:51:01 -04:00
Jack Hsu b7c1c0ed27 docs(misc): remove unused tutorialkit code (#32053)
This PR removes the tutorialkit code since it was never made public, and
we had issues with it. We'll reassess the tutorials at a later date.

Removing the code solves some of the "critical" alerts from the repo.
e.g. https://github.com/nrwl/nx/security/dependabot/863

---

Also, some of the unused components from our landing pages are removed.
They have references to `/tutorials/gradle` that we had planned but
never did, and they were just copy and pasted by AI.

- Delete nx-dev/ui-gradle/src/resource.tsx
(https://nx-dev-git-docs-remove-tutorialkit-nrwl.vercel.app/java)
- Delete nx-dev/ui-react/src/resource.tsx
(https://nx-dev-git-docs-remove-tutorialkit-nrwl.vercel.app/react)
- Delete nx-dev/ui-react/src/webinar.tsx
(https://nx-dev-git-docs-remove-tutorialkit-nrwl.vercel.app/react)
2025-07-23 14:38:10 -04:00
Mike Hartington 121bbab070 docs(misc): add nx workshop promo blog post (#32055)
<!-- 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-07-23 13:57:10 -04:00
Nicholas Cunningham 400e3003d7 fix(core): improve build time by narrowing the path scope for upload (#32023)
This pull request updates the `.github/workflows/publish.yml` file to
refine the workflow configuration by narrowing the file paths for
artifacts. These changes aim to simplify and improve the workflow and
ensure more precise artifact handling.

Before ts references:
https://github.com/nrwl/nx/actions/runs/16207520134 - 27m 20s
Currently (ts references):
https://github.com/nrwl/nx/actions/runs/16379805806 - 39m 7s
PR changes: https://github.com/nrwl/nx/actions/runs/16449233981 19m 12s
2025-07-23 13:40:49 -04:00
Leosvel Pérez Espinosa f73a66984e fix(angular): update migration target version for jest-preset-angular v15 package update (#32051)
Update the migration target version for `jest-preset-angular` v15
package update.
2025-07-23 13:13:41 -04:00
Jason Jean 713f86a64d chore(repo): remove stylus res (#32052)
<!-- 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 -->

Security package is removed. This resolution fails.

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

Remove the resolution.

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

Fixes #
2025-07-23 12:27:07 -04:00
Leosvel Pérez Espinosa 3419b329a3 fix(angular): update jest-preset-angular to v15 (#32050)
## Current Behavior

Angular projects use `jest-preset-angular` v14, which doesn't support
Jest v30.

Note: When support for Jest v30 was added, `jest-preset-angular` didn't
have a version explicitly supporting it.

## Expected Behavior

Angular projects should use `jest-preset-angular` v15, which supports
Jest v30.

## Related Issue(s)

Fixes #32024
2025-07-23 10:03:58 -06:00
Nicholas Cunningham 758e793e5f feat(bundling)!: remove stylus support (#32035)
BREAKING CHANGE: Stylus (.styl) files are no longer supported.

Stylus has been deprecated and was slated to be removed in Nx 20. 
Now we are removing it.

- Remove `stylus` and `stylus-loader` dependencies
- Remove `deprecated-stylus-loader` file
- Remove `stylus` configuration from `webpack` and `rspack` plugins
- Remove `'styl'` option from `rspack` generator schemas and TypeScript
definitions
- Remove `.styl`/`.stylus` extensions from executor schema file
completion globs

MISC
Even though we removed stylus from our repo as a dependency other
projects in the workspace still have stylus as an optional dependency:
  - Vite
  - Astro
  
So we add a placeholder for it since on npm registry there is a
_security_ placeholder.

---------

Co-authored-by: Leosvel Pérez Espinosa <leosvel.perez.espinosa@gmail.com>
2025-07-23 10:56:35 -04:00
Colum Ferry f20ff566d7 fix(core): handle undefined packageJson.dependencies (#31998)
## Current Behavior
`npm-parser` for lockfile pruning is trying to run `Object.entries` on a
potentially null or undefined object (packageJson.dependencies).

## Expected Behavior
Ensure `?? {}` is used when evaluating `Object.entries`
2025-07-23 08:24:04 -04:00
Nicholas Cunningham 87b04d4617 fix(bundling): fix stylus installation error due to npm security (#32036)
### Changes

The stylus npm registry has been compromised.
So can resolve `stylus` with `npm:ignore@*` it tells the package manager
to replace the dependency with the ignore package from npm registry.

Until we can merge: https://github.com/nrwl/nx/pull/32035
2025-07-23 10:58:06 +00:00
MaxKless b879e7e0d2 chore(misc): change cursor mcp.json to use streamable http instead of sse (#31994) 2025-07-23 12:46:52 +02:00
Leosvel Pérez Espinosa dd57e0faf0 fix(core): render the correct output in the tui terminal pane when pinning task (#31975)
## Current Behavior

In the TUI, opening the Terminal Pane for a task with the space bar,
navigating to another task, and pressing "1" to pin it, results in the
terminal pane displaying the output of the task for which the space bar
was pressed initially instead of the pinned task.

## Expected Behavior

Pinning tasks in the TUI should work correctly and always display the
output of the pinned task.
2025-07-23 09:37:39 +02:00
Victor Savkin 51b702e67f cleanup(misc): point to the guide with next steps (#32026)
<!-- 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-07-22 17:52:33 -04:00
Caleb Ukle eb2392a515 docs(core): add "next steps" for nx init docs (#32025)
improve doc page where people land after running `nx init` 
- clarify how to use nx after setup
- make sure to update CI configs
- how to finish nx cloud setup if opted-in for cloud
2025-07-22 18:11:13 +00:00
Emily Xiong 862bc4bbb0 chore(gradle): document build-ci target (#31660)
<!-- 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 -->
add documentation for build-ci target for gradle

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
currently there is no build-ci target documented

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

Fixes #
2025-07-22 13:00:09 -04:00
Caleb Ukle 0348faa7c5 docs(core): update intro language for tutorials (#32005)
<!-- 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 -->
tutorial intro language is subpar
## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
improve tutorial intro language

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

Fixes #
2025-07-22 09:37:47 -05:00
Leosvel Pérez Espinosa 0bbb473f4f fix(testing): add missing package updates for ts-jest and jest-util for jest v30 migrations (#32017)
## Current Behavior

The migration for Jest v30 is missing package updates for `ts-jest` and
`jest-util`.

## Expected Behavior

The migration for Jest v30 should have package updates for `ts-jest` and
`jest-util`.
2025-07-22 13:13:12 +02:00
Leosvel Pérez Espinosa a64af8b59b fix(testing): normalize spec files correctly in jest replace-removed-matcher-aliases migration (#31995)
## Current Behavior

When running the Jest `replace-removed-matcher-aliases` migration on
Windows, it resolves the spec files incorrectly and fails.

## Expected Behavior

Running the Jest `replace-removed-matcher-aliases` migration should work
correctly regardless the OS.

## Related Issue(s)

Fixes #31991
2025-07-22 13:12:53 +02:00
Leosvel Pérez Espinosa aad2e81eaa fix(nextjs): infer relevant tasks with the typescript sync generator when using ts project references (#31996)
## Current Behavior

When using the TS solution setup, tasks inferred by the
`@nx/next/plugin` do not have the `@nx/js:typescript-sync` generator
set.

## Expected Behavior

When using the TS solution setup, tasks inferred by the
`@nx/next/plugin` should have the `@nx/js:typescript-sync` generator
set.

## Related Issue(s)

Fixes #31983
2025-07-22 09:10:21 +02:00
Jack Hsu 5163bcddfd docs(misc): remove CI tutorials and redirect to their setup guides (#32004)
This PR removes the two CI tutorials (GitHub Actions and CircleCI) and
redirect them to the setup guides:
- https://nx.dev/ci/recipes/set-up/monorepo-ci-github-actions
- https://nx.dev/ci/recipes/set-up/monorepo-ci-circle-ci

There's not much value in having separate CI tutorials now that CI is a
central part of the main tutorials, rather than an optional step. e.g.
https://nx.dev/getting-started/tutorials/typescript-packages-tutorial

The guides are sufficient for users that want to learn how to set up
their CI with Nx Cloud.
2025-07-21 21:10:15 +00:00
Mike Hartington 105ce6af06 docs(nx-dev): add 21.3 changelog (#32000)
<!-- 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-07-21 13:18:30 -04:00
Leosvel Pérez Espinosa 59496ed446 fix(linter): update lint executor to correctly handle --fix and --quiet (#31970)
## Current Behavior

When running ESLint using the `@nx/eslint:lint` executor with `--quiet`
and `--fix`, and there are errors, no fix is made, and the task
incorrectly succeeds.

This is a regression introduced by
https://github.com/nrwl/nx/commit/9406d2bfdb15e33ad85345533f96f6136130e817,
which updated the executor to not fix warnings when `--quiet` is used,
but the solution was incorrect.

## Expected Behavior

When running ESLint using the `@nx/eslint:lint` executor with `--quiet`
and `--fix`, and there are errors, fixes should be applied, and the task
should succeed if there are no remaining errors. It should not fix
warnings.

## Related Issue(s)

Fixes #31868
2025-07-21 19:03:03 +02:00
Victor Savkin 84a6f9da35 fix(misc): fix setup selection (#31997)
<!-- 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: Jason Jean <FrozenPandaz@users.noreply.github.com>
2025-07-21 15:44:10 +00:00
James Henry 27330b53bd docs(core): update self-healing-ci.md (#31993) 2025-07-21 15:37:00 +02:00
Jason Jean 4720175b1e chore(repo): update nx to 21.4.0-beta.0 (#31985)
Updating Nx from 21.3.0-rc.0 to 21.4.0-beta.0
2025-07-20 10:07:34 -04:00
Victor Savkin 82ba3b71fa cleanup(misc): small tweaks to cnw and init (#31986)
<!-- 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-07-20 10:02:26 -04:00
Jason Jean 21c528e706 fix(jest): revert back to Jest 30 after synckit compatibility fix (#31984)
## Current Behavior

Jest is currently pinned to version 29 due to compatibility issues with
synckit@0.11.10 that caused TypeErrors in Jest tests.

## Expected Behavior

With the synckit compatibility issue resolved in v0.11.11, Jest can be
safely upgraded back to version 30, providing users with the latest Jest
features and improvements.

## Related Issue(s)

The underlying synckit compatibility issue has been fixed:
https://github.com/un-ts/synckit/issues/252

This reverts the temporary downgrade that was applied in #31981.

Fixes the Jest version regression by restoring Jest 30 support.
2025-07-19 11:57:26 -04:00
Nicholas Cunningham 34c5b614f4 fix(core): adjust artifacts path for publish (#31979)
Update native `.wasm` paths to be `./artifacts`
2025-07-18 19:08:44 -06:00
Nicholas Cunningham 91acf8c792 fix(jest): revert version back to 29 (#31981)
### Changes

Newly create projects fail when using jest v30 so lets revert this for
now
2025-07-18 19:39:17 -04:00
Nicholas Cunningham 0ca4aacd0b feat(repo): use ts solution in the nx repo (#31654)
This PR updates the Nx repo to use ts solution to improve build
processes and module resolution via the `@nx/js/typescript` plugin.

- Added `@nx/js/typescript` (adding new targets `typecheck` and
`build-base`)
- Updated all e2e test projects for consistent module resolution. (Now
contains `package.json` for all dependencies)
- Fixed module resolution conflicts by streamlining `NODE_PATH` handling
in e2e tests.
- Added `legacy-post-build` executor merging `copy-asset` and
`package.json` cleanup.
- Added `package.json` to e2e projects for proper dependency management.

---------

Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
Co-authored-by: Leosvel Pérez Espinosa <leosvel.perez.espinosa@gmail.com>
Co-authored-by: Emily Xiong <xiongemi@gmail.com>
Co-authored-by: yarden-island <yarden@island.io>
Co-authored-by: Julien Marcou <julien.marcou@convelio.com>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Colum Ferry <cferry09@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-07-18 14:49:03 -04:00
Jason Jean ccbc750b7b chore(repo): update nx to 21.3.0-rc.0 (#31968)
Updating Nx from 21.3.0-beta.7 to 21.3.0-rc.0

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Jason Jean <FrozenPandaz@users.noreply.github.com>
2025-07-18 15:22:25 +00:00
Jason Jean 98383131a0 fix(core): allow nx-cloud commands to run without local Nx installation (#31974)
## Current Behavior

When running nx-cloud commands like `nx start-ci-run` in environments
without local Nx installation, users get this error:

```
NX   Could not find Nx modules at "/path/to/workspace".
Have you run npm/yarn install?
```

This prevents legitimate use of nx-cloud commands in CI environments
that don't have local Nx modules installed.

## Expected Behavior

nx-cloud commands should be able to run using the global Nx installation
without requiring local Nx modules, since they're designed to work
independently of the local workspace setup.

## Related Issue(s)

This fixes scenarios where users run `nx start-ci-run` in CI
environments without local Nx installation.

## Changes Made

- Added `isNxCloudCommand()` function to identify nx-cloud commands:
`start-ci-run`, `login`, `logout`, `connect`, `view-logs`, `fix-ci`,
`record`
- Modified the missing local installation check to exclude nx-cloud
commands
- Added execution path for nx-cloud commands when no local Nx is
available - they now run via the global nx-commands module
- Preserves the error check for regular Nx commands that require local
installation

## Testing

- Verified that nx-cloud commands are properly identified
- Confirmed that regular Nx commands still show the error when local Nx
is missing
- Ensured nx-cloud commands can run without local Nx installation
2025-07-18 10:30:10 -04:00
Iulian Marcu 2f2764d695 feat(release): releaseTagPatternStrictPreid option to match git tag based on semver preid (#31756) 2025-07-18 16:30:18 +04:00
Jason Jean 30ca911ab0 feat(core): add GitHub repository creation and push functionality (#31936)
## Current Behavior

The `create-nx-workspace` command only creates local git repositories
and does not provide any integration with GitHub for pushing the newly
created workspace to a remote repository.

## Expected Behavior

The `create-nx-workspace` command should offer users the option to
automatically create a GitHub repository and push their new workspace to
it using the GitHub CLI (`gh`), streamlining the workflow from workspace
creation to remote repository setup.

## Changes Made

- **New Options**: Added `skipGitHubPush` and `verbose` command-line
options
- **GitHub Integration**: Integrated GitHub repository creation and push
workflow into the main create-workspace process
- **Interactive Prompts**: Added user-friendly prompts for GitHub
repository creation with validation
- **Async Refactor**: Converted git utilities from sync to async/await
pattern for better error handling
- **Bug Fix**: Fixed `gh repo create` command to include `--source` flag
for proper directory specification
- **Error Handling**: Added comprehensive error handling with optional
verbose logging

## Implementation Details

### New CLI Options
- `--skipGitHubPush`: Skip pushing to GitHub via gh CLI (default: false)
- `--verbose` (`-v`): Enable verbose logging for detailed error messages

### Workflow Integration
- After successful git initialization and commit, prompts user if they
want to push to GitHub
- Uses `gh` CLI to authenticate and create repository
- Provides default repository name format (`username/workspace-name`)
- Validates repository name format
- Handles errors gracefully with helpful fallback instructions

### Technical Changes
- Refactored `git.ts` utilities to use `execAndWait` and `spawnAndWait`
for better async handling
- Added `pushToGitHub` function with comprehensive error handling
- Updated `CreateWorkspaceOptions` interface with new optional
properties
- Enhanced command-line argument parsing in `yargs-options.ts`

## Testing

The changes maintain backward compatibility - existing workflows
continue to work unchanged. The new GitHub integration is opt-in and
gracefully handles cases where:
- GitHub CLI is not installed
- User is not authenticated with GitHub
- Network issues prevent repository creation
- User chooses not to push to GitHub

## Related Issue(s)

This PR enhances the user experience by providing seamless integration
between workspace creation and GitHub repository setup.
2025-07-17 23:41:36 -04:00
Colum Ferry 9f1c811f50 fix(module-federation): ensure react deps are eagerly loaded #31612 (#31961)
## Current Behavior
The static build for a React Module Federation application can suffer
from issues where react is not initialised on load.
This is caused by Module Federation trying to lazily instantiate the
library.

## Expected Behavior
Ensure that React deps are marked as eager in the module federation
config to allow them to be instantiated on load

## Related Issue(s)

Fixes #31612

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Colum Ferry <Coly010@users.noreply.github.com>
2025-07-17 17:23:46 +00:00
Colum Ferry b9066a91d3 fix(core): lockfile pruning uess project name to identify workspace nodes (#31959)
## Current Behavior
The workspace packages logic for pruning lockfile assumes the
jsPackageName is the same as the node name.
This is not always the case.

## Expected Behavior
Ensure the actual node name is used to reference the node in the project
graph
2025-07-17 12:42:42 -04:00
Craigory Coppola 394b5b5461 feat(core): add env var for cache size (#31609)
## Summary
- support configuring max cache size via NX_MAX_CACHE_SIZE env var
- show max cache size from env var in `nx report`
- document the new `NX_MAX_CACHE_SIZE` option
- test NX_MAX_CACHE_SIZE in e2e cache tests

## Testing
- `pnpm nx run-many -t lint,test,build` *(failed: NX Lexer error)*
- `pnpm test:e2e` *(failed: Command "test:e2e" not found)*
- `pnpm e2e` *(failed: Failed to process project graph)*

------
https://chatgpt.com/codex/tasks/task_e_68503bff022c832c8c014c61432aa2ed

Co-authored-by: Jason Jean <FrozenPandaz@users.noreply.github.com>
2025-07-17 12:18:50 -04:00
Craigory Coppola f94f608ca8 fix(core): shutdown running tasks properly when recieving sigterm (#31534)
<!-- 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 tasks without the daemon, tui, and using run-commands w/
serially running tasks, its possible that Nx will not properly terminate
on receiving SIGTERM.

## Expected Behavior
Nx properly shuts down child tasks on receiving SIGTERM

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

Fixes #
2025-07-17 12:18:05 -04:00
Craigory Coppola d207a5cedc fix(core): improve parent gitignore handling for nested Nx workspaces (#31911)
## Current Behavior

When an Nx workspace exists inside a subdirectory of another git
repository or when parent directories contain `.gitignore` files, those
ignore patterns can affect file traversal within the Nx workspace,
making project resolution non-deterministic.

For example, if a workspace is inside a directory with `*` in its
`.gitignore`, Nx fails to properly traverse workspace files.

## Expected Behavior

Nx should respect `.gitignore` files in a smart way:
- **Workspace is git root**: Ignores all parent gitignore files 
- **Workspace nested in git repo**: Respects gitignore files within the
git repository but ignores any gitignore files above the git root
- **No git repo found**: Respects all parent gitignore files (backwards
compatibility)

This ensures deterministic project resolution regardless of where the
workspace is located.

## Related Issue(s)

Fixes #27368, #28000, #27295, #28123, #29413

Supersedes #29245 (incorporates feedback from @Cammisuli and @adamalton)

## Implementation Details

The fix implements smart gitignore boundary detection that:

1. **Finds the nearest git repository root** by walking up the directory
tree
2. **Uses built-in git ignore handling** for maximum compatibility  
3. **Disables automatic parent discovery** and manually adds only
relevant `.gitignore` files
4. **Stops at git repository boundaries** to prevent external gitignore
files from affecting the workspace

This approach addresses the feedback from the original PR #29245 to
handle both:
- Standalone workspaces (where workspace root = git root)
- Workspaces nested within larger git repositories

The solution leverages the `ignore` crate's existing functionality while
providing precise control over which ignore files are considered.

## Test Plan

- [x] Unit tests covering all three scenarios
- [x] Workspace is git root: ignores parent gitignores
- [x] Workspace nested in git repo: respects repo gitignores, ignores
external ones
- [x] No git repo: uses all parent gitignores (backwards compatibility)
- [x] All existing walker tests continue to pass

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

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Adam Biggs <adam.biggs@lmpm.com>
2025-07-17 12:13:55 -04:00
Craigory Coppola 07a6feafd6 feat(core): add --initialRun flag to nx watch command (#31910)
## Current Behavior

The `nx watch` command currently requires a file change before executing
the specified command for the first time.

## Expected Behavior

Add support for running the watch command once before watching for
changes. This is useful when you want to see results immediately without
having to make a file change first.

## Related Issue(s)

N/A - Feature addition

## Implementation Details

- Added a new `--initialRun` flag (alias `-i`) to the `nx watch` command
- When the flag is set to `true`, the command executes once before
setting up the file watcher
- Works with both `--all` mode and specific project selections
- Default value is `false` to maintain backward compatibility
- Documentation has been updated to reflect this new option

## Usage Examples

```bash
# Run the command initially, then watch for changes
nx watch --all --initialRun -- echo "Running command"

# Or with the alias
nx watch --projects=myapp -i -- npm run test
```

## Test Plan

- [ ] Manual testing with `--all` flag
- [ ] Manual testing with specific projects
- [ ] Verify command runs initially when flag is set
- [ ] Verify command does not run initially when flag is not set
(default behavior)
- [ ] Documentation generated correctly

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

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-17 12:04:52 -04:00
Nicholas Cunningham a42d7a398d fix(testing): update yarn integration tests for remix and enable previously skipped tests (#31933)
These tests were skipped previously, we should re-enable them so that we
have coverage.
2025-07-17 11:55:25 -04:00
Philip Fulcher a044e062e1 docs(nx-dev): add Conformance article (#31939)
https://nx-dev-git-philip-conformance-article-nrwl.vercel.app/blog/nx-cloud-conformance-automate-consistency

---------

Co-authored-by: Juri Strumpflohner <juri.strumpflohner@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-07-17 08:49:34 -06:00
Craigory Coppola b1e647d9eb chore(core): add more logging by default on daemon server (#31948)
<!-- 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 daemon doesn't log several things which would be helpful when
troubleshooting issues

## Expected Behavior
There are several more logs

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

Fixes #
2025-07-17 09:55:30 -04:00
Colum Ferry 1aa2f10697 fix(webpack): ensure less and less-loader deps are ranges (#31958)
## Current Behavior
The `@nx/webpack` and `@nx/rspack` packages depend on a pinned version
of `less` and `less-loader`.
This causes an issue with dependency resolution for packages that
require a different version of these packages.

## Expected Behavior
Use a range for `less` and `less-loader` to aid package managers in
resolution and hoisting.

## Related Issue(s)

Fixes #31953
2025-07-17 13:04:35 +01:00
Colum Ferry 0d8c32b7fe fix(webpack): use loadPaths instead of includePaths (#31946)
## Current Behavior
Nx switched to use sass-loader with `modern-compiler` api. However, it
did not update to use `loadPaths` instead of `includePaths`.

## Expected Behavior
Use `loadPaths`.

## Related Issue(s)

Fixes #30340
2025-07-17 10:46:57 +01:00
Craigory Coppola 8b4b3e94b6 fix(core): preserve scroll position when tasks complete and scroll faster (#31898)
## Current Behavior
<!-- This is the behavior we have today -->
Scroll position gets reset when unrelated tasks finish. Additionally,
scrolling is just really slow.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
This pull request introduces momentum-based scrolling and improves
scroll position preservation across terminal panes and pseudo-terminal
instances (`PtyInstance`). It also adds a new `ScrollMomentum` module to
manage scrolling behavior dynamically based on user input patterns. The
changes enhance user experience by making scrolling smoother and more
intuitive, especially during rapid or sustained scrolling.

### Scroll Momentum Enhancements:
* Added the `ScrollMomentum` module to calculate dynamic scrolling
behavior based on time intervals and direction changes, allowing for
accelerated scrolling during sustained input.
(`packages/nx/src/native/tui/scroll_momentum.rs`,
[packages/nx/src/native/tui/scroll_momentum.rsR1-R101](diffhunk://#diff-60e4cfcd0a48b7d32e565a9254f89f142587e07a37536ca103b1ae76a760135eR1-R101))
* Integrated momentum-based scrolling into `TerminalPaneData` and
`PtyInstance`, replacing static scroll methods with dynamic ones
(`scroll_up` and `scroll_down`) that use calculated momentum values.
(`packages/nx/src/native/tui/components/terminal_pane.rs`,
[[1]](diffhunk://#diff-494d587e52e864f34496326a7453461a9a15e5c136d504a54db36a59cae7c446L45-R66);
`packages/nx/src/native/tui/pty.rs`,
[[2]](diffhunk://#diff-1e180729578f1157895b8cd0df25b87ba902ac7804e3a944601d28d3cf437b14L122-R158)
[[3]](diffhunk://#diff-1e180729578f1157895b8cd0df25b87ba902ac7804e3a944601d28d3cf437b14L148-R192)
[[4]](diffhunk://#diff-1e180729578f1157895b8cd0df25b87ba902ac7804e3a944601d28d3cf437b14L175-R231)

### Scroll Position Preservation:
* Enhanced `PtyInstance` to preserve scroll position during terminal
resize operations, ensuring better continuity when dimensions change.
(`packages/nx/src/native/tui/pty.rs`,
[[1]](diffhunk://#diff-1e180729578f1157895b8cd0df25b87ba902ac7804e3a944601d28d3cf437b14L76-R91)
[[2]](diffhunk://#diff-1e180729578f1157895b8cd0df25b87ba902ac7804e3a944601d28d3cf437b14L91-R120)

### Code Improvements:
* Added momentum reset logic when switching interactive modes or
changing scroll direction to avoid abrupt changes in scrolling behavior.
(`packages/nx/src/native/tui/components/terminal_pane.rs`,
[[1]](diffhunk://#diff-494d587e52e864f34496326a7453461a9a15e5c136d504a54db36a59cae7c446R150-R169);
`packages/nx/src/native/tui/scroll_momentum.rs`,
[[2]](diffhunk://#diff-60e4cfcd0a48b7d32e565a9254f89f142587e07a37536ca103b1ae76a760135eR1-R101)
* Updated `TerminalPaneData` and `PtyInstance` constructors to
initialize `ScrollMomentum` instances for consistent scrolling state
management. (`packages/nx/src/native/tui/components/terminal_pane.rs`,
[[1]](diffhunk://#diff-494d587e52e864f34496326a7453461a9a15e5c136d504a54db36a59cae7c446R38);
`packages/nx/src/native/tui/pty.rs`,
[[2]](diffhunk://#diff-1e180729578f1157895b8cd0df25b87ba902ac7804e3a944601d28d3cf437b14R53)
[[3]](diffhunk://#diff-1e180729578f1157895b8cd0df25b87ba902ac7804e3a944601d28d3cf437b14R67)

These changes collectively improve the usability of terminal panes and
pseudo-terminal instances by making scrolling more responsive and
preserving user context during resize events.

## 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: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-07-16 22:22:28 +00:00
Nicholas Cunningham 06c01571f2 fix(react): Ensure react-router e2e test are generated with the correct config (#31945)
<!-- 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 we generate a router-router app the e2e test generated expects the
server to be ran on port `4300`.
Which fails because react-router serves from only one port and it's the
dev port which is defaults to `4200`.

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

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

Fixes #
2025-07-16 17:46:15 -04:00
Philip Fulcher 088cdb3449 docs(nx-dev): update webinar notifier to workshop (#31947) 2025-07-16 19:42:05 +00:00
Leosvel Pérez Espinosa 71b958c053 fix(react): normalize paths correctly when generating stories (#31944)
## Current Behavior

When generating stories, the generation can fail due to a bad path
normalization with:

```bash
 NX   Failed to read src/src/app/app.tsx

Pass --verbose to see the stacktrace.
```

## Expected Behavior

Generating stories should work correctly.
2025-07-16 14:54:36 +00:00
Juri 074b398490 docs(core): align typescript query param for cloud onboarding in tutorials 2025-07-16 13:36:01 +02:00
Jack Hsu 46d21c77ff docs(core): update tutorial intros to match the new onboarding (#31895)
Co-authored-by: Juri <juri.strumpflohner@gmail.com>
2025-07-15 20:10:27 -04:00
Victor Savkin db2b52289d cleanup(nx-dev): minor home page cleanup (#31931)
<!-- 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[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Jason Jean <FrozenPandaz@users.noreply.github.com>
2025-07-15 17:03:48 -04:00
Jason Jean 89c784b059 fix(core): remove accidental additional line (#31930)
<!-- 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 line was added by accident.

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

This line is removed.

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

Fixes #
2025-07-15 18:54:22 +00:00
Jason Jean f9295bd057 fix(core): remove affected comment and improve CI setup messages (#31913)
## Current Behavior

Currently, the CI workflow templates and setup messages contain
potentially confusing or outdated information:

1. CI workflow templates include a comment about "Nx Affected runs only
tasks affected by the changes in this PR/commit. Learn more:
https://nx.dev/ci/features/affected." which may be redundant or
confusing
2. The setup messages for CI and remote cache simply say "Finish it by
visiting: {url}" which doesn't provide clear next steps

## Expected Behavior

With these changes:

1. The redundant affected comment is removed from CI workflow templates
to reduce noise
2. The setup messages are improved to say "Push your repository and
finish the setup: {url}" which provides clearer guidance on what the
user needs to do next
3. Jest snapshot test references are updated to use the current Jest
documentation URL

## Related Issue(s)

This is a minor cleanup improvement to reduce confusion and provide
better user guidance in the CI setup flow.
2025-07-15 14:20:13 -04:00
Leosvel Pérez Espinosa 5217e53513 fix(misc): improve the generation of storybook stories (#31893)
Improve the generation of Storybook stories:

- Import relevant types from the appropriate packages
- Use TypeScript `satisfies` operator
- Simplify the selector in the generated interaction test example
- Fix an issue when source root is not set in the project configuration
2025-07-15 10:37:09 -06:00
Nicholas Cunningham d4a2072e76 fix(testing): when we generate a random port we should start from 1024 (#31927)
When we generate a random port in our node e2e tests we should ensure
that the random generation port generation range starts from 1024.

Also, move the `getRandomPort` function to `e2e-utils` so that other
tests benefit from this change.
2025-07-15 11:46:58 -04:00
Craigory Coppola 4d7b17687c fix(misc): nx should error if atomization brings in invalid file paths (#31675)
<!-- 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 some rare occurences we've observed our atomization plugins returning
an invalid list of test files. We've only seen this in the jest plugin
in our internal monorepo under a very specific yet hard to repro area.

## Expected Behavior
If this occurs, the plugin errors.

## 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-07-15 11:44:20 -04:00
Colum Ferry 434cf4556c feat(core): allow {args} to be fully interpolated in run-commands (#31824)
## Current Behavior
Currently, there is no way for a target using `run-commands` to define
where in the command args are attached.
This is problematic in some tooling cases where args positional location
matters

## Expected Behavior
Placing `{args}` into the command should allow for interpolation of any
and all args provided.
Therefore commands can be written such as `docker run {args} imageRef`
2025-07-15 11:11:21 -04:00
Emily Xiong 1f56eadb65 fix(react-native): app creation should sync deps (#31839)
<!-- 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, when options.install=true (need to do pod install), it only
syncs deps.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
make it sync deps regardless of options.install, so when developers
choose to run `pod-install` after, it will work right away.

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

Fixes #
2025-07-15 10:48:42 -04:00
Emily Xiong 51bf772048 fix(react-native): fix react native web configuration (#29608)
<!-- 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 serve up the react-native app using web configuration, it defaults
tsconfig to
```
tsConfig: joinPathFragments(options.projectRoot, 'tsconfig.app.json'),
```
which is not right

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->
not hard code ts config path, add a function determineTsConfig for that

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

Fixes #
2025-07-15 10:48:22 -04:00
Leosvel Pérez Espinosa 2527519fdd feat(core): add live durations for running tasks in the tui (#31897)
## Current Behavior

The TUI doesn't display live durations for running tasks.

<img width="506" height="384" alt="image"
src="https://github.com/user-attachments/assets/0c9d2ad6-810c-4785-9e0e-a9e56c86ba7f"
/>

## Expected Behavior

The TUI should display live durations for running tasks.

<img width="499" height="378" alt="image"
src="https://github.com/user-attachments/assets/2a675c42-3268-4faf-83d7-f747ad52ce35"
/>

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
2025-07-15 09:57:43 -04:00
Julien Marcou 83d2d3b9bf feat(module-federation): bump @module-federation/node & @module-federation/enhanced to fix esbuild vulnerability (#31924)
<!-- 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 has a dependency to a [vulnerable version of
esbuild](https://github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99)

## Expected Behavior

Updating several `@module-federation` dependencies to update esbuild to
v0.25.5 and fix the vulnerability

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

Fixes #31923
2025-07-15 14:04:25 +01:00
Leosvel Pérez Espinosa 8d6fa3fe4c fix(core): ensure non-pty tasks have output in terminal pane when finish (#31925)
## Current Behavior

When a task with no PTY (e.g. a task using the `nx:noop` executor) has
its output pane open and it finishes successfully, no output is shown,
and there's a blank space to the right of the task list where the output
pane is meant to be.

<img width="1366" height="413" alt="image"
src="https://github.com/user-attachments/assets/fc34cc18-1bed-4d73-9b94-5a25069e8a3d"
/>

## Expected Behavior

When a task with no PTY (e.g. a task using the `nx:noop` executor) has
its output pane open and it finishes successfully, the output pane
should be correctly rendered in a successful status.

<img width="1365" height="411" alt="image"
src="https://github.com/user-attachments/assets/cb8862d5-f1c2-4aa6-a098-f710020e64f4"
/>
2025-07-15 11:46:57 +00:00
yarden-island ce2dbd244f feat(rspack): add support for proxyConfig in the dev-server executor (#31909)
<!-- 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. -->

This PR adds support for the `proxyConfig` option in the
@rspack/dev-server executor, similarly to the existing option in the
matching Webpack executor. This new options is another step for allowing
simpler migration to Rspack when coming from Webpack, adding to the
feature parity of the Rspack executor.

## Current Behavior

The `@nx/rspack:dev-server` executor does not allow for passing a
`proxyConfig` as an option, opposed to the matching Webpack executor,
that does.

## Expected Behavior

The `@nx/rspack:dev-server` executor allows for passing a `proxyConfig`
option, same as the `@nx/webpack:dev-server` executor.

## Related Issue(s)

None.
2025-07-15 12:21:21 +01:00
Nicholas Cunningham cf994dfbe4 chore(core): update nx dependencies to 21.3.0-beta.7 (#31919)
### Changes
Update nx dependencies to `21.3.0-beta.7`
2025-07-14 19:14:55 -04:00
Nicholas Cunningham eb61103850 fix(core): update our caching for ts-node service from plugins (#31917)
## Current Behaviour

We are having a lot of cache misses due to using `compilerOptions` the
key for registering the `ts-node` service.
This can cause out-of-memory errors due to several registrations of the
`ts-node` service consecutively.

https://github.com/nrwl/nx/actions/runs/16233768215/job/45840886378

## Expected Behaviour
The `ts-node` service _should_ have cache hits so that the knock-on
effect of multiple registration (out-of-memory) does not happen via
plugins.

## MISC
If we set `NX_PREFER_TS_NODE` env variable we should not show the
warning fallback message.
2025-07-14 14:04:17 -06:00
Benjamin Cabanes d99c200dc1 docs(nx-dev): update team list (#31916)
Updated the team list.
2025-07-14 18:27:23 +00:00
Tomáš Čarnecký db4b0d3a45 fix(misc): await load in config-utils.ts
Fixes #31408

Change verified by patching the file in my local node_modules, `nx
run-many --target build` works with this change.
2025-07-14 13:24:06 -04:00
Victor Savkin eef293ce86 cleanup(nx-dev): clean up get started buttons 2025-07-12 23:24:37 -04:00
Juri 18e5d95916 docs(nx-cloud): remove obsolete callout 2025-07-11 23:20:00 +02:00
Craigory Coppola 89495db0ab fix(core): swap from gray -> dark gray for light theme secondary foreground (#31901)
## Current Behavior
Gray for secondary light foreground has low contrast in light themes

## Expected Behavior
This pull request includes a small change to the `Theme` implementation
in the `packages/nx/src/native/tui/theme.rs` file. The change updates
the `secondary_fg` color from `Color::Gray` to `Color::DarkGray` to
improve visual contrast.

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

Fixes #
2025-07-11 17:15:06 -04:00
Jack Hsu cf7ffd391b docs(misc): update react and angular monorepo tutorials to match new onboarding and include self-healing CI (#31870)
This is an update to the React and Angular monorepo tutorial to match
new onboarding experience.

Notes: 
- The link to create new workspace uses the querystring `?preset=...` --
this requires a deployment to cloud.nx.app to work
- This tutorial assumes the generated `ci.yml` comes with `npx nx-cloud
fix-ci` out of the box -- this is only in beta (but should be released
soon)

Previews:
-
https://nx-dev-git-docs-react-tutorial-update-nrwl.vercel.app/getting-started/tutorials/react-monorepo-tutorial
-
https://nx-dev-git-docs-react-tutorial-update-nrwl.vercel.app/getting-started/tutorials/angular-monorepo-tutorial
2025-07-11 17:05:35 -04:00
Jason Jean d3206e662e chore(repo): update nx to 21.3.0-beta.6 (#31900)
<!-- 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 repo is using Nx `21.3.0-beta.5`

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

This repo is using Nx `21.3.0-beta.6`

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

Fixes #
2025-07-11 20:59:57 +00:00
Benjamin Cabanes 61e8479a36 docs(nx-dev): update contact button link in plans section (#31899)
Changed the contact button link in the pricing section to point to the sales page.
2025-07-11 13:39:40 -04:00
Nicholas Cunningham 8123d4c62f fix(node): preserve existing test target options (#31891)
We should preserve the test target options if they are provided.
2025-07-11 11:16:28 -06:00
Benjamin Cabanes b1b332fe50 docs(nx-dev): update contact button link in plans section (#31896)
Changed the contact button link in the pricing section to point to the sales page.
2025-07-11 16:19:49 +00:00
Leosvel Pérez Espinosa f7e2256b1f fix(core): improve column display decision logic in tui (#31885)
## Current Behavior

When the available space in the TUI task list is small, task names can
be cropped while still displaying the Duration column.

## Expected Behavior

When the available space is insufficient, task names should be
prioritized over duration. Additionally, update the overall column
display decision logic to better use the available space.

### Before

<img width="622" height="368" alt="image"
src="https://github.com/user-attachments/assets/bd486408-abef-4601-9339-b2bf3c589287"
/>

### After

<img width="618" height="369" alt="image"
src="https://github.com/user-attachments/assets/5331172a-23b8-4924-8f3f-b2b107d011d8"
/>
2025-07-11 17:46:44 +02:00
Leosvel Pérez Espinosa 856cb30660 feat(testing): support jest v30 (#31853)
## Current Behavior

Jest v30 is not supported.

**Note**: this is currently awaiting for `jest-preset-angular` to
support Jest v30:
https://github.com/thymikee/jest-preset-angular/pull/3175.

## Expected Behavior

Jest v30 should be supported.

## Related Issue(s)

Fixes #31778
2025-07-11 11:17:14 -04:00
Jason Jean 29f9e76925 feat(core): add comprehensive dependency tracking with continuous task support (#31861)
## Current Behavior

When tasks are pending (not started yet), the TUI shows an empty
terminal pane with no information about why the task is waiting. Users
have no visibility into task dependencies or their status.

## Expected Behavior

When a task is pending, the TUI now displays a comprehensive dependency
view showing:
- Progress header indicating how many dependencies are complete vs total
- Scrollable list of all dependencies (direct and transitive) with
real-time status updates
- Support for continuous tasks where InProgress/Stopped are considered
complete
- Keyboard navigation (arrow keys, j/k vim keys, page up/down)
- Dependencies sorted by complexity (most dependencies first), then
alphabetically

### Dependencies Pending

![image](https://github.com/user-attachments/assets/c704dac9-500c-4ff8-a658-24fd23276a29)

### Dependencies Ready but waiting for thread

![image](https://github.com/user-attachments/assets/834dcbc8-6801-4392-b047-0c5115a5ad06)


### Scrollable

![image](https://github.com/user-attachments/assets/338c4486-6268-48c2-a91c-cfa282101565)


## Related Issue(s)

This enhancement improves the TUI experience by providing clear
visibility into task dependencies, making it easier to understand build
pipelines and debug issues.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 09:40:18 -04:00
Jason Jean be6d35bc26 chore(repo): update nx to 21.3.0-beta.5 2025-07-10 20:45:10 -04:00
Emily Xiong fb7f38edda fix(gradle): allow excludeDependsOn to be false (#31890)
<!-- 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 -->
excludeDependsOn is true by default, but got this error when running `nx
run nx-api:compileTestKotlin`:
```
* What went wrong:
Execution failed for task ':nx-api:compileTestKotlin'.
> Error while evaluating property 'friendPathsSet$kotlin_gradle_plugin_common' of task ':nx-api:compileTestKotlin'.
   > Querying the mapped value of provider(java.util.Set) before task ':nx-api:compileJava' has completed is not supported
   ```

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR -->
have a way to turn off excludeDependsOn

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

Fixes #
2025-07-10 18:38:18 -04:00
Craigory Coppola 819ac4442f feat(core): add support for --tui and --no-tui (#31621)
## Summary
- support `--tui` flag alongside `--output-style`
- expose tui option in NxArgs
- respect `tui` CLI option in TUI detection
- warn when environment can't display TUI even if flag is set
- test tui CLI flag parsing

## Testing
- `pnpm nx run-many -t lint,test,build` *(fails: Failed to process
project graph)*
- `pnpm test:e2e` *(fails: Command "test:e2e" not found)*

------
https://chatgpt.com/codex/tasks/task_e_68517adad738832c81ecdfba7f4a1feb

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Craigory Coppola <AgentEnder@users.noreply.github.com>
2025-07-10 17:47:31 -04:00
Benjamin Cabanes 7c9f6cadcc docs(nx-dev): add credit pricing reference & update navigation (#31875)
Introduced a new "Credit Pricing" reference page for Nx Cloud, detailing credit consumption and pricing metrics. Updated documentation structure, menus, sitemap, and headers to integrate the new page. Removed outdated FAQ entries and replaced the "Pricing" reference with the new "Credits Pricing" link in navigation. Adjusted related redirects and UI components for consistency.
2025-07-10 13:22:59 -04:00
Jason Jean 3bdc0ccd90 docs(misc): update nx fix-ci documentation link (#31884)
## Current Behavior

The CI workflow generators for both @nx/workspace and @nx/gradle
currently reference the old documentation URL `https://nx.dev/ai` when
explaining the `nx fix-ci` command.

## Expected Behavior

The CI workflow generators should reference the correct self-healing CI
documentation URL `https://nx.dev/ci/features/self-healing-ci`.

## Related Issue(s)

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

This is a follow-up to update the documentation links to point to the
correct self-healing CI feature page.

## Changes Made

- Updated @nx/workspace CI workflow generator to use the correct
documentation URL
- Updated @nx/gradle CI workflow generator to use the correct
documentation URL
- Updated all snapshot tests to reflect the new URLs
- Updated tutorial documentation that shows the CI workflow examples

**Files Updated:**
- `packages/workspace/src/generators/ci-workflow/ci-workflow.ts`
- `packages/gradle/src/generators/ci-workflow/generator.ts`
-
`packages/workspace/src/generators/ci-workflow/__snapshots__/ci-workflow.spec.ts.snap`
-
`packages/gradle/src/generators/ci-workflow/__snapshots__/generator.spec.ts.snap`
- `packages/workspace/src/generators/ci-workflow/ci-workflow.spec.ts`
- `docs/shared/tutorials/react-monorepo.md`
- `docs/shared/tutorials/typescript-packages.md`
- `docs/shared/tutorials/angular-monorepo.md`
- `docs/shared/tutorials/gradle.md`

All changes ensure users are directed to the correct self-healing CI
documentation when using the `nx fix-ci` command in their CI workflows.
2025-07-10 12:41:02 -04:00
Leosvel Pérez Espinosa bc939973a9 feat(angular): support angular v20.1 (#31845)
## Current Behavior

Angular v20.1 is not supported.

## Expected Behavior

Angular v20.1 should be supported.

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Jason Jean <FrozenPandaz@users.noreply.github.com>
2025-07-10 16:21:03 +00:00
Leosvel Pérez Espinosa a7800c47d6 fix(misc): add fallback for missing source root (#31759)
## Current Behavior

The `sourceRoot` project configuration property is optional. Several
places in the codebase do not properly handle this, which can result in
issues.

## Expected Behavior

A missing `sourceRoot` project configuration property should be handled
correctly throughout the codebase.

## Related Issue(s)

Fixes #30638
2025-07-10 16:19:06 +00:00
Leosvel Pérez Espinosa b8f139016b fix(angular): generate ngrx facade spec file correctly (#31850)
## Current Behavior

When generating a facade with the NgRx generators, the spec file imports
a non-existent `readFirst` from `@nx/angular/testing`. That helper was
deprecated for a long time and removed in Nx v21, but this usage was
missed, causing those tests to fail.

The e2e tests that cover this were disabled for the pnpm package
manager, so it was not caught in the PR/main CI pipeline. It was
correctly failing in the Nightly CI pipeline. The tests are now enabled
for all package managers.

Nightly failure:
https://staging.nx.app/runs/uRlR20Fzt9/task/e2e-angular%3Ae2e-local

## Expected Behavior

When generating a facade with the NgRx generators, the spec file for the
facade should be correct.

## Related Issue(s)

Fixes #
2025-07-10 11:13:57 -04:00
Juri ecee1c34fc docs(core): updates to the getting started pages 2025-07-10 16:12:50 +02:00
Leosvel Pérez Espinosa b5d406dee8 fix(core): allow opting out of sorting root tsconfig path mappings with an env var (#31763)
## Current Behavior

Currently, users can opt out of sorting the root tsconfig file path
mappings by providing `--sort-root-tsconfig-paths=false` to the `nx
format` commands, or by providing `{ sortRootTsconfigPaths: false }` to
the `formatFiles` function when invoked programmatically. Still, Nx
generators sort the root tsconfig file path mappings by default, and the
only way to bypass that is to run two different commands:

```bash
nx g component path/to/component --skip-format
nx format:write --sort-root-tsconfig-paths=false
```

## Expected Behavior

Users should be able to easily opt out of sorting the root tsconfig file
path mappings by setting the `NX_FORMAT_SORT_TSCONFIG_PATHS` environment
variable to `false`. With that set, all the relevant commands, including
`nx generate` will respect it.

## Related Issue(s)

Fixes #29043
2025-07-10 09:58:52 -04:00
Leosvel Pérez Espinosa 3782d7edac Revert "fix(core): add option to use v8 for daemon message serializat… (#31881)
…ion to avoid issues when JSON.stringify would fail (#30516)"

This reverts commit a59e6eb559.
2025-07-10 13:34:38 +00:00
Jason Jean 13551c9457 feat(core): add fix-ci command to CI workflows (#31833)
## Current Behavior

Nx-cloud commands are scattered across different directories in the
command-line structure, making them harder to find and maintain.
Commands like `record`, `start-ci-run`, and `fix-ci` don't exist as
direct nx commands. The fix-ci command in CI workflows doesn't run when
previous steps fail.

## Expected Behavior

All nx-cloud related commands are organized in a dedicated directory
with consistent patterns and shared utilities. New commands provide
better CI/CD integration. The fix-ci command always runs to provide
AI-powered recommendations even when builds fail.

## Related Issue(s)

Improves code organization and adds missing CI workflow commands for
better developer experience.

## Changes Made

### 🏗️ **Reorganized nx-cloud commands**
- Created `/packages/nx/src/command-line/nx-cloud/` directory structure
- Moved existing commands (`login`, `logout`, `connect`) to new location
- Extracted shared utility function to eliminate code duplication

### 🆕 **Added new nx-cloud commands**
- `nx record` - Records command execution for distributed task execution
- `nx start-ci-run` - Starts new CI run for distributed execution  
- `nx fix-ci` - Fixes CI configuration issues with AI-powered
suggestions

### 🔧 **Code quality improvements**
- Reduced code duplication by 80+ lines across command implementations
- All commands now follow consistent patterns using shared utilities
- Fixed import paths throughout codebase after reorganization

### 🚀 **Enhanced CI workflow support**
- **Gradle Generator**: Added `alwaysRun` property to Command type for
conditional execution
- **Template Updates**: GitHub Actions and CircleCI templates now handle
`alwaysRun` property
- **Fix-CI Integration**: The `fix-ci` command now always runs
regardless of previous step failures

### 📚 **Comprehensive documentation updates**
- Updated all CI provider documentation (GitHub Actions, Azure DevOps,
GitLab, Bitbucket, CircleCI, Jenkins)
- Updated Nx Cloud tutorial documentation (GitHub Actions, CircleCI)
- **Framework Tutorials**: Added `if: always()` condition to fix-ci
commands in:
  - Gradle tutorial (`/docs/shared/tutorials/gradle.md`)
- Angular monorepo tutorial
(`/docs/shared/tutorials/angular-monorepo.md`)
  - React monorepo tutorial (`/docs/shared/tutorials/react-monorepo.md`)
- TypeScript packages tutorial
(`/docs/shared/tutorials/typescript-packages.md`)
- Added proper documentation linking for all new commands
- All validation passes (TypeScript, formatting, documentation)

### 🎯 **Key Technical Improvements**
- **Always-Run Logic**: Fix-ci command uses platform-specific
conditional execution:
  - GitHub Actions: `if: always()`
  - CircleCI: `when: always`
  - Azure DevOps: `condition: always()`
- **Consistent Patterns**: All nx-cloud commands follow unified
implementation approach
- **Backward Compatibility**: All existing functionality preserved
during reorganization

All nx-cloud commands now provide a more cohesive experience with better
CI integration, ensuring users get AI-powered recommendations even when
builds fail.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com>
2025-07-09 18:20:59 -04:00
Philip Fulcher baa28ab697 docs(nx-dev): remove references to July 9th webinar (#31874) 2025-07-09 13:48:29 -06:00
Juri b67deeefe3 docs(nx-cloud): add new self-healing ci feature page 2025-07-09 19:22:17 +02:00
Jack Hsu 5eec205959 docs(misc): fix command in self-healing ci blog post 2025-07-09 18:01:35 +02:00
Craigory Coppola a59e6eb559 fix(core): add option to use v8 for daemon message serialization to avoid issues when JSON.stringify would fail (#30516)
<!-- 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
For really large objects (particularly those containing large strings)
JSON.stringify can fail

## Expected Behavior
Daemon serialization doesn't fail for the same strings when setting
`NX_USE_V8_SERIALIZER=true`. This should become the default behavior.

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

Fixes #

---------

Co-authored-by: Jason Jean <jasonjean1993@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-07-09 10:53:23 -04:00
Brandon Roberts 4a09116283 fix(vite): bump @analogjs/vite-plugin-angular to 1.19.x (#31866)
## Current Behavior

AnalogJS installs 1.17.1 for Vitest support

## Expected Behavior

AnalogJS installs 1.19.1 for Vitest support
2025-07-09 16:49:07 +02:00
Miroslav Jonaš f432f78028 docs(nx-dev): remove problematic GitHub parallelization (#31865)
The existing parallelization example does not work correctly due to the
encapsulated run_command swallowing the status codes and passing the
runs with a failed command.

If users are interested in how to parallelize the tasks they can easily
find it today. We should provide minimal example like we do for other CI
providers.

<!-- 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-07-09 10:35:16 +00:00
Jason Jean 2077a4ac4b Revert "feat(core): add CI warning for missing remote cache solution (#31678)" (#31860)
This reverts commit
[a745ca5dd6fac1c91233976b9fe3713a7018cfe3](https://github.com/nrwl/nx/pull/31860/commits/a745ca5dd6fac1c91233976b9fe3713a7018cfe3).

<!-- 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://github.com/nrwl/nx/issues/31837
2025-07-08 18:54:27 -04:00
Jack Hsu a024760e1d chore(repo): rename rawdocs to upstream docs (#31859)
Just a rename for https://github.com/nrwl/upstream-docs
2025-07-08 13:58:10 -04:00
Leosvel Pérez Espinosa ffb80d10ab chore(core): optionally infer all package.json files as projects (#31843)
Add an env var to allow inferring projects from all `package.json` files
when there's no `package.json` file at the workspace root.
2025-07-08 12:12:14 -04:00
Benjamin Cabanes ea5cd30e42 docs(nx-dev): update nx-cloud page (#31844)
The main Nx Cloud page was completely rebuilt with a new component structure, replacing the old sections (`Hero`, `TrustedBy`, `FasterAndCheaper`, etc.) with new ones like `NxCloudHero`, `CiBottleneck`, `TimeToGreen`, `Features`, and others.
2025-07-07 14:47:56 -04:00
Colum Ferry 16e3e7aa8d feat(release): allow for semver requirements to be disabled in version and changelog (#31794) 2025-07-07 13:53:27 +04:00
James Henry 7f674e1406 fix(core): improve tui contrast on some terminal themes (#31299) 2025-07-07 12:54:56 +04:00
Miguel 0fce02a7f5 fix(core): consider virtual trees in globAsync (#31805) 2025-07-07 12:31:02 +04:00
Jonathan Gelin 31661c8340 fix(plugin): fix e2e-project generator when the e2e target is inferred (#31809) 2025-07-07 12:22:15 +04:00
Jason Jean 666da3eaeb feat(core): refactor CI workflow generator to use centralized command generation (#31787)
## Summary

This PR refactors the @nx/workspace CI workflow generator to adopt the
same centralized command generation pattern used by the Gradle
generator, making it more maintainable and consistent.

## Key Changes

### 1. Centralized Command Generation
- Added `getCiCommands()` function that generates command arrays for all
CI providers
- Replaced hardcoded commands in templates with dynamic command
substitution
- All CI providers now use identical commands with provider-specific
formatting

### 2. Performance Improvement  
- Replaced `nx affected` with `nx run-many` for better performance
- Updated all CI workflow templates and snapshots accordingly

### 3. Better Code Organization
- Separated nx-cloud record comments from nx-affected comments
- Added helper functions `getCiPrefix()` and `getCiArgs()` for cleaner
code
- Improved comment clarity to guide users on when to switch to nx
affected

### 4. Bitbucket Prefix Fix
- Fixed inconsistent YAML formatting in Bitbucket pipelines
- Pull requests section: no prefix for comments
- Branches section: proper "- " prefix for comments

### 5. Template Consistency
- All CI providers (GitHub, Azure, GitLab, CircleCI, Bitbucket) now
generate identical commands
- Consistent comment structure across all templates
- Updated tutorial template to match new format

## Test Results
-  All 114 tests passing
-  All 95 snapshots updated and verified
-  100% backward compatibility maintained

## Benefits
1. **Maintainability**: Changes to commands only need to be made in one
place
2. **Consistency**: All CI providers use identical commands and comments
3. **Performance**: nx run-many provides better performance than nx
affected
4. **Extensibility**: Easy to add new CI providers or modify existing
ones
5. **Clean Architecture**: Follows the same pattern as other generators
2025-07-04 15:02:47 +00:00
2590 changed files with 114172 additions and 216469 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
[build]
target-dir = 'build/target'
target-dir = 'dist/target'
[target.x86_64-unknown-linux-musl]
rustflags = [
+1 -1
View File
@@ -1,7 +1,7 @@
{
"mcpServers": {
"nx-mcp": {
"url": "http://localhost:9470/sse"
"url": "http://localhost:9470/mcp"
}
}
}
+7 -3
View File
@@ -348,8 +348,8 @@ jobs:
with:
name: bindings-${{ matrix.settings.target }}
path: |
packages/**/*.node
packages/**/*.wasm
packages/nx/src/native/*.node
packages/nx/src/native/*.wasm
if-no-files-found: error
build-freebsd:
@@ -398,8 +398,11 @@ jobs:
whoami
env
freebsd-version
echo "Installing dependencies"
pnpm install --frozen-lockfile --ignore-scripts
echo "Building FreeBSD bindings"
pnpm nx run-many --verbose --outputStyle stream --target=build-native -- --target=x86_64-unknown-freebsd
echo "Cleaning up"
pnpm nx reset
rm -rf node_modules
rm -rf dist
@@ -411,7 +414,8 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: bindings-freebsd
path: packages/**/*.node
path: |
packages/nx/src/native/*.node
if-no-files-found: error
publish:
+4 -2
View File
@@ -35,6 +35,7 @@ CHANGELOG.md
.next
out
# Angular Cache
.angular
@@ -104,6 +105,7 @@ node_modules/
tasks.json
tasks/
# Raw docs local configuration (machine-specific)
.rawdocs.local.json
# Upstream docs local configuration (machine-specific)
.upstreamdocs.local.json
astro-docs/.netlify
+9
View File
@@ -9,6 +9,7 @@ assignment-rules:
- agent: linux-extra-large
parallelism: 1
# These projects should not need to be isolated.
- projects:
- nx-dev
targets:
@@ -16,6 +17,14 @@ assignment-rules:
run-on:
- agent: linux-extra-large
parallelism: 1
- projects:
- angular
- react
targets:
- test
run-on:
- agent: linux-extra-large
parallelism: 1
- targets:
- lint
+4 -1
View File
@@ -137,6 +137,9 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
/packages/storybook/** @nrwl/nx-storybook-reviewers
/e2e/storybook/** @nrwl/nx-storybook-reviewers
# Docker
/packages/docker/** @nrwl/nx-core-reviewers @Coly010
## Devkit
/docs/generated/devkit/** @nrwl/nx-devkit-reviewers @nrwl/nx-docs-reviewers
/docs/generated/packages/devkit/** @nrwl/nx-devkit-reviewers @nrwl/nx-docs-reviewers
@@ -174,7 +177,7 @@ rust-toolchain.toml @nrwl/nx-native-reviewers
# Misc
/e2e/lerna-smoke-tests/** @vsavkin @JamesHenry
/e2e/utils/** @meeroslav @nrwl/nx-testing-tools-reviewers @vsavkin @mandarini
/e2e/utils/** @meeroslav @nrwl/nx-testing-tools-reviewers @vsavkin
/community @nrwl/nx-docs-reviewers
/CONTRIBUTING.md @FrozenPandaz @isaacplmann
/CODE_OF_CONDUCT.md @FrozenPandaz @isaacplmann
+12 -12
View File
@@ -82,17 +82,17 @@ help you get started.
| ![James Henry](https://avatars.githubusercontent.com/u/900523?s=160&v=4) | ![Jon Cammisuli](https://avatars2.githubusercontent.com/u/4332460?s=160) | ![Isaac Mann](https://avatars1.githubusercontent.com/u/861504?s=160) | ![Juri Strumpflohner](https://avatars1.githubusercontent.com/u/542458?s=160) |
| [JamesHenry](https://github.com/JamesHenry) | [cammisuli](https://github.com/cammisuli) | [isaacplmann](https://github.com/isaacplmann) | [juristr](https://github.com/juristr) |
| Philip Fulcher | Caleb Ukle | Katerina Skroumpelou | Colum Ferry |
| ------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| ![Philip Fulcher](https://avatars1.githubusercontent.com/u/1536471?s=160) | ![Caleb Ukle](https://avatars.githubusercontent.com/u/23272162?s=160) | ![Katerina Skroumpelou](https://avatars0.githubusercontent.com/u/6603745?s=160) | ![Colum Ferry](https://avatars.githubusercontent.com/u/12140467?s=160) |
| [philipjfulcher](https://github.com/philipjfulcher) | [barbados-clemens](https://github.com/barbados-clemens) | [mandarini](https://github.com/mandarini) | [Coly010](https://github.com/Coly010) |
| Philip Fulcher | Caleb Ukle | Colum Ferry | Emily Xiong |
| ------------------------------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| ![Philip Fulcher](https://avatars1.githubusercontent.com/u/1536471?s=160) | ![Caleb Ukle](https://avatars.githubusercontent.com/u/23272162?s=160) | ![Colum Ferry](https://avatars.githubusercontent.com/u/12140467?s=160) | ![Emily Xiong](https://avatars.githubusercontent.com/u/16211801?s=160) |
| [philipjfulcher](https://github.com/philipjfulcher) | [barbados-clemens](https://github.com/barbados-clemens) | [Coly010](https://github.com/Coly010) | [xiongemi](https://github.com/xiongemi) |
| Emily Xiong | Miroslav Jonaš | Leosvel Pérez Espinosa | Zachary DeRose |
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| ![Emily Xiong](https://avatars.githubusercontent.com/u/16211801?s=160) | ![Miroslav Jonaš](https://avatars.githubusercontent.com/u/881612?s=160) | ![Leosvel Pérez Espinosa](https://avatars.githubusercontent.com/u/12051310?s=160) | ![Zachary DeRose](https://avatars.githubusercontent.com/u/3788405?s=160) |
| [xiongemi](https://github.com/xiongemi) | [meeroslav](https://github.com/meeroslav) | [leosvelperez](https://github.com/leosvelperez) | [ZackDeRose](https://github.com/ZackDeRose) |
| Miroslav Jonaš | Leosvel Pérez Espinosa | Zachary DeRose | Craigory Coppola |
| ----------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------------- |
| ![Miroslav Jonaš](https://avatars.githubusercontent.com/u/881612?s=160) | ![Leosvel Pérez Espinosa](https://avatars.githubusercontent.com/u/12051310?s=160) | ![Zachary DeRose](https://avatars.githubusercontent.com/u/3788405?s=160) | ![Craigory Coppola](https://avatars.githubusercontent.com/u/6933928?s=160) |
| [meeroslav](https://github.com/meeroslav) | [leosvelperez](https://github.com/leosvelperez) | [ZackDeRose](https://github.com/ZackDeRose) | [AgentEnder](https://github.com/AgentEnder) |
| Craigory Coppola | Chau Tran | Nicholas Cunningham | Max Kless |
| -------------------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| ![Craigory Coppola](https://avatars.githubusercontent.com/u/6933928?s=160) | ![Chau Tran](https://avatars.githubusercontent.com/u/25516557?s=160) | ![Nicholas Cunningham](https://avatars.githubusercontent.com/u/338948?s=160) | ![Max Kless](https://avatars.githubusercontent.com/u/34165455?s=160) |
| [AgentEnder](https://github.com/AgentEnder) | [nartc](https://github.com/nartc) | [ndcunningham](https://github.com/ndcunningham) | [MaxKless](https://github.com/MaxKless) |
| Chau Tran | Nicholas Cunningham | Max Kless |
| -------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| ![Chau Tran](https://avatars.githubusercontent.com/u/25516557?s=160) | ![Nicholas Cunningham](https://avatars.githubusercontent.com/u/338948?s=160) | ![Max Kless](https://avatars.githubusercontent.com/u/34165455?s=160) |
| [nartc](https://github.com/nartc) | [ndcunningham](https://github.com/ndcunningham) | [MaxKless](https://github.com/MaxKless) |
+24
View File
@@ -0,0 +1,24 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# Local Netlify folder
.netlify
+54
View File
@@ -0,0 +1,54 @@
# Starlight Starter Kit: Basics
[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)
```
pnpm create astro@latest -- --template starlight
```
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics)
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics)
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/withastro/starlight&create_from_path=examples/basics)
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs)
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files:
```
.
├── public/
├── src/
│ ├── assets/
│ ├── content/
│ │ ├── docs/
│ └── content.config.ts
├── astro.config.mjs
├── package.json
└── tsconfig.json
```
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.
Images can be added to `src/assets/` and embedded in Markdown with a relative link.
Static assets, like favicons, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :--------------------- | :----------------------------------------------- |
| `pnpm install` | Installs dependencies |
| `pnpm dev` | Starts local dev server at `localhost:4321` |
| `pnpm build` | Build your production site to `./dist/` |
| `pnpm preview` | Preview your build locally, before deploying |
| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` |
| `pnpm astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [Starlights docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).
+99
View File
@@ -0,0 +1,99 @@
// @ts-check
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import { sectionSidebarPlugin } from './src/plugins/section-sidebar.plugin';
import netlify from '@astrojs/netlify';
import linkValidator from 'starlight-links-validator';
import react from '@astrojs/react';
import markdoc from '@astrojs/markdoc';
import tailwindcss from '@tailwindcss/vite';
// https://astro.build/config
export default defineConfig({
vite: { plugins: [tailwindcss()] },
site: 'https://docs.nx.dev',
adapter: netlify(),
integrations: [
markdoc(),
starlight({
title: 'Nx',
tagline:
'An AI-first build platform that connects everything from your editor to CI. Helping you deliver fast, without breaking things.',
customCss: ['./src/styles/global.css'],
favicon: '/favicon.svg',
logo: {
src: './src/assets/nx/Nx-light.png',
replacesTitle: true,
},
plugins: [
// linkValidator(),
sectionSidebarPlugin(),
],
routeMiddleware: ['./src/plugins/banner.middleware.ts'],
markdown: {
// this breaks the renderMarkdown function in the plugin loader due to starlight path normalization
// as to _why_ it has to normalize a path?
// idk just working around the issue for now but we'll want to have linked headers so will need to fix
headingLinks: false,
},
social: [
{ icon: 'github', label: 'GitHub', href: 'https://github.com/nrwl/nx' },
{
icon: 'youtube',
label: 'YouTube',
href: 'https://www.youtube.com/@NxDevtools?utm_source=nx.dev',
},
{
icon: 'x.com',
label: 'X',
href: 'https://x.com/NxDevTools?utm_source=nx.dev',
},
{
icon: 'discord',
label: 'Discord',
href: 'https://go.nx.dev/community',
},
],
editLink: {
baseUrl: 'https://github.com/nrwl/nx/tree/main/',
},
sidebar: [
{
label: 'Getting Started',
autogenerate: { directory: 'getting-started' },
},
{
label: 'Guides',
autogenerate: { directory: 'guides' },
},
{
label: 'Concepts',
autogenerate: { directory: 'concepts' },
},
{
label: 'References',
collapsed: true,
items: [
// have to use link bc slug is mapped to the /docs/ folder but we need the astro component in the pages/ dir
{ label: 'Nx CLI', link: 'api/nx-cli' },
{ label: 'Nx Cloud CLI', slug: 'api/nx-cloud-cli' },
{ label: 'create-nx-workspace', link: 'api/create-nx-workspace' },
{
label: 'devkit',
collapsed: true,
items: [
{ label: 'Overview', link: 'api/plugins/devkit/' },
{
label: 'Ng CLI Adapter',
link: 'api/plugins/devkit/ngcli_adapter',
},
],
},
// plugins are autogenerated from the Nx repository via the sidebar plugin
],
},
],
}),
react(),
],
});
+29
View File
@@ -0,0 +1,29 @@
import { defineMarkdocConfig, component } from '@astrojs/markdoc/config';
import starlightMarkdoc from '@astrojs/starlight-markdoc';
export default defineMarkdocConfig({
extends: [starlightMarkdoc()],
tags: {
youtube: {
render: component('./src/components/Youtube.astro'),
attributes: {
src: {
type: 'String',
required: true,
},
title: {
type: 'String',
required: true,
},
width: {
type: 'String',
default: '100%',
},
caption: {
type: 'String',
required: false,
},
},
},
},
});
+19
View File
@@ -0,0 +1,19 @@
{
"name": "astro-docs",
"version": "0.0.1",
"private": true,
"dependencies": {
"@astrojs/check": "^0.7.0",
"@astrojs/markdoc": "^0.15.0",
"@astrojs/netlify": "^6.4.0",
"@astrojs/react": "^4.3.0",
"@astrojs/starlight": "0.34.6",
"@astrojs/starlight-markdoc": "^0.4.0",
"@astrojs/starlight-tailwind": "^4.0.1",
"@nx/nx-dev-ui-icons": "workspace:*",
"@nx/nx-dev-ui-markdoc": "workspace:*",
"@tailwindcss/vite": "^4.1.11",
"astro": "^5.10.1",
"tailwindcss": "4.1.11"
}
}
+37
View File
@@ -0,0 +1,37 @@
{
"name": "astro-docs",
"targets": {
"comment": "package.json#scripts runs in the project root directory with astro assumes is where the node_modules is. which fails. so run the scripts in project.json#targets with --root command instead",
"serve": {
"continuous": true,
"dependsOn": [
{
"projects": ["devkit", "create-nx-workspace"],
"target": "build"
}
],
"command": "astro dev",
"options": {
"cwd": "astro-docs"
}
},
"build": {
"dependsOn": [
{
"projects": ["devkit", "create-nx-workspace"],
"target": "build"
}
],
"command": "astro build",
"options": {
"cwd": "astro-docs"
}
},
"astro": {
"command": "astro",
"options": {
"cwd": "astro-docs"
}
}
}
}
+1
View File
@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Nx</title><path d="M11.987 14.138l-3.132 4.923-5.193-8.427-.012 8.822H0V4.544h3.691l5.247 8.833.005-3.998 3.044 4.759zm.601-5.761c.024-.048 0-3.784.008-3.833h-3.65c.002.059-.005 3.776-.003 3.833h3.645zm5.634 4.134a2.061 2.061 0 0 0-1.969 1.336 1.963 1.963 0 0 1 2.343-.739c.396.161.917.422 1.33.283a2.1 2.1 0 0 0-1.704-.88zm3.39 1.061c-.375-.13-.8-.277-1.109-.681-.06-.08-.116-.17-.176-.265a2.143 2.143 0 0 0-.533-.642c-.294-.216-.68-.322-1.18-.322a2.482 2.482 0 0 0-2.294 1.536 2.325 2.325 0 0 1 4.002.388.75.75 0 0 0 .836.334c.493-.105.46.36 1.203.518v-.133c-.003-.446-.246-.55-.75-.733zm2.024 1.266a.723.723 0 0 0 .347-.638c-.01-2.957-2.41-5.487-5.37-5.487a5.364 5.364 0 0 0-4.487 2.418c-.01-.026-1.522-2.39-1.538-2.418H8.943l3.463 5.423-3.379 5.32h3.54l1.54-2.366 1.568 2.366h3.541l-3.21-5.052a.7.7 0 0 1-.084-.32 2.69 2.69 0 0 1 2.69-2.691h.001c1.488 0 1.736.89 2.057 1.308.634.826 1.9.464 1.9 1.541a.707.707 0 0 0 1.066.596zm.35.133c-.173.372-.56.338-.755.639-.176.271.114.412.114.412s.337.156.538-.311c.104-.231.14-.488.103-.74z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 78 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 334 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

+1
View File
@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Nx</title><path d="M11.987 14.138l-3.132 4.923-5.193-8.427-.012 8.822H0V4.544h3.691l5.247 8.833.005-3.998 3.044 4.759zm.601-5.761c.024-.048 0-3.784.008-3.833h-3.65c.002.059-.005 3.776-.003 3.833h3.645zm5.634 4.134a2.061 2.061 0 0 0-1.969 1.336 1.963 1.963 0 0 1 2.343-.739c.396.161.917.422 1.33.283a2.1 2.1 0 0 0-1.704-.88zm3.39 1.061c-.375-.13-.8-.277-1.109-.681-.06-.08-.116-.17-.176-.265a2.143 2.143 0 0 0-.533-.642c-.294-.216-.68-.322-1.18-.322a2.482 2.482 0 0 0-2.294 1.536 2.325 2.325 0 0 1 4.002.388.75.75 0 0 0 .836.334c.493-.105.46.36 1.203.518v-.133c-.003-.446-.246-.55-.75-.733zm2.024 1.266a.723.723 0 0 0 .347-.638c-.01-2.957-2.41-5.487-5.37-5.487a5.364 5.364 0 0 0-4.487 2.418c-.01-.026-1.522-2.39-1.538-2.418H8.943l3.463 5.423-3.379 5.32h3.54l1.54-2.366 1.568 2.366h3.541l-3.21-5.052a.7.7 0 0 1-.084-.32 2.69 2.69 0 0 1 2.69-2.691h.001c1.488 0 1.736.89 2.057 1.308.634.826 1.9.464 1.9 1.541a.707.707 0 0 0 1.066.596zm.35.133c-.173.372-.56.338-.755.639-.176.271.114.412.114.412s.337.156.538-.311c.104-.231.14-.488.103-.74z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 68 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 112 KiB

+4
View File
@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: https://<YOUR SITE>/sitemap-index.xml
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,3 @@
<svg width="508" height="508" viewBox="0 0 508 508" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M404 179V141.5C404 120.8 387.2 104 366.5 104H141.5C120.8 104 104 120.8 104 141.5V366.5C104 387.2 120.8 404 141.5 404H179M404 179C362.6 179 329 212.6 329 254C329 295.4 295.4 329 254 329C212.6 329 179 362.6 179 404M404 179V365.364C404 386.691 386.691 404 365.364 404L179 404" stroke="#0A1A2D" stroke-width="36"/>
</svg>

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

@@ -0,0 +1,3 @@
<svg width="508" height="508" viewBox="0 0 508 508" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M404 179V141.5C404 120.8 387.2 104 366.5 104H141.5C120.8 104 104 120.8 104 141.5V366.5C104 387.2 120.8 404 141.5 404H179M404 179C362.6 179 329 212.6 329 254C329 295.4 295.4 329 254 329C212.6 329 179 362.6 179 404M404 179V365.364C404 386.691 386.691 404 365.364 404L179 404" stroke="white" stroke-width="36"/>
</svg>

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@@ -0,0 +1,17 @@
<svg width="172" height="39" viewBox="0 0 172 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_301_3)">
<path d="M69.6733 9.27841V29.642H66.8494L56.4985 14.7074H56.3096V29.642H53.2372V9.27841H56.0809L66.4417 24.233H66.6306V9.27841H69.6733Z" fill="#0F172A"/>
<path d="M76.2631 14.3693L79.6338 20.3153L83.0344 14.3693H86.2858L81.523 22.0057L86.3256 29.642H83.0742L79.6338 23.9347L76.2034 29.642H72.9421L77.6949 22.0057L73.0017 14.3693H76.2631Z" fill="#0F172A"/>
<path d="M113.901 15.9006H110.798C110.679 15.2377 110.457 14.6544 110.132 14.1506C109.807 13.6468 109.41 13.2192 108.939 12.8679C108.468 12.5166 107.941 12.2514 107.358 12.0724C106.781 11.8935 106.168 11.804 105.518 11.804C104.345 11.804 103.294 12.099 102.366 12.6889C101.445 13.2789 100.716 14.1439 100.179 15.2841C99.6486 16.4242 99.3835 17.8163 99.3835 19.4602C99.3835 21.1174 99.6486 22.5161 100.179 23.6562C100.716 24.7964 101.448 25.6581 102.376 26.2415C103.304 26.8248 104.348 27.1165 105.508 27.1165C106.151 27.1165 106.761 27.0303 107.338 26.858C107.921 26.679 108.448 26.4171 108.919 26.0724C109.39 25.7277 109.787 25.3068 110.112 24.8097C110.444 24.3059 110.672 23.7292 110.798 23.0795L113.901 23.0895C113.735 24.0904 113.413 25.0118 112.936 25.8537C112.465 26.6889 111.859 27.4115 111.116 28.0213C110.381 28.6245 109.539 29.0919 108.591 29.4233C107.643 29.7547 106.609 29.9205 105.489 29.9205C103.725 29.9205 102.154 29.5028 100.776 28.6676C99.3967 27.8258 98.3096 26.6226 97.5142 25.0582C96.7253 23.4938 96.3309 21.6278 96.3309 19.4602C96.3309 17.286 96.7287 15.42 97.5241 13.8622C98.3196 12.2978 99.4067 11.098 100.785 10.2628C102.164 9.42093 103.732 9 105.489 9C106.569 9 107.577 9.15578 108.511 9.46733C109.453 9.77225 110.298 10.223 111.047 10.8196C111.796 11.4096 112.416 12.1321 112.906 12.9872C113.397 13.8357 113.728 14.8068 113.901 15.9006Z" fill="#0F172A"/>
<path d="M120.311 9.27841V29.642H117.338V9.27841H120.311Z" fill="#0F172A"/>
<path d="M130.744 29.9503C129.312 29.9503 128.063 29.6222 126.996 28.9659C125.928 28.3097 125.1 27.3916 124.51 26.2116C123.92 25.0317 123.625 23.6529 123.625 22.0753C123.625 20.491 123.92 19.1056 124.51 17.919C125.1 16.7325 125.928 15.8111 126.996 15.1548C128.063 14.4986 129.312 14.1705 130.744 14.1705C132.176 14.1705 133.426 14.4986 134.493 15.1548C135.56 15.8111 136.389 16.7325 136.979 17.919C137.569 19.1056 137.864 20.491 137.864 22.0753C137.864 23.6529 137.569 25.0317 136.979 26.2116C136.389 27.3916 135.56 28.3097 134.493 28.9659C133.426 29.6222 132.176 29.9503 130.744 29.9503ZM130.754 27.4545C131.682 27.4545 132.451 27.2093 133.061 26.7188C133.671 26.2282 134.122 25.5753 134.413 24.7599C134.712 23.9446 134.861 23.0464 134.861 22.0653C134.861 21.0909 134.712 20.196 134.413 19.3807C134.122 18.5587 133.671 17.8991 133.061 17.402C132.451 16.9048 131.682 16.6562 130.754 16.6562C129.82 16.6562 129.044 16.9048 128.428 17.402C127.818 17.8991 127.364 18.5587 127.065 19.3807C126.774 20.196 126.628 21.0909 126.628 22.0653C126.628 23.0464 126.774 23.9446 127.065 24.7599C127.364 25.5753 127.818 26.2282 128.428 26.7188C129.044 27.2093 129.82 27.4545 130.754 27.4545Z" fill="#0F172A"/>
<path d="M150.857 23.3082V14.3693H153.84V29.642H150.917V26.9972H150.757C150.406 27.8125 149.843 28.492 149.067 29.0355C148.298 29.5724 147.34 29.8409 146.194 29.8409C145.212 29.8409 144.344 29.6255 143.588 29.1946C142.839 28.7571 142.249 28.1108 141.819 27.2557C141.394 26.4006 141.182 25.3433 141.182 24.0838V14.3693H144.155V23.7259C144.155 24.7666 144.444 25.5952 145.02 26.2116C145.597 26.8281 146.346 27.1364 147.267 27.1364C147.824 27.1364 148.378 26.9972 148.928 26.7188C149.485 26.4403 149.945 26.0194 150.31 25.456C150.681 24.8925 150.863 24.1766 150.857 23.3082Z" fill="#0F172A"/>
<path d="M163.552 29.9403C162.319 29.9403 161.218 29.6255 160.251 28.9957C159.29 28.3594 158.534 27.4545 157.984 26.2812C157.44 25.1013 157.168 23.6861 157.168 22.0355C157.168 20.3849 157.443 18.973 157.994 17.7997C158.55 16.6264 159.313 15.7282 160.281 15.1051C161.248 14.482 162.345 14.1705 163.572 14.1705C164.52 14.1705 165.282 14.3295 165.859 14.6477C166.442 14.9593 166.893 15.3239 167.211 15.7415C167.536 16.1591 167.788 16.527 167.967 16.8452H168.146V9.27841H171.119V29.642H168.215V27.2656H167.967C167.788 27.5904 167.529 27.9616 167.191 28.3793C166.86 28.7969 166.402 29.1615 165.819 29.473C165.236 29.7846 164.48 29.9403 163.552 29.9403ZM164.208 27.4048C165.063 27.4048 165.786 27.1795 166.376 26.7287C166.972 26.2713 167.423 25.6383 167.728 24.8295C168.04 24.0208 168.195 23.0795 168.195 22.0057C168.195 20.9451 168.043 20.017 167.738 19.2216C167.433 18.4261 166.986 17.8063 166.396 17.3622C165.806 16.9181 165.076 16.696 164.208 16.696C163.313 16.696 162.567 16.928 161.971 17.392C161.374 17.8561 160.924 18.4891 160.619 19.2912C160.32 20.0933 160.171 20.9981 160.171 22.0057C160.171 23.0265 160.324 23.9446 160.629 24.7599C160.933 25.5753 161.384 26.2216 161.981 26.6989C162.584 27.1695 163.326 27.4048 164.208 27.4048Z" fill="#0F172A"/>
<path d="M36.7916 10.5417V6.16669C36.7916 3.75169 34.8316 1.79169 32.4166 1.79169H6.16663C3.75163 1.79169 1.79163 3.75169 1.79163 6.16669V32.4167C1.79163 34.8317 3.75163 36.7917 6.16663 36.7917H10.5416M36.7916 10.5417C31.9616 10.5417 28.0416 14.4617 28.0416 19.2917C28.0416 24.1217 24.1216 28.0417 19.2916 28.0417C14.4616 28.0417 10.5416 31.9617 10.5416 36.7917M36.7916 10.5417V32.2841C36.7916 34.7723 34.7722 36.7917 32.2841 36.7917L10.5416 36.7917" stroke="#0F172A" stroke-width="3"/>
</g>
<defs>
<clipPath id="clip0_301_3">
<rect width="172" height="39" fill="white" transform="matrix(-1 0 0 1 172 0)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

@@ -0,0 +1,17 @@
<svg width="172" height="39" viewBox="0 0 172 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_403_2)">
<path d="M69.6733 9.27841V29.642H66.8494L56.4985 14.7074H56.3096V29.642H53.2372V9.27841H56.0809L66.4417 24.233H66.6306V9.27841H69.6733Z" fill="white"/>
<path d="M76.2631 14.3693L79.6338 20.3153L83.0344 14.3693H86.2858L81.523 22.0057L86.3256 29.642H83.0742L79.6338 23.9347L76.2034 29.642H72.9421L77.6949 22.0057L73.0017 14.3693H76.2631Z" fill="white"/>
<path d="M113.901 15.9006H110.798C110.679 15.2377 110.457 14.6544 110.132 14.1506C109.807 13.6468 109.41 13.2192 108.939 12.8679C108.468 12.5166 107.941 12.2514 107.358 12.0724C106.781 11.8935 106.168 11.804 105.518 11.804C104.345 11.804 103.294 12.099 102.366 12.6889C101.445 13.2789 100.716 14.1439 100.179 15.2841C99.6486 16.4242 99.3835 17.8163 99.3835 19.4602C99.3835 21.1174 99.6486 22.5161 100.179 23.6562C100.716 24.7964 101.448 25.6581 102.376 26.2415C103.304 26.8248 104.348 27.1165 105.508 27.1165C106.151 27.1165 106.761 27.0303 107.338 26.858C107.921 26.679 108.448 26.4171 108.919 26.0724C109.39 25.7277 109.787 25.3068 110.112 24.8097C110.444 24.3059 110.672 23.7292 110.798 23.0795L113.901 23.0895C113.735 24.0904 113.413 25.0118 112.936 25.8537C112.465 26.6889 111.859 27.4115 111.116 28.0213C110.381 28.6245 109.539 29.0919 108.591 29.4233C107.643 29.7547 106.609 29.9205 105.489 29.9205C103.725 29.9205 102.154 29.5028 100.776 28.6676C99.3967 27.8258 98.3096 26.6226 97.5142 25.0582C96.7253 23.4938 96.3309 21.6278 96.3309 19.4602C96.3309 17.286 96.7287 15.42 97.5241 13.8622C98.3196 12.2978 99.4067 11.098 100.785 10.2628C102.164 9.42093 103.732 9 105.489 9C106.569 9 107.577 9.15578 108.511 9.46733C109.453 9.77225 110.298 10.223 111.047 10.8196C111.796 11.4096 112.416 12.1321 112.906 12.9872C113.397 13.8357 113.728 14.8068 113.901 15.9006Z" fill="white"/>
<path d="M120.311 9.27841V29.642H117.338V9.27841H120.311Z" fill="white"/>
<path d="M130.744 29.9503C129.312 29.9503 128.063 29.6222 126.996 28.9659C125.928 28.3097 125.1 27.3916 124.51 26.2116C123.92 25.0317 123.625 23.6529 123.625 22.0753C123.625 20.491 123.92 19.1056 124.51 17.919C125.1 16.7325 125.928 15.8111 126.996 15.1548C128.063 14.4986 129.312 14.1705 130.744 14.1705C132.176 14.1705 133.426 14.4986 134.493 15.1548C135.56 15.8111 136.389 16.7325 136.979 17.919C137.569 19.1056 137.864 20.491 137.864 22.0753C137.864 23.6529 137.569 25.0317 136.979 26.2116C136.389 27.3916 135.56 28.3097 134.493 28.9659C133.426 29.6222 132.176 29.9503 130.744 29.9503ZM130.754 27.4545C131.682 27.4545 132.451 27.2093 133.061 26.7188C133.671 26.2282 134.122 25.5753 134.413 24.7599C134.712 23.9446 134.861 23.0464 134.861 22.0653C134.861 21.0909 134.712 20.196 134.413 19.3807C134.122 18.5587 133.671 17.8991 133.061 17.402C132.451 16.9048 131.682 16.6562 130.754 16.6562C129.82 16.6562 129.044 16.9048 128.428 17.402C127.818 17.8991 127.364 18.5587 127.065 19.3807C126.774 20.196 126.628 21.0909 126.628 22.0653C126.628 23.0464 126.774 23.9446 127.065 24.7599C127.364 25.5753 127.818 26.2282 128.428 26.7188C129.044 27.2093 129.82 27.4545 130.754 27.4545Z" fill="white"/>
<path d="M150.857 23.3082V14.3693H153.84V29.642H150.917V26.9972H150.757C150.406 27.8125 149.843 28.492 149.067 29.0355C148.298 29.5724 147.34 29.8409 146.194 29.8409C145.212 29.8409 144.344 29.6255 143.588 29.1946C142.839 28.7571 142.249 28.1108 141.819 27.2557C141.394 26.4006 141.182 25.3433 141.182 24.0838V14.3693H144.155V23.7259C144.155 24.7666 144.444 25.5952 145.02 26.2116C145.597 26.8281 146.346 27.1364 147.267 27.1364C147.824 27.1364 148.378 26.9972 148.928 26.7188C149.485 26.4403 149.945 26.0194 150.31 25.456C150.681 24.8925 150.863 24.1766 150.857 23.3082Z" fill="white"/>
<path d="M163.552 29.9403C162.319 29.9403 161.218 29.6255 160.251 28.9957C159.29 28.3594 158.534 27.4545 157.984 26.2812C157.44 25.1013 157.168 23.6861 157.168 22.0355C157.168 20.3849 157.443 18.973 157.994 17.7997C158.55 16.6264 159.313 15.7282 160.281 15.1051C161.248 14.482 162.345 14.1705 163.572 14.1705C164.52 14.1705 165.282 14.3295 165.859 14.6477C166.442 14.9593 166.893 15.3239 167.211 15.7415C167.536 16.1591 167.788 16.527 167.967 16.8452H168.146V9.27841H171.119V29.642H168.215V27.2656H167.967C167.788 27.5904 167.529 27.9616 167.191 28.3793C166.86 28.7969 166.402 29.1615 165.819 29.473C165.236 29.7846 164.48 29.9403 163.552 29.9403ZM164.208 27.4048C165.063 27.4048 165.786 27.1795 166.376 26.7287C166.972 26.2713 167.423 25.6383 167.728 24.8295C168.04 24.0208 168.195 23.0795 168.195 22.0057C168.195 20.9451 168.043 20.017 167.738 19.2216C167.433 18.4261 166.986 17.8063 166.396 17.3622C165.806 16.9181 165.076 16.696 164.208 16.696C163.313 16.696 162.567 16.928 161.971 17.392C161.374 17.8561 160.924 18.4891 160.619 19.2912C160.32 20.0933 160.171 20.9981 160.171 22.0057C160.171 23.0265 160.324 23.9446 160.629 24.7599C160.933 25.5753 161.384 26.2216 161.981 26.6989C162.584 27.1695 163.326 27.4048 164.208 27.4048Z" fill="white"/>
<path d="M36.7916 10.5417V6.16669C36.7916 3.75169 34.8316 1.79169 32.4166 1.79169H6.16663C3.75163 1.79169 1.79163 3.75169 1.79163 6.16669V32.4167C1.79163 34.8317 3.75163 36.7917 6.16663 36.7917H10.5416M36.7916 10.5417C31.9616 10.5417 28.0416 14.4617 28.0416 19.2917C28.0416 24.1217 24.1216 28.0417 19.2916 28.0417C14.4616 28.0417 10.5416 31.9617 10.5416 36.7917M36.7916 10.5417V32.2841C36.7916 34.7723 34.7722 36.7917 32.2841 36.7917L10.5416 36.7917" stroke="white" stroke-width="3"/>
</g>
<defs>
<clipPath id="clip0_403_2">
<rect width="172" height="39" fill="white" transform="matrix(-1 0 0 1 172 0)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

@@ -0,0 +1,10 @@
<svg width="344" height="221" viewBox="0 0 344 221" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M43.3535 191.192C40.8271 191.192 38.5414 190.639 36.4963 189.532C34.4752 188.401 32.8872 186.861 31.7323 184.912C30.5774 182.939 30 180.726 30 178.272C30 175.818 30.5774 173.616 31.7323 171.667C32.8872 169.694 34.4872 168.154 36.5324 167.048C38.5775 165.917 40.8632 165.351 43.3896 165.351C45.3625 165.351 47.167 165.688 48.8031 166.362C50.4392 167.011 51.8347 167.986 52.9896 169.285L50.6437 171.559C48.743 169.562 46.373 168.563 43.5339 168.563C41.6572 168.563 39.961 168.984 38.4452 169.827C36.9294 170.669 35.7384 171.836 34.8722 173.327C34.0301 174.795 33.609 176.443 33.609 178.272C33.609 180.1 34.0301 181.76 34.8722 183.252C35.7384 184.72 36.9294 185.875 38.4452 186.717C39.961 187.559 41.6572 187.98 43.5339 187.98C46.349 187.98 48.7189 186.969 50.6437 184.948L52.9896 187.222C51.8347 188.521 50.4272 189.508 48.767 190.182C47.1309 190.855 45.3264 191.192 43.3535 191.192Z" fill="#143055"/>
<path d="M85.9766 191.192C83.4262 191.192 81.1284 190.639 79.0833 189.532C77.0382 188.401 75.4261 186.849 74.2472 184.876C73.0923 182.903 72.5148 180.702 72.5148 178.272C72.5148 175.842 73.0923 173.64 74.2472 171.667C75.4261 169.694 77.0382 168.154 79.0833 167.048C81.1284 165.917 83.4262 165.351 85.9766 165.351C88.5029 165.351 90.7886 165.917 92.8338 167.048C94.8789 168.154 96.4789 169.694 97.6338 171.667C98.7887 173.616 99.3661 175.818 99.3661 178.272C99.3661 180.726 98.7887 182.939 97.6338 184.912C96.4789 186.861 94.8789 188.401 92.8338 189.532C90.7886 190.639 88.5029 191.192 85.9766 191.192ZM85.9766 187.98C87.8292 187.98 89.4894 187.559 90.957 186.717C92.4488 185.875 93.6157 184.72 94.4578 183.252C95.324 181.76 95.7571 180.1 95.7571 178.272C95.7571 176.443 95.324 174.795 94.4578 173.327C93.6157 171.836 92.4488 170.669 90.957 169.827C89.4894 168.984 87.8292 168.563 85.9766 168.563C84.1239 168.563 82.4397 168.984 80.9239 169.827C79.4322 170.669 78.2532 171.836 77.387 173.327C76.5449 174.795 76.1239 176.443 76.1239 178.272C76.1239 180.1 76.5449 181.76 77.387 183.252C78.2532 184.72 79.4322 185.875 80.9239 186.717C82.4397 187.559 84.1239 187.98 85.9766 187.98Z" fill="#143055"/>
<path d="M143.571 165.64V190.903H140.612L125.454 172.064V190.903H121.845V165.64H124.804L139.962 184.479V165.64H143.571Z" fill="#143055"/>
<path d="M175.458 191.192C173.557 191.192 171.717 190.903 169.936 190.326C168.18 189.724 166.796 188.954 165.786 188.016L167.121 185.201C168.084 186.067 169.311 186.777 170.802 187.33C172.318 187.86 173.87 188.124 175.458 188.124C177.551 188.124 179.115 187.776 180.15 187.078C181.184 186.356 181.702 185.406 181.702 184.227C181.702 183.36 181.413 182.663 180.836 182.133C180.282 181.58 179.584 181.159 178.742 180.87C177.924 180.581 176.757 180.257 175.241 179.896C173.341 179.439 171.801 178.981 170.622 178.524C169.467 178.067 168.469 177.369 167.626 176.431C166.808 175.469 166.399 174.181 166.399 172.569C166.399 171.222 166.748 170.007 167.446 168.924C168.168 167.842 169.25 166.975 170.694 166.326C172.138 165.676 173.93 165.351 176.072 165.351C177.563 165.351 179.031 165.544 180.475 165.929C181.918 166.314 183.157 166.867 184.192 167.589L183.001 170.476C181.942 169.802 180.811 169.297 179.608 168.96C178.405 168.599 177.226 168.419 176.072 168.419C174.026 168.419 172.487 168.792 171.452 169.538C170.441 170.284 169.936 171.246 169.936 172.425C169.936 173.291 170.225 174.001 170.802 174.554C171.38 175.084 172.09 175.505 172.932 175.818C173.798 176.106 174.965 176.419 176.432 176.756C178.333 177.213 179.861 177.67 181.016 178.127C182.171 178.584 183.157 179.282 183.975 180.221C184.817 181.159 185.239 182.422 185.239 184.01C185.239 185.333 184.878 186.548 184.156 187.655C183.434 188.738 182.339 189.604 180.872 190.254C179.404 190.879 177.599 191.192 175.458 191.192Z" fill="#143055"/>
<path d="M218.878 191.192C216.328 191.192 214.03 190.639 211.985 189.532C209.94 188.401 208.328 186.849 207.149 184.876C205.994 182.903 205.416 180.702 205.416 178.272C205.416 175.842 205.994 173.64 207.149 171.667C208.328 169.694 209.94 168.154 211.985 167.048C214.03 165.917 216.328 165.351 218.878 165.351C221.405 165.351 223.69 165.917 225.735 167.048C227.781 168.154 229.381 169.694 230.535 171.667C231.69 173.616 232.268 175.818 232.268 178.272C232.268 180.726 231.69 182.939 230.535 184.912C229.381 186.861 227.781 188.401 225.735 189.532C223.69 190.639 221.405 191.192 218.878 191.192ZM218.878 187.98C220.731 187.98 222.391 187.559 223.859 186.717C225.35 185.875 226.517 184.72 227.359 183.252C228.226 181.76 228.659 180.1 228.659 178.272C228.659 176.443 228.226 174.795 227.359 173.327C226.517 171.836 225.35 170.669 223.859 169.827C222.391 168.984 220.731 168.563 218.878 168.563C217.026 168.563 215.341 168.984 213.826 169.827C212.334 170.669 211.155 171.836 210.289 173.327C209.447 174.795 209.026 176.443 209.026 178.272C209.026 180.1 209.447 181.76 210.289 183.252C211.155 184.72 212.334 185.875 213.826 186.717C215.341 187.559 217.026 187.98 218.878 187.98Z" fill="#143055"/>
<path d="M254.747 165.64H258.356V187.763H272.034V190.903H254.747V165.64Z" fill="#143055"/>
<path d="M311.472 187.763V190.903H293.138V165.64H310.966V168.78H296.747V176.539H309.414V179.607H296.747V187.763H311.472Z" fill="#143055"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.4936 30H30.2225V127.745H59.4859V79.9321L99.0949 127.745H123.366V30H94.1026V77.8129L54.4936 30ZM33.2301 124.737V33.0075H53.0796L97.1102 86.1577V33.0075H120.358V124.737H100.509L56.4783 71.5873V124.737H33.2301ZM153.172 30H186.673L220.749 78.3213L186.683 127.745H151.648L187.249 78.3219L153.172 30ZM158.973 33.0075L190.942 78.3404L157.521 124.737H185.103L217.083 78.341L185.113 33.0075H158.973ZM243.307 108.196H313.984V127.745H243.307V108.196ZM246.314 111.204V124.737H310.976V111.204H246.314Z" fill="#143055"/>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@@ -0,0 +1,10 @@
<svg width="344" height="221" viewBox="0 0 344 221" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M43.3535 191.192C40.8271 191.192 38.5414 190.639 36.4963 189.532C34.4752 188.401 32.8872 186.861 31.7323 184.912C30.5774 182.939 30 180.726 30 178.272C30 175.818 30.5774 173.616 31.7323 171.667C32.8872 169.694 34.4872 168.154 36.5324 167.048C38.5775 165.917 40.8632 165.351 43.3896 165.351C45.3625 165.351 47.167 165.688 48.8031 166.362C50.4392 167.011 51.8347 167.986 52.9896 169.285L50.6437 171.559C48.743 169.562 46.373 168.563 43.5339 168.563C41.6572 168.563 39.961 168.984 38.4452 169.827C36.9294 170.669 35.7384 171.836 34.8722 173.327C34.0301 174.795 33.609 176.443 33.609 178.272C33.609 180.1 34.0301 181.76 34.8722 183.252C35.7384 184.72 36.9294 185.875 38.4452 186.717C39.961 187.559 41.6572 187.98 43.5339 187.98C46.349 187.98 48.7189 186.969 50.6437 184.948L52.9896 187.222C51.8347 188.521 50.4272 189.508 48.767 190.182C47.1309 190.855 45.3264 191.192 43.3535 191.192Z" fill="white"/>
<path d="M85.9766 191.192C83.4262 191.192 81.1284 190.639 79.0833 189.532C77.0382 188.401 75.4261 186.849 74.2472 184.876C73.0923 182.903 72.5148 180.702 72.5148 178.272C72.5148 175.842 73.0923 173.64 74.2472 171.667C75.4261 169.694 77.0382 168.154 79.0833 167.048C81.1284 165.917 83.4262 165.351 85.9766 165.351C88.5029 165.351 90.7886 165.917 92.8338 167.048C94.8789 168.154 96.4789 169.694 97.6338 171.667C98.7887 173.616 99.3661 175.818 99.3661 178.272C99.3661 180.726 98.7887 182.939 97.6338 184.912C96.4789 186.861 94.8789 188.401 92.8338 189.532C90.7886 190.639 88.5029 191.192 85.9766 191.192ZM85.9766 187.98C87.8292 187.98 89.4894 187.559 90.957 186.717C92.4488 185.875 93.6157 184.72 94.4578 183.252C95.324 181.76 95.7571 180.1 95.7571 178.272C95.7571 176.443 95.324 174.795 94.4578 173.327C93.6157 171.836 92.4488 170.669 90.957 169.827C89.4894 168.984 87.8292 168.563 85.9766 168.563C84.1239 168.563 82.4397 168.984 80.9239 169.827C79.4322 170.669 78.2532 171.836 77.387 173.327C76.5449 174.795 76.1239 176.443 76.1239 178.272C76.1239 180.1 76.5449 181.76 77.387 183.252C78.2532 184.72 79.4322 185.875 80.9239 186.717C82.4397 187.559 84.1239 187.98 85.9766 187.98Z" fill="white"/>
<path d="M143.571 165.64V190.903H140.612L125.454 172.064V190.903H121.845V165.64H124.804L139.962 184.479V165.64H143.571Z" fill="white"/>
<path d="M175.458 191.192C173.557 191.192 171.717 190.903 169.936 190.326C168.18 189.724 166.796 188.954 165.786 188.016L167.121 185.201C168.084 186.067 169.311 186.777 170.802 187.33C172.318 187.86 173.87 188.124 175.458 188.124C177.551 188.124 179.115 187.776 180.15 187.078C181.184 186.356 181.702 185.406 181.702 184.227C181.702 183.36 181.413 182.663 180.836 182.133C180.282 181.58 179.584 181.159 178.742 180.87C177.924 180.581 176.757 180.257 175.241 179.896C173.341 179.439 171.801 178.981 170.622 178.524C169.467 178.067 168.469 177.369 167.626 176.431C166.808 175.469 166.399 174.181 166.399 172.569C166.399 171.222 166.748 170.007 167.446 168.924C168.168 167.842 169.25 166.975 170.694 166.326C172.138 165.676 173.93 165.351 176.072 165.351C177.563 165.351 179.031 165.544 180.475 165.929C181.918 166.314 183.157 166.867 184.192 167.589L183.001 170.476C181.942 169.802 180.811 169.297 179.608 168.96C178.405 168.599 177.226 168.419 176.072 168.419C174.026 168.419 172.487 168.792 171.452 169.538C170.441 170.284 169.936 171.246 169.936 172.425C169.936 173.291 170.225 174.001 170.802 174.554C171.38 175.084 172.09 175.505 172.932 175.818C173.798 176.106 174.965 176.419 176.432 176.756C178.333 177.213 179.861 177.67 181.016 178.127C182.171 178.584 183.157 179.282 183.975 180.221C184.817 181.159 185.239 182.422 185.239 184.01C185.239 185.333 184.878 186.548 184.156 187.655C183.434 188.738 182.339 189.604 180.872 190.254C179.404 190.879 177.599 191.192 175.458 191.192Z" fill="white"/>
<path d="M218.878 191.192C216.328 191.192 214.03 190.639 211.985 189.532C209.94 188.401 208.328 186.849 207.149 184.876C205.994 182.903 205.416 180.702 205.416 178.272C205.416 175.842 205.994 173.64 207.149 171.667C208.328 169.694 209.94 168.154 211.985 167.048C214.03 165.917 216.328 165.351 218.878 165.351C221.405 165.351 223.69 165.917 225.735 167.048C227.781 168.154 229.381 169.694 230.535 171.667C231.69 173.616 232.268 175.818 232.268 178.272C232.268 180.726 231.69 182.939 230.535 184.912C229.381 186.861 227.781 188.401 225.735 189.532C223.69 190.639 221.405 191.192 218.878 191.192ZM218.878 187.98C220.731 187.98 222.391 187.559 223.859 186.717C225.35 185.875 226.517 184.72 227.359 183.252C228.226 181.76 228.659 180.1 228.659 178.272C228.659 176.443 228.226 174.795 227.359 173.327C226.517 171.836 225.35 170.669 223.859 169.827C222.391 168.984 220.731 168.563 218.878 168.563C217.026 168.563 215.341 168.984 213.826 169.827C212.334 170.669 211.155 171.836 210.289 173.327C209.447 174.795 209.026 176.443 209.026 178.272C209.026 180.1 209.447 181.76 210.289 183.252C211.155 184.72 212.334 185.875 213.826 186.717C215.341 187.559 217.026 187.98 218.878 187.98Z" fill="white"/>
<path d="M254.747 165.64H258.356V187.763H272.034V190.903H254.747V165.64Z" fill="white"/>
<path d="M311.472 187.763V190.903H293.138V165.64H310.966V168.78H296.747V176.539H309.414V179.607H296.747V187.763H311.472Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.4937 30H30.2227V127.745H59.486V79.9321L99.095 127.745H123.366V30H94.1028V77.8129L54.4937 30ZM33.2302 124.737V33.0075H53.0797L97.1103 86.1577V33.0075H120.359V124.737H100.509L56.4785 71.5873V124.737H33.2302ZM153.173 30H186.673L220.749 78.3213L186.683 127.745H151.648L187.249 78.3219L153.173 30ZM158.974 33.0075L190.942 78.3404L157.521 124.737H185.103L217.083 78.341L185.114 33.0075H158.974ZM243.307 108.196H313.984V127.745H243.307V108.196ZM246.314 111.204V124.737H310.976V111.204H246.314Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

@@ -0,0 +1,10 @@
<svg width="536" height="97" viewBox="0 0 536 97" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M40.9208 30H30V66.6005H43.5953V53.8792L54.1338 66.6005H65.0547V30H51.4593V42.7212L40.9208 30ZM93.7248 30H77.8642L90.6309 48.1037L77.307 66.6005H93.7411L106.491 48.1028L93.7248 30ZM32.8504 63.7501V32.8504H39.5807L54.3097 50.6301V32.8504H62.2043V63.7501H55.4739L40.7449 45.9704V63.7501H32.8504ZM94.1312 48.1212L83.3622 32.8504H92.2471L103.016 48.1214L92.2439 63.7501H82.8731L94.1312 48.1212ZM142 56.2685H114.492V66.6005H142V56.2685ZM117.343 63.7501V59.1189H139.15V63.7501H117.343Z" fill="#143055"/>
<path d="M186.568 67.2486C182.943 67.2486 179.664 66.4546 176.729 64.8665C173.829 63.2439 171.551 61.0345 169.894 58.2381C168.237 55.4072 167.408 52.2311 167.408 48.7097C167.408 45.1883 168.237 42.0295 169.894 39.2331C171.551 36.4022 173.847 34.1927 176.781 32.6047C179.715 30.9821 182.995 30.1708 186.62 30.1708C189.451 30.1708 192.04 30.6541 194.388 31.6207C196.735 32.5529 198.738 33.9511 200.395 35.8153L197.029 39.0777C194.301 36.2123 190.901 34.7796 186.827 34.7796C184.134 34.7796 181.701 35.3838 179.526 36.5921C177.351 37.8004 175.642 39.4748 174.399 41.6152C173.191 43.7211 172.586 46.0859 172.586 48.7097C172.586 51.3335 173.191 53.7156 174.399 55.856C175.642 57.9619 177.351 59.619 179.526 60.8273C181.701 62.0356 184.134 62.6398 186.827 62.6398C190.866 62.6398 194.267 61.1898 197.029 58.2899L200.395 61.5523C198.738 63.4166 196.718 64.832 194.336 65.7987C191.988 66.7653 189.399 67.2486 186.568 67.2486Z" fill="#143055"/>
<path d="M236.852 67.2486C233.192 67.2486 229.895 66.4546 226.961 64.8665C224.026 63.2439 221.713 61.0172 220.022 58.1863C218.365 55.3554 217.536 52.1965 217.536 48.7097C217.536 45.2229 218.365 42.064 220.022 39.2331C221.713 36.4022 224.026 34.1927 226.961 32.6047C229.895 30.9821 233.192 30.1708 236.852 30.1708C240.477 30.1708 243.756 30.9821 246.691 32.6047C249.625 34.1927 251.921 36.4022 253.578 39.2331C255.235 42.0295 256.064 45.1883 256.064 48.7097C256.064 52.2311 255.235 55.4072 253.578 58.2381C251.921 61.0345 249.625 63.2439 246.691 64.8665C243.756 66.4546 240.477 67.2486 236.852 67.2486ZM236.852 62.6398C239.51 62.6398 241.892 62.0356 243.998 60.8273C246.138 59.619 247.813 57.9619 249.021 55.856C250.264 53.7156 250.885 51.3335 250.885 48.7097C250.885 46.0859 250.264 43.7211 249.021 41.6152C247.813 39.4748 246.138 37.8004 243.998 36.5921C241.892 35.3838 239.51 34.7796 236.852 34.7796C234.193 34.7796 231.777 35.3838 229.602 36.5921C227.461 37.8004 225.77 39.4748 224.527 41.6152C223.319 43.7211 222.714 46.0859 222.714 48.7097C222.714 51.3335 223.319 53.7156 224.527 55.856C225.77 57.9619 227.461 59.619 229.602 60.8273C231.777 62.0356 234.193 62.6398 236.852 62.6398Z" fill="#143055"/>
<path d="M308.617 30.5851V66.8344H304.371L282.621 39.8027V66.8344H277.443V30.5851H281.689L303.439 57.6167V30.5851H308.617Z" fill="#143055"/>
<path d="M343.495 67.2486C340.768 67.2486 338.127 66.8344 335.572 66.0058C333.052 65.1427 331.067 64.038 329.617 62.6916L331.533 58.6524C332.914 59.8952 334.675 60.9136 336.815 61.7077C338.99 62.4672 341.217 62.8469 343.495 62.8469C346.499 62.8469 348.743 62.3463 350.227 61.3452C351.712 60.3095 352.454 58.9458 352.454 57.2542C352.454 56.0113 352.04 55.0102 351.211 54.2507C350.417 53.4566 349.416 52.8525 348.208 52.4382C347.034 52.0239 345.36 51.5579 343.185 51.04C340.457 50.3841 338.248 49.7281 336.556 49.0722C334.899 48.4163 333.466 47.4151 332.258 46.0687C331.084 44.6878 330.497 42.8408 330.497 40.5277C330.497 38.5944 330.998 36.851 331.999 35.2975C333.035 33.7439 334.588 32.5011 336.66 31.569C338.731 30.6368 341.303 30.1708 344.376 30.1708C346.516 30.1708 348.622 30.447 350.693 30.9993C352.765 31.5517 354.543 32.3457 356.027 33.3814L354.318 37.5242C352.799 36.5576 351.177 35.8326 349.451 35.3492C347.724 34.8314 346.033 34.5725 344.376 34.5725C341.441 34.5725 339.232 35.1076 337.747 36.1778C336.297 37.248 335.572 38.6289 335.572 40.3206C335.572 41.5634 335.987 42.5818 336.815 43.3759C337.644 44.1354 338.662 44.7395 339.87 45.1883C341.113 45.6026 342.788 46.0514 344.894 46.5347C347.621 47.1907 349.813 47.8466 351.47 48.5026C353.127 49.1585 354.543 50.1597 355.717 51.5061C356.925 52.8525 357.529 54.6649 357.529 56.9435C357.529 58.8422 357.011 60.5857 355.976 62.1737C354.94 63.7273 353.369 64.9701 351.263 65.9022C349.157 66.7998 346.568 67.2486 343.495 67.2486Z" fill="#143055"/>
<path d="M394.922 67.2486C391.263 67.2486 387.966 66.4546 385.032 64.8665C382.097 63.2439 379.784 61.0172 378.092 58.1863C376.435 55.3554 375.607 52.1965 375.607 48.7097C375.607 45.2229 376.435 42.064 378.092 39.2331C379.784 36.4022 382.097 34.1927 385.032 32.6047C387.966 30.9821 391.263 30.1708 394.922 30.1708C398.547 30.1708 401.827 30.9821 404.762 32.6047C407.696 34.1927 409.992 36.4022 411.649 39.2331C413.306 42.0295 414.135 45.1883 414.135 48.7097C414.135 52.2311 413.306 55.4072 411.649 58.2381C409.992 61.0345 407.696 63.2439 404.762 64.8665C401.827 66.4546 398.547 67.2486 394.922 67.2486ZM394.922 62.6398C397.581 62.6398 399.963 62.0356 402.069 60.8273C404.209 59.619 405.884 57.9619 407.092 55.856C408.335 53.7156 408.956 51.3335 408.956 48.7097C408.956 46.0859 408.335 43.7211 407.092 41.6152C405.884 39.4748 404.209 37.8004 402.069 36.5921C399.963 35.3838 397.581 34.7796 394.922 34.7796C392.264 34.7796 389.848 35.3838 387.673 36.5921C385.532 37.8004 383.841 39.4748 382.598 41.6152C381.389 43.7211 380.785 46.0859 380.785 48.7097C380.785 51.3335 381.389 53.7156 382.598 55.856C383.841 57.9619 385.532 59.619 387.673 60.8273C389.848 62.0356 392.264 62.6398 394.922 62.6398Z" fill="#143055"/>
<path d="M435.514 30.5851H440.692V62.3291H460.318V66.8344H435.514V30.5851Z" fill="#143055"/>
<path d="M506.031 62.3291V66.8344H479.725V30.5851H505.306V35.0903H484.903V46.224H503.08V50.6257H484.903V62.3291H506.031Z" fill="#143055"/>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,10 @@
<svg width="536" height="97" viewBox="0 0 536 97" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M40.9208 30H30V66.6005H43.5953V53.8792L54.1338 66.6005H65.0547V30H51.4593V42.7212L40.9208 30ZM93.7248 30H77.8642L90.6309 48.1037L77.307 66.6005H93.7411L106.491 48.1028L93.7248 30ZM32.8504 63.7501V32.8504H39.5807L54.3097 50.6301V32.8504H62.2043V63.7501H55.4739L40.7449 45.9704V63.7501H32.8504ZM94.1312 48.1212L83.3622 32.8504H92.2471L103.016 48.1214L92.2439 63.7501H82.8731L94.1312 48.1212ZM142 56.2685H114.492V66.6005H142V56.2685ZM117.343 63.7501V59.1189H139.15V63.7501H117.343Z" fill="white"/>
<path d="M186.568 67.2486C182.943 67.2486 179.664 66.4546 176.729 64.8665C173.829 63.2439 171.551 61.0345 169.894 58.2381C168.237 55.4072 167.408 52.2311 167.408 48.7097C167.408 45.1883 168.237 42.0295 169.894 39.2331C171.551 36.4022 173.847 34.1927 176.781 32.6047C179.715 30.9821 182.995 30.1708 186.62 30.1708C189.451 30.1708 192.04 30.6541 194.388 31.6207C196.735 32.5529 198.738 33.9511 200.395 35.8153L197.029 39.0777C194.301 36.2123 190.901 34.7796 186.827 34.7796C184.134 34.7796 181.701 35.3838 179.526 36.5921C177.351 37.8004 175.642 39.4748 174.399 41.6152C173.191 43.7211 172.586 46.0859 172.586 48.7097C172.586 51.3335 173.191 53.7156 174.399 55.856C175.642 57.9619 177.351 59.619 179.526 60.8273C181.701 62.0356 184.134 62.6398 186.827 62.6398C190.866 62.6398 194.267 61.1898 197.029 58.2899L200.395 61.5523C198.738 63.4166 196.718 64.832 194.336 65.7987C191.988 66.7653 189.399 67.2486 186.568 67.2486Z" fill="white"/>
<path d="M236.852 67.2486C233.192 67.2486 229.895 66.4546 226.961 64.8665C224.026 63.2439 221.713 61.0172 220.022 58.1863C218.365 55.3554 217.536 52.1965 217.536 48.7097C217.536 45.2229 218.365 42.064 220.022 39.2331C221.713 36.4022 224.026 34.1927 226.961 32.6047C229.895 30.9821 233.192 30.1708 236.852 30.1708C240.477 30.1708 243.756 30.9821 246.691 32.6047C249.625 34.1927 251.921 36.4022 253.578 39.2331C255.235 42.0295 256.064 45.1883 256.064 48.7097C256.064 52.2311 255.235 55.4072 253.578 58.2381C251.921 61.0345 249.625 63.2439 246.691 64.8665C243.756 66.4546 240.477 67.2486 236.852 67.2486ZM236.852 62.6398C239.51 62.6398 241.892 62.0356 243.998 60.8273C246.138 59.619 247.813 57.9619 249.021 55.856C250.264 53.7156 250.885 51.3335 250.885 48.7097C250.885 46.0859 250.264 43.7211 249.021 41.6152C247.813 39.4748 246.138 37.8004 243.998 36.5921C241.892 35.3838 239.51 34.7796 236.852 34.7796C234.193 34.7796 231.777 35.3838 229.602 36.5921C227.461 37.8004 225.77 39.4748 224.527 41.6152C223.319 43.7211 222.714 46.0859 222.714 48.7097C222.714 51.3335 223.319 53.7156 224.527 55.856C225.77 57.9619 227.461 59.619 229.602 60.8273C231.777 62.0356 234.193 62.6398 236.852 62.6398Z" fill="white"/>
<path d="M308.617 30.5851V66.8344H304.371L282.621 39.8027V66.8344H277.443V30.5851H281.689L303.439 57.6167V30.5851H308.617Z" fill="white"/>
<path d="M343.495 67.2486C340.768 67.2486 338.127 66.8344 335.572 66.0058C333.052 65.1427 331.067 64.038 329.617 62.6916L331.533 58.6524C332.914 59.8952 334.675 60.9136 336.815 61.7077C338.99 62.4672 341.217 62.8469 343.495 62.8469C346.499 62.8469 348.743 62.3463 350.227 61.3452C351.712 60.3095 352.454 58.9458 352.454 57.2542C352.454 56.0113 352.04 55.0102 351.211 54.2507C350.417 53.4566 349.416 52.8525 348.208 52.4382C347.034 52.0239 345.36 51.5579 343.185 51.04C340.457 50.3841 338.248 49.7281 336.556 49.0722C334.899 48.4163 333.466 47.4151 332.258 46.0687C331.084 44.6878 330.497 42.8408 330.497 40.5277C330.497 38.5944 330.998 36.851 331.999 35.2975C333.035 33.7439 334.588 32.5011 336.66 31.569C338.731 30.6368 341.303 30.1708 344.376 30.1708C346.516 30.1708 348.622 30.447 350.693 30.9993C352.765 31.5517 354.543 32.3457 356.027 33.3814L354.318 37.5242C352.799 36.5576 351.177 35.8326 349.451 35.3492C347.724 34.8314 346.033 34.5725 344.376 34.5725C341.441 34.5725 339.232 35.1076 337.747 36.1778C336.297 37.248 335.572 38.6289 335.572 40.3206C335.572 41.5634 335.987 42.5818 336.815 43.3759C337.644 44.1354 338.662 44.7395 339.87 45.1883C341.113 45.6026 342.788 46.0514 344.894 46.5347C347.621 47.1907 349.813 47.8466 351.47 48.5026C353.127 49.1585 354.543 50.1597 355.717 51.5061C356.925 52.8525 357.529 54.6649 357.529 56.9435C357.529 58.8422 357.011 60.5857 355.976 62.1737C354.94 63.7273 353.369 64.9701 351.263 65.9022C349.157 66.7998 346.568 67.2486 343.495 67.2486Z" fill="white"/>
<path d="M394.922 67.2486C391.263 67.2486 387.966 66.4546 385.032 64.8665C382.097 63.2439 379.784 61.0172 378.092 58.1863C376.435 55.3554 375.607 52.1965 375.607 48.7097C375.607 45.2229 376.435 42.064 378.092 39.2331C379.784 36.4022 382.097 34.1927 385.032 32.6047C387.966 30.9821 391.263 30.1708 394.922 30.1708C398.547 30.1708 401.827 30.9821 404.762 32.6047C407.696 34.1927 409.992 36.4022 411.649 39.2331C413.306 42.0295 414.135 45.1883 414.135 48.7097C414.135 52.2311 413.306 55.4072 411.649 58.2381C409.992 61.0345 407.696 63.2439 404.762 64.8665C401.827 66.4546 398.547 67.2486 394.922 67.2486ZM394.922 62.6398C397.581 62.6398 399.963 62.0356 402.069 60.8273C404.209 59.619 405.884 57.9619 407.092 55.856C408.335 53.7156 408.956 51.3335 408.956 48.7097C408.956 46.0859 408.335 43.7211 407.092 41.6152C405.884 39.4748 404.209 37.8004 402.069 36.5921C399.963 35.3838 397.581 34.7796 394.922 34.7796C392.264 34.7796 389.848 35.3838 387.673 36.5921C385.532 37.8004 383.841 39.4748 382.598 41.6152C381.389 43.7211 380.785 46.0859 380.785 48.7097C380.785 51.3335 381.389 53.7156 382.598 55.856C383.841 57.9619 385.532 59.619 387.673 60.8273C389.848 62.0356 392.264 62.6398 394.922 62.6398Z" fill="white"/>
<path d="M435.514 30.5851H440.692V62.3291H460.318V66.8344H435.514V30.5851Z" fill="white"/>
<path d="M506.031 62.3291V66.8344H479.725V30.5851H505.306V35.0903H484.903V46.224H503.08V50.6257H484.903V62.3291H506.031Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M499.651 555.512L416.132 686.623L277.653 462.192L277.333 697.143H180V300H278.426L418.345 535.244L418.479 428.768L499.651 555.512V555.512ZM515.678 402.082C516.318 400.804 515.678 301.305 515.891 300H418.559C418.612 301.571 418.425 400.564 418.479 402.082H515.678V402.082ZM665.917 512.181C654.556 511.963 643.406 515.267 634.003 521.639C624.6 528.011 617.406 537.137 613.411 547.762C620.029 537.871 629.827 530.531 641.187 526.953C652.546 523.374 664.788 523.772 675.89 528.08C686.45 532.368 700.344 539.319 711.357 535.617C706.19 528.388 699.374 522.491 691.472 518.416C683.57 514.34 674.81 512.203 665.917 512.181V512.181ZM756.316 540.438C746.317 536.976 734.983 533.061 726.743 522.301C725.143 520.17 723.65 517.774 722.05 515.244C718.48 508.669 713.651 502.86 707.837 498.145C699.997 492.393 689.704 489.57 676.37 489.57C663.264 489.573 650.454 493.463 639.563 500.745C628.673 508.028 620.193 518.376 615.197 530.477C621.53 521.672 630.067 514.682 639.954 510.206C649.84 505.73 660.73 503.925 671.535 504.971C682.339 506.017 692.679 509.878 701.52 516.168C710.362 522.457 717.395 530.955 721.917 540.811C724.168 544.503 727.558 547.366 731.578 548.97C735.598 550.574 740.031 550.832 744.21 549.706C757.357 546.909 756.476 559.294 776.29 563.501V559.959C776.21 548.081 769.73 545.312 756.29 540.438H756.316ZM810.289 574.154C813.196 572.389 815.582 569.887 817.207 566.903C818.833 563.919 819.638 560.559 819.543 557.163C819.276 478.411 755.277 411.031 676.344 411.031C652.616 411.011 629.257 416.887 608.369 428.129C587.482 439.37 569.722 455.625 556.691 475.428C556.424 474.736 516.105 411.776 515.678 411.031H418.479L510.825 555.458L420.719 697.143H515.118L556.184 634.131L597.997 697.143H692.424L606.824 562.596C605.406 559.975 604.638 557.052 604.584 554.074C604.581 544.663 606.433 535.344 610.037 526.649C613.64 517.955 618.923 510.054 625.585 503.398C632.246 496.743 640.155 491.464 648.86 487.862C657.565 484.26 666.895 482.406 676.317 482.406H676.344C716.023 482.406 722.637 506.109 731.197 517.241C748.103 539.239 781.863 529.598 781.863 558.282C781.924 561.571 782.846 564.788 784.539 567.611C786.233 570.434 788.637 572.764 791.513 574.37C794.388 575.976 797.635 576.801 800.93 576.763C804.224 576.725 807.451 575.826 810.289 574.154V574.154ZM819.623 577.697C815.009 587.604 804.69 586.698 799.49 594.715C794.796 601.932 802.53 605.687 802.53 605.687C802.53 605.687 811.516 609.842 816.876 597.405C819.649 591.252 820.609 584.408 819.623 577.697V577.697Z" fill="#020617"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M499.651 555.512L416.132 686.623L277.653 462.192L277.333 697.143H180V300H278.426L418.345 535.244L418.479 428.768L499.651 555.512V555.512ZM515.678 402.082C516.318 400.804 515.678 301.305 515.891 300H418.559C418.612 301.571 418.425 400.564 418.479 402.082H515.678V402.082ZM665.917 512.181C654.556 511.963 643.406 515.267 634.003 521.639C624.6 528.011 617.406 537.137 613.411 547.762C620.029 537.871 629.827 530.531 641.187 526.952C652.546 523.374 664.788 523.772 675.89 528.08C686.45 532.368 700.344 539.319 711.357 535.617C706.19 528.388 699.374 522.491 691.472 518.416C683.57 514.34 674.81 512.203 665.917 512.181V512.181ZM756.316 540.438C746.317 536.975 734.983 533.06 726.743 522.301C725.143 520.17 723.65 517.773 722.05 515.243C718.48 508.669 713.651 502.86 707.837 498.145C699.997 492.393 689.704 489.57 676.37 489.57C663.264 489.573 650.454 493.463 639.563 500.745C628.673 508.028 620.193 518.376 615.197 530.477C621.53 521.672 630.067 514.682 639.954 510.206C649.84 505.73 660.73 503.925 671.535 504.971C682.339 506.017 692.679 509.878 701.52 516.168C710.362 522.457 717.395 530.955 721.917 540.811C724.168 544.503 727.558 547.366 731.578 548.97C735.598 550.574 740.031 550.832 744.21 549.706C757.357 546.909 756.476 559.293 776.29 563.501V559.959C776.21 548.081 769.73 545.311 756.29 540.438H756.316ZM810.289 574.154C813.196 572.389 815.582 569.887 817.207 566.903C818.833 563.919 819.638 560.559 819.543 557.163C819.276 478.411 755.277 411.031 676.344 411.031C652.616 411.011 629.257 416.887 608.369 428.129C587.482 439.37 569.722 455.625 556.691 475.428C556.424 474.735 516.105 411.776 515.678 411.031H418.479L510.825 555.458L420.719 697.143H515.118L556.184 634.131L597.997 697.143H692.424L606.824 562.596C605.406 559.975 604.638 557.052 604.584 554.073C604.581 544.663 606.433 535.344 610.037 526.649C613.64 517.954 618.923 510.054 625.585 503.398C632.246 496.743 640.155 491.463 648.86 487.861C657.565 484.259 666.895 482.406 676.317 482.406H676.344C716.023 482.406 722.637 506.108 731.197 517.241C748.103 539.239 781.863 529.598 781.863 558.281C781.924 561.571 782.846 564.788 784.539 567.611C786.233 570.434 788.637 572.764 791.513 574.37C794.388 575.976 797.635 576.801 800.93 576.763C804.224 576.725 807.451 575.826 810.289 574.154V574.154ZM819.623 577.696C815.009 587.604 804.69 586.698 799.49 594.715C794.796 601.932 802.53 605.687 802.53 605.687C802.53 605.687 811.516 609.842 816.876 597.404C819.649 591.252 820.609 584.408 819.623 577.696V577.696Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

File diff suppressed because it is too large Load Diff
@@ -0,0 +1,64 @@
{
"projects": [
{
"name": "app1",
"type": "app",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
},
{
"name": "app2",
"type": "app",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
},
{
"name": "lib",
"type": "lib",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
}
],
"taskId": "lib:test",
"taskGraphs": {
"lib:test": {
"roots": ["app1:test", "app2:test", "lib:test"],
"tasks": {
"app1:test": {
"id": "app1:test",
"target": { "project": "app1", "target": "test" },
"projectRoot": "apps/app1",
"overrides": {}
},
"app2:test": {
"id": "app2:test",
"target": { "project": "app2", "target": "test" },
"projectRoot": "apps/app2",
"overrides": {}
},
"lib:test": {
"id": "lib:test",
"target": { "project": "lib", "target": "test" },
"projectRoot": "libs/lib",
"overrides": {}
}
},
"dependencies": {
"app1:test": ["lib:test"],
"app2:test": ["lib:test"]
}
}
}
}
@@ -0,0 +1,61 @@
{
"projects": [
{
"name": "app1",
"type": "app",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
},
{
"name": "app2",
"type": "app",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
},
{
"name": "lib",
"type": "lib",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
}
],
"taskId": "lib:test",
"taskGraphs": {
"lib:test": {
"roots": ["app1:test", "app2:test", "lib:test"],
"tasks": {
"app1:test": {
"id": "app1:test",
"target": { "project": "app1", "target": "test" },
"projectRoot": "apps/app1",
"overrides": {}
},
"app2:test": {
"id": "app2:test",
"target": { "project": "app2", "target": "test" },
"projectRoot": "apps/app2",
"overrides": {}
},
"lib:test": {
"id": "lib:test",
"target": { "project": "lib", "target": "test" },
"projectRoot": "libs/lib",
"overrides": {}
}
},
"dependencies": {}
}
}
}
File diff suppressed because it is too large Load Diff
+29
View File
@@ -0,0 +1,29 @@
{
"projects": [
{
"name": "lib",
"type": "lib",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
}
],
"taskId": "lib:test",
"taskGraphs": {
"lib:test": {
"roots": ["lib:test"],
"tasks": {
"lib:test": {
"id": "lib:test",
"target": { "project": "lib", "target": "test" },
"projectRoot": "libs/lib",
"overrides": {}
}
},
"dependencies": {}
}
}
}
@@ -0,0 +1,47 @@
{
"projects": [
{
"name": "app1",
"type": "app",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
},
{
"name": "app2",
"type": "app",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
},
{
"name": "lib",
"type": "lib",
"data": {
"tags": [],
"targets": {
"test": {}
}
}
}
],
"dependencies": {
"app1": [{ "source": "app1", "target": "lib", "type": "static" }],
"app2": [{ "source": "app2", "target": "lib", "type": "static" }],
"lib": []
},
"workspaceLayout": {
"appsDir": "apps",
"libsDir": "libs"
},
"affectedProjectIds": [],
"focus": null,
"groupByFolder": false,
"exclude": []
}
+5
View File
@@ -0,0 +1,5 @@
---
import { YouTube } from './youtube.component';
---
<YouTube {...Astro.props} />
+11
View File
@@ -0,0 +1,11 @@
import classNames from 'classnames';
import { twMerge } from 'tailwind-merge';
/**
* Small wrapper around classNames and twMerge
* It enables conditional and dynamic class usage,
* resolves duplications and conflicts for TailwindCSS
*/
export function cx(...inputs: classNames.ArgumentArray): string {
return twMerge(classNames(inputs));
}
@@ -0,0 +1,151 @@
import { PlayCircleIcon, PlayIcon } from '@heroicons/react/24/solid';
import { cx } from './utils/cx';
// TODO(caleb): this came from typedoc ui markdown impl in nx-dev
type Schema = any;
export const youtube: Schema = {
render: 'YouTube',
attributes: {
src: {
type: 'String',
required: true,
},
title: {
type: 'String',
required: true,
},
width: {
type: 'String',
default: '100%',
},
caption: {
// Added caption attribute here
type: 'String',
required: false, // Not required since it's optional
},
},
};
export function computeVideoID(youtubeURL: string): string | undefined {
let match;
// Check for 'https://www.youtube.com/embed/' format
match = youtubeURL.match(/youtube\.com\/embed\/([a-zA-Z0-9_-]+)/);
if (match && match[1]) {
return match[1];
}
// Check for 'https://www.youtube.com/watch?v=' format
match = youtubeURL.match(/youtube\.com\/watch\?v=([a-zA-Z0-9_-]+)/);
if (match && match[1]) {
return match[1];
}
match = youtubeURL.match(/youtube\.com\/live\/([a-zA-Z0-9_-]+)/);
if (match && match[1]) {
return match[1];
}
// Check for 'https://youtu.be/' format
match = youtubeURL.match(/youtu\.be\/([a-zA-Z0-9_-]+)/);
if (match && match[1]) {
return match[1];
}
return undefined;
}
export function computeThumbnailURL(youtubeURL: string) {
const videoID = computeVideoID(youtubeURL);
if (!videoID) {
throw new Error(
`Could not properly compute the thumbnail URL for ${youtubeURL}`
);
}
return `https://i.ytimg.com/vi_webp/${videoID}/maxresdefault.webp`;
}
export function computeWatchOnYoutubeURL(youtubeURL: string) {
const videoID = computeVideoID(youtubeURL);
if (!videoID) {
throw new Error(
`Could not properly compute the embed URL for ${youtubeURL}`
);
}
return 'https://www.youtube.com/watch?v=' + videoID;
}
export function computeEmbedURL(youtubeURL: string) {
const videoID = computeVideoID(youtubeURL);
if (!videoID) {
throw new Error(
`Could not properly compute the embed URL for ${youtubeURL}`
);
}
return 'https://www.youtube.com/embed/' + videoID;
}
const youtubeIcon = (
<svg
fill="currentColor"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
className="absolute left-1/2 top-1/2 h-12 w-12 -translate-x-1/2 -translate-y-1/2 transform"
>
<path d="M23.5 6.19a3.02 3.02 0 0 0-2.12-2.14c-1.88-.5-9.38-.5-9.38-.5s-7.5 0-9.38.5A3.02 3.02 0 0 0 .5 6.19C0 8.07 0 12 0 12s0 3.93.5 5.81a3.02 3.02 0 0 0 2.12 2.14c1.87.5 9.38.5 9.38.5s7.5 0 9.38-.5a3.02 3.02 0 0 0 2.12-2.14C24 15.93 24 12 24 12s0-3.93-.5-5.81zM9.54 15.57V8.43L15.82 12l-6.28 3.57z" />
</svg>
);
export function YouTube(props: {
title: string;
caption?: string;
src: string;
width?: string;
disableRoundedCorners?: boolean;
imageOnly?: boolean;
}): JSX.Element {
return (
<div className="text-center">
{' '}
{/* Center alignment applied to the container */}
{props.imageOnly ? (
<a
href={computeWatchOnYoutubeURL(props.src)}
className="relative block !text-inherit"
>
{youtubeIcon}
<img
src={computeThumbnailURL(props.src)}
alt={props.title}
width={props.width || '100%'}
className={cx(
{
'rounded-lg shadow-lg': !props.disableRoundedCorners,
},
'border-2 border-slate-200 hover:border-slate-500 dark:border-slate-700/40 dark:hover:border-slate-700'
)}
/>
</a>
) : (
<iframe
src={computeEmbedURL(props.src)}
title={props.title}
width={props.width || '100%'}
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen"
loading="lazy"
credentialless="true"
className={cx({
'rounded-lg shadow-lg': !props.disableRoundedCorners,
})}
/>
)}
{props.caption && (
<p className="mx-auto pt-0 text-slate-500 md:w-1/2 dark:text-slate-400">
{props.caption}
</p>
)}
</div>
);
}
+87
View File
@@ -0,0 +1,87 @@
import { defineCollection, z } from 'astro:content';
import { docsLoader } from '@astrojs/starlight/loaders';
import { docsSchema } from '@astrojs/starlight/schema';
import { PluginLoader } from './plugins/plugin.loader';
import { CliLoader } from './plugins/cli.loader';
import { DevkitLoader } from './plugins/devkit.loader';
import { file } from 'astro/loaders';
import { CnwLoader } from './plugins/cnw.loader.ts';
// Default docs collection handled by Starlight
const docs = defineCollection({
loader: docsLoader(),
schema: docsSchema(),
});
const nxCliDocs = defineCollection({
loader: CliLoader(),
schema: z.object({
title: z.string(),
docType: z.literal('cli'),
}),
});
const pluginDocs = defineCollection({
loader: PluginLoader(),
schema: z.object({
title: z.string(),
pluginName: z.string(),
packageName: z.string(),
docType: z.enum(['generators', 'executors', 'migrations']),
description: z.string(),
}),
});
const devkitDocs = defineCollection({
loader: DevkitLoader(),
schema: z.object({
title: z.string(),
docType: z.enum(['devkit', 'ngcli_adapter']),
description: z.string().optional(),
category: z.string().optional(),
kind: z.string().optional(),
}),
});
const cnwDocs = defineCollection({
loader: CnwLoader(),
schema: z.object({
title: z.string(),
docType: z.enum(['cnw']),
}),
});
// general notification collection for showing time based notifications
// in app, i.e. webinars, or confs etc.
// goal is that different pages/parts of the app can query for their specific needs.
// i.e. show banner for webinar, or show a dynamic sidebars item for a conf signups etc.
const notifications = defineCollection({
loader: file('src/content/notifications.json'),
schema: z.object({
title: z.string(),
description: z.string(),
// TODO(caleb): should parse this to a date object
date: z.string(),
// slug will be dismiss key for the banner
slug: z.string(),
authors: z.array(z.string()),
// these have to contain the tag webinar??
type: z.enum(['webinar', 'event', 'release']),
cover_image: z.string(),
// tbf this can probs be derived if given a full timestamp for `date`
time: z.string(),
// TODO(caleb); get all possible statues, some of these could be derived such as 'Upcoming' or 'Past - *'
// we just really want to know if something is gated or not etc
status: z.enum(['Upcoming', 'Past - Gated']),
registrationUrl: z.string(),
}),
});
export const collections = {
docs,
notifications,
'nx-cli-docs': nxCliDocs,
'plugin-docs': pluginDocs,
'devkit-docs': devkitDocs,
'cnw-docs': cnwDocs,
};
@@ -0,0 +1,537 @@
[
{
"name": "@ahryman40k/nx-vitepress",
"description": "Nx plugin add vitepress project to your workspace",
"url": "https://github.com/Ahryman40k/nx-vitepress/tree/main/packages/nx-vitepress"
},
{
"name": "@klerick/nx-angular-mf",
"description": "Custom Angular Builder for Microfrontend Architecture",
"url": "https://github.com/klerick/nx-angular-mf"
},
{
"name": "@nightwatch/nx",
"description": "The NightwatchJS plugin allows your workspace to use the power of NightwatchJS for E2E and Component Testing on Desktop and Mobile",
"url": "https://github.com/nightwatchjs/nightwatch-plugin-nx/"
},
{
"name": "@nxkit/playwright",
"description": "The Playwright plugin allows your workspace to use the power of Playwright end-to-end testing",
"url": "https://github.com/nxkit/nxkit"
},
{
"name": "qwik-nx",
"description": "Get first class support for Qwik inside of Nx monorepos with Qwik optimized custom executors, generators and a vite plugin",
"url": "https://github.com/qwikifiers/qwik-nx"
},
{
"name": "@nxkit/style-dictionary",
"description": "Nx plugin to generate and build Style Dictionary projects inside your Nx workspace",
"url": "https://github.com/nxkit/nxkit"
},
{
"name": "nx-plugin-vite",
"description": "Nx plugin integrations with Vite.",
"url": "https://nx-plugins.netlify.app/"
},
{
"name": "nx-serverless-cdk",
"description": "Create CDK applications and construct libraries. Test and debug infrastructure code and AWS Lambda functions locally.",
"url": "https://github.com/castleadmin/nx-plugins/tree/main/nx-serverless-cdk/plugin"
},
{
"name": "@ago-dev/nx-aws-cdk-v2",
"description": "An nx plugin for the aws-cdk v2.",
"url": "https://github.com/adrian-goe/nx-aws-cdk-v2"
},
{
"name": "@berenddeboer/nx-aws-cdk",
"description": "Nx plugin to generate a CDK stack with support for the vitest runner. Supports all CDK commands.",
"url": "https://github.com/berenddeboer/nx-plugins/tree/main/packages/nx-aws-cdk"
},
{
"name": "@nx-iac/aws-cdk",
"description": "Empowers your Nx workspace with AWS CDK capabilities ⚡",
"url": "https://github.com/joelklint/nx-aws-cdk"
},
{
"name": "@routineless/nx-aws-cdk",
"description": "Nx plugin to generate and manage aws cdk app and lambdas.",
"url": "https://github.com/KozelAnatoliy/routineless/tree/main/packages/nx-aws-cdk"
},
{
"name": "@berenddeboer/nx-sst",
"description": "Nx plugin to generate an SST stack and execute all SST commands.",
"url": "https://github.com/berenddeboer/nx-plugins/tree/main/packages/nx-sst"
},
{
"name": "@rxap/plugin-localazy",
"description": "An Nx plugin for localazy.com upload and download tasks.",
"url": "https://gitlab.com/rxap/plugins/-/tree/master/libs/localazy"
},
{
"name": "nx-electron",
"description": "An Nx plugin for developing Electron applications",
"url": "https://github.com/bennymeg/nx-electron"
},
{
"name": "nx-stylelint",
"description": "Nx plugin to use stylelint in a nx workspace",
"url": "https://github.com/Phillip9587/nx-stylelint"
},
{
"name": "@nxext/ionic-react",
"description": "An Nx plugin for developing Ionic React applications and libraries",
"url": "https://github.com/nxext/nx-extensions-ionic/tree/main/packages/ionic-react"
},
{
"name": "@nxext/ionic-angular",
"description": "An Nx plugin for developing Ionic Angular applications and libraries",
"url": "https://github.com/nxext/nx-extensions-ionic/tree/main/packages/ionic-angular"
},
{
"name": "@nxext/capacitor",
"description": "An Nx plugin for developing cross-platform applications using Capacitor",
"url": "https://github.com/nxext/nx-extensions/tree/main/packages/capacitor"
},
{
"name": "@angular-architects/ddd",
"description": "Nx plugin for structuring a monorepo with domains and layers",
"url": "https://github.com/angular-architects/nx-ddd-plugin"
},
{
"name": "@flowaccount/nx-serverless",
"description": "Nx plugin for node/angular-universal schematics and deployment builders in an Nx workspace",
"url": "https://github.com/flowaccount/nx-plugins"
},
{
"name": "@ns3/nx-serverless",
"description": "Nx plugin for node serverless applications in an Nx workspace",
"url": "https://github.com/Bielik20/nx-plugins/tree/master/packages/nx-serverless"
},
{
"name": "@ns3/nx-jest-playwright",
"description": "Nx plugin to run jest-playwright e2e tests in an Nx workspace",
"url": "https://github.com/Bielik20/nx-plugins/tree/master/packages/nx-jest-playwright"
},
{
"name": "@ns3/nx-playwright",
"description": "Nx plugin to run playwright e2e tests in an Nx workspace",
"url": "https://github.com/Bielik20/nx-plugins/tree/master/packages/nx-playwright"
},
{
"name": "@nx-plus/nuxt",
"description": "Nx plugin adding first class support for Nuxt in your Nx workspace.",
"url": "https://github.com/ZachJW34/nx-plus/tree/master/libs/nuxt"
},
{
"name": "@nx-plus/vue",
"description": "Nx plugin adding first class support for Vue in your Nx workspace.",
"url": "https://github.com/ZachJW34/nx-plus/tree/master/libs/vue"
},
{
"name": "@nx-plus/docusaurus",
"description": "Nx plugin adding first class support for Docusaurus in your Nx workspace.",
"url": "https://github.com/ZachJW34/nx-plus/tree/master/libs/docusaurus"
},
{
"name": "@twittwer/compodoc",
"description": "Nx Plugin to integrate the generation of documentation with Compodoc in the Nx workflow",
"url": "https://github.com/twittwer/nx-tools/tree/master/libs/compodoc#readme"
},
{
"name": "@enio.ai/nx-install",
"description": "nx-install is a plugin for Nx workspaces to quickly setup custom install commands via npm.",
"url": "https://github.com/enio-ireland/enio/tree/develop/packages/nx-install#readme"
},
{
"name": "@enio.ai/typedoc",
"description": "typedoc is a plugin for Nx workspaces to quickly setup documentation automation on your projects using typedoc.",
"url": "https://github.com/enio-ireland/enio/tree/develop/packages/typedoc#readme"
},
{
"name": "@nxext/svelte",
"description": "Nx plugin to use Svelte within nx workspaces",
"url": "https://github.com/nxext/nx-extensions/tree/master/packages/svelte"
},
{
"name": "@nxext/stencil",
"description": "Nx plugin to use StencilJs within nx workspaces",
"url": "https://github.com/nxext/nx-extensions/tree/master/packages/stencil"
},
{
"name": "@nxext/vue",
"description": "Nx plugin to use VueJS 3 within nx workspaces",
"url": "https://github.com/nxext/nx-extensions/tree/master/packages/vue"
},
{
"name": "@nxext/solid",
"description": "Nx plugin to use SolidJS within nx workspaces",
"url": "https://github.com/nxext/nx-extensions/tree/master/packages/solid"
},
{
"name": "@nx-go/nx-go",
"description": "Nx plugin to use Go in a Nx workspace",
"url": "https://github.com/nx-go/nx-go"
},
{
"name": "@nx-golang/gin",
"description": "Nx plugin to use Go-Gin in a Nx workspace",
"url": "https://github.com/nx-golang/nx-golang"
},
{
"name": "@angular-architects/module-federation",
"description": "Nx plugin to use webpack module federation",
"url": "https://github.com/angular-architects/module-federation-plugin"
},
{
"name": "@nxrocks/nx-spring-boot",
"description": "Nx plugin to generate, run, package, build (and more) Spring Boot projects inside your Nx workspace",
"url": "https://github.com/tinesoft/nxrocks/tree/master/packages/nx-spring-boot"
},
{
"name": "@trumbitta/nx-plugin-openapi",
"description": "OpenAPI Plugin for Nx. Keep your API spec files in libs, and auto-generate sources.",
"url": "https://github.com/trumbitta/nx-trumbitta/tree/main/packages/nx-plugin-openapi"
},
{
"name": "@trumbitta/nx-plugin-unused-deps",
"description": "Check the dependency graph of your monorepo, looking for unused NPM packages.",
"url": "https://github.com/trumbitta/nx-trumbitta/tree/main/packages/nx-plugin-unused-deps"
},
{
"name": "@nxrocks/nx-flutter",
"description": "Nx Plugin adding first class support for Flutter in your Nx workspace",
"url": "https://github.com/tinesoft/nxrocks/tree/master/packages/nx-flutter"
},
{
"name": "@srleecode/domain",
"description": "Nx Plugin for allowing operations to occur at the domain level instead of the default library level",
"url": "https://github.com/srlee309/domain"
},
{
"name": "@jscutlery/semver",
"description": "Nx plugin to automate semantic versioning and CHANGELOG generation.",
"url": "https://github.com/jscutlery/semver"
},
{
"name": "ngx-deploy-npm",
"description": "Publish your libraries to NPM with just one command.",
"url": "https://github.com/bikecoders/ngx-deploy-npm"
},
{
"name": "@nx-dotnet/core",
"description": "Nx plugin for developing and housing .NET projects within an Nx workspace.",
"url": "https://github.com/nx-dotnet/nx-dotnet"
},
{
"name": "@nxrocks/nx-quarkus",
"description": "Nx plugin to generate, run, package, build (and more) Quarkus projects inside your Nx workspace",
"url": "https://github.com/tinesoft/nxrocks/tree/master/packages/nx-quarkus"
},
{
"name": "@nx-extend/gcp-secrets",
"description": "Nx plugin to generate and securely deploy your Google Cloud Secrets",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/gcp-secrets"
},
{
"name": "@nx-extend/gcp-storage",
"description": "Nx plugin to upload to Google Cloud Storage",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/gcp-storage"
},
{
"name": "@nx-extend/gcp-functions",
"description": "Nx plugin to generate, run, build and deploy your Google Cloud Functions",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/gcp-functions"
},
{
"name": "@nx-extend/gcp-deployment-manager",
"description": "Nx plugin to deploy your Google Cloud Deployments",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/gcp-deployment-manager"
},
{
"name": "@nx-extend/gcp-cloud-run",
"description": "Nx plugin to build and deploy your docker container to Google Cloud Run",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/gcp-cloud-run"
},
{
"name": "@nx-extend/translations",
"description": "Nx plugin to extract, pull, push and translate your apps translations",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/translations"
},
{
"name": "@nx-extend/firebase-hosting",
"description": "Nx plugin to deploy your apps to Firebase hosting",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/firebase-hosting"
},
{
"name": "@nx-extend/e2e-runner",
"description": "Nx plugin that can start your API before running Cypress/Playwright",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/e2e-runner"
},
{
"name": "@nx-extend/vercel",
"description": "Nx plugin to deploy your apps to Vercel",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/vercel"
},
{
"name": "@nx-extend/strapi",
"description": "Nx plugin for developing Strapi applications",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/strapi"
},
{
"name": "@nx-extend/playwright",
"description": "Nx plugin to run playwright e2e tests in an Nx workspace",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/playwright"
},
{
"name": "@nx-extend/terraform",
"description": "Nx plugin for deploying your resources with Terraform",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/terraform"
},
{
"name": "@nx-extend/pulumi",
"description": "Nx plugin for deploying your resources with Pulumi",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/pulumi"
},
{
"name": "@nx-extend/react-email",
"description": "Nx plugin for developing email templates with react.email",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/react-email"
},
{
"name": "@nx-extend/shadcn-ui",
"description": "Nx plugin for working with shadcn/ui",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/shadcn-ui"
},
{
"name": "@nx-extend/docusaurus",
"description": "Nx plugin adding first class support for Docusaurus in your Nx workspace.",
"url": "https://github.com/tripss/nx-extend/tree/master/packages/docusaurus"
},
{
"name": "@nativescript/nx",
"description": "Nx Plugin adding first class support for NativeScript in your Nx workspace",
"url": "https://github.com/nativescript/nx"
},
{
"name": "@nxtensions/astro",
"description": "Nx plugin adding first class support for Astro (https://astro.build).",
"url": "https://github.com/nxtensions/nxtensions/tree/main/packages/astro"
},
{
"name": "@nxrs/cargo",
"description": "Nx plugin adding first-class support for Rust applications and libraries.",
"url": "https://github.com/nxrs/cargo/tree/main/packages/cargo"
},
{
"name": "nx-uvu",
"description": "An nx executor for the uvu test library",
"url": "https://github.com/jmcdo29/nx-uvu"
},
{
"name": "@ndrsg/nx-http",
"description": "Plugin with executors, which can perform http-stuff (e.g. requests, webhooks, file up/downloads, ...)",
"url": "https://github.com/ndrsg/nx-ext/tree/main/packages/nx-http"
},
{
"name": "@diogovcs/graphql-mesh",
"description": "Nx plugin to add GraphQL Mesh integration to Nx Workspace.",
"url": "https://github.com/DiogoVCS/nx-workspace-plugins"
},
{
"name": "@computas/nx-yarn",
"description": "A plugin to help make nx with yarn a pleasant experience.",
"url": "https://github.com/computas/nx-yarn"
},
{
"name": "@theunderscorer/nx-semantic-release",
"description": "Nx plugin for automated releases using semantic-release.",
"url": "https://github.com/TheUnderScorer/nx-semantic-release"
},
{
"name": "nx-pwm",
"description": "Nx plugin and CLI to help maintain packages, inspired by NX repo tooling",
"url": "https://github.com/gioragutt/nx-pwm"
},
{
"name": "@nxrocks/nx-micronaut",
"description": "Nx plugin to generate, run, package, build (and more) Micronaut projects inside your Nx workspace",
"url": "https://github.com/tinesoft/nxrocks/tree/master/packages/nx-micronaut"
},
{
"name": "@koliveira15/nx-sonarqube",
"description": "Nx plugin that scans projects using SonarQube / SonarCloud.",
"url": "https://github.com/koliveira15/nx-sonarqube"
},
{
"name": "@mands/nx-playwright",
"description": "The Playwright plugin allows your workspace to use the power of Playwright end-to-end testing using a native runner.",
"url": "https://github.com/marksandspencer/nx-plugins/tree/main/packages/nx-playwright"
},
{
"name": "@diogovcs/stryker-mutator",
"description": "Nx plugin to add Stryker Mutator mutation tests to the Nx Workspace.",
"url": "https://github.com/DiogoVCS/nx-workspace-plugins"
},
{
"name": "@spaceribs/nx-web-ext",
"description": "Nx plugin that allows you to build, test and deploy web extensions.",
"url": "https://github.com/spaceribs/spaceribs/tree/main/packages/nx-web-ext"
},
{
"name": "@spaceribs/nx-betterer",
"description": "Nx plugin that applies betterer standards on a per-project basis.",
"url": "https://github.com/spaceribs/spaceribs/tree/main/packages/nx-betterer"
},
{
"name": "@nx-extensions/helm",
"description": "Nx plugin providing comprehensive support for Helm charts, including generation, packaging, and publishing capabilities.",
"url": "https://github.com/marcolongol/nx-extensions/tree/main/packages/helm"
},
{
"name": "@nx-tools/nx-container",
"description": "Nx plugin to build OCI containers with Docker, Podman or Kaniko.",
"url": "https://github.com/gperdomor/nx-tools/tree/main/plugins/nx-container"
},
{
"name": "@nxrocks/nx-melos",
"description": "Nx plugin adding first class support for Melos in your Nx workspace",
"url": "https://github.com/tinesoft/nxrocks/tree/master/packages/nx-melos"
},
{
"name": "@monodon/rust",
"description": "Adds Cargo and Rust support",
"url": "https://github.com/cammisuli/monodon/tree/main/packages/rust"
},
{
"name": "nx-mesh",
"description": "GraphQL Mesh support for Nx",
"url": "https://github.com/domjtalbot/nx-mesh"
},
{
"name": "@nxazure/func",
"description": "Nx plugin to add Azure Functions support to Nx Workspace.",
"url": "https://github.com/AlexPshul/nxazure/tree/master/packages/func"
},
{
"name": "@rbnx/webdriverio",
"description": "A Nx plugin that adds the WebdriverIO testing framework to a NX workspace.",
"url": "https://github.com/Roozenboom/rbnx/tree/main/packages/webdriverio"
},
{
"name": "nx-ngrok",
"description": "Ngrok support for Nx",
"url": "https://github.com/domjtalbot/nx-ngrok"
},
{
"name": "@nxrocks/nx-ktor",
"description": "Nx plugin to generate, run, package, build (and more) Ktor projects inside your Nx workspace",
"url": "https://github.com/tinesoft/nxrocks/tree/master/packages/nx-ktor"
},
{
"name": "nx-size-limit",
"description": "Adds size-limit support for Nx (performance budget tool for JavaScript)",
"url": "https://github.com/LironHazan/nx-size-limit"
},
{
"name": "@loft-orbital/terraform",
"description": "Terraform executors and generators",
"url": "https://github.com/loft-orbital/nx-plugins/tree/main/packages/terraform"
},
{
"name": "@nxlv/python",
"description": "Nx plugin designed to extend the Nx features to work with Python projects based on Poetry.",
"url": "https://github.com/lucasvieirasilva/nx-plugins/tree/main/packages/nx-python"
},
{
"name": "nx-gcp-cache",
"description": "Nx plugin to use Google Cloud Storage as distributed remote cache",
"url": "https://github.com/davidgarciab/nx-gcp-cache"
},
{
"name": "@jnxplus/nx-gradle",
"description": "Nx plugin to add Gradle multi-project builds support to Nx workspace",
"url": "https://github.com/khalilou88/jnxplus/tree/main/packages/nx-gradle"
},
{
"name": "@jnxplus/nx-maven",
"description": "Nx plugin to add Maven multi-module project support to Nx workspace",
"url": "https://github.com/khalilou88/jnxplus/tree/main/packages/nx-maven"
},
{
"name": "@naxodev/nx-cloudflare",
"description": "Nx plugin for Cloudflare, in particular Cloudflare workers. It allows to generate build and run Cloudflare workers in your Nx workspace.",
"url": "https://github.com/naxodev/oss/tree/main/packages/nx-cloudflare"
},
{
"name": "@naxodev/gonx",
"description": "Modern Nx plugin to use Go in a Nx workspace. Forked from @nx-go/nx-go",
"url": "https://github.com/naxodev/oss/tree/main/packages/gonx"
},
{
"name": "@ziacik/azure-func",
"description": "Generating, serving and publishing Azure Functions 4 apps.",
"url": "https://github.com/ziacik/nx-tools/tree/master/packages/azure-func"
},
{
"name": "@simondotm/nx-firebase",
"description": "Nx plugin to support Firebase Apps and Cloud Functions in Nx workspaces",
"url": "https://github.com/simondotm/nx-firebase"
},
{
"name": "@dman926/nx-python-pdm",
"description": "Use Python in NX workspaces with PDM",
"url": "https://github.com/dman926/nx-python-pdm"
},
{
"name": "@gnuechtel/nx-cucumber",
"description": "Plugin to use Cucumber within Nx workspaces",
"url": "https://gitlab.com/gnuechtel/open-source/-/tree/main/libs/nx-cucumber"
},
{
"name": "@analogjs/platform",
"description": "Official plugin to add Analog to your Nx monorepo.",
"url": "https://analogjs.org/docs/integrations/nx"
},
{
"name": "@getlarge/nx-heroku",
"description": "Plugin to deploy and promote Nx apps on Heroku",
"url": "https://github.com/getlarge/nx-heroku"
},
{
"name": "@getlarge/nx-node-sea",
"description": "Plugin that provides integration with Node.js Single Executable Applications (SEA).",
"url": "https://github.com/getlarge/nx-node-sea"
},
{
"name": "@huge-nx/conventions",
"description": "Plugin to generate and manage Nx workspaces by adhering to established workspace conventions.",
"url": "https://github.com/jogelin/huge-nx"
},
{
"name": "nx-github-pages",
"description": "A small Nx plugin to make deploying static projects to GitHub Pages easy.",
"url": "https://github.com/agentender/nx-github-pages"
},
{
"name": "nx-solhint",
"description": "Solhint generators and inferred tasks for Nx",
"url": "https://github.com/juliangsibecas/nx-solhint"
},
{
"name": "nx-foundry",
"description": "Foundry generators and inferred tasks for Nx",
"url": "https://github.com/juliangsibecas/nx-foundry"
},
{
"name": "@robby-rabbitman/nx-plus-web-test-runner",
"description": "Web Test Runner plugin for Nx workspaces.",
"url": "https://github.com/RobbyRabbitman/nx-plus/tree/main/libs/web-test-runner"
},
{
"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"
}
]
@@ -0,0 +1,314 @@
---
title: Nx Cloud CLI
description: Complete reference for all Nx Cloud CLI commands
---
The Nx Cloud command line interface provides various commands to connect and interact with Nx Cloud, manage distributed task execution, and handle authentication.
Below is a complete reference for all available commands and their options.
## Available Commands
### `nx-cloud login`
Provision a local personal access token to access Nx Cloud features. This will open your browser to the Nx Cloud application and after signing in will generate a personal access token and save it in a configuration file locally called `nxcloud.ini`.
This command is the same as running `nx login`.
**Usage:**
```bash
npx nx-cloud login [nxCloudUrl]
```
#### Options
| Option | Type | Description | Default |
| ------------ | ------ | ---------------------------------------------- | ---------------------- |
| `nxCloudUrl` | string | The URL of the Nx Cloud instance to connect to | `https://cloud.nx.app` |
#### Configuration File Location
{% tabs %}
{% tabitem label="macOS & Linux" %}
We look for this file at the following locations:
- `$XDG_CONFIG_HOME/nxcloud/nxcloud.ini`
- `$HOME/config/nxcloud/nxcloud.ini`
- `$HOME/.nxcloud.ini`
If we don't find an existing config file, we create one at `$HOME/config/nxcloud/nxcloud.ini`
{% /tabitem %}
{% tabitem label="Windows" %}
We look for this file within the `%LOCALAPPDATA%/nxcloud` directory and if it does not exist, we will create a new `nxcloud.ini` file there.
{% /tabitem %}
{% /tabs %}
The format of this file is as follows:
```ini
[https://cloud\.nx\.app]
personalAccessToken=SOME_ACCESS_TOKEN
```
If you have access to multiple instances of the Nx Cloud application (e.g. self-hosted Enterprise and our managed instance), each instance will be saved to this file under its URL.
### `nx-cloud logout`
Revoke a personal access token from your local environment. This will remove the personal access token from the locally initialized configuration file and also invalidate the token from the Nx Cloud application. You will be prompted to remove a single token or all tokens from your local environment.
**Usage:**
```bash
npx nx-cloud logout
```
### `nx-cloud configure`
To provision more than one personal access token for multiple contexts (e.g. home and work machines) you can use the personal access tokens page under your Nx Cloud profile. To save a personal access token to your local `nxcloud.ini` file without needing to edit the file yourself call `nx-cloud configure`.
**Usage:**
```bash
npx nx-cloud configure
```
#### Options
| Option | Type | Description | Default |
| ----------------------- | ------ | -------------------------------------- | ---------------------- |
| `--personalAccessToken` | string | The personal access token to configure | |
| `--nx-cloud-url` | string | The URL of the Nx Cloud instance | `https://cloud.nx.app` |
#### Examples
```bash
npx nx-cloud configure --personalAccessToken=SOME_ACCESS_TOKEN
```
To configure multiple tokens for different instances of the Nx Cloud app:
```bash
npx nx-cloud configure --personalAccessToken=SOME_ACCESS_TOKEN --nx-cloud-url=https://nx-cloud.my-domain.app
```
### `nx-cloud convert-to-nx-cloud-id`
When logging into Nx Cloud with a [Personal Access Token](/ci/recipes/security/personal-access-tokens), your `nx.json` file needs to include the `nxCloudId` property, which acts as a unique identifier for your workspace. If you have been using the previous `nxCloudAccessToken` to connect, simply run `npx nx-cloud convert-to-nx-cloud-id` to automatically update your configuration to use `nxCloudId`.
If you are connecting to Nx Cloud with a workspace that is version 19.6 or lower, this command will also install the latest version of the Nx Cloud npm package and add it into your `package.json`. Only Nx versions 19.7 and higher natively support the `nxCloudId` property in the `nx.json` file; for versions 19.6 and lower, the Nx Cloud npm package will be needed to use that property.
**Usage:**
```bash
npx nx-cloud convert-to-nx-cloud-id
```
### `nx-cloud start-ci-run`
At the beginning of your main job, invoke `npx nx-cloud start-ci-run`. This tells Nx Cloud that the following series of command correspond to the same CI run.
**Usage:**
```bash
npx nx-cloud start-ci-run
```
:::warning[Do not run start-ci-run locally]
`npx nx-cloud start-ci-run` generates a temporary marker file that can cause a local Nx repo to behave as if it is a part of a CI run. This can cause strange behavior like Nx commands timing out or throwing unexpected errors.
To discourage this from happening, this command will run a check to see if it is running in a CI environment. You can bypass this check with `npx nx-cloud start-ci-run --force`.
If you accidentally run this command locally, remove all generated marker files with `npx nx-cloud cleanup`.
:::
#### Options
| Option | Type | Description | Default |
| ------------------------------- | ------- | --------------------------------------------------------------------------------------- | ------- |
| `--distribute-on` | string | Configure the number of agents and launch templates for distributed execution | |
| `--require-explicit-completion` | boolean | Disable automatic completion monitoring and require explicit `nx-cloud complete-ci-run` | `false` |
| `--stop-agents-after` | string | Comma-separated list of targets after which agents should terminate | |
| `--stop-agents-on-failure` | boolean | Terminate all agents when a command fails | `true` |
| `--use-dte-by-default` | boolean | Configure Nx to distribute all commands by default | `true` |
| `--with-env-vars` | string | Comma-separated list of environment variables to pass to Nx Agents | |
| `--force` | boolean | Bypass CI environment check | |
#### Detailed Option Usage
##### --distribute-on
By default, `npx nx-cloud start-ci-run` is intended for use with [Nx Agents](/ci/features/distribute-task-execution) and expects `--distribute-on` to be configured. It will output a warning if this flag is not set. If you are running a distributed execution with a legacy setup without Nx Agents, you can pass `--distribute-on=manual` to disable this warning.
This command tells Nx Cloud how many agents to use (and what launch templates to use) to distribute tasks. E.g.,
`npx nx-cloud start-ci-run --distribute-on="8 linux-medium-js"` will distribute CI using 8 agents that are initialized
using the `linux-medium-js` launch template.
You can also [define the configuration in a file](/ci/features/dynamic-agents) and reference it as follows:
`npx nx-cloud start-ci-run --distribute-on=".nx/workflows/dynamic-changesets.yaml"`.
```yaml
// .nx/workflows/dynamic-changesets.yaml
distribute-on:
small-changeset: 3 linux-medium-js
medium-changeset: 6 linux-medium-js
large-changeset: 10 linux-medium-js
```
##### --stop-agents-after
You can tell Nx Cloud to terminate agents after it sees a certain
target or group of targets: `npx nx-cloud start-ci-run --stop-agents-after=build,test,e2e`.
:::tip[Be as specific]
For the best results, always tell Nx Cloud about all targets that should be expected during your pipeline. This will
prevent your CI Pipeline Execution from ending prematurely, cutting off any unfinished work.
:::
Whether you are running commands serially or in parallel (through use of the `&` operand or discrete jobs), you should
include one or more targets from each command.
{% tabs %}
{% tabitem label="Serial command execution" %}
#### Incorrect example:
```yaml
- run: npx nx-cloud start-ci-run --stop-agents-after=build
- run: nx affected -t build
- run: nx affected -t lint
- run: nx affected -t test
```
Nx Cloud will only look for the presence of a `build` target before determining your pipeline can be shut down. Since
both `lint` and `test` will only run after `build` is complete, your pipeline would end before all intended work is
executed.
#### Corrected example:
```yaml
- run: npx nx-cloud start-ci-run --stop-agents-after=lint,test,build
- run: nx affected -t lint
- run: nx affected -t test
- run: nx affected -t build
```
{% /tabitem %}
{% tabitem label="Parallel command execution" %}
#### Incorrect example:
```yaml
- run: npx nx-cloud start-ci-run --stop-agents-after=test
- run: nx affected -t build & nx affected -t lint & nx affected -t test
```
At first glance, this example may appear correct. However, since all the commands are executed in parallel, it could
be possible that your `test` command results in full cache hits and finishes faster than the `build` and `lint` commands.
In this case, Nx Cloud will stop your pipeline, leaving work incomplete for both the `build` and `lint` commands.
#### Corrected example:
```yaml
- run: npx nx-cloud start-ci-run --stop-agents-after=lint,test,build
- run: nx affected -t build & nx affected -t lint & nx affected -t test
```
{% /tabitem %}
{% /tabs %}
#### Advanced shutdown targeting
In advanced pipeline setups, it is possible that you want to run multiple commands with the same target, but with
distinct configurations. An example of this may be doing static translations for different locales during your builds.
```yaml
- run: npx nx-cloud start-ci-run --stop-agents-after=build
- run: nx affected -t build --configuration=locale-en
- run: nx affected -t build --configuration=locale-es
```
In this case, the `build` target will be executed twice, once with the `locale-en` configuration and once with the
`locale-es` configuration. However, Nx Cloud is only looking for the `build` target to assess whether the CI Pipeline
Execution can be marked complete.
To address this, you can pass an optional `configuration` to make your `target`s more specific.
```yaml
- run: npx nx-cloud start-ci-run --stop-agents-after=build:locale-en,build:locale-es
- run: nx affected -t build --configuration=locale-en
- run: nx affected -t build --configuration=locale-es
```
##### --with-env-vars (Nx Agents Only)
By default, invoking `npx nx-cloud start-ci-run` will take all environment variables prefixed with `NX_` and send them over to Nx Agents.
This means that your access token, verbose logging configuration and other Nx-related environment variables will be the same on your
main CI jobs and the Nx Agent machines.
If you want to pass other environment variables from the main job to Nx Agents, you can do it as follows: `--with-env-vars="VAR1,VAR2"`.
This will set `VAR1` and `VAR2` on Nx Agents to the same values set on the main job before any steps run.
> Note: none of the values passed to Nx Agents are stored by Nx Cloud.
#### Enabling/Disabling Distribution
Invoking `npx nx-cloud start-ci-run` will tell Nx to distribute by default. You can enable/disable distribution for
individual commands as follows:
{% tabs %}
{% tabitem label="Nx >= 18" %}
- `nx affected -t build --agents` (explicitly enable distribution)
- `nx affected -t build --no-agents` (explicitly disable distribution)
{% /tabitem %}
{% tabitem label="Nx >= 14.7" %}
- `nx affected -t build --dte` (explicitly enable distribution)
- `nx affected -t build --no-dte` (explicitly disable distribution)
{% /tabitem %}
{% /tabs %}
### `nx-cloud stop-all-agents`
Same as `npx nx-cloud complete-ci-run`.
This command tells Nx Cloud to terminate all agents associated with this CI pipeline execution.
Invoking this command is not needed anymore. New versions of Nx Cloud can track when the main job terminates
and terminate associated agents automatically.
**Usage:**
```bash
npx nx-cloud stop-all-agents
```
### `nx-cloud complete-ci-run`
Explicitly complete a CI run when using `--require-explicit-completion` with `start-ci-run`.
**Usage:**
```bash
npx nx-cloud complete-ci-run
```
### `nx-cloud cleanup`
Remove temporary marker files created by `start-ci-run` if accidentally run locally.
**Usage:**
```bash
npx nx-cloud cleanup
```
## Getting Help
You can get help for any command by adding the `--help` flag:
```bash
npx nx-cloud <command> --help
```
@@ -0,0 +1,16 @@
---
title: Test Plugin
description: A test plugin page
---
This is a test plugin page to demonstrate the dynamic sidebar functionality.
## Plugin Features
The sidebar should automatically switch to the "Plugins" tab when viewing this page.
## Installation
```bash
npm install @nx/test-plugin
```
@@ -0,0 +1,31 @@
---
title: 'Nx Plugins'
description: 'Complete reference for all Nx plugin commands'
---
# Nx Plugins
Nx provides a rich ecosystem of plugins to help you build, test, and deploy your applications. Each plugin offers generators, executors, and migrations specific to its technology stack.
## Available Plugins
import { getCollection } from 'astro:content';
export const pluginDocs = await getCollection('plugin-docs');
export const pluginsByName = pluginDocs.reduce((acc, doc) => {
if (!acc[doc.data.pluginName]) {
acc[doc.data.pluginName] = [];
}
acc[doc.data.pluginName].push(doc);
return acc;
}, {});
export const sortedPluginNames = Object.keys(pluginsByName).sort();
<ul>
{sortedPluginNames.map((pluginName) => (
<li key={pluginName}>
<a href={`/api/plugins/${pluginName}`}>@nx/{pluginName}</a>
</li>
))}
</ul>
@@ -0,0 +1,219 @@
---
title: Mental Model
description: Understand how Nx works with project graphs, task graphs, affected commands, and caching to efficiently manage your monorepo development workflow.
---
Nx is a VSCode of build tools, with a powerful core, driven by metadata, and extensible through [plugins](/concepts/nx-plugins). Nx works with a
few concepts to drive your monorepo efficiently, and effectively. This guide covers the mental model around how Nx works
with project graphs, task graphs, affected commands, computation hashing and caching.
## The project graph
A project graph is used to reflect the source code in your repository and all the external dependencies that aren't
authored in your repository, such as Webpack, React, Angular, and so forth.
![project-graph](/img/project-graph.svg)
Nx analyzes your file system to detect projects. Projects are identified by the presence of a `package.json` file or `project.json` file. Projects identification can also be customized through plugins. You can manually define dependencies between
the project nodes, but you don't have to do it very often. Nx analyzes files' source code, your installed dependencies, TypeScript
files, and others figuring out these dependencies for you. Nx also stores the cached project graph, so it only
reanalyzes the files you have changed.
![project-graph-updated](/img/project-graph-updated.svg)
Nx provides an updated graph after each analysis is done.
## Metadata-driven
Everything in Nx comes with metadata to enable toolability. Nx gathers information about your projects and tasks and then uses that information to help you understand and interact with your codebase. With the right plugins installed, most of the metadata can be [inferred directly from your existing configuration files](/concepts/inferred-tasks) so you don't have to define it manually.
This metadata is used by Nx itself, by VSCode and WebStorm integrations, by GitHub integration, and by third-party
tools.
![metadata](/img/metadata.png)
These tools are able to implement richer experiences with Nx using this metadata.
## The task graph
Nx uses the project graph to create a task graph. Any time you run anything, Nx creates a task graph from the project
graph and then executes the tasks in that graph.
For instance `nx test lib` creates a task graph with a single node:
\{% graph height="100px" type="task" jsonFile="shared/mental-model/single-task.json" %}
\{% /graph %}
A task is an invocation of a target. If you invoke the same target twice, you create two tasks.
Nx uses the [project graph](#the-project-graph), but the task graph and project graph aren't isomorphic, meaning they
aren't directly connected. In the case above, `app1` and `app2` depend on `lib`, but
running `nx run-many -t test -p app1 app2 lib`, the created task graph will look like this:
\{% side-by-side %}
**Project Graph**
**Task Graph**
\{% /side-by-side %}
\{% side-by-side %}
\{% graph height="200px" type="project" jsonFile="shared/mental-model/three-projects.json" %}
\{% /graph %}
\{% graph height="200px" type="task" jsonFile="shared/mental-model/disconnected-tasks.json"%}
\{% /graph %}
\{% /side-by-side %}
Even though the apps depend on `lib`, testing `app1` doesn't depend on the testing `lib`. This means that the two tasks
can
run in parallel.
Let's look at the test target relying on its dependencies.
```json
// project.json
{
"test": {
"executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/apps/app1"],
"dependsOn": ["^test"],
"options": {
"jestConfig": "apps/app1/jest.config.js",
"passWithNoTests": true
}
}
}
```
With this, running the same test command creates the following task graph:
\{% side-by-side %}
**Project Graph**
**Task Graph**
\{% /side-by-side %}
\{% side-by-side %}
\{% graph height="200px" type="project" jsonFile="shared/mental-model/three-projects.json" %}
\{% /graph %}
\{% graph height="200px" type="task" jsonFile="shared/mental-model/connected-tasks.json" %}
\{% /graph %}
\{% /side-by-side %}
This often makes more sense for builds, where to build `app1`, you want to build `lib` first. You can also define
similar
relationships between targets of the same project, including a test target that depends on the build.
A task graph can contain different targets, and those can run in parallel. For instance, as Nx is building `app2`, it
can be testing `app1` at the same time.
![task-graph-execution](/img/task-graph-execution.svg)
Nx also runs the tasks in the task graph in the right order. Nx executing tasks in parallel speeds up your overall
execution time.
## Affected commands
When you run `nx test app1`, you are telling Nx to run the `app1:test` task plus all the tasks it depends on.
When you run `nx run-many -t test -p app1 lib`, you are telling Nx to do the same for two
tasks `app1:test`
and `lib:test`.
When you run `nx run-many -t test`, you are telling Nx to do this for all the projects.
As your workspace grows, retesting all projects becomes too slow. To address this Nx implements code change analysis to
get the min set of projects that need to be retested. How does it work?
When you run `nx affected -t test`, Nx looks at the files you changed in your PR, it will look at the nature of
change (what exactly did you update in those files), and it uses this to figure the list of projects in the workspace
that can be affected by this change. It then runs the `run-many` command with that list.
For instance, if my PR changes `lib`, and I then run `nx affected -t test`, Nx figures out that `app1` and `app2`
depend on `lib`, so it will invoke `nx run-many -t test -p app1 app2 lib`.
![affected](/img/affected.svg)
Nx analyzes the nature of the changes. For example, if you change the version of Next.js in the package.json, Nx knows
that `app2` cannot be affected by it, so it only retests `app1`.
## Computation hashing and caching
Nx runs the tasks in the task graph in the right order. Before running the task, Nx computes its computation hash. As
long as the computation hash is the same, the output of running the task is the same.
How does Nx do it?
By default, the computation hash for say `nx test app1` includes:
- All the source files of `app1` and `lib`
- Relevant global configuration
- Versions of external dependencies
- [Runtime values provisioned by the user](/reference/inputs#runtime-inputs)
- CLI Command flags
![computation-hashing](/img/computation-hashing.svg)
This behavior is customizable. For instance, lint checks may only depend on the source code of the project and global
configs. Builds can depend on the `.d.ts` files of the compiled libs instead of their source.
After Nx computes the hash for a task, it then checks if it ran this exact computation before. First, it checks locally,
and then if it is missing, and if a remote cache is configured, it checks remotely.
If Nx finds the computation, Nx retrieves it and replays it. Nx places the right files in the right folders and prints
the terminal output. So from the user's point of view, the command ran the same, just a lot faster.
![cache](/img/cache.svg)
If Nx doesn't find this computation, Nx runs the task, and after it completes, it takes the outputs and the terminal
output and stores it locally (and if configured remotely). All of this happens transparently, so you don't have to worry
about it.
Although conceptually this is fairly straightforward, Nx optimizes this to make this experience good for you. For
instance, Nx:
- Captures stdout and stderr to make sure the replayed output looks the same, including on Windows.
- Minimizes the IO by remembering what files are replayed where.
- Only shows relevant output when processing a large task graph.
- Provides affordances for troubleshooting cache misses. And many other optimizations.
As your workspace grows, the task graph looks more like this:
\{% graph height="400px" type="task" jsonFile="shared/mental-model/large-tasks.json"%}
\{% /graph %}
All of these optimizations are crucial for making Nx usable for any non-trivial workspace. Only the minimum amount of
work happens. The rest is either left as is or restored from the cache.
## Distributed task execution
Nx supports running commands across multiple machines. You can either set it up by hand or use Nx Cloud. [Read the comparison of the two approaches.](/blog/distributing-ci-binning-and-distributed-task-execution)
When using the distributed task execution, Nx is able to run any task graph on many agents instead of locally.
For instance, `nx affected --build` won't run the build locally (which can take hours for large workspaces). Instead,
it will send the Task Graph to Nx Cloud. Nx Cloud Agents will then pick up the tasks they can run and execute them.
Note that this happens transparently. If an agent builds `app1`, it will fetch the outputs for `lib` if it doesn't have
them
already.
As agents complete tasks, the main job where you invoked `nx affected --build` will start receiving created files and
terminal outputs.
After `nx affected --build` completes, the machine will have the build files and all the terminal outputs as if it ran
it locally.
![Distribution](/img/dte.svg)
## In summary
- Nx is able to analyze your source code to create a Project Graph.
- Nx can use the project graph and information about projects' targets to create a Task Graph.
- Nx is able to perform code-change analysis to create the smallest task graph for your PR.
- Nx supports computation caching to never execute the same computation twice. This computation cache is pluggable and
can be distributed.
@@ -0,0 +1,50 @@
---
title: Integrate Nx with your Coding Assistant
description: Set up Nx MCP server to give AI assistants deep workspace context, terminal integration, and enhanced development capabilities.
sidebar:
order: 6
label: AI Integration
---
Nx provides deep integration with AI coding assistants through the **Nx Model Context Protocol (MCP) server**, giving your AI assistant comprehensive understanding of your monorepo structure, running processes, and development workflows.
## Setup and Configuration
### Automatic Setup with Nx Console
Make sure you have **Nx Console** [installed in your editor](/getting-started/editor-setup), as it automatically exposes the Nx MCP server. Once Nx Console is installed and you open an Nx workspace, you'll receive a notification to **"Improve Copilot/AI agent with Nx-specific context"** - click **"Yes"** to automatically configure it.
![VS Code showing the Nx MCP installation prompt](/img/copilot-mcp-install.avif)
If you miss the notification, you can manually run the configuration by opening the command palette (`Ctrl/Cmd + Shift + P`) and running `nx.configureMcpServer`.
### Manual Setup for Other AI Clients
For MCP-compatible clients like **Claude Desktop**, **Cursor**, or other AI assistants, add the following configuration:
```json
// mcp.json
{
"servers": {
"nx-mcp": {
"command": "npx",
"args": ["nx-mcp@latest", "/path/to/your/workspace"]
}
}
}
```
Replace `/path/to/your/workspace` with your actual workspace path.
## What This Integration Enables
The Nx AI integration provides your coding assistant with powerful capabilities:
- **[Workspace Structure Understanding](/blog/nx-mcp-vscode-copilot)** - Deep architectural awareness of your monorepo, project relationships, and dependencies
- **[Real-time Terminal Integration](/blog/nx-terminal-integration-ai)** - AI can read your terminal output, running processes, and error messages without copy-pasting
- **[CI Pipeline Context](/blog/nx-editor-ci-llm-integration)** - Access to build failures, test results, and deployment status from your CI/CD processes
- **[Enhanced Code Generation](/blog/nx-generators-ai-integration)** - AI-powered generator suggestions and custom scaffolding with intelligent defaults
- **Cross-project Impact Analysis** - Understanding the implications of changes across your entire monorepo
- **Autonomous Error Debugging** - AI independently accesses context to help fix development issues
Learn more about [why Nx and AI work so well together](/blog/nx-and-ai-why-they-work-together).
@@ -0,0 +1,34 @@
---
title: Editor Integration
description: Set up Nx Console in VSCode or JetBrains for visual UI, task management, code generation, and enhanced AI assistance in your Nx workspace.
sidebar:
order: 5
---
Nx Console editor extensions make your developer experience richer. The extensions:
- [enhance AI integrations](/features/enhance-AI) by providing workspace-level context and up-to-date docs
- show [inferred tasks](/concepts/inferred-tasks) and help you invoke them via the Project Details View
- provide a [visual UI for discovering and invoking generators](/recipes/nx-console/console-generate-command)
- visualize dependencies between projects and tasks
- and more!
## Download
### Official Integrations
If you are using [VSCode](https://code.visualstudio.com/) or a [JetBrains IDE](https://www.jetbrains.com/) you can install Nx Console from their respective marketplaces. Nx Console for VSCode and JetBrains is **built and maintained by the Nx team**.
\{ % install-nx-console /% }
- [Install from the VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=nrwl.angular-console)
- [Install from the JetBrains Marketplace](https://plugins.jetbrains.com/plugin/21060-nx-console)
- [Contribute on GitHub](https://github.com/nrwl/nx-console)
![Nx Console screenshot](/img/nx-console-screenshot.webp)
### Neovim
If you are using [Neovim](https://neovim.io/), you can install [Equilibris/nx.nvim](https://github.com/Equilibris/nx.nvim) with your favorite package manager.
This plugin is **NOT** built or maintained by the Nx team. They are maintained by independent community contributors.
@@ -0,0 +1,131 @@
---
title: Installation
description: Install Nx globally via npm, Homebrew, Chocolatey, or apt. Add Nx to existing repos with nx init and keep dependencies updated automatically.
sidebar:
order: 2
---
To install Nx on your machine, choose one of the following methods based on your operating system and package manager. You can also use `npx` to run Nx without installing it globally.
{% tabs %}
{% tabitem label="npm" %}
```shell
npm add --global nx
```
**Note:** You can also use `yarn`, `pnpm`, or `bun`
{% /tabitem %}
{% tabitem label="Homebrew (macOS, Linux)" %}
```shell
brew install nx
```
{% /tabitem %}
{% tabitem label="Chocolatey (Windows)" %}
```shell
choco install nx
```
{% /tabitem %}
{% tabitem label="apt (Ubuntu)" %}
```shell
sudo add-apt-repository ppa:nrwl/nx
sudo apt update
sudo apt install nx
```
{% /tabitem %}
{% /tabs %}
{% tabs %}
{% tabitem label="npm" %}
```shell
npm add --global nx
```
**Note:** You can also use `yarn`, `pnpm`, or `bun`
{% /tabitem %}
{% tabitem label="Homebrew (macOS, Linux)" %}
```shell
brew install nx
```
{% /tabitem %}
{% tabitem label="Chocolatey (Windows)" %}
```shell
choco install nx
```
{% /tabitem %}
{% tabitem label="apt (Ubuntu)" %}
```shell
sudo add-apt-repository ppa:nrwl/nx
sudo apt update
sudo apt install nx
```
{% /tabitem %}
{% /tabs %}
## Adding Nx to Your Repository
To add Nx to an existing repository, run:
```shell
nx init
```
**Note:** You can also manually install the [`nx` NPM package](https://www.npmjs.com/package/nx) and create a [nx.json](/reference/nx-json) to configure it. Learn more about [adopting Nx in an existing project](/recipes/adopting-nx)
### Starter Repository
To create a starter repository, you can use the `create-nx-workspace` command. This will create a new Nx workspace with a default configuration and example applications.
```shell
npx create-nx-workspace@latest
```
## Update Nx
When you update Nx, Nx will also [automatically update your dependencies](/features/automate-updating-dependencies) if you have an [Nx plugin](/concepts/nx-plugins) installed for that dependency. To update Nx, run:
```shell
nx migrate latest
```
This will create a `migrations.json` file with any update scripts that need to be run. Run them with:
```shell
nx migrate --run-migrations
```
{% aside type="tip" title="Update One Major Version at a Time" %}
To avoid potential issues, it is [recommended to update one major version of Nx at a time](/recipes/tips-n-tricks/advanced-update#one-major-version-at-a-time-small-steps).
{% /aside %}
## Tutorials
Try one of these tutorials for a full walkthrough of what to do after you install Nx:
- [TypeScript Monorepo Tutorial](/getting-started/tutorials/typescript-packages-tutorial)
- [React Monorepo Tutorial](/getting-started/tutorials/react-monorepo-tutorial)
- [Angular Monorepo Tutorial](/getting-started/tutorials/angular-monorepo-tutorial)
## More Documentation
- [Add Nx to an Existing Repository](/recipes/adopting-nx)
- [Update Nx](/features/automate-updating-dependencies)
- [Update Your Global Nx Installation](/recipes/installation/update-global-installation)
- [Install Nx in a Non-Javascript Repo](/recipes/installation/install-non-javascript)
@@ -0,0 +1,97 @@
---
title: What is Nx?
description: 'Nx is an AI-first build platform that connects everything from your editor to CI Helping you deliver fast, without breaking things.'
sidebar:
order: 1
label: Intro
---
Nx is a powerful, open source, technology-agnostic build platform designed to efficiently manage codebases of any scale. From small single projects to large enterprise monorepos, Nx is designed to **streamline your development workflows**, **minimize errors** and **dramatically reduce waste** by [saving engineering time](https://youtu.be/2BLqiNnBPuU) and cutting compute costs.
{% youtube title="What is Nx?" src="https://www.youtube.com/embed/-_4WMl-Fn0w" /%}
As teams and codebases grow, productivity bottlenecks multiply: build times increase, CI becomes flaky, and code sharing becomes complex. **Nx reduces friction across your entire development cycle.**
## Start small, extend as you grow
Nx is built in a modular fashion, allowing you to adopt as little or as much as you'd like at any moment in your development lifecycle. You can **start with just the core and add additional capabilities incrementally** as your needs grow and complexity increases.
At the **foundation is Nx Core**, a Rust-based, technology-agnostic task runner. Nx Core creates a knowledge graph of your workspace, understanding project relationships and dependencies. This enables highly optimized and fast task execution regardless of technology stack. It runs `package.json` scripts in [TypeScript monorepos](/technologies/typescript/introduction) or Gradle tasks in [Java projects](/technologies/java/introduction) or [can be extended](/extending-nx/intro/getting-started) to meet your projects specific needs
{% aside type="tip" title="What do you mean by _running NPM scripts_?" %}
At the very core, Nx is a super fast, intelligent task runner. Let's take the example of an NPM workspace. This could be a project's `package.json`:
```json
// my-project/package.json
{
"name": "my-project",
"scripts": {
"build": "tsc",
"test": "jest"
}
}
```
Then you can simply add Nx to your root `package.json`:
```json
// package.json
{
"devDependencies": {
"nx": "latest"
}
}
```
And once that's done, you can run your tasks via Nx.
```shell {% frame="none" %}
nx build my-project
```
This will execute the `build` script from `my-project`'s `package.json`, equivalent to running `npm run build` in that project directory.
Similarly you [can run tasks across all projects](/features/run-tasks), just specific ones or just those from projects you touched.
From there, you can gradually enhance your setup by adding features like [task caching](/features/cache-task-results), adding [plugins](/technologies), optimizing your CI via [task distribution](/ci/features/distribute-task-execution), and many more powerful capabilities as your needs grow.
{% /aside %}
Nx Core works great alone, but you can incrementally add capabilities as needed. Speed up your CI with [**Nx Cloud**](/ci) through remote caching and distributed task execution. Add [**Nx Console**](/getting-started/editor-setup) integrating Nx with your editor, giving you powerful autocomplete support, project graph visualization, CI run notifications and an MCP to [make your AI coding assistant smarter](/features/enhance-AI). Add [**Nx Plugins**](/technologies) for technology-specific automation and DX improvements and build custom capabilities using [Nx Devkit](/extending-nx/intro/getting-started).
## Where to go from here?
{% cardgrid %}
{% linkcard title="Get set up and ready with Nx" href="/getting-started"
description="Dive right in with our getting started steps to install Nx, set up your editor, and create your first project"
/%}
{% linkcard
title="Step by step with our tutorials"
href="/getting-started/tutorials"
description="Learn more about Nx through hands-on tutorials for different technology stacks"
/%}
{% linkcard title="Learn with our video courses" href="/courses"
description="Dive deeper with comprehensive video courses that walk you through Nx concepts"
/%}
{% linkcard title="Dive deep into Nx features" href="/features"
description="Discover all the powerful features that Nx provides to streamline your workflow"
/%}
{% linkcard title="Understand underlying concepts" href="/concepts"
description="Improve your understanding of the core concepts of how Nx works under the hood"
/%}
{% linkcard title="Explore Technologies" href="/technologies"
description="Explore Nx's technology integrations and how it can support your specific stack"
/%}
{% /cardgrid %}
**Stay up to date** with our latest news by [⭐️ starring us on Github](https://github.com/nrwl/nx), [subscribing to our Youtube channel](https://www.youtube.com/@nxdevtools), [joining our Discord](https://go.nx.dev/community), [subscribe to our monthly tech newsletter](https://go.nrwl.io/nx-newsletter) or follow us [on X](https://x.com/nxdevtools), [Bluesky](https://bsky.app/profile/nx.dev) and [LinkedIn](https://www.linkedin.com/company/nxdevtools).
@@ -0,0 +1,92 @@
---
title: Start a new project with Nx
description: Create a new Nx workspace manually with your favorite CLI or use the guided setup with presets for various technology stacks and configurations.
sidebar:
label: Start a new project
order: 3
---
When you start a new project with Nx, you have two options: manual or guided.
## Option 1: Manual setup
In a nutshell, this means using your favorite CLI to create your initial project setup and then adding Nx to it.
Let's take the example of an NPM workspace. Create a new root-level `package.json` like:
```json
{
"name": "my-workspace",
"version": "1.0.0",
"private": true,
"workspaces": ["packages/*", "apps/*"]
}
```
Then you can add Nx to it by using:
```shell {% frame="none" %}
nx init
```
{% aside type="note" title="Global Installs" %}
Make sure you have [Nx installed globally](/getting-started/installation) or use `npx` if you're in a JavaScript environment
{% /aside %}
Nx will detect the underlying workspace configuration, ask you a couple of questions and install itself into the workspace. As you keep going, you can incrementally add functionality, like:
- [configure caching](/features/cache-task-results)
- [adding Nx plugins to help refine your workflows](/plugin-registry)
- [optimizing your CI](/ci/intro/ci-with-nx)
## Option 2: Guided setup (JavaScript only)
Alternatively, you can choose a more guided approach by leveraging some of the presets Nx comes with.
Run the following command to get started:
```shell {% frame="none" %}
npx create-nx-workspace@latest
```
This interactive command will guide you through the setup process, allowing you to:
- **Choose your workspace name** - This will be the name of your root directory
- **Select your preferred package manager** - npm, yarn, or pnpm
- **Pick a preset** - Choose from various technology stacks and configurations
- **Configure additional options** - Such as styling solutions, testing frameworks, and more
Choose a preset that matches your technology stack. This gives you a fully configured workspace.
You can also choose **an empty workspace preset** which sets up the bare minimum configuration including Nx itself. This allows you to add technologies and features incrementally over time as you need them.
<!-- ## Pick Your Stack!
{% cards cols="3" lgCols="8" mdCols="6" smCols="5" moreLink="/showcase/example-repos" %}
{% link-card title="Express" appearance="small" url="/technologies/node/express" icon="express" /%}
{% link-card title="Vue" appearance="small" url="/technologies/vue/introduction" icon="vue" /%}
{% link-card title="Next" appearance="small" url="/technologies/react/next" icon="nextjs" /%}
{% link-card title="Nuxt" appearance="small" url="/technologies/vue/nuxt/introduction" icon="nuxt" /%}
{% link-card title="Nest" appearance="small" url="/technologies/node/nest" icon="nestjs" /%}
{% link-card title="Remix" appearance="small" url="/technologies/react/remix" icon="remix" /%}
{% link-card title="Expo" appearance="small" url="/technologies/react/expo" icon="expo" /%}
{% link-card title="React Native" appearance="small" url="/technologies/react/react-native" icon="react" /%}
{% link-card title="Fastify" appearance="small" url="/showcase/example-repos/mongo-fastify" icon="fastify" /%}
{% link-card title="Svelte" appearance="small" url="/showcase/example-repos/add-svelte" icon="svelte" /%}
{% link-card title="Solid" appearance="small" url="/showcase/example-repos/add-solid" icon="solid" /%}
{% link-card title="Lit" appearance="small" url="/showcase/example-repos/add-lit" icon="lit" /%}
{% link-card title="Astro" appearance="small" url="/showcase/example-repos/add-astro" icon="astro" /%}
{% link-card title="Qwik" appearance="small" url="/showcase/example-repos/add-qwik" icon="qwik" /%}
{% link-card title="Rust" appearance="small" url="/showcase/example-repos/add-rust" icon="rust" /%}
{% link-card title="Go" appearance="small" url="https://github.com/nrwl/nx-recipes/blob/main/go/README.md" icon="go" /%}
{% link-card title=".NET" appearance="small" url="https://github.com/nrwl/nx-recipes/tree/main/dot-net-standalone" icon="dotnet" /%}
{% link-card title="Cypress" appearance="small" url="/technologies/test-tools/cypress/introduction" icon="cypress" /%}
{% link-card title="Playwright" appearance="small" url="/technologies/test-tools/playwright/introduction" icon="playwright" /%}
{% link-card title="Vite" appearance="small" url="/technologies/build-tools/vite" icon="vite" /%}
{% link-card title="Storybook" appearance="small" url="/technologies/test-tools/storybook" icon="storybook" /%}
{% link-card title="Jest" appearance="small" url="/technologies/test-tools/jest/introduction" icon="jest" /%}
{% link-card title="Rspack" appearance="small" url="/technologies/build-tools/rspack/introduction" icon="rspack" /%}
{% /cards %} -->
@@ -0,0 +1,40 @@
---
title: Start with an existing project
description: Add Nx to any existing project with a single command. Start with Nx Core and gradually adopt plugins, CI integrations, and other capabilities.
sidebar:
order: 4
label: Add to existing project
---
In many situations, you have an existing codebase and want to improve it with Nx using an **incremental adoption approach**.
Thanks to [Nx's modular architecture](/getting-started/intro), you can start with just **Nx Core** and then gradually add [technology-specific plugins](/technologies), [CI integrations](/ci), or other capabilities as your requirements evolve.
Getting started is remarkably simple. You can add Nx to any existing project with a single command:
```shell {% frame="none" %}
nx init
```
{% aside type="note" title="Global Installs" %}
Make sure you have [Nx installed globally](/getting-started/installation) or use `npx` if you're in a JavaScript environment
{% /aside %}
This command automatically detects your underlying workspace structure, whether it's a monorepo, a single project, or something in between. Nx will then ask you a series of targeted questions about your setup and preferences, using your answers to auto-configure itself seamlessly into your existing workspace. This intelligent setup process ensures you get the benefits of Nx with minimal configuration changes or disruption to your current development workflow.
Here are some guides that give you more details based on the technology stack you're using:
{% cardgrid %}
{% linkcard title="Add to Existing Monorepo"
href="/recipes/adopting-nx/adding-to-monorepo" %}
{% /linkcard %}
{% linkcard title="Add to Any Project" href="/recipes/adopting-nx/adding-to-existing-project" /%}
{% linkcard title="Migrate from Angular CLI" href="technologies/angular/migration/angular" /%}
{% linkcard title="Import Projects into Your Nx Workspace" href="/recipes/adopting-nx/import-project" /%}
{% /cardgrid %}
{% linkcard title="See more options" href="/recipes/adopting-nx" /%}
@@ -0,0 +1,11 @@
---
title: Example Guide
description: A guide in my new Starlight docs site.
---
Guides lead a user through a specific task they want to accomplish, often with a sequence of steps.
Writing a good guide requires thinking about what your users are trying to do.
## Further reading
- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the Diátaxis framework
@@ -0,0 +1,18 @@
---
title: Test Guide
description: A test guide to demonstrate the sidebar
---
# Test Guide
This is a test guide page to demonstrate the dynamic sidebar functionality.
## Overview
The sidebar should automatically switch to the "Guides" tab when viewing this page.
## Features
- Dynamic tab switching based on URL
- Multiple group support
- Flexible configuration
+39
View File
@@ -0,0 +1,39 @@
---
title: Nx Documentation
description: Learn how to use Nx to build faster and scale better
template: splash
hero:
title: Welcome to Nx
tagline: An AI-first build platform that connects everything from your editor to CI. Helping you deliver fast, without breaking things.
actions:
- text: Get Started
link: /getting-started/intro
icon: right-arrow
variant: primary
- text: API Reference
link: /api/
icon: open-book
---
import { Card, CardGrid } from '@astrojs/starlight/components';
## Explore Nx
<CardGrid stagger>
<Card title="Getting Started" icon="rocket">
Learn the basics of Nx and set up your first workspace. [Start learning
→](/getting-started/intro)
</Card>
<Card title="API Reference" icon="document">
Browse comprehensive API documentation for all Nx tools and plugins. [View
API →](/api/)
</Card>
<Card title="Nx Cloud" icon="cloud">
Speed up your builds with distributed caching and task execution. [Learn
about Nx Cloud →](/getting-started/nx-cloud)
</Card>
<Card title="Plugins" icon="puzzle">
Extend Nx with plugins for React, Angular, Vue, and more. [Browse plugins
→](/api/plugins)
</Card>
</CardGrid>
+26
View File
@@ -0,0 +1,26 @@
[
{
"title": "Polygraph Launch Preview: Conformance, Workspace Graph, and Custom Workflows",
"description": "Join us for a demo of the new polygraph features in Nx Cloud, launching this month with Nx Enterprise! These features are designed to extend some of the powerful benefits of an Nx workspace to multi-workspace environments and take Nx Cloud beyond CI. We'll cover our updated conformance dashboard, how to visualize dependencies across your repos, the new onboarding experience for workspaces that arent yet a part of Nx Cloud, and preview how Nx Cloud will be able to fix your code automatically via agentic AI.",
"date": "2025-06-09",
"slug": "polygraph-launch-preview-conformance-workspace-graph-and-custom-workflows",
"authors": ["James Henry"],
"type": "webinar",
"cover_image": "/blog/images/2025-06-18/June-2025-Webinar-Card.avif",
"time": "10am ET/2pm UTC",
"status": "Past - Gated",
"registrationUrl": "https://go.nx.dev/june2025-webinar"
},
{
"title": "Securing Your Build Pipeline: Critical Vulnerabilities and Modern Security Practices",
"description": "Join Nx CEO, Jeff Cross, and CTO, Victor Savkin, for an essential security briefing on protecting your build infrastructure from emerging threats. With the recent publication of CVE-2025-36852 CREEP (Cache Race-condition Exploit Enables Poisoning, severity 9.4), it's more critical than ever to understand the security implications of your build and CI/CD choices. This webinar goes beyond just one vulnerability to address the broader security challenges facing modern development teams. Whether you're using Nx or other build systems, you'll learn actionable strategies to secure your entire build pipeline.",
"date": "2025-06-25",
"slug": "securing-your-build-pipeline-critical-vulnerabilities-and-modern-security-practices",
"authors": ["Jeff Cross", "Victor Savkin"],
"type": "webinar",
"cover_image": ",/blog/images/2025-07-09/2025-July-Webinar-Card.avif",
"time": "1pm ET/5pm UTC",
"status": "Upcoming",
"registrationUrl": "https://go.nx.dev/july2025-webinar"
}
]
@@ -0,0 +1,21 @@
---
import { getEntry, render } from 'astro:content';
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
const doc = await getEntry('cnw-docs', 'cnw-cli');
if (!doc) {
throw new Error('CNW CLI documentation not found');
}
const { Content, headings } = await render(doc);
---
<StarlightPage
frontmatter={{
title: doc.data.title
}}
headings={headings || []}
>
<Content />
</StarlightPage>
+21
View File
@@ -0,0 +1,21 @@
---
import { getEntry, render } from 'astro:content';
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
const nxClI = await getEntry('nx-cli-docs', 'api/nx-cli');
if (!nxClI || !nxClI.rendered) {
throw new Error('No content found for nx-cli docs');
}
const { Content, headings } = await render(nxClI);
---
<StarlightPage
frontmatter={{
title: '@nx/cli',
description: 'Complete reference for @nx/cli',
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,36 @@
---
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import { getCollection, render } from 'astro:content';
export async function getStaticPaths() {
const pluginDocs = await getCollection(
'plugin-docs',
(entry) => entry.data.docType === 'executors'
);
// Generate paths for each plugin
return pluginDocs.map((p) => ({
params: { plugin: p.data.pluginName },
props: { doc: p }
}));
}
const { doc } = Astro.props;
const pluginName = doc.data.pluginName;
if (!doc.body) {
throw new Error(`No content found for plugin: ${pluginName}`);
}
const { Content, headings } = await render(doc);
---
<StarlightPage
frontmatter={{
title: `@nx/${pluginName} - executors`,
description: `@nx/${pluginName} plugin executors`
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,35 @@
---
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import { getCollection, render } from 'astro:content';
export async function getStaticPaths() {
const pluginDocs = await getCollection(
'plugin-docs',
(entry) => entry.data.docType === 'generators'
);
// Generate paths for each plugin
return pluginDocs.map((p) => ({
params: { plugin: p.data.pluginName },
props: { doc: p },
}));
}
const { doc } = Astro.props;
const pluginName = doc.data.pluginName;
if (!doc.body) {
throw new Error(`No content found for plugin: ${pluginName}`);
}
const {Content , headings} = await render(doc)
---
<StarlightPage
frontmatter={{
title: `@nx/${pluginName} - generators`,
description: `@nx/${pluginName} plugin generators`,
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,58 @@
---
import { getCollection, render } from 'astro:content';
import { CardGrid, LinkCard } from '@astrojs/starlight/components';
import type { CollectionEntry } from 'astro:content';
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
export async function getStaticPaths() {
const pluginDocs = await getCollection('plugin-docs');
// Group docs by plugin name
const docsByPlugin = pluginDocs.reduce(
(acc, doc) => {
const pluginName = doc.data.pluginName;
if (!acc[pluginName]) {
acc[pluginName] = [];
}
acc[pluginName].push(doc);
return acc;
},
{} as Record<string, CollectionEntry<'plugin-docs'>[]>
);
// Generate paths for each plugin
return Object.entries(docsByPlugin).map(([pluginName, docs]) => ({
params: { plugin: pluginName },
props: {
pluginName,
docs: docs.sort((a, b) => {
const order = ['generators', 'executors', 'migrations'];
return order.indexOf(a.data.docType) - order.indexOf(b.data.docType);
})
}
}));
}
const { pluginName, docs } = Astro.props;
---
<StarlightPage
frontmatter={{
title: `@nx/${pluginName}`,
description: `Complete reference for @nx/${pluginName} plugin`
}}
>
<CardGrid>
{
docs.map(({ data }) => (
<LinkCard title={data.docType.charAt(0).toUpperCase() + data.docType.slice(1)}
href={`./${pluginName}/${data.docType}`}>
</LinkCard>
))
}
</CardGrid>
</StarlightPage>
@@ -0,0 +1,37 @@
---
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import { getCollection, render } from 'astro:content';
import { parseMarkdownToHtml } from '../../../../utils/markdown';
export async function getStaticPaths() {
const pluginDocs = await getCollection(
'plugin-docs',
(entry) => entry.data.docType === 'migrations'
);
// Generate paths for each plugin
return pluginDocs.map((p) => ({
params: { plugin: p.data.pluginName },
props: { doc: p },
}));
}
const { doc } = Astro.props;
const pluginName = doc.data.pluginName;
if (!doc.body) {
throw new Error(`No content found for plugin: ${pluginName}`);
}
const {Content, headings } = await render(doc);
---
<StarlightPage
frontmatter={{
title: `@nx/${pluginName} - migrations`,
description: `@nx/${pluginName} plugin migrations`,
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,37 @@
---
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import { getCollection, render } from 'astro:content';
export async function getStaticPaths() {
const docs = await getCollection(
'devkit-docs',
// we don't want the overview page, this is custom handled via the index.astro page
(doc) => doc.id !== 'devkit-overview' && doc.data.docType === 'devkit'
);
return docs.map(doc => ({
params: { name: doc.id.split('devkit_')[1] },
props: {
doc
}
}));
}
const { doc } = Astro.props;
const { name } = Astro.params;
if (!doc) {
throw new Error(`DevKit doc not found, ${name}`);
}
const { Content, headings } = await render(doc);
---
<StarlightPage
frontmatter={{
title: doc.data.title
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,22 @@
---
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import { render, getEntry } from 'astro:content';
const devkitDocs = await getEntry('devkit-docs', 'devkit-overview');
if (!devkitDocs) {
throw new Error('DevKit documentation not found');
}
const { headings, Content } = await render(devkitDocs);
---
<StarlightPage
frontmatter={{
title: 'DevKit Documentation',
description: 'Documentation for the DevKit'
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,36 @@
---
import { getCollection, render } from 'astro:content';
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
export async function getStaticPaths() {
const docs = await getCollection(
'devkit-docs',
// we don't want the overview page, this is custom handled via the index.astro page
(doc) => doc.id !== 'ngcli_adapter-overview' && doc.data.docType === 'ngcli_adapter'
);
return docs.map(doc => ({
params: { name: doc.id.split('ngcli_adapter_')[1] },
props: {
doc
}
}));
}
const { doc, name } = Astro.props;
if (!doc) {
throw new Error(`ngcli_adapter doc not found. ${name}`);
}
const { Content, headings } = await render(doc);
---
<StarlightPage
frontmatter={{
title: doc.data.title
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,21 @@
---
import { getEntry, render, getCollection } from 'astro:content';
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
const doc = await getEntry('devkit-docs', 'ngcli_adapter-overview');
if (!doc) {
throw new Error('angular cli adapter overview doc not found');
}
const { Content, headings } = await render(doc);
---
<StarlightPage
frontmatter={{
title: doc.data.title
}}
headings={headings || []}
>
<Content />
</StarlightPage>
@@ -0,0 +1,88 @@
---
import { getCollection } from 'astro:content';
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import { Card, CardGrid, Badge } from '@astrojs/starlight/components';
// Get all plugin documentation entries
const pluginDocs = await getCollection('plugin-docs');
// Group plugins by plugin name and collect their available doc types
const pluginGroups = new Map();
for (const doc of pluginDocs) {
const { pluginName, packageName, docType, description } = doc.data;
if (!pluginGroups.has(pluginName)) {
pluginGroups.set(pluginName, {
name: pluginName,
packageName,
description,
generators: false,
executors: false,
migrations: false,
totalDocs: 0
});
}
const plugin = pluginGroups.get(pluginName);
plugin[docType] = true;
plugin.totalDocs++;
// Use the first description we find (they should all be the same for the same plugin)
if (!plugin.description && description) {
plugin.description = description;
}
}
// Convert to array and sort alphabetically
const plugins = Array.from(pluginGroups.values()).sort((a, b) => a.name.localeCompare(b.name));
---
<StarlightPage frontmatter={{
title: 'Nx Plugins',
description: 'Discover all available Nx plugins to enhance your development workflow. Each plugin provides generators, executors, and migrations to help you build modern applications.'
}}
>
<CardGrid stagger={true}>
{plugins.map(plugin => (
<Card title={plugin.name} icon="open-book">
<div class="plugin-description">
The Nx Plugin for {plugin.name}
</div>
<div class="plugin-features">
{plugin.generators && <a href={`/api/plugins/${plugin.name}/generators`}>
<Badge variant="default" text="Generators" size="small" />
</a>}
{plugin.executors && <a href={`/api/plugins/${plugin.name}/executors`}>
<Badge variant="default" text="Executors" size="small" />
</a>}
{plugin.migrations && <a href={`/api/plugins/${plugin.name}/migrations`}>
<Badge variant="default" text="Migrations" size="small" />
</a>}
</div>
</Card>
))}
</CardGrid>
<hr />
TODO: add community plugins
</StarlightPage>
<style>
.plugin-features {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
</style>
+11
View File
@@ -0,0 +1,11 @@
---
import { getCollection } from 'astro:content';
const webinars = await getCollection('notifications', item => item.data.type === 'webinar');
webinars.sort((a, b) => {
return new Date(b.data.date).getTime() - new Date(a.data.date).getTime();
});
---
<pre>
{JSON.stringify(webinars, null, 2)}
</pre>
@@ -0,0 +1,203 @@
import type { StarlightPlugin } from '@astrojs/starlight/types';
import { readdirSync, existsSync, readFileSync } from 'fs';
import { join, basename, extname } from 'path';
import { workspaceRoot } from '@nx/devkit';
function getStaticPluginFiles(
pluginDir: string,
workspaceRoot: string
): Array<{ label: string; slug: string }> {
const staticFiles: Array<{ label: string; slug: string }> = [];
const pluginContentDir = join(
workspaceRoot,
'astro-docs',
'src',
'content',
'docs',
'api',
'plugins',
pluginDir
);
if (!existsSync(pluginContentDir)) {
return staticFiles;
}
try {
const files = readdirSync(pluginContentDir, { withFileTypes: true });
for (const file of files) {
if (
file.isFile() &&
(file.name.endsWith('.md') || file.name.endsWith('.mdx'))
) {
const fileName = basename(file.name, extname(file.name));
const label = fileName
.split('-')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
staticFiles.push({
label,
slug: `api/plugins/${pluginDir}/${fileName}`,
});
}
}
} catch (error) {
// Ignore errors when reading static files
}
return staticFiles;
}
export function autoPluginSidebarPlugin(): StarlightPlugin {
return {
name: 'auto-plugin-sidebar',
hooks: {
setup({ config, logger, updateConfig }) {
logger.info('Setting up auto-plugin-sidebar...');
// Get all directories in packages (look in parent directory for actual Nx packages)
const packagesDir = join(workspaceRoot, 'packages');
if (!existsSync(packagesDir)) {
throw new Error('Packages directory does not exist: ' + packagesDir);
}
const pluginItems: Array<{
label: string;
link?: string;
items?: any[];
collapsed?: boolean;
}> = [];
try {
const directories = readdirSync(packagesDir, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name);
for (const dir of directories) {
const packageJsonPath = join(packagesDir, dir, 'package.json');
if (!existsSync(packageJsonPath)) {
logger.warn(
`Skipping ${dir} - package.json not found in ${packagesDir}`
);
continue;
}
const packageJson = JSON.parse(
readFileSync(packageJsonPath, 'utf-8')
);
const packageName = packageJson.name || `@nx/${dir}`;
// Only include @nx scoped packages
if (!packageName.startsWith('@nx/')) {
logger.warn(
`Skipping ${dir} - package name does not start with @nx/`
);
continue;
}
if (packageName === '@nx/devkit') {
// devkit is special handled
continue;
}
const item = generatePluginSideBarConfig(
packagesDir,
dir,
packageName
);
pluginItems.push(item);
}
// Sort plugin items alphabetically
pluginItems.sort((a, b) => a.label.localeCompare(b.label));
logger.info(`Found ${pluginItems.length} plugins`);
// Find the API Reference section in the sidebar
const sidebar = config.sidebar || [];
const apiRefIndex = sidebar.findIndex(
(item) =>
typeof item === 'object' &&
'label' in item &&
item.label === 'References'
);
if (apiRefIndex !== -1) {
const apiRefSection = sidebar[apiRefIndex] as any;
if (apiRefSection.items) {
apiRefSection.items.push(...pluginItems);
updateConfig({ sidebar });
logger.info(
`Successfully added ${pluginItems.length} plugins directly to API Reference`
);
}
}
} catch (error) {
logger.error(`Error generating plugin sidebar: ${error}`);
}
},
},
};
}
function generatePluginSideBarConfig(
packagesDir: string,
dir: string,
packageName: string
) {
const pluginDir = join(packagesDir, dir);
// Check for generators.json, executors.json, and migrations.json
const hasGenerators = existsSync(join(pluginDir, 'generators.json'));
const hasExecutors = existsSync(join(pluginDir, 'executors.json'));
const hasMigrations = existsSync(join(pluginDir, 'migrations.json'));
// Create sub-items for generated docs and static files
const subItems: any[] = [];
if (hasGenerators) {
subItems.push({
label: 'Generators',
link: `/api/plugins/${dir}/generators`,
});
}
if (hasExecutors) {
subItems.push({
label: 'Executors',
link: `/api/plugins/${dir}/executors`,
});
}
if (hasMigrations) {
subItems.push({
label: 'Migrations',
link: `/api/plugins/${dir}/migrations`,
});
}
// Add static markdown files from content/docs/api/plugins/<plugin>/
const staticFiles = getStaticPluginFiles(dir, workspaceRoot);
subItems.push(...staticFiles);
if (subItems.length > 0) {
return {
// make the names pretty for the sidebar
label: packageName.replace('@nx/', ''),
items: subItems,
collapsed: true,
};
}
// If no sub-items, link directly to the plugin overview
return {
// make the names pretty for the sidebar
label: packageName.replace('@nx/', ''),
link: `/api/plugins/${dir}`,
};
}
@@ -0,0 +1,32 @@
import { defineRouteMiddleware } from '@astrojs/starlight/route-data';
import { getCollection } from 'astro:content';
export const onRequest = defineRouteMiddleware(async (context) => {
const { entry } = context.locals.starlightRoute;
if (entry.data.banner) {
return;
}
const bannerContent = await getCollection('notifications');
if (bannerContent.length) {
bannerContent.sort((a, b) =>
new Date(b.data.date) > new Date(a.data.date) ? -1 : 1
);
const nextEventToOccur = bannerContent.at(-1);
if (!nextEventToOccur || !nextEventToOccur.data.title) {
return;
}
const title = nextEventToOccur.data.title.split(':')[0];
// TODO(caleb): based on the 'type' we will render different markup for the banners
// i.e. type=webinar => "Register for the {title} webinar"
// type=event => "Join us for {title} on {date}"
entry.data.banner = {
content: `<a href="${nextEventToOccur.data.registrationUrl}" title="${nextEventToOccur.data.title}">${title}</a>`,
};
}
});

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