diff --git a/docs/blog/2023-04-19-nx-cloud-3.md b/docs/blog/2023-04-19-nx-cloud-3.md index f2e1b9d9bafd9..018d8084ec714 100644 --- a/docs/blog/2023-04-19-nx-cloud-3.md +++ b/docs/blog/2023-04-19-nx-cloud-3.md @@ -119,4 +119,4 @@ In addition, we are actively exploring ways to provide advanced analytics for yo - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-06-29-nx-console-gets-lit.md b/docs/blog/2023-06-29-nx-console-gets-lit.md index 8d4a99a7876b0..96ec5cf578dd5 100644 --- a/docs/blog/2023-06-29-nx-console-gets-lit.md +++ b/docs/blog/2023-06-29-nx-console-gets-lit.md @@ -335,4 +335,4 @@ If the prettier UI and better performance haven’t convinced you, this surely w - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-08-15-qwikify-your-dev.md b/docs/blog/2023-08-15-qwikify-your-dev.md index f9df508ec29d6..9aba2a54f80f4 100644 --- a/docs/blog/2023-08-15-qwikify-your-dev.md +++ b/docs/blog/2023-08-15-qwikify-your-dev.md @@ -608,4 +608,4 @@ This journey through Qwik and Nx demonstrates how thoughtful architecture and th - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-09-25-nx-raises.md b/docs/blog/2023-09-25-nx-raises.md index a29f7f4d8952d..8a6f0f066c71f 100644 --- a/docs/blog/2023-09-25-nx-raises.md +++ b/docs/blog/2023-09-25-nx-raises.md @@ -18,4 +18,4 @@ Victor and I are excited to announce that Nx has raised another $16M in a Series - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-10-13-nx-conf-2023-recap.md b/docs/blog/2023-10-13-nx-conf-2023-recap.md index 7a3727cc69cee..ada78d604202b 100644 --- a/docs/blog/2023-10-13-nx-conf-2023-recap.md +++ b/docs/blog/2023-10-13-nx-conf-2023-recap.md @@ -495,4 +495,4 @@ If you enjoyed these, [subscribe to our YouTube channel](https://www.youtube.com - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-10-20-nx-17-release.md b/docs/blog/2023-10-20-nx-17-release.md index e4766bab4a353..1d80e7f9da118 100644 --- a/docs/blog/2023-10-20-nx-17-release.md +++ b/docs/blog/2023-10-20-nx-17-release.md @@ -284,4 +284,4 @@ That’s all for now folks! We’re just starting up a new iteration of developm - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-11-08-state-management.md b/docs/blog/2023-11-08-state-management.md index 2df57ccf4173b..74036c8193a2d 100644 --- a/docs/blog/2023-11-08-state-management.md +++ b/docs/blog/2023-11-08-state-management.md @@ -621,4 +621,4 @@ Nx is a powerful monorepo tool. Together with Nx and these 2 state management to - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-11-21-ai-assistant.md b/docs/blog/2023-11-21-ai-assistant.md index 4c4ca3f7e8b14..f00472e6dd7c7 100644 --- a/docs/blog/2023-11-21-ai-assistant.md +++ b/docs/blog/2023-11-21-ai-assistant.md @@ -312,4 +312,4 @@ This role, in the context of OpenAI’s chat models, is the response of the AI. - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-12-20-nx-17-2-release.md b/docs/blog/2023-12-20-nx-17-2-release.md index 607b93a4848bd..cd504e6238a75 100644 --- a/docs/blog/2023-12-20-nx-17-2-release.md +++ b/docs/blog/2023-12-20-nx-17-2-release.md @@ -212,4 +212,4 @@ That’s all for now folks! We’re just starting up a new iteration of developm - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2023-12-28-highlights-2023.md b/docs/blog/2023-12-28-highlights-2023.md index 377d1dd8b8c56..ec40ee5467527 100644 --- a/docs/blog/2023-12-28-highlights-2023.md +++ b/docs/blog/2023-12-28-highlights-2023.md @@ -389,4 +389,4 @@ Exciting stuff! So keep an eye on our channels, and subscribe if you haven’t a - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-02-05-nx-18-project-crystal.md b/docs/blog/2024-02-05-nx-18-project-crystal.md index 4ef71e1f37643..fde4b1a5d9615 100644 --- a/docs/blog/2024-02-05-nx-18-project-crystal.md +++ b/docs/blog/2024-02-05-nx-18-project-crystal.md @@ -185,4 +185,4 @@ We just released Project Crystal, so this is just the beginning of it. While we - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-02-07-fast-effortless-ci.md b/docs/blog/2024-02-07-fast-effortless-ci.md index 1b02bf3c4dae7..28228f4c3dd67 100644 --- a/docs/blog/2024-02-07-fast-effortless-ci.md +++ b/docs/blog/2024-02-07-fast-effortless-ci.md @@ -124,4 +124,4 @@ If you have a task that can’t be run on Nx Agents for some reason, you can eas - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-02-09-versioning-and-releasing-packages.md b/docs/blog/2024-02-09-versioning-and-releasing-packages.md index 791b4102beedb..c6ccb756d6eb5 100644 --- a/docs/blog/2024-02-09-versioning-and-releasing-packages.md +++ b/docs/blog/2024-02-09-versioning-and-releasing-packages.md @@ -319,4 +319,4 @@ Here are some example repositories already leveraging Nx release: - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-02-15-launch-week-recap.md b/docs/blog/2024-02-15-launch-week-recap.md index 83551a41ad9c8..70c2fcfeb87d7 100644 --- a/docs/blog/2024-02-15-launch-week-recap.md +++ b/docs/blog/2024-02-15-launch-week-recap.md @@ -145,4 +145,4 @@ That’s all for now folks! We’re just starting up a new iteration of developm - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-04-19-manage-your-gradle.md b/docs/blog/2024-04-19-manage-your-gradle.md index d3740d6212353..74417dcf99911 100644 --- a/docs/blog/2024-04-19-manage-your-gradle.md +++ b/docs/blog/2024-04-19-manage-your-gradle.md @@ -215,4 +215,4 @@ Here is how to set up Nx with the Gradle workspace. Hopefully, this gives you a - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-05-08-nx-19-release.md b/docs/blog/2024-05-08-nx-19-release.md index 60724dd8433f9..85ef137a58d87 100644 --- a/docs/blog/2024-05-08-nx-19-release.md +++ b/docs/blog/2024-05-08-nx-19-release.md @@ -235,4 +235,4 @@ Zack - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-07-29-explain-with-ai.md b/docs/blog/2024-07-29-explain-with-ai.md index 0e535808f6a7c..5f7765e3d8aef 100644 --- a/docs/blog/2024-07-29-explain-with-ai.md +++ b/docs/blog/2024-07-29-explain-with-ai.md @@ -56,4 +56,4 @@ This is just the first of a series of AI-powered features that we're going to be - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-08-01-nx-19-5-update.md b/docs/blog/2024-08-01-nx-19-5-update.md index 0f324f824326c..348b7cf1c1378 100644 --- a/docs/blog/2024-08-01-nx-19-5-update.md +++ b/docs/blog/2024-08-01-nx-19-5-update.md @@ -292,4 +292,4 @@ The [Monorepo World conference](https://monorepo.world) is coming up soon on Oct - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-09-10-personal-access-tokens.md b/docs/blog/2024-09-10-personal-access-tokens.md index d0f35bb519af8..09d2c785bf29c 100644 --- a/docs/blog/2024-09-10-personal-access-tokens.md +++ b/docs/blog/2024-09-10-personal-access-tokens.md @@ -91,4 +91,4 @@ can [find more details in our docs](/ci/recipes/security/personal-access-tokens) - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-09-20-nx-19-8.md b/docs/blog/2024-09-20-nx-19-8.md index 09dc7578ac7ec..13ddaa4da1cb1 100644 --- a/docs/blog/2024-09-20-nx-19-8.md +++ b/docs/blog/2024-09-20-nx-19-8.md @@ -110,4 +110,4 @@ The [Monorepo World conference](https://monorepo.world) is coming up soon on Oct - [Nx GitHub](https://github.com/nrwl/nx) - [Nx Official Discord Server](https://go.nx.dev/community) - [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) -- [Speed up your CI](https://nx.app/) +- [Speed up your CI](/nx-cloud) diff --git a/docs/blog/2024-09-25-evolving-nx.md b/docs/blog/2024-09-25-evolving-nx.md new file mode 100644 index 0000000000000..4e5720f8df385 --- /dev/null +++ b/docs/blog/2024-09-25-evolving-nx.md @@ -0,0 +1,54 @@ +--- +title: Evolving Nx +slug: evolving-nx +authors: [Jeff Cross] +tags: [nx, release] +cover_image: /blog/images/evolving-nx/thumbnail.png +--- + +Over the years, Nx has grown from a small 20% side project of our consulting business into a tool that empowers millions of developers worldwide and helps Fortune 500 companies ship high-quality software faster. In the last two years, we successfully transformed our consulting business into a product company, where our team can fully focus on evolving Nx and building Nx Cloud to extend Nx’s capabilities beyond local development. + +This success is in large part thanks to: + +- Our commitment to building Nx as MIT-licensed open-source software, supported by the incredible contributions from our vibrant Nx community. +- Close collaboration with our customers, allowing us to understand their needs and continuously improve Nx and Nx Cloud to address their demanding and complex challenges. + +When we have new ideas to make Nx better, we’ve always had two options: it could be in the open source build system, or it could be in the paid cloud product, [Nx Cloud](/nx-cloud). But sometimes, there are important things we want to offer that can solve some gnarly problems for teams but don’t require them to spend months convincing their IT department to incorporate yet another cloud service. So, we decided to create a collection of non-cloud-dependent Nx add-ons in a new package called **Nx Powerpack**, which will require paid licenses to use. + +## Introducing Nx Powerpack + +**[Nx Powerpack](/powerpack)** — our newest product designed to elevate the Nx CLI experience for enterprise environments. Powerpack offers advanced features like self-hosted remote cache storage, code ownership for monorepos, and workspace conformance, seamlessly integrating into sealed systems with strict security requirements. It’s also designed for ease of implementation, helping enterprises bypass lengthy procurement processes and quickly access the tools they need. + +> If you want to get into the technical details, we wrote a separate blog post diving deeper into the technical details: [Introducing Nx Powerpack](/blog/introducing-nx-powerpack). + +Everything in Powerpack is new functionality, not previously free features that we’re now putting behind a paywall. However, this change coincides with some Nx improvements that will eventually interfere with users who were relying on our original filesystem-based implementation of local caching. We’ve completely rewritten Nx's local caching to be faster and more secure, partly by using a local database instead of checking the filesystem for artifact metadata. With this rewrite, any custom remote caches that rely on metadata reflected in the filesystem will not work as of Nx 21. This is why we decided to build an API into Powerpack to be able to connect Nx’s cache to different clouds and data sources. Now with Powerpack, teams can use an officially-supported implementation of remote caching, without needing to use Nx Cloud. + +There’s a Steve Jobs quote that I think rings true with all of us at Nx: + +> "I think money is a wonderful thing because it enables you to do things. It enables you to invest in ideas that don't have a short-term payback." - Steve Jobs + +As Nx has grown, we’ve hired more people to make the product better. Naturally, those people want to do good work and be paid. We all show up for work to build things we’re passionate about, and solve real pains for the millions of developers using Nx every day. Money is what enables us to keep doing what we love. So as much as Victor Savkin and I want to just build things and give them away for free, we need to balance our personal passion with what’s the best long-term decisions for Nx — the project, the community, and the company. + +Like many open source projects, one of the bigger challenges to sustainability in recent years has been larger cloud products who wait for projects to become successful, and then try to capitalize on that success at the expense of the maintainers. I call these companies “parasite vendors” since they benefit from the host, but give no value back. To battle this, many open source projects have decided to make their open source licensing more restrictive, or introduce dual licenses, forcing those parasite vendors to work with the maintainers on a fair arrangement. We think we’ve come up with a better solution for the community by introducing a new package, Powerpack, with a new commercial license, with only new functionality. **Nx itself still has one license: the MIT license.** + +![Nx products and their licenses](/blog/images/evolving-nx/nx-products-licenses.avif) + +## How to Get Nx Powerpack + +Powerpack is automatically included for all existing enterprise customers. If you’re looking to purchase a new license, you can easily [do so on this page](/powerpack). + +Are you a startup? If these features make sense for your team but the cost is a concern, reach out to our support team, and we’ll work with you to find a solution that fits. + +## Got Questions? + +If you’re curious to learn more about these changes for Nx and how to get started, [check out our docs](/features/powerpack). + +## Learn more + +- [Nx Powerpack](/powerpack) +- [Blog: Introducing Nx Powerpack](/blog/introducing-nx-powerpack) +- [Docs: Powerpack features](/getting-started/intro) +- [X/Twitter](https://twitter.com/nxdevtools) -- [LinkedIn](https://www.linkedin.com/company/nrwl/) +- [Nx GitHub](https://github.com/nrwl/nx) +- [Nx Official Discord Server](https://go.nx.dev/community) +- [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) diff --git a/docs/blog/2024-09-25-introducing-nx-powerpack.md b/docs/blog/2024-09-25-introducing-nx-powerpack.md new file mode 100644 index 0000000000000..683306ab0514d --- /dev/null +++ b/docs/blog/2024-09-25-introducing-nx-powerpack.md @@ -0,0 +1,252 @@ +--- +title: Introducing Nx Powerpack +slug: introducing-nx-powerpack +authors: [Juri Strumpflohner] +tags: [nx, release] +cover_image: /blog/images/introducing-powerpack/thumbnail.png +youtubeUrl: https://youtu.be/KZ0nh2lj8zE +--- + +Today we're introducing our latest product, **Nx Powerpack**, a suite of paid extensions for Nx, specifically designed around common enterprise needs. Now, before anyone draws the wrong conclusions: + +- No, we’re **not going to restrict Nx’s license**, lock you in, and then harvest. Nx remains MIT licensed and fully open source. +- No, we’re **not placing existing features behind a paywall**. Nx Powerpack introduces new features on top of Nx (more about that below). +- Yes, we still **strongly believe in OSS and our community**, and we will keep improving Nx more than ever; if anything, Powerpack will help us fund our OSS work on Nx core and ensure its long-term sustainability. + +So this leaves us with: +![Nx products and their licenses](/blog/images/evolving-nx/nx-products-licenses.avif) + +> But why do we release Nx Powerpack under a commercial license? Read all about our strategy, the reasoning behind Powerpack and OSS funding in the **blog post from our CEO, Jeff Cross**: [Evolving Nx](/blog/evolving-nx). + +But now to the fun, technical part! Nx Powerpack is a bundle that - in this very first release - comes with three major features: + +- [Codeowners for monorepos](#codeowners-for-monorepos) +- [Self-hosted cache storage](#selfhosted-cache-storage) +- [Workspace conformance (beta)](#workspace-conformance-beta) + +Let’s dive in! + +## Getting an Nx Powerpack license + +All Powerpack features require a dedicated commercial license. You can get one here: [Nx Powerpack](/powerpack). + +Once you have your license, run the following command + +```shell +npx nx activate-powerpack +``` + +## Codeowners for monorepos + +Setting up Codeowners is highly recommended when designing a monorepo. If you’re not closely familiar, Codeowners is a common feature of VCS providers (such as GitHub, GitLab, Bitbucket, etc.), allowing you to enforce specific code reviewers to approve PRs. This functionality is especially important in a monorepo, where you manage multiple projects with multiple teams. You want to ensure the right people are reviewing the code being submitted. + +Here’s a simple example of a [GitHub CODEOWNERS definition](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners): + +```plain {% fileName=".github/CODEOWNERS" %} +/docs/ @doc-owner +/apps/orders @orders-team +/apps/products @products-team +/libs/orders/** @orders-team +/libs/products/** @products-team +/libs/shared/** @infra-team +``` + +One of the downsides of how codeowners works on today's VCS providers is that **they are folder-based**. That requires you to map your project paths to your codeowner files and keep maintaining that as you change your monorepo structure. And **this is exactly what we're going to automate**. + +In a monorepo you reason based on projects. That's what you pass to your [Nx run commands](/features/run-tasks), what you see on the [project graph](/features/explore-graph) and also where owners should be defined. To get started install the Codeowners Powerpack plugin: + +```shell +npx nx add @nx/powerpack-owners +``` + +This will allow you to define an owners section in your `nx.json` where you can define owners at the project level or even leveraging project tags. Here's a small example: + +```json {% fileName="nx.json" %} +{ + ... + "owners": { + "format": "github", + "patterns": [ + { + "description": "CI configuration", + "owners": ["@devops"], + "files": [".github/workflows/**"] + }, + { + "description": "Order team", + "owners": ["@team-orders"], + "projects": ["tag:scope:orders"] + }, + { + "description": "Product team", + "owners": ["@team-products"], + "projects": ["tag:scope:products"] + }, + { + "description": "Design team", + "owners": ["@team-design"], + "projects": ["tag:scope:design-system"] + } + ] + }, + ... +} +``` + +A dedicated `nx sync` command automatically synchronizes such definition to a `CODEOWNERS` that matches your VCS provider: + +```{% fileName=".github/CODEOWNERS" %} + +# CI configuration +.github/workflows/** @devops + +# Design team +/libs/shared/ui/angular/form-controls/ @team-design + +# Design team +/libs/shared/ui/react/form-controls/ @team-design + +# Product team +/libs/products/feat-product-detail/ @team-products + +# Order team +/libs/orders/feat-current-orders/ @team-orders + +... +``` + +Read all about how to [configure Codeowners for your project on our docs](/features/powerpack/owners). + +## Self-hosted cache storage + +A continuous effort on our Nx core is to improve speed. Last year, we began **rewriting performance-critical parts of Nx into Rust**, and more core components are being rewritten. As part of this effort, we also changed how we manage local cache, moving from a **file-based to a database-based approach**. In addition to small performance gains from reduced I/O, this opens up many opportunities for improving local cache handling, such as keeping only relevant cache based on usage, more easily controlling maximum cache size, and optimizing task orchestration by running failed tasks earlier. + +As part of this new approach we're also going to [deprecate custom `taskRunners`](/deprecated/custom-task-runners) in Nx 20. I bring this up because it might affect users that relied on 3rd party tools that hooked into the task runners API. + +To fill in on the custom task runner API we're providing a new Powerpack plugin that allows you to use S3 or a network drive as your storing mechanism for your Nx cache. + +Here's an example on how to get started with AWS S3 based remote caching. First add the powerpack plugin: + +```shell +npx nx add @nx/powerpack-s3-cache +``` + +This will update your `nx.json` to add the new `cache` section. + +```json {% fileName="nx.json" %} +{ + ... + "s3": { + "bucket": "your-s3-bucket-name", + "region": "us-east-1" + } +} +``` + +To then leverage the S3 powered remote cache on CI, [follow the official AWS documentation](https://github.com/aws-actions/configure-aws-credentials). Here's a short example snippet using OIDC to authenticate with AWS on GitHub Actions: + +```yaml {% fileName=".github/workflows/ci.yml" %} +name: CI +... +permissions: + id-token: write + ... + +env: + NX_DB_CACHE: true + +jobs: + main: + runs-on: ubuntu-latest + steps: + ... + + - name: 'Configure AWS Credentials' + uses: aws-actions/configure-aws-credentials@v4.0.2 + with: + role-to-assume: arn:aws:iam::123456789123:role/GhAIBucketUserRole + aws-region: us-east-1 + + ... + + - run: pnpm exec nx affected -t lint test build +``` + +Similarly you can **set up network file based caching** using the `nx add @nx/powerpack-shared-fs-cache` package and by setting the `cacheDirectory` path in your `nx.json`. + +Read all about how to [set up S3 or network drive based caching for your Nx workspace on our docs](/features/powerpack/custom-caching). + +## Workspace conformance (Beta) + +We're releasing the `@nx/powerpack-conformance` plugin in an early preview. This new package focuses specifically on the maintainability of your monorepo. It allows you to encode your organization's standards so they can be enforced automatically. In this first version, the workspace conformance package ships with: + +- [Enforce Module Boundaries](/nx-api/powerpack-conformance#enforce-module-boundaries): Similar to the Nx ESLint [Enforce Module Boundaries rule](https://nx-dev-git-docs-powerpack-nrwl.vercel.app/features/enforce-module-boundaries), but enforces boundaries on every project dependency, not just those created from TypeScript imports or `package.json` dependencies. +- [Ensure Owners](/nx-api/powerpack-conformance#ensure-owners): Requires every project to have an owner defined for the `@nx/powerpack-owners` plugin. + +To get started, install the following package: + +```shell +npx nx add @nx/powerpack-conformance +``` + +This allows you to define conformance rules in your `nx.json`. Here is an example: + +```json {% fileName="nx.json" %} +{ + ... + "conformance": { + "rules": [ + { + "rule": "@nx/powerpack-conformance/enforce-module-boundaries", + "projects": ["!remix-app-e2e"], + "options": {} + }, + { + "rule": "@nx/powerpack-conformance/ensure-owners", + "projects": ["!remix-app-e2e"] + }, + { + "rule": "./tools/local-conformance-rule.ts" + } + ] + } +} +``` + +You can also define rules locally, as shown in the example above, which are simple TypeScript files: + +```ts +import { createConformanceRule } from '@nx/powerpack-conformance'; + +const rule = createConformanceRule({ + name: 'local-conformance-rule-example', + category: 'security', + reporter: 'project-reporter', + implementation: async (context) => { + return { + severity: 'low', + details: { + violations: [], + }, + }; + }, +}); + +export default rule; +``` + +You can then run `nx conformance` to execute the conformance checks: + +![Screenshot of the conformance check output](/blog/images/introducing-powerpack/conformance-check.avif) + +In this first preview release, you'll only be able to run workspace conformance rules on a single workspace. In future iterations, you **will be able to connect it to your existing Nx Cloud organization**, allowing you to upload conformance rules and run them across connected workspaces. + +Read all the details on how to [get started with workspace conformance rules in our docs](/features/powerpack/conformance). + +## Learn more + +- [Nx Docs](/getting-started/intro) +- [X/Twitter](https://twitter.com/nxdevtools) -- [LinkedIn](https://www.linkedin.com/company/nrwl/) +- [Nx GitHub](https://github.com/nrwl/nx) +- [Nx Official Discord Server](https://go.nx.dev/community) +- [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) diff --git a/docs/blog/images/evolving-nx/nx-products-licenses.avif b/docs/blog/images/evolving-nx/nx-products-licenses.avif new file mode 100644 index 0000000000000..f3a8604f8d507 Binary files /dev/null and b/docs/blog/images/evolving-nx/nx-products-licenses.avif differ diff --git a/docs/blog/images/evolving-nx/thumbnail.png b/docs/blog/images/evolving-nx/thumbnail.png new file mode 100644 index 0000000000000..d53c0b963b40a Binary files /dev/null and b/docs/blog/images/evolving-nx/thumbnail.png differ diff --git a/docs/blog/images/introducing-powerpack/conformance-check.avif b/docs/blog/images/introducing-powerpack/conformance-check.avif new file mode 100644 index 0000000000000..0572bd036e257 Binary files /dev/null and b/docs/blog/images/introducing-powerpack/conformance-check.avif differ diff --git a/docs/blog/images/introducing-powerpack/thumbnail.png b/docs/blog/images/introducing-powerpack/thumbnail.png new file mode 100644 index 0000000000000..058f5805a822f Binary files /dev/null and b/docs/blog/images/introducing-powerpack/thumbnail.png differ diff --git a/nx-dev/nx-dev/app/powerpack/page.tsx b/nx-dev/nx-dev/app/powerpack/page.tsx new file mode 100644 index 0000000000000..6fb333d71a9e9 --- /dev/null +++ b/nx-dev/nx-dev/app/powerpack/page.tsx @@ -0,0 +1,52 @@ +import { DefaultLayout } from '@nx/nx-dev/ui-common'; +import { + CallToAction, + GetStarted, + Hero, + PowerpackFeatures, +} from '@nx/nx-dev/ui-powerpack'; + +import type { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Nx PowerPack', + description: + 'Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.', + openGraph: { + url: 'https://nx.dev/powerpack', + title: 'Nx PowerPack', + description: + 'Nx Powerpack is a suite of paid extensions for the Nx CLI specifically designed for enterprises.', + images: [ + { + url: 'https://nx.dev/socials/nx-powerpack-media.png', + width: 800, + height: 421, + alt: 'Nx PowerPack: Advanced tools for enterprises', + type: 'image/jpeg', + }, + ], + siteName: 'NxDev', + type: 'website', + }, +}; + +export default function NxPowerPackPage(): JSX.Element { + return ( + + + +
+ +
+ +
+ +
+ +
+ +
+
+ ); +} diff --git a/nx-dev/ui-animations/src/index.ts b/nx-dev/ui-animations/src/index.ts index eaa9db921885a..9cd2a0fbed3be 100644 --- a/nx-dev/ui-animations/src/index.ts +++ b/nx-dev/ui-animations/src/index.ts @@ -1,3 +1,4 @@ +export * from './lib/animated-beam'; export * from './lib/animate-value'; export * from './lib/blur-fade'; export * from './lib/fit-text'; diff --git a/nx-dev/ui-animations/src/lib/animated-beam.tsx b/nx-dev/ui-animations/src/lib/animated-beam.tsx new file mode 100644 index 0000000000000..e4ee814875d53 --- /dev/null +++ b/nx-dev/ui-animations/src/lib/animated-beam.tsx @@ -0,0 +1,371 @@ +'use client'; +import { FC, RefObject, useEffect, useId, useState } from 'react'; +import { motion, TargetAndTransition } from 'framer-motion'; +import { cx } from '@nx/nx-dev/ui-primitives'; + +export interface AnimatedCurvedBeamProps { + className?: string; + containerRef: RefObject; // Container ref + fromRef: RefObject; + toRef: RefObject; + curvature?: number; + reverse?: boolean; + pathColor?: string; + pathWidth?: number; + pathOpacity?: number; + gradientStartColor?: string; + gradientStopColor?: string; + delay?: number; + duration?: number; + startXOffset?: number; + startYOffset?: number; + endXOffset?: number; + endYOffset?: number; + bidirectional?: boolean; +} + +type BeamAnimation = { + x1: [string, string]; + x2: [string, string]; + y1: [string, string]; + y2: [string, string]; +}; + +export const AnimatedCurvedBeam: FC = ({ + className, + containerRef, + fromRef, + toRef, + curvature = 0, + reverse = false, // Include the reverse prop + duration = Math.random() * 3 + 8, + delay = 0, + pathColor = 'gray', + pathWidth = 2, + pathOpacity = 0.2, + gradientStartColor = '#ffaa40', + gradientStopColor = '#9c40ff', + startXOffset = 0, + startYOffset = 0, + endXOffset = 0, + endYOffset = 0, + bidirectional = false, +}) => { + const id = useId(); + const [pathD, setPathD] = useState(''); + const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 }); + + // Calculate the gradient coordinates based on the reverse prop + const forwardAnimation: BeamAnimation = { + x1: reverse ? ['90%', '-10%'] : ['10%', '110%'], + x2: reverse ? ['100%', '0%'] : ['0%', '100%'], + y1: ['0%', '0%'], + y2: ['0%', '0%'], + }; + + const backwardAnimation: BeamAnimation = { + x1: reverse ? ['-10%', '90%'] : ['110%', '10%'], + x2: reverse ? ['0%', '100%'] : ['100%', '0%'], + y1: ['0%', '0%'], + y2: ['0%', '0%'], + }; + + const animateValue: TargetAndTransition = bidirectional + ? { + x1: [ + forwardAnimation.x1[0], + forwardAnimation.x1[1], + backwardAnimation.x1[1], + backwardAnimation.x1[0], + ], + x2: [ + forwardAnimation.x2[0], + forwardAnimation.x2[1], + backwardAnimation.x2[1], + backwardAnimation.x2[0], + ], + y1: ['0%', '0%', '0%', '0%'], + y2: ['0%', '0%', '0%', '0%'], + } + : forwardAnimation; + + useEffect(() => { + const updatePath = () => { + if (containerRef.current && fromRef.current && toRef.current) { + const containerRect = containerRef.current.getBoundingClientRect(); + const rectA = fromRef.current.getBoundingClientRect(); + const rectB = toRef.current.getBoundingClientRect(); + + const svgWidth = containerRect.width; + const svgHeight = containerRect.height; + setSvgDimensions({ width: svgWidth, height: svgHeight }); + + const startX = + rectA.left - containerRect.left + rectA.width / 2 + startXOffset; + const startY = + rectA.top - containerRect.top + rectA.height / 2 + startYOffset; + const endX = + rectB.left - containerRect.left + rectB.width / 2 + endXOffset; + const endY = + rectB.top - containerRect.top + rectB.height / 2 + endYOffset; + + const controlY = startY - curvature; + const d = `M ${startX},${startY} Q ${ + (startX + endX) / 2 + },${controlY} ${endX},${endY}`; + setPathD(d); + } + }; + + // Initialize ResizeObserver + const resizeObserver = new ResizeObserver((entries) => { + // For all entries, recalculate the path + for (let entry of entries) { + updatePath(); + } + }); + + // Observe the container element + if (containerRef.current) { + resizeObserver.observe(containerRef.current); + } + + // Call the updatePath initially to set the initial path + updatePath(); + + // Clean up the observer on component unmount + return () => { + resizeObserver.disconnect(); + }; + }, [ + containerRef, + fromRef, + toRef, + curvature, + startXOffset, + startYOffset, + endXOffset, + endYOffset, + ]); + + return ( + + + + + + + + + + + + + ); +}; + +export interface AnimatedAngledBeamProps { + className?: string; + containerRef: RefObject; + fromRef: RefObject; + toRef: RefObject; + reverse?: boolean; + pathColor?: string; + pathWidth?: number; + pathOpacity?: number; + gradientStartColor?: string; + gradientStopColor?: string; + delay?: number; + duration?: number; + startXOffset?: number; + startYOffset?: number; + endXOffset?: number; + endYOffset?: number; + bidirectional?: boolean; +} + +export const AnimatedAngledBeam: FC = ({ + className, + containerRef, + fromRef, + toRef, + reverse = false, + duration = Math.random() * 3 + 8, + delay = 0, + pathColor = '#cbd5e1', + pathWidth = 2, + pathOpacity = 1, + gradientStartColor = '#ffaa40', + gradientStopColor = '#9c40ff', + startXOffset = 0, + startYOffset = 0, + endXOffset = 0, + endYOffset = 0, + bidirectional = false, +}) => { + const id = useId(); + const [pathD, setPathD] = useState(''); + const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 }); + const [totalLength, setTotalLength] = useState(0); + + useEffect(() => { + const updatePath = () => { + if (containerRef.current && fromRef.current && toRef.current) { + const containerRect = containerRef.current.getBoundingClientRect(); + const fromRect = fromRef.current.getBoundingClientRect(); + const toRect = toRef.current.getBoundingClientRect(); + + const svgWidth = containerRect.width; + const svgHeight = containerRect.height; + setSvgDimensions({ width: svgWidth, height: svgHeight }); + + const startX = + fromRect.left - + containerRect.left + + fromRect.width / 2 + + startXOffset; + const startY = + fromRect.top - containerRect.top + fromRect.height / 2 + startYOffset; + const endX = + toRect.left - containerRect.left + toRect.width / 2 + endXOffset; + const endY = + toRect.top - containerRect.top + toRect.height / 2 + endYOffset; + + // Create a path with 90-degree angles + const midY = (startY + endY) / 2; + const d = `M ${startX},${startY} V ${midY} H ${endX} V ${endY}`; + setPathD(d); + + // Calculate total length of the path + const tempPath = document.createElementNS( + 'http://www.w3.org/2000/svg', + 'path' + ); + tempPath.setAttribute('d', d); + setTotalLength(tempPath.getTotalLength()); + } + }; + + const resizeObserver = new ResizeObserver((entries) => { + for (let entry of entries) { + updatePath(); + } + }); + + if (containerRef.current) { + resizeObserver.observe(containerRef.current); + } + + updatePath(); + + return () => { + resizeObserver.disconnect(); + }; + }, [ + containerRef, + fromRef, + toRef, + startXOffset, + startYOffset, + endXOffset, + endYOffset, + ]); + + return ( + + + + + + + + + + + + + + + ); +}; diff --git a/nx-dev/ui-common/src/index.ts b/nx-dev/ui-common/src/index.ts index 545e0c5944c0f..2c25a2dc46867 100644 --- a/nx-dev/ui-common/src/index.ts +++ b/nx-dev/ui-common/src/index.ts @@ -27,7 +27,7 @@ export { resourceMenuItems } from './lib/headers/menu-items'; export { solutionsMenuItems } from './lib/headers/menu-items'; export { eventItems } from './lib/headers/menu-items'; export { learnItems } from './lib/headers/menu-items'; -export { plans } from './lib/headers/menu-items'; +export { solutions as plans } from './lib/headers/menu-items'; export { featuresItems } from './lib/headers/menu-items'; export { DefaultMenuItem } from './lib/headers/default-menu-item'; export { MobileMenuItem } from './lib/headers/mobile-menu-item'; diff --git a/nx-dev/ui-common/src/lib/default-layout.tsx b/nx-dev/ui-common/src/lib/default-layout.tsx index c8c5cd40bba0e..2f3c27c3a5ca6 100644 --- a/nx-dev/ui-common/src/lib/default-layout.tsx +++ b/nx-dev/ui-common/src/lib/default-layout.tsx @@ -8,7 +8,7 @@ export function DefaultLayout({ children, }: { isHome?: boolean } & PropsWithChildren): JSX.Element { return ( -
+
- {plans.map((item) => ( + {solutions.map((item) => ( > = (props) => ( + + Amazon S3 + + +); diff --git a/nx-dev/ui-powerpack/.eslintrc.json b/nx-dev/ui-powerpack/.eslintrc.json new file mode 100644 index 0000000000000..a39ac5d057803 --- /dev/null +++ b/nx-dev/ui-powerpack/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nx/react", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/nx-dev/ui-powerpack/README.md b/nx-dev/ui-powerpack/README.md new file mode 100644 index 0000000000000..91a2beb481ace --- /dev/null +++ b/nx-dev/ui-powerpack/README.md @@ -0,0 +1,7 @@ +# ui-powerpack + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test ui-powerpack` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/nx-dev/ui-powerpack/project.json b/nx-dev/ui-powerpack/project.json new file mode 100644 index 0000000000000..d40d751599ef4 --- /dev/null +++ b/nx-dev/ui-powerpack/project.json @@ -0,0 +1,9 @@ +{ + "name": "ui-powerpack", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "nx-dev/ui-powerpack/src", + "projectType": "library", + "tags": [], + "// targets": "to see all targets run: nx show project ui-powerpack --web", + "targets": {} +} diff --git a/nx-dev/ui-powerpack/src/index.ts b/nx-dev/ui-powerpack/src/index.ts new file mode 100644 index 0000000000000..7dfdd8321a597 --- /dev/null +++ b/nx-dev/ui-powerpack/src/index.ts @@ -0,0 +1,7 @@ +// Use this file to export React client components (e.g. those with 'use client' directive) or other non-server utilities + +export * from './lib/hero'; +export * from './lib/powerpack-features'; +export * from './lib/get-started'; +export * from './lib/powerpack-pricing'; +export * from './lib/call-to-action'; diff --git a/nx-dev/ui-powerpack/src/lib/call-to-action.tsx b/nx-dev/ui-powerpack/src/lib/call-to-action.tsx new file mode 100644 index 0000000000000..4cd6032a5a59b --- /dev/null +++ b/nx-dev/ui-powerpack/src/lib/call-to-action.tsx @@ -0,0 +1,85 @@ +import Link from 'next/link'; +import { ReactElement } from 'react'; + +export function CallToAction(): ReactElement { + return ( +
+ +
+ ); +} diff --git a/nx-dev/ui-powerpack/src/lib/get-started.tsx b/nx-dev/ui-powerpack/src/lib/get-started.tsx new file mode 100644 index 0000000000000..f4379e21bbe56 --- /dev/null +++ b/nx-dev/ui-powerpack/src/lib/get-started.tsx @@ -0,0 +1,172 @@ +import { SectionHeading, TextLink } from '@nx/nx-dev/ui-common'; +import { ReactElement } from 'react'; +import { TerminalOutput } from '@nx/nx-dev/ui-fence'; +import { PowerpackPricing } from './powerpack-pricing'; + +export function GetStarted(): ReactElement { + return ( +
+
+
+ + Premium features,
carefully crafted DX +
+ + Expand you capabilities with Nx Powerpack,
a suite of + advanced tools designed for enterprises. +
+
+ +
+ + +
+
+
+ + 1 + +
+
+

+ Buy an Nx Powerpack license +

+

+ Select between monthly payments or a one-time annual fee for + your license. +

+
+ +
+
+
+
+
+ + 2 + +
+
+

+ Activate Nx Powerpack right from your terminal +

+

+ In your Nx workspace, run the following command to activate + your new license. +

+
+ +
+
+
+
+
+ + 3 + +
+
+

+ Install Powerpack plugins +

+

+ Install Powerpack plugins such as{' '} + + Self-hosted cache storage + + ,{' '} + + workspace conformance + + , and{' '} + + Codeowners for monorepos + + . +

+
+
+
+
+
+
+ ); +} diff --git a/nx-dev/ui-powerpack/src/lib/hero.tsx b/nx-dev/ui-powerpack/src/lib/hero.tsx new file mode 100644 index 0000000000000..8a6469ab1dbd4 --- /dev/null +++ b/nx-dev/ui-powerpack/src/lib/hero.tsx @@ -0,0 +1,29 @@ +'use client'; +import { ButtonLink, SectionHeading, Strong } from '@nx/nx-dev/ui-common'; +import { ReactElement } from 'react'; + +export function Hero(): ReactElement { + return ( +
+
+ + Nx Powerpack + + + A suite of paid extensions for the Nx CLI specifically designed for + enterprises, built and supported by the Nx core team. + +
+ + Get Powerpack + +
+
+
+ ); +} diff --git a/nx-dev/ui-powerpack/src/lib/powerpack-features.tsx b/nx-dev/ui-powerpack/src/lib/powerpack-features.tsx new file mode 100644 index 0000000000000..ef0ed11ec4409 --- /dev/null +++ b/nx-dev/ui-powerpack/src/lib/powerpack-features.tsx @@ -0,0 +1,262 @@ +'use client'; +import { forwardRef, ReactElement, ReactNode, useRef } from 'react'; +import { ButtonLink, SectionHeading, Strong } from '@nx/nx-dev/ui-common'; +import { cx } from '@nx/nx-dev/ui-primitives'; +import { AnimatedAngledBeam } from '@nx/nx-dev/ui-animations'; +import { + CalendarDaysIcon, + CircleStackIcon, + ServerIcon, +} from '@heroicons/react/24/outline'; +import { NxIcon } from '@nx/nx-dev/ui-icons'; + +export function PowerpackFeatures(): ReactElement { + return ( +
+
+
+
+
+ + Self-hosted cache storage + +

+ Nx Powerpack enables you to use AWS S3 or a{' '} + shared network drive as your remote cache + storage, offering a flexible, self-managed solution for faster + builds. +

+
+ + Learn more about self-hosted cache storage + +
+
+
+ +
+
+ +
+
+ + Codeowners for monorepos + +

+ Common VCS providers require folder-based ownership definitions. + Now, define and manage ownership where it matters— + at the project level +

+

+ Nx Powerpack codeowners bridges this gap by{' '} + + automatically tracking changes and syncing ownership data + {' '} + with GitHub, GitLab, or Bitbucket-specific CODEOWNERS files. + This ensures clear responsibilities and enables efficient + collaboration across large-scale projects. +

+
+
+ + Learn more about codeowners + +
+
+
+
+ + Workspace conformance + +

+ Ensuring consistent code quality and long-term maintainability + across large teams is critical. Nx Powerpack allows you to{' '} + + define and run conformance rules throughout your workspace + + , leverage built-in rules or{' '} + + create your own to ensure compliance with organizational + standards. + +

+

+ With Nx Cloud Enterprise Edition, you can{' '} + + upload your custom rules to your Nx Cloud organization + {' '} + and automatically enforce them across multiple repositories and + workspaces, regardless of your tech stack. +

+
+
+ + Learn how to use conformance rules + +
+
+
+
+ +
+ ); +} + +const Card = forwardRef< + HTMLDivElement, + { className?: string; children?: ReactNode } +>(({ className, children }, ref) => { + return ( +
+ {children} +
+ ); +}); + +Card.displayName = 'Card'; + +export function CustomRemoteCacheAnimation(): ReactElement { + const containerRef = useRef(null); + const gitHubRef = useRef(null); + const gitlabRef = useRef(null); + const nxRef = useRef(null); + const computerRef = useRef(null); + + return ( +
+
+
+ + +
+
+ +
+ AWS +
+
S3
+ + + Get started + +
+ +
+ Network drive +
+
+ +
+ More soon! +
+
+ + + + +
+ ); +} diff --git a/nx-dev/ui-powerpack/src/lib/powerpack-pricing.tsx b/nx-dev/ui-powerpack/src/lib/powerpack-pricing.tsx new file mode 100644 index 0000000000000..d0f13655f9af2 --- /dev/null +++ b/nx-dev/ui-powerpack/src/lib/powerpack-pricing.tsx @@ -0,0 +1,74 @@ +'use client'; +import { ArrowRightIcon } from '@heroicons/react/24/outline'; +import { ButtonLink } from '@nx/nx-dev/ui-common'; + +export function PowerpackPricing() { + return ( + + ); +} diff --git a/nx-dev/ui-powerpack/src/server.ts b/nx-dev/ui-powerpack/src/server.ts new file mode 100644 index 0000000000000..d24a65c5aee62 --- /dev/null +++ b/nx-dev/ui-powerpack/src/server.ts @@ -0,0 +1 @@ +// Use this file to export React server components diff --git a/nx-dev/ui-powerpack/tsconfig.json b/nx-dev/ui-powerpack/tsconfig.json new file mode 100644 index 0000000000000..95cfeb243dd57 --- /dev/null +++ b/nx-dev/ui-powerpack/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ], + "extends": "../../tsconfig.base.json" +} diff --git a/nx-dev/ui-powerpack/tsconfig.lib.json b/nx-dev/ui-powerpack/tsconfig.lib.json new file mode 100644 index 0000000000000..578a3fb7dd757 --- /dev/null +++ b/nx-dev/ui-powerpack/tsconfig.lib.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [ + "node", + "@nx/react/typings/cssmodule.d.ts", + "@nx/react/typings/image.d.ts" + ] + }, + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.spec.tsx", + "src/**/*.test.tsx", + "src/**/*.spec.js", + "src/**/*.test.js", + "src/**/*.spec.jsx", + "src/**/*.test.jsx" + ], + "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] +} diff --git a/nx.json b/nx.json index 3b26ecd70e65c..b41ef6b8444aa 100644 --- a/nx.json +++ b/nx.json @@ -234,6 +234,15 @@ "targetName": "e2e-macos-local", "ciTargetName": "e2e-macos-ci" } + }, + { + "plugin": "@nx/next/plugin", + "options": { + "startTargetName": "next:start", + "buildTargetName": "next:build", + "devTargetName": "dev", + "serveStaticTargetName": "serve-static" + } } ], "nxCloudId": "62d013ea0852fe0a2df74438", @@ -241,5 +250,10 @@ "parallel": 1, "cacheDirectory": "/tmp/nx-cache", "bust": 8, - "defaultBase": "master" + "defaultBase": "master", + "generators": { + "@nx/react": { + "library": {} + } + } } diff --git a/tsconfig.base.json b/tsconfig.base.json index 66ff46902c8b9..cf6f3a655e619 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -108,6 +108,7 @@ "@nx/nx-dev/ui-markdoc": ["nx-dev/ui-markdoc/src/index.ts"], "@nx/nx-dev/ui-member-card": ["nx-dev/ui-member-card/src/index.ts"], "@nx/nx-dev/ui-podcast": ["nx-dev/ui-podcast/src/index.ts"], + "@nx/nx-dev/ui-powerpack": ["nx-dev/ui-powerpack/src/index.ts"], "@nx/nx-dev/ui-pricing": ["nx-dev/ui-pricing/src/index.ts"], "@nx/nx-dev/ui-primitives": ["nx-dev/ui-primitives/src/index.ts"], "@nx/nx-dev/ui-references": ["nx-dev/ui-references/src/index.ts"],