Benjamin Cabanes abd40db6bf
docs(nx-dev): remove deprecated RFC references & update link (#30849)
Removed outdated references to RFC #30548 in FAQ and remote cache solutions components. Updated the link to point to the relevant documentation on building a custom caching server.
2025-04-24 14:44:49 +00:00

206 lines
9.1 KiB
TypeScript

'use client';
import {
Disclosure,
DisclosureButton,
DisclosurePanel,
Transition,
} from '@headlessui/react';
import { ChevronDownIcon } from '@heroicons/react/24/outline';
import { SectionHeading, Strong } from '@nx/nx-dev/ui-common';
import { cx } from '@nx/nx-dev/ui-primitives';
import { FAQPageJsonLd } from 'next-seo';
import Link from 'next/link';
import { ReactElement } from 'react';
export function Faq(): ReactElement {
const faqs = [
{
question: 'How is a key different than the license?',
answerJson:
'Unlike a license, which outlined a commercial relationship between the code consumer and us, the key simply provides a free mechanism for us to gather insights into how our tools are used.',
answerUi: (
<p>
Unlike a license, which outlined a commercial relationship between the
code consumer and us, the key simply provides a free mechanism for us
to gather insights into how our tools are used.
</p>
),
},
{
question:
'I was using custom runners or a DIY self-hosted caching solution. What should I do?',
answerJson:
"It's important to note that not all custom task runner use-cases were caching related. If you want to execute some code before or after tasks are executed, we have a new API for you to leverage which is documented here: https://nx.dev/deprecated/custom-tasks-runner#deprecating-custom-tasks-runner.\n If you were leveraging the custom tasks runners API to facilitate remote caching then you now have the choice between the three remote caching options outlined on this page: Nx Cloud, Self-Hosted via Nx Plugins, and Self-Hosted via your own OpenAPI server.",
answerUi: (
<>
<p>
It's important to note that not all custom task runner use-cases
were caching related. If you want to execute some code before or
after tasks are executed, we have a new API for you to leverage
which is{' '}
<Link
href="/deprecated/custom-tasks-runner#deprecating-custom-tasks-runner"
title="See documentation"
className="font-semibold"
>
documented here.
</Link>
</p>
<p>
If you were leveraging the custom tasks runners API to facilitate
remote caching then you now have the choice between the three remote
caching options outlined on this page: Nx Cloud, Self-Hosted via Nx
Plugins, and Self-Hosted via your own OpenAPI server.
</p>
</>
),
},
{
question:
'How do I implement custom authentication for my self-hosted cache?',
answerJson:
'You implement custom authentication by using our OpenAPI solution',
answerUi: (
<p>
We have an OpenAPI spec to implement your own remote caching server,
thus giving you the flexibility to adapt it to your custom
authentication requirements.{' '}
<Link
href="/recipes/running-tasks/self-hosted-caching#build-your-own-caching-server"
title="Learn more"
className="font-semibold"
>
Learn more here.
</Link>
</p>
),
},
{
question:
'What security measures does Nx Cloud offer beyond the official plugins and third party plugins?',
answerJson:
'Nx Cloud includes enterprise-grade security features designed to give organizations more control over access and data protection:\n\n' +
'- Access Management: Nx Cloud supports **individual user authentication tied to personal accounts, enabling precise control over who can access cached data. If a user leaves the company or changes roles, their access can be revoked immediately without impacting others.\n' +
'- Personal Access Tokens: Teams can issue and revoke multiple access tokens, allowing fine-grained control over automation and integrations.\n' +
'- No Cache Overrides: Nx Cloud prevents unauthorized cache modifications.\n' +
'- SOC 2 Compliance: Nx Cloud is SOC 2 certified, demonstrating a high standard for security, availability, and confidentiality.\n' +
'- Secure Deployment Options: Nx Cloud though Nx Enterprise, includes single-tenant or on-prem options for teams needing full control over their data storage and access policies.',
answerUi: (
<>
<p>
Nx Cloud includes{' '}
<Strong>enterprise-grade security features</Strong> designed to give
organizations more control over access and data protection.
</p>
<ul className="mt-4 list-disc space-y-2 px-4">
<li>
<Strong>Access Management</Strong>: Nx Cloud supports{' '}
<Strong>individual user authentication</Strong> tied to personal
accounts, enabling precise control over who can access cached
data. If a user leaves the company or changes roles, their access
can be revoked immediately — without impacting others.
</li>
<li>
<Strong>Personal Access Tokens</Strong>: Teams can issue and
revoke multiple access tokens, allowing fine-grained control over
automation and integrations.
</li>
<li>
<Strong>No Cache Overrides</Strong>: Nx Cloud prevents
unauthorized cache modifications.
</li>
<li>
<Strong>SOC 2 Compliance</Strong>: Nx Cloud is SOC 2 certified,
demonstrating a high standard for security, availability, and
confidentiality.
</li>
<li>
<Strong>Secure Deployment Options</Strong>: Nx Cloud though{' '}
<Strong>Nx Enterprise</Strong>, includes{' '}
<Strong>single-tenant or on-prem options</Strong> for teams
needing full control over their data storage and access policies.
</li>
</ul>
</>
),
},
];
return (
<section id="faq" className="scroll-mt-24">
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<div className="lg:grid lg:grid-cols-3 lg:gap-8">
<header>
<SectionHeading as="h2" variant="title">
Have questions?
</SectionHeading>
<SectionHeading as="p" variant="subtitle" className="mt-6">
Check out our most commonly asked questions.
</SectionHeading>
<p className="text-md mt-4 text-slate-400 dark:text-slate-600">
<Link
href="/contact"
title="Reach out to the team"
className="font-semibold"
>
Can't find the answer you're looking for?
</Link>
</p>
</header>
<FAQPageJsonLd
useAppDir={true}
mainEntity={faqs.map((faq) => ({
questionName: faq.question,
acceptedAnswerText: faq.answerJson,
}))}
/>
<div className="mt-12 lg:col-span-2 lg:mt-0">
<dl className="mt-6 space-y-6 divide-y divide-slate-100 dark:divide-slate-800">
{faqs.map((faq) => (
<Disclosure as="div" key={faq.question} className="pt-6">
{({ open }) => (
<>
<dt className="text-lg">
<DisclosureButton className="flex w-full items-start justify-between text-left text-slate-400">
<span className="font-medium text-slate-800 dark:text-slate-300">
{faq.question}
</span>
<span className="ml-6 flex h-7 items-center">
<ChevronDownIcon
className={cx(
open ? '-rotate-180' : 'rotate-0',
'h-6 w-6 transform transition-transform'
)}
aria-hidden="true"
/>
</span>
</DisclosureButton>
</dt>
<Transition
enter="transition duration-100 ease-out"
enterFrom="transform -translate-y-6 opacity-0"
enterTo="transform translate-y-0 opacity-100"
leave="transition duration-75 ease-out"
leaveFrom="transform translate-y-0 opacity-100"
leaveTo="transform -translate-y-6 opacity-0"
>
<DisclosurePanel
as="dd"
className="mt-2 pr-12 text-base text-slate-500 dark:text-slate-400"
>
{faq.answerUi}
</DisclosurePanel>
</Transition>
</>
)}
</Disclosure>
))}
</dl>
</div>
</div>
</div>
</section>
);
}