diff --git a/apps/site/app/[locale]/[...path]/page.tsx b/apps/site/app/[locale]/[...path]/page.tsx index 723adbf9c7c16..3c75be3786632 100644 --- a/apps/site/app/[locale]/[...path]/page.tsx +++ b/apps/site/app/[locale]/[...path]/page.tsx @@ -74,9 +74,9 @@ const getPage: FC = async props => { // If we have a filename and layout then we have a page if (context.filename && context.frontmatter.layout) { return basePage.renderPage({ - content: content, + content, layout: context.frontmatter.layout, - context: context, + context, }); } diff --git a/apps/site/app/[locale]/blog/[...path]/page.tsx b/apps/site/app/[locale]/blog/[...path]/page.tsx index fddb6a5d47cb9..2e3546994465f 100644 --- a/apps/site/app/[locale]/blog/[...path]/page.tsx +++ b/apps/site/app/[locale]/blog/[...path]/page.tsx @@ -50,7 +50,7 @@ const getPage: FC = async props => { // Gets the Markdown content and context for Blog pages // otherwise this is likely a blog-category or a blog post const [content, context] = await basePage.getMarkdownContext({ - locale: locale, + locale, pathname: `blog/${pathname}`, }); @@ -58,7 +58,7 @@ const getPage: FC = async props => { // for this, then we fail as not found as there's nothing we can do. if (isDynamicRoute || context.filename) { return basePage.renderPage({ - content: content, + content, layout: context.frontmatter.layout ?? 'blog-category', context: { ...context, pathname: `/blog/${pathname}` }, }); diff --git a/apps/site/app/[locale]/download/archive/[version]/page.tsx b/apps/site/app/[locale]/download/archive/[version]/page.tsx index eee45611e6b46..f8b627977bab3 100644 --- a/apps/site/app/[locale]/download/archive/[version]/page.tsx +++ b/apps/site/app/[locale]/download/archive/[version]/page.tsx @@ -31,7 +31,7 @@ export const generateStaticParams = async () => { return ARCHIVE_DYNAMIC_ROUTES.map(version => ({ locale: defaultLocale.code, - version: version, + version, })); }; @@ -58,7 +58,7 @@ const getPage: FC = async props => { // Gets the Markdown content and context for Download Archive pages const [content, context] = await basePage.getMarkdownContext({ - locale: locale, + locale, pathname: 'download/archive', }); @@ -66,7 +66,7 @@ const getPage: FC = async props => { // file for this, then we fail as not found as there's nothing we can do. if (isDynamicRoute && context.filename) { return basePage.renderPage({ - content: content, + content, layout: context.frontmatter.layout!, context: { ...context, pathname: `/download/archive/${pathname}` }, }); diff --git a/apps/site/app/[locale]/page.tsx b/apps/site/app/[locale]/page.tsx index c2a4f3d12a8cd..19dde5c53de2e 100644 --- a/apps/site/app/[locale]/page.tsx +++ b/apps/site/app/[locale]/page.tsx @@ -64,9 +64,9 @@ const getPage: FC = async props => { // If we have a filename and layout then we have a page if (context.filename && context.frontmatter.layout) { return basePage.renderPage({ - content: content, + content, layout: context.frontmatter.layout, - context: context, + context, }); } diff --git a/apps/site/components/Downloads/Release/PrebuiltDownloadButtons.tsx b/apps/site/components/Downloads/Release/PrebuiltDownloadButtons.tsx index 1939ca3adaa71..859ab3faeef80 100644 --- a/apps/site/components/Downloads/Release/PrebuiltDownloadButtons.tsx +++ b/apps/site/components/Downloads/Release/PrebuiltDownloadButtons.tsx @@ -24,8 +24,8 @@ const PrebuiltDownloadButtons: FC = () => { const installerUrl = platform ? getNodeDownloadUrl({ versionWithPrefix: release.versionWithPrefix, - os: os, - platform: platform, + os, + platform, kind: 'installer', }) : ''; @@ -33,8 +33,8 @@ const PrebuiltDownloadButtons: FC = () => { const binaryUrl = platform ? getNodeDownloadUrl({ versionWithPrefix: release.versionWithPrefix, - os: os, - platform: platform, + os, + platform, kind: 'binary', }) : ''; diff --git a/apps/site/components/Downloads/Release/VersionDropdown.tsx b/apps/site/components/Downloads/Release/VersionDropdown.tsx index 3399ca2af48a4..94a74ad4533bc 100644 --- a/apps/site/components/Downloads/Release/VersionDropdown.tsx +++ b/apps/site/components/Downloads/Release/VersionDropdown.tsx @@ -38,12 +38,12 @@ const VersionDropdown: FC = () => { ); if (release?.isLts && pathname.includes('current')) { - redirect({ href: '/download', locale: locale }); + redirect({ href: '/download', locale }); return; } if (release?.status === 'Current' && !pathname.includes('current')) { - redirect({ href: '/download/current', locale: locale }); + redirect({ href: '/download/current', locale }); return; } diff --git a/apps/site/components/withBreadcrumbs.tsx b/apps/site/components/withBreadcrumbs.tsx index a0fed550947e4..2d342a2b6803a 100644 --- a/apps/site/components/withBreadcrumbs.tsx +++ b/apps/site/components/withBreadcrumbs.tsx @@ -57,9 +57,7 @@ const WithBreadcrumbs: FC = ({ navKeys = [] }) => { // Goes deeper on the tree of items if there are any. currentNode = items; - return label - ? [...breadcrumbs, { label: label, href: link }] - : breadcrumbs; + return label ? [...breadcrumbs, { label, href: link }] : breadcrumbs; } return breadcrumbs; diff --git a/apps/site/components/withFooter.tsx b/apps/site/components/withFooter.tsx index c5bc06e8a02e3..b334621adff20 100644 --- a/apps/site/components/withFooter.tsx +++ b/apps/site/components/withFooter.tsx @@ -16,7 +16,7 @@ const WithFooter: FC = () => { const { socialLinks, footerLinks } = siteNavigation; const navigation = { - socialLinks: socialLinks, + socialLinks, footerLinks: footerLinks.map(link => ({ ...link, text: t(link.text) })), }; diff --git a/apps/site/components/withNavBar.tsx b/apps/site/components/withNavBar.tsx index 24ca3d9d794f2..2ac1f16a3e130 100644 --- a/apps/site/components/withNavBar.tsx +++ b/apps/site/components/withNavBar.tsx @@ -62,9 +62,9 @@ const WithNavBar: FC = () => { ({ - link: link, + link, text: label, - target: target, + target, }))} pathname={pathname} as={Link} diff --git a/apps/site/eslint.config.js b/apps/site/eslint.config.js index 61ca4ccb1d6ec..619b5eb4fa765 100644 --- a/apps/site/eslint.config.js +++ b/apps/site/eslint.config.js @@ -1,60 +1,36 @@ -import { FlatCompat } from '@eslint/eslintrc'; -import { flatConfigs } from 'eslint-plugin-import-x'; +import next from '@next/eslint-plugin-next'; import * as mdx from 'eslint-plugin-mdx'; import react from 'eslint-plugin-react'; -import tseslint from 'typescript-eslint'; +import * as hooks from 'eslint-plugin-react-hooks'; import baseConfig from '../../eslint.config.js'; -const compat = new FlatCompat(); - -const compatConfig = compat.config({ - extends: [ - // https://github.com/vercel/next.js/discussions/49337 - 'plugin:@next/eslint-plugin-next/core-web-vitals', +export default baseConfig.concat([ + { + ignores: ['pages/en/blog/**/*.{md,mdx}/**', 'public', 'next-env.d.ts'], + }, - // https://github.com/facebook/react/issues/28313 - 'plugin:react-hooks/recommended', - ], -}); + react.configs.flat['jsx-runtime'], + hooks.configs['recommended-latest'], + next.flatConfig.coreWebVitals, + mdx.flatCodeBlocks, -export default tseslint.config( - ...baseConfig, - { ignores: ['pages/en/blog/**/*.{md,mdx}/**', 'public', 'next-env.d.ts'] }, + // Type-checking { - extends: [ - react.configs.flat['jsx-runtime'], - ...tseslint.configs.recommended, - flatConfigs.typescript, - ...compatConfig, - ], - files: ['**/*.{js,md,mdx,mjs,ts,tsx}'], + ignores: ['**/*.{md,mdx}', '**/*.{md,mdx}/**'], + languageOptions: { + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: import.meta.dirname, + }, + }, rules: { - '@typescript-eslint/array-type': ['error', { default: 'generic' }], '@typescript-eslint/consistent-type-imports': 'error', - '@typescript-eslint/no-require-imports': 'off', - '@next/next/no-duplicate-head': 'off', - 'import-x/no-duplicates': 'off', }, - settings: { react: { version: 'detect' } }, }, - { - files: ['**/*.{md,mdx}'], - extends: [mdx.flat], - processor: mdx.createRemarkProcessor({ lintCodeBlocks: true }), - rules: { - 'no-irregular-whitespace': 'off', - '@next/next/no-img-element': 'off', - '@next/next/no-html-link-for-pages': ['error', 'apps/site/pages/'], - // https://github.com/typescript-eslint/typescript-eslint/issues/9860 - '@typescript-eslint/consistent-type-imports': 'off', - }, - }, { - files: ['**/*.{mdx,tsx}'], rules: { - '@typescript-eslint/consistent-type-definitions': ['error', 'type'], 'react/no-unescaped-entities': 'off', 'react/function-component-definition': [ 'error', @@ -63,22 +39,25 @@ export default tseslint.config( unnamedComponents: 'arrow-function', }, ], - 'no-restricted-syntax': [ - 'error', - { - selector: - "ImportDeclaration[source.value='react'][specifiers.0.type='ImportDefaultSpecifier']", - message: - 'Default React import not allowed since we use the TypeScript jsx-transform. If you need a global type that collides with a React named export (such as `MouseEvent`), try using `globalThis.MouseHandler`', - }, - { - selector: - "ImportDeclaration[source.value='react'] :matches(ImportNamespaceSpecifier)", - message: - 'Named * React import is not allowed. Please import what you need from React with Named Imports', - }, - ], + }, + settings: { react: { version: 'detect' } }, + }, + + { + files: ['**/*.{md,mdx}/**'], + rules: { + '@typescript-eslint/no-require-imports': 'off', + }, + }, + + { + ...mdx.flat, + processor: mdx.createRemarkProcessor({ lintCodeBlocks: true }), + rules: { + ...mdx.flat.rules, + 'no-irregular-whitespace': 'off', + '@next/next/no-img-element': 'off', + '@next/next/no-html-link-for-pages': ['error', 'apps/site/pages/'], }, }, - mdx.flatCodeBlocks -); +]); diff --git a/apps/site/hooks/react-generic/useSiteNavigation.ts b/apps/site/hooks/react-generic/useSiteNavigation.ts index a9dcabf1e154f..83f866e5bcb20 100644 --- a/apps/site/hooks/react-generic/useSiteNavigation.ts +++ b/apps/site/hooks/react-generic/useSiteNavigation.ts @@ -13,12 +13,12 @@ import type { type Context = Record; type Navigation = Record; -interface MappedNavigationEntry { +type MappedNavigationEntry = { items: Array<[string, MappedNavigationEntry]>; label: FormattedMessage; link: string; target?: HTMLAttributeAnchorTarget | undefined; -} +}; // Provides Context replacement for variables within the Link. This is also something that is not going // to happen in the future with `nodejs/nodejs.dev` codebase @@ -49,7 +49,7 @@ const useSiteNavigation = () => { ] => [ key, { - target: target, + target, label: label ? getFormattedMessage(label, key) : '', link: link ? replaceLinkWithContext(link, context[key]) : '', items: items ? mapNavigationEntries(items, context) : [], diff --git a/apps/site/i18n.tsx b/apps/site/i18n.tsx index d130c399d8433..7abd8682746a9 100644 --- a/apps/site/i18n.tsx +++ b/apps/site/i18n.tsx @@ -35,7 +35,7 @@ export default getRequestConfig(async ({ requestLocale }) => { } return { - locale: locale, + locale, // This is the dictionary of messages to be loaded messages: await loadLocaleDictionary(locale), // We always define the App timezone as UTC diff --git a/apps/site/layouts/Blog.tsx b/apps/site/layouts/Blog.tsx index d6958d8ae6e0a..c9d13d401aba8 100644 --- a/apps/site/layouts/Blog.tsx +++ b/apps/site/layouts/Blog.tsx @@ -28,9 +28,9 @@ const getBlogCategory = (pathname: string) => { const { posts, pagination } = getBlogData(category, Number(page)); return { - category: category, - posts: posts, - pagination: pagination, + category, + posts, + pagination, page: Number(page), }; }; diff --git a/apps/site/layouts/Post.tsx b/apps/site/layouts/Post.tsx index 3d7a5188b67c8..50d8b98963d48 100644 --- a/apps/site/layouts/Post.tsx +++ b/apps/site/layouts/Post.tsx @@ -16,9 +16,9 @@ import styles from './layouts.module.css'; const PostLayout: FC = ({ children }) => { const { frontmatter } = useClientContext(); - const authors = mapAuthorToCardAuthors(frontmatter.author); + const authors = mapAuthorToCardAuthors(frontmatter.author!); - const type = mapBlogCategoryToPreviewType(frontmatter.category); + const type = mapBlogCategoryToPreviewType(frontmatter.category!); return ( <> diff --git a/apps/site/next-data/generators/__tests__/websiteFeeds.test.mjs b/apps/site/next-data/generators/__tests__/websiteFeeds.test.mjs index 0619ab4b00b5b..bd24af0dbbfa7 100644 --- a/apps/site/next-data/generators/__tests__/websiteFeeds.test.mjs +++ b/apps/site/next-data/generators/__tests__/websiteFeeds.test.mjs @@ -41,7 +41,7 @@ describe('generateWebsiteFeeds', () => { id: blogData.posts[0].slug, title: blogData.posts[0].title, guid: `${blogData.posts[0].slug}?${date.getTime()}`, - date: date, + date, link: `${base}${blogData.posts[0].slug}`, }, ]); diff --git a/apps/site/next-data/generators/blogData.mjs b/apps/site/next-data/generators/blogData.mjs index 21b1a98314ae5..2041ebc4cacf3 100644 --- a/apps/site/next-data/generators/blogData.mjs +++ b/apps/site/next-data/generators/blogData.mjs @@ -38,12 +38,12 @@ const getFrontMatter = (filename, source) => { const slug = `/blog/${category}/${basename(filename, extname(filename))}`; return { - title: title, - author: author, - username: username, + title, + author, + username, date: new Date(date), - categories: categories, - slug: slug, + categories, + slug, }; }; @@ -110,7 +110,7 @@ const generateBlogData = async () => { ) ); - return { categories: [...blogCategories], posts: posts }; + return { categories: [...blogCategories], posts }; }; export default generateBlogData; diff --git a/apps/site/next-data/generators/releaseData.mjs b/apps/site/next-data/generators/releaseData.mjs index e42a12926604b..9887cef858474 100644 --- a/apps/site/next-data/generators/releaseData.mjs +++ b/apps/site/next-data/generators/releaseData.mjs @@ -58,7 +58,7 @@ const generateReleaseData = async () => { return { ...support, - status: status, + status, major: latestVersion.semver.major, version: latestVersion.semver.raw, versionWithPrefix: `v${latestVersion.semver.raw}`, @@ -68,7 +68,7 @@ const generateReleaseData = async () => { v8: latestVersion.dependencies.v8, releaseDate: latestVersion.releaseDate, modules: latestVersion.modules.version || '', - minorVersions: minorVersions, + minorVersions, }; }); }; diff --git a/apps/site/next-data/generators/websiteFeeds.mjs b/apps/site/next-data/generators/websiteFeeds.mjs index c0f9bd47c7f64..6be01b65c29be 100644 --- a/apps/site/next-data/generators/websiteFeeds.mjs +++ b/apps/site/next-data/generators/websiteFeeds.mjs @@ -30,7 +30,7 @@ const generateWebsiteFeeds = ({ posts }) => { ({ category, title, description, file }) => { const feed = new Feed({ id: file, - title: title, + title, language: 'en', link: canonicalUrl, description: description || '', @@ -46,7 +46,7 @@ const generateWebsiteFeeds = ({ posts }) => { id: post.slug, title: post.title, author: post.author, - date: date, + date, link: `${canonicalUrl}${post.slug}`, guid: time > guidTimestampStartDate diff --git a/apps/site/next.calendar.mjs b/apps/site/next.calendar.mjs index 22add252415bf..d32b4f5af27c3 100644 --- a/apps/site/next.calendar.mjs +++ b/apps/site/next.calendar.mjs @@ -18,8 +18,8 @@ export const getCalendarEvents = async (calendarId = '', maxResults = 20) => { nextWeekDate.setDate(currentDate.getDate() + 7); const calendarQueryParams = new URLSearchParams({ - calendarId: calendarId, - maxResults: maxResults, + calendarId, + maxResults, singleEvents: true, timeZone: 'Etc/Utc', key: SHARED_CALENDAR_KEY, diff --git a/apps/site/next.dynamic.mjs b/apps/site/next.dynamic.mjs index b1822ead633df..7dd922b47228f 100644 --- a/apps/site/next.dynamic.mjs +++ b/apps/site/next.dynamic.mjs @@ -30,7 +30,7 @@ const getPathname = (path = []) => // we use a platform-specific separator to split the pathname // since we're using filepaths here and not URL paths const mapPathToRoute = (locale = defaultLocale.code, path = '') => ({ - locale: locale, + locale, path: path.split(sep), }); @@ -111,7 +111,7 @@ const getDynamicRouter = async () => { `${locale}${normalizedPathname}` ); - return { source: fileContent, filename: filename }; + return { source: fileContent, filename }; } // Attempts to read a file or simply (and silently) fail, as the file might @@ -129,7 +129,7 @@ const getDynamicRouter = async () => { fileLanguageContent ); - return { source: fileLanguageContent, filename: filename }; + return { source: fileLanguageContent, filename }; } // Prevent infinite loops as if at this point the file does not exist with the default locale @@ -149,7 +149,7 @@ const getDynamicRouter = async () => { // of the same locale for this file and improve read performance cachedMarkdownFiles.set(`${locale}${normalizedPathname}`, fileContent); - return { source: fileContent, filename: filename }; + return { source: fileContent, filename }; } return { filename: '', source: '' }; diff --git a/apps/site/next.dynamic.page.mjs b/apps/site/next.dynamic.page.mjs index 6dab59d86f17f..3a35f371bc720 100644 --- a/apps/site/next.dynamic.page.mjs +++ b/apps/site/next.dynamic.page.mjs @@ -86,11 +86,11 @@ export const getMarkdownContext = async props => { // Metadata and shared Context to be available through the lifecycle of the page const context = { - frontmatter: frontmatter, - headings: headings, + frontmatter, + headings, pathname: `/${props.pathname}`, - readingTime: readingTime, - filename: filename, + readingTime, + filename, }; return [content, context]; diff --git a/apps/site/next.mdx.use.client.mjs b/apps/site/next.mdx.use.client.mjs index 94e04232bee72..e0a22055a01ec 100644 --- a/apps/site/next.mdx.use.client.mjs +++ b/apps/site/next.mdx.use.client.mjs @@ -29,9 +29,9 @@ export const clientMdxComponents = { // Renders MDX CodeTabs CodeTabs: MDXCodeTabs, // Renders a Download Button - DownloadButton: DownloadButton, + DownloadButton, // Renders a stateless Release Select Component - WithReleaseSelect: WithReleaseSelect, + WithReleaseSelect, // Group of components that enable you to select versions for Node.js // releases and download selected versions. Uses `releaseProvider` as a provider Release: { @@ -48,13 +48,13 @@ export const clientMdxComponents = { // Renders a drop-down menu to select an operating system OperatingSystemDropdown: ReleaseOperatingSystemDropdown, // Renders a Blog Post Link for the selected release - BlogPostLink: BlogPostLink, + BlogPostLink, // Renders a Download Button for the selected release PrebuiltDownloadButtons: ReleasePrebuiltDownloadButtons, // Renders a Release CodeBox - ReleaseCodeBox: ReleaseCodeBox, + ReleaseCodeBox, // Renders a Changelog Link Button - ChangelogLink: ChangelogLink, + ChangelogLink, // Renders a DownloadLink Button DownloadLink: ReleaseDownloadLink, }, diff --git a/apps/site/next.rewrites.mjs b/apps/site/next.rewrites.mjs index 5977a40ed6ddc..aa8bea4125883 100644 --- a/apps/site/next.rewrites.mjs +++ b/apps/site/next.rewrites.mjs @@ -24,7 +24,7 @@ const redirects = async () => { // We prevent permanent redirects as in general the redirects are safeguards // of legacy or old pages or pages that moved, and in general we don't want permanent redirects permanent: false, - destination: destination, + destination, })); }; @@ -40,7 +40,7 @@ const rewrites = async () => { const mappedRewrites = siteRedirects.internal.map( ({ source, destination }) => ({ source: source.replace('/:locale', localesMatch), - destination: destination, + destination, }) ); diff --git a/apps/site/package.json b/apps/site/package.json index e2de71ad70325..0f822ac5cdb27 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -77,8 +77,6 @@ "vfile-matter": "~5.0.1" }, "devDependencies": { - "@eslint/compat": "~1.3.1", - "@eslint/eslintrc": "~3.3.1", "@flarelabs-net/wrangler-build-time-fs-assets-polyfilling": "^0.0.1", "@next/eslint-plugin-next": "15.5.0", "@node-core/remark-lint": "workspace:*", @@ -89,10 +87,9 @@ "@types/semver": "~7.7.0", "dedent": "^1.6.0", "eslint-config-next": "15.5.0", - "eslint-import-resolver-typescript": "~4.4.4", "eslint-plugin-mdx": "~3.6.2", - "eslint-plugin-react": "~7.37.4", - "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-react": "~7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", "global-jsdom": "^26.0.0", "handlebars": "4.7.8", "jsdom": "^26.0.0", diff --git a/apps/site/pages/en/learn/getting-started/fetch.md b/apps/site/pages/en/learn/getting-started/fetch.md index ac897bec2bb11..26cd99cd51f70 100644 --- a/apps/site/pages/en/learn/getting-started/fetch.md +++ b/apps/site/pages/en/learn/getting-started/fetch.md @@ -98,7 +98,7 @@ async function streamOllamaCompletion(prompt) { headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ prompt: prompt, model: 'mistral' }), + body: JSON.stringify({ prompt, model: 'mistral' }), }); // You can read about HTTP status codes here: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status diff --git a/apps/site/pages/en/learn/manipulating-files/nodejs-file-stats.md b/apps/site/pages/en/learn/manipulating-files/nodejs-file-stats.md index 2b196196d907d..a07b405469379 100644 --- a/apps/site/pages/en/learn/manipulating-files/nodejs-file-stats.md +++ b/apps/site/pages/en/learn/manipulating-files/nodejs-file-stats.md @@ -76,7 +76,7 @@ fs.stat('/Users/joe/test.txt', (err, stats) => { stats.isFile(); // true stats.isDirectory(); // false stats.isSymbolicLink(); // false - stats.size; // 1024000 //= 1MB + console.log(stats.size); // 1024000 //= 1MB }); ``` @@ -107,7 +107,7 @@ async function example() { stats.isFile(); // true stats.isDirectory(); // false stats.isSymbolicLink(); // false - stats.size; // 1024000 //= 1MB + console.log(stats.size); // 1024000 //= 1MB } catch (err) { console.log(err); } diff --git a/apps/site/pages/en/learn/modules/backpressuring-in-streams.md b/apps/site/pages/en/learn/modules/backpressuring-in-streams.md index 02320df4dddd8..4ad78d6d0ebdd 100644 --- a/apps/site/pages/en/learn/modules/backpressuring-in-streams.md +++ b/apps/site/pages/en/learn/modules/backpressuring-in-streams.md @@ -84,8 +84,8 @@ a script that takes Node.js' module [`zlib`][], that wraps around another compression tool, [`gzip(1)`][]. ```cjs -const gzip = require('node:zlib').createGzip(); const fs = require('node:fs'); +const gzip = require('node:zlib').createGzip(); const inp = fs.createReadStream('The.Matrix.1080p.mkv'); const out = fs.createWriteStream('The.Matrix.1080p.mkv.gz'); @@ -124,8 +124,8 @@ cleaning up and providing a callback when the pipeline is complete. Here is an example of using pipeline: ```cjs -const { pipeline } = require('node:stream'); const fs = require('node:fs'); +const { pipeline } = require('node:stream'); const zlib = require('node:zlib'); // Use the pipeline API to easily pipe a series of streams @@ -172,8 +172,8 @@ pipeline( You can also use the [`stream/promises`][] module to use pipeline with `async` / `await`: ```cjs -const { pipeline } = require('node:stream/promises'); const fs = require('node:fs'); +const { pipeline } = require('node:stream/promises'); const zlib = require('node:zlib'); async function run() { @@ -613,7 +613,7 @@ import { Readable } from 'node:stream'; // Create a custom Readable stream const myReadableStream = new Readable({ objectMode: true, - read: function (size) { + read(size) { // Push some data onto the stream this.push({ message: 'Hello, world!' }); this.push(null); // Mark the end of the stream diff --git a/apps/site/pages/en/learn/modules/how-to-use-streams.md b/apps/site/pages/en/learn/modules/how-to-use-streams.md index f046574e21ef8..21e88a5b73155 100644 --- a/apps/site/pages/en/learn/modules/how-to-use-streams.md +++ b/apps/site/pages/en/learn/modules/how-to-use-streams.md @@ -186,8 +186,8 @@ And we’ll get: Here's an example of creating a writable stream that converts all incoming data to uppercase before writing it to the standard output: ```cjs -const { Writable } = require('node:stream'); const { once } = require('node:events'); +const { Writable } = require('node:stream'); class MyStream extends Writable { constructor() { @@ -418,7 +418,7 @@ const { Transform } = require('node:stream'); let errorCount = 0; const upper = new Transform({ - transform: function (data, enc, cb) { + transform(data, enc, cb) { if (errorCount === 10) { return cb(new Error('BOOM!')); } @@ -510,7 +510,7 @@ const { Transform, pipeline } = require('node:stream'); let errorCount = 0; const upper = new Transform({ - transform: function (data, enc, cb) { + transform(data, enc, cb) { if (errorCount === 10) { return cb(new Error('BOOM!')); } @@ -671,7 +671,7 @@ import { Readable } from 'node:stream'; const readable = Readable({ objectMode: true, - read: function () { + read() { this.push({ hello: 'world' }); this.push(null); }, diff --git a/apps/site/pages/en/learn/test-runner/collecting-code-coverage.md b/apps/site/pages/en/learn/test-runner/collecting-code-coverage.md index 91361d666e2c8..8df497210c7a4 100644 --- a/apps/site/pages/en/learn/test-runner/collecting-code-coverage.md +++ b/apps/site/pages/en/learn/test-runner/collecting-code-coverage.md @@ -37,9 +37,10 @@ module.exports = { add, isEven, multiply }; ``` ```cjs displayName="main.test.js" -const { add, isEven } = require('./main.js'); const { test } = require('node:test'); +const { add, isEven } = require('./main.js'); + test('add() should add two numbers', t => { t.assert.strictEqual(add(1, 2), 3); }); diff --git a/apps/site/reducers/releaseReducer.ts b/apps/site/reducers/releaseReducer.ts index c16de5cf00be6..3ad09f64e089c 100644 --- a/apps/site/reducers/releaseReducer.ts +++ b/apps/site/reducers/releaseReducer.ts @@ -22,13 +22,12 @@ export const releaseState: Types.ReleaseState = { export const getActions = ( dispatch: Dispatch ): Types.ReleaseDispatchActions => ({ - setVersion: payload => dispatch({ type: 'SET_VERSION', payload: payload }), - setOS: payload => dispatch({ type: 'SET_OS', payload: payload }), - setPlatform: payload => dispatch({ type: 'SET_PLATFORM', payload: payload }), + setVersion: payload => dispatch({ type: 'SET_VERSION', payload }), + setOS: payload => dispatch({ type: 'SET_OS', payload }), + setPlatform: payload => dispatch({ type: 'SET_PLATFORM', payload }), setInstallMethod: payload => - dispatch({ type: 'SET_INSTALL_METHOD', payload: payload }), - setPackageManager: payload => - dispatch({ type: 'SET_MANAGER', payload: payload }), + dispatch({ type: 'SET_INSTALL_METHOD', payload }), + setPackageManager: payload => dispatch({ type: 'SET_MANAGER', payload }), }); const reducer = ( diff --git a/apps/site/scripts/orama-search/process-documents.mjs b/apps/site/scripts/orama-search/process-documents.mjs index c327f0474d406..be499a8fd229b 100644 --- a/apps/site/scripts/orama-search/process-documents.mjs +++ b/apps/site/scripts/orama-search/process-documents.mjs @@ -82,8 +82,8 @@ export const processDocument = ({ pathname, content }) => { return sections.map(section => ({ path: `${pathname}#${slug(section.pageSectionTitle)}`, - siteSection: siteSection, - pageTitle: pageTitle, + siteSection, + pageTitle, ...section, })); }; diff --git a/apps/site/tsconfig.json b/apps/site/tsconfig.json index 97fdc96bc59e0..dbb0784d61bda 100644 --- a/apps/site/tsconfig.json +++ b/apps/site/tsconfig.json @@ -19,12 +19,14 @@ }, "mdx": { "checkMdx": true }, "include": [ - "next-env.d.ts", - "global.d.ts", - "**/*.mdx", "**/*.ts", "**/*.tsx", - ".next/types/**/*.ts" + "**/*.js", + "**/*.mjs", + "**/*.jsx", + "**/*.mdx", + // Explicitly include since the globs won't match the `.` + ".stylelintrc.mjs" ], "exclude": ["node_modules", ".next"] } diff --git a/apps/site/types/author.ts b/apps/site/types/author.ts index 9027163bc243f..c6867f8d71b5e 100644 --- a/apps/site/types/author.ts +++ b/apps/site/types/author.ts @@ -1,12 +1,12 @@ -export interface AuthorProps { +export type AuthorProps = { names?: Array; usernames?: Array; clickable?: boolean; container?: HTMLElement | null; -} +}; -export interface Author { +export type Author = { id: string; name: string; website?: string; -} +}; diff --git a/apps/site/types/blog.ts b/apps/site/types/blog.ts index 79db83ad1ed97..341ed85e545a0 100644 --- a/apps/site/types/blog.ts +++ b/apps/site/types/blog.ts @@ -3,28 +3,28 @@ import type { IntlMessageKeys } from './i18n'; export type BlogPreviewType = 'announcements' | 'release' | 'vulnerability'; export type BlogCategory = IntlMessageKeys<'layouts.blog.categories'>; -export interface BlogPost { +export type BlogPost = { title: string; author: string; username: string; date: Date; categories: Array; slug: string; -} +}; -export interface BlogData { +export type BlogData = { posts: Array; categories: Array; -} +}; -export interface BlogPagination { +export type BlogPagination = { next: number | null; prev: number | null; pages: number; total: number; -} +}; -export interface BlogPostsRSC { +export type BlogPostsRSC = { posts: Array; pagination: BlogPagination; -} +}; diff --git a/apps/site/types/calendar.ts b/apps/site/types/calendar.ts index 159b076b0b577..b950a36c8da6c 100644 --- a/apps/site/types/calendar.ts +++ b/apps/site/types/calendar.ts @@ -1,13 +1,13 @@ -export interface ZonedCalendarTime { +export type ZonedCalendarTime = { dateTime: string; timeZone: string; -} +}; -export interface SimpleCalendarTime { +export type SimpleCalendarTime = { date: string; -} +}; -export interface CalendarEvent { +export type CalendarEvent = { id: string; summary: string; location?: string; @@ -16,4 +16,4 @@ export interface CalendarEvent { end: ZonedCalendarTime | SimpleCalendarTime; htmlLink: string; description?: string; -} +}; diff --git a/apps/site/types/config.ts b/apps/site/types/config.ts index f307d15457aab..3ac69e965129f 100644 --- a/apps/site/types/config.ts +++ b/apps/site/types/config.ts @@ -1,21 +1,21 @@ import type { RSSFeed, WebsiteBadge, WebsiteBanner } from './features'; -export interface TwitterConfig { +export type TwitterConfig = { username: string; card: string; img: string; imgAlt: string; -} +}; -export interface OGConfig { +export type OGConfig = { imgType: string; imgWidth: string; imgHeight: string; -} +}; export type LogoVariant = 'default' | 'pride'; -export interface SiteConfig { +export type SiteConfig = { title: string; description: string; featuredImage: string; @@ -28,4 +28,4 @@ export interface SiteConfig { rssFeeds: Array; websiteBanners: Record; websiteBadges: Record; -} +}; diff --git a/apps/site/types/download.ts b/apps/site/types/download.ts index aa836fe5b875a..c7c7db00c3bac 100644 --- a/apps/site/types/download.ts +++ b/apps/site/types/download.ts @@ -7,11 +7,11 @@ import type { Platform, } from '#site/types'; -export interface DownloadSnippet { +export type DownloadSnippet = { name: string; language: string; content: string; -} +}; export type DownloadKind = 'installer' | 'binary' | 'source' | 'shasum'; diff --git a/apps/site/types/features.ts b/apps/site/types/features.ts index 49ba532fd6cf0..f854206ae1887 100644 --- a/apps/site/types/features.ts +++ b/apps/site/types/features.ts @@ -1,24 +1,24 @@ -export interface RSSFeed { +export type RSSFeed = { file: string; title: string; category: string; description?: string; -} +}; -interface WithRange { +type WithRange = { startDate: string; endDate: string; -} +}; -export interface WebsiteBanner extends WithRange { +export type WebsiteBanner = { text: string; link?: string; type?: 'default' | 'warning' | 'error'; -} +} & WithRange; -export interface WebsiteBadge extends WithRange { +export type WebsiteBadge = { text: string; link: string; title?: string; kind?: 'default' | 'warning' | 'error'; -} +} & WithRange; diff --git a/apps/site/types/frontmatter.ts b/apps/site/types/frontmatter.ts index 4c50ff0d778cd..75779f0638430 100644 --- a/apps/site/types/frontmatter.ts +++ b/apps/site/types/frontmatter.ts @@ -1,10 +1,12 @@ import type { Layouts } from './layouts'; -// @TODO: Extra data from Frontmatter should not be a thing in the future -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export interface LegacyFrontMatter extends Record { +// TODO(@avivkeller): BlogFrontmatter, LearnFrontmatter, etc +export type Frontmatter = { layout?: Layouts; title?: string; labels?: Record; + date?: string; + author?: string; authors?: string; -} + category?: string; +}; diff --git a/apps/site/types/github.ts b/apps/site/types/github.ts index d26ad6924ec83..444582c852f6f 100644 --- a/apps/site/types/github.ts +++ b/apps/site/types/github.ts @@ -1,4 +1,4 @@ -export interface GitHubApiFile { +export type GitHubApiFile = { name: string; path: string; sha: string; @@ -8,4 +8,4 @@ export interface GitHubApiFile { git_url: string; download_url: string; type: 'file' | 'dir'; -} +}; diff --git a/apps/site/types/navigation.ts b/apps/site/types/navigation.ts index 44618de780706..3256280ae549f 100644 --- a/apps/site/types/navigation.ts +++ b/apps/site/types/navigation.ts @@ -2,16 +2,16 @@ import type { HTMLAttributeAnchorTarget } from 'react'; import type { IntlMessageKeys } from './i18n'; -export interface FooterConfig { +export type FooterConfig = { text: IntlMessageKeys; link: string; -} +}; -export interface SocialConfig { +export type SocialConfig = { icon: string; link: string; alt?: string; -} +}; export type NavigationKeys = | 'about' @@ -22,16 +22,16 @@ export type NavigationKeys = | 'learn' | 'blog'; -export interface NavigationEntry { +export type NavigationEntry = { label?: IntlMessageKeys; link?: string; items?: Record; target?: HTMLAttributeAnchorTarget | undefined; -} +}; -export interface SiteNavigation { +export type SiteNavigation = { topNavigation: Record; footerLinks: Array; socialLinks: Array; sideNavigation: Record; -} +}; diff --git a/apps/site/types/redirects.ts b/apps/site/types/redirects.ts index b1e729160b346..e91fe1554ad63 100644 --- a/apps/site/types/redirects.ts +++ b/apps/site/types/redirects.ts @@ -1,4 +1,4 @@ -export interface Redirect { +export type Redirect = { source: string; destination: string; -} +}; diff --git a/apps/site/types/release.ts b/apps/site/types/release.ts index fc150fec22d68..1330c36c43a67 100644 --- a/apps/site/types/release.ts +++ b/apps/site/types/release.ts @@ -15,13 +15,13 @@ export type PackageManager = 'NPM' | 'YARN' | 'PNPM'; // Items with a pipe/default value mean that they are auto inferred // during runtime and do not have necessarily a consistent initial value -export interface ReleaseState { +export type ReleaseState = { version: string; os: OperatingSystem | 'LOADING'; platform: Platform | ''; installMethod: InstallationMethod | ''; packageManager: PackageManager; -} +}; export type ReleaseAction = | { type: 'SET_VERSION'; payload: string } @@ -30,30 +30,29 @@ export type ReleaseAction = | { type: 'SET_INSTALL_METHOD'; payload: InstallationMethod } | { type: 'SET_MANAGER'; payload: PackageManager }; -export interface ReleaseDispatchActions { +export type ReleaseDispatchActions = { setVersion: (version: string) => void; setOS: (os: OperatingSystem) => void; setPlatform: (bitness: Platform) => void; setInstallMethod: (installMethod: InstallationMethod) => void; setPackageManager: (packageManager: PackageManager) => void; -} +}; -export interface ReleasesContextType { +export type ReleasesContextType = { releases: Array; snippets: Array; -} +}; -export interface ReleaseContextType - extends ReleaseState, - ReleaseDispatchActions { +export type ReleaseContextType = { release: NodeRelease; -} +} & ReleaseState & + ReleaseDispatchActions; -export interface ReleasesProviderProps { +export type ReleasesProviderProps = { releases: Array; snippets: Array; -} +}; -export interface ReleaseProviderProps { +export type ReleaseProviderProps = { initialRelease?: NodeRelease; -} +}; diff --git a/apps/site/types/releases.ts b/apps/site/types/releases.ts index 2e54681d132e8..37d9cec716e40 100644 --- a/apps/site/types/releases.ts +++ b/apps/site/types/releases.ts @@ -5,7 +5,7 @@ export type NodeReleaseStatus = | 'End-of-life' | 'Pending'; -export interface NodeReleaseSource { +export type NodeReleaseSource = { major: number; version: string; codename?: string; @@ -17,20 +17,20 @@ export interface NodeReleaseSource { v8: string; releaseDate: string; modules?: string; -} +}; -export interface MinorVersion { +export type MinorVersion = { npm?: string; modules?: string; releaseDate: string; v8: string; version: string; versionWithPrefix: string; -} +}; -export interface NodeRelease extends NodeReleaseSource { +export type NodeRelease = { versionWithPrefix: string; isLts: boolean; status: NodeReleaseStatus; minorVersions: Array; -} +} & NodeReleaseSource; diff --git a/apps/site/types/server.ts b/apps/site/types/server.ts index 35736d36a16d8..d582c9b4e9470 100644 --- a/apps/site/types/server.ts +++ b/apps/site/types/server.ts @@ -2,13 +2,12 @@ import type { Heading } from '@vcarl/remark-headings'; import type { ReadTimeResults } from 'reading-time'; import type { useDetectOS } from '#site/hooks'; -import type { LegacyFrontMatter } from '#site/types/frontmatter'; +import type { Frontmatter } from '#site/types/frontmatter'; -export interface ClientSharedServerContext - extends ReturnType { - frontmatter: LegacyFrontMatter; +export type ClientSharedServerContext = { + frontmatter: Frontmatter; headings: Array; pathname: string; filename: string; readingTime: ReadTimeResults; -} +} & ReturnType; diff --git a/apps/site/types/vulnerabilities.ts b/apps/site/types/vulnerabilities.ts index 9c2761e6ba3c6..d4816a99f6615 100644 --- a/apps/site/types/vulnerabilities.ts +++ b/apps/site/types/vulnerabilities.ts @@ -1,6 +1,6 @@ export type Severity = 'unknown' | 'low' | 'medium' | 'high' | 'critical'; -export interface RawVulnerability { +export type RawVulnerability = { cve: Array; ref?: string; vulnerable: string; @@ -9,12 +9,10 @@ export interface RawVulnerability { overview: string; affectedEnvironments: Array; severity: Severity; -} +}; -export interface Vulnerability extends Omit { +export type Vulnerability = { url?: string; -} +} & Omit; -export interface GroupedVulnerabilities { - [majorVersion: string]: Array; -} +export type GroupedVulnerabilities = Record>; diff --git a/apps/site/util/author.ts b/apps/site/util/author.ts index 92ab969b5d90d..3de13ccf94168 100644 --- a/apps/site/util/author.ts +++ b/apps/site/util/author.ts @@ -27,7 +27,7 @@ export const getAuthorWithId = (usernames: Array, hasUrl: boolean) => { return { image: getGitHubAvatarUrl(id), - name: name, + name, nickname: id, fallback: getAcronymFromString(name), url: hasUrl ? website : undefined, @@ -53,7 +53,7 @@ export const getAuthorWithName = (names: Array, hasUrl: boolean) => { return { image: getGitHubAvatarUrl(id), - name: name, + name, nickname: id, fallback: getAcronymFromString(name), url: hasUrl ? website : undefined, diff --git a/apps/site/util/download/archive.tsx b/apps/site/util/download/archive.tsx index bb6156254c191..15d6e407bb75b 100644 --- a/apps/site/util/download/archive.tsx +++ b/apps/site/util/download/archive.tsx @@ -25,18 +25,18 @@ const createDownloadArtifact = ( kind: DownloadKind ): DownloadArtifact => { const url = getNodeDownloadUrl({ - versionWithPrefix: versionWithPrefix, - os: os, + versionWithPrefix, + os, platform: platform.value, - kind: kind, + kind, }); return { fileName: url.replace(`${DIST_URL}${versionWithPrefix}/`, ''), - kind: kind, - os: os, + kind, + os, architecture: platform.label, - url: url, + url, version: versionWithPrefix, }; }; @@ -113,21 +113,21 @@ export const buildReleaseArtifacts = ( return { binaries: getCompatibleArtifacts({ - versionWithPrefix: versionWithPrefix, + versionWithPrefix, kind: 'binary', }), installers: getCompatibleArtifacts({ exclude: OS_NOT_SUPPORTING_INSTALLERS, - versionWithPrefix: versionWithPrefix, + versionWithPrefix, kind: 'installer', }), sources: { shasum: getNodeDownloadUrl({ - versionWithPrefix: versionWithPrefix, + versionWithPrefix, kind: 'shasum', }), tarball: getNodeDownloadUrl({ - versionWithPrefix: versionWithPrefix, + versionWithPrefix, kind: 'source', }), }, diff --git a/eslint.config.js b/eslint.config.js index 797b176088594..561dd687ab75b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,9 +1,14 @@ import js from '@eslint/js'; -import { flatConfigs } from 'eslint-plugin-import-x'; +import * as importX from 'eslint-plugin-import-x'; +import tseslint from 'typescript-eslint'; +import globals from 'globals'; -export default [ +export default tseslint.config( js.configs.recommended, - flatConfigs.recommended, + tseslint.configs.recommended, + tseslint.configs.stylistic, + importX.flatConfigs.typescript, + { ignores: [ 'node_modules', @@ -21,9 +26,20 @@ export default [ 'dist', ], }, + { - files: ['**/*.{js,mjs,ts,tsx}'], + languageOptions: { + globals: { + ...globals.browser, + ...globals.nodeBuiltin, + }, + }, + rules: { + '@typescript-eslint/array-type': ['error', { default: 'generic' }], + '@typescript-eslint/consistent-type-definitions': ['error', 'type'], + '@typescript-eslint/no-empty-function': 'off', + 'import-x/namespace': 'off', 'import-x/no-named-as-default-member': 'off', 'import-x/no-unresolved': 'off', @@ -45,7 +61,24 @@ export default [ }, }, ], - 'object-shorthand': ['error', 'consistent-as-needed'], + + 'no-restricted-syntax': [ + 'error', + { + selector: + "ImportDeclaration[source.value='react'][specifiers.0.type='ImportDefaultSpecifier']", + message: + 'Default React import not allowed since we use the TypeScript jsx-transform. If you need a global type that collides with a React named export (such as `MouseEvent`), try using `globalThis.MouseHandler`', + }, + { + selector: + "ImportDeclaration[source.value='react'] :matches(ImportNamespaceSpecifier)", + message: + 'Named * React import is not allowed. Please import what you need from React with Named Imports', + }, + ], + + 'object-shorthand': 'error', }, - }, -]; + } +); diff --git a/package.json b/package.json index b1670bcbcb322..2cfd80131a13d 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,13 @@ "@testing-library/react": "~16.3.0", "cross-env": "^10.0.0", "eslint": "~9.32.0", + "eslint-import-resolver-typescript": "~4.4.4", "eslint-plugin-import-x": "~4.16.1", + "globals": "^16.3.0", "prettier": "3.6.2", - "prettier-plugin-tailwindcss": "0.6.14" + "prettier-plugin-tailwindcss": "0.6.14", + "typescript": "catalog:", + "typescript-eslint": "~8.38.0" }, "packageManager": "pnpm@10.13.1", "devEngines": { diff --git a/packages/i18n/eslint.config.js b/packages/i18n/eslint.config.js index 522c9d121b479..92c6ea4214f81 100644 --- a/packages/i18n/eslint.config.js +++ b/packages/i18n/eslint.config.js @@ -1,16 +1 @@ -import { flatConfigs } from 'eslint-plugin-import-x'; -import tseslint from 'typescript-eslint'; - -import baseConfig from '../../eslint.config.js'; - -export default [ - ...baseConfig, - ...tseslint.configs.recommended, - flatConfigs.typescript, - { - rules: { - '@typescript-eslint/array-type': ['error', { default: 'generic' }], - '@typescript-eslint/consistent-type-imports': 'error', - }, - }, -]; +export { default } from '../../eslint.config.js'; diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 14f69c06c3b61..2853120803027 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -25,8 +25,6 @@ "lint:js:fix": "node --run lint:js -- --fix" }, "devDependencies": { - "eslint-import-resolver-typescript": "~4.4.4", - "typescript": "catalog:", - "typescript-eslint": "~8.38.0" + "typescript": "catalog:" } } diff --git a/packages/i18n/src/types.d.ts b/packages/i18n/src/types.d.ts index d091091106255..e8bfdc06bc8de 100644 --- a/packages/i18n/src/types.d.ts +++ b/packages/i18n/src/types.d.ts @@ -1,6 +1,6 @@ import type EnglishMessages from './locales/en.json'; -export interface LocaleConfig { +export type LocaleConfig = { code: string; localName: string; name: string; @@ -9,6 +9,6 @@ export interface LocaleConfig { hrefLang: string; enabled: boolean; default: boolean; -} +}; export type Locale = typeof EnglishMessages; diff --git a/packages/rehype-shiki/eslint.config.js b/packages/rehype-shiki/eslint.config.js index 86d9d9da769ce..92c6ea4214f81 100644 --- a/packages/rehype-shiki/eslint.config.js +++ b/packages/rehype-shiki/eslint.config.js @@ -1,21 +1 @@ -import baseConfig from '../../eslint.config.js'; - -export default [ - ...baseConfig, - { - languageOptions: { - parserOptions: { - // Allow nullish syntax (i.e. "?." or "??"), - // and top-level await - ecmaVersion: 'latest', - }, - globals: { - globalThis: 'readonly', - }, - }, - rules: { - // Shiki's export isn't named, it's a re-export - 'import-x/named': 'off', - }, - }, -]; +export { default } from '../../eslint.config.js'; diff --git a/packages/rehype-shiki/src/plugin.mjs b/packages/rehype-shiki/src/plugin.mjs index a12ade9b811c0..c07416a4db326 100644 --- a/packages/rehype-shiki/src/plugin.mjs +++ b/packages/rehype-shiki/src/plugin.mjs @@ -110,7 +110,7 @@ export default function rehypeShikiji() { properties: { languages: languages.join('|'), displayNames: displayNames.join('|'), - defaultTab: defaultTab, + defaultTab, }, }; diff --git a/packages/remark-lint/eslint.config.js b/packages/remark-lint/eslint.config.js index 205088e6ad6ae..92c6ea4214f81 100644 --- a/packages/remark-lint/eslint.config.js +++ b/packages/remark-lint/eslint.config.js @@ -1,17 +1 @@ -import globals from 'globals'; - -import baseConfig from '../../eslint.config.js'; - -export default [ - ...baseConfig, - { - languageOptions: { - globals: globals.nodeBuiltin, - parserOptions: { - // Allow nullish syntax (i.e. "?." or "??"), - // and top-level await - ecmaVersion: 'latest', - }, - }, - }, -]; +export { default } from '../../eslint.config.js'; diff --git a/packages/remark-lint/package.json b/packages/remark-lint/package.json index a607b9e085217..1d2f99167a2ae 100644 --- a/packages/remark-lint/package.json +++ b/packages/remark-lint/package.json @@ -57,7 +57,6 @@ "devDependencies": { "cross-env": "catalog:", "dedent": "^1.6.0", - "globals": "^16.3.0", "remark-parse": "^11.0.0", "unified": "^11.0.5" } diff --git a/packages/ui-components/eslint.config.js b/packages/ui-components/eslint.config.js index 5d835e07068cf..9801e8d3a3988 100644 --- a/packages/ui-components/eslint.config.js +++ b/packages/ui-components/eslint.config.js @@ -1,34 +1,33 @@ -import { flatConfigs } from 'eslint-plugin-import-x'; import react from 'eslint-plugin-react'; +import * as hooks from 'eslint-plugin-react-hooks'; import storybook from 'eslint-plugin-storybook'; -import tseslint from 'typescript-eslint'; import baseConfig from '../../eslint.config.js'; -export default tseslint.config( - ...baseConfig, +export default baseConfig.concat([ + react.configs.flat['jsx-runtime'], + hooks.configs['recommended-latest'], + ...storybook.configs['flat/recommended'], + + // Type-checking { - extends: [ - react.configs.flat['jsx-runtime'], - ...tseslint.configs.recommended, - flatConfigs.typescript, - ], - files: ['**/*.{js,mjs,ts,tsx}'], + files: ['src'], + ignores: ['**/*.test.*', '**/*.stories.tsx'], + languageOptions: { + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: import.meta.dirname, + }, + }, rules: { - '@typescript-eslint/array-type': ['error', { default: 'generic' }], '@typescript-eslint/consistent-type-imports': 'error', - '@typescript-eslint/no-require-imports': 'off', - }, - settings: { - react: { - version: 'detect', - }, }, }, + { - files: ['**/*.{tsx}'], rules: { - '@typescript-eslint/consistent-type-definitions': ['error', 'type'], + 'storybook/no-renderer-packages': 'off', + 'react/no-unescaped-entities': 'off', 'react/function-component-definition': [ 'error', @@ -37,25 +36,7 @@ export default tseslint.config( unnamedComponents: 'arrow-function', }, ], - 'no-restricted-syntax': [ - 'error', - { - selector: - "ImportDeclaration[source.value='react'][specifiers.0.type='ImportDefaultSpecifier']", - message: - 'Default React import not allowed since we use the TypeScript jsx-transform. If you need a global type that collides with a React named export (such as `MouseEvent`), try using `globalThis.MouseHandler`', - }, - { - selector: - "ImportDeclaration[source.value='react'] :matches(ImportNamespaceSpecifier)", - message: - 'Named * React import is not allowed. Please import what you need from React with Named Imports', - }, - ], }, + settings: { react: { version: 'detect' } }, }, - { - files: ['components/**/*.stories.tsx'], - extends: [...storybook.configs['flat/recommended']], - } -); +]); diff --git a/packages/ui-components/package.json b/packages/ui-components/package.json index 7ef6048a5e078..b1ff2213df662 100644 --- a/packages/ui-components/package.json +++ b/packages/ui-components/package.json @@ -62,7 +62,8 @@ "@types/react": "catalog:", "cross-env": "catalog:", "css-loader": "~7.1.2", - "eslint-plugin-react": "~7.37.4", + "eslint-plugin-react": "~7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-storybook": "~9.0.3", "global-jsdom": "^26.0.0", "postcss-cli": "^11.0.1", @@ -76,8 +77,7 @@ "stylelint-selector-bem-pattern": "4.0.1", "tailwindcss": "catalog:", "tsx": "^4.20.3", - "typescript": "catalog:", - "typescript-eslint": "~8.38.0" + "typescript": "catalog:" }, "imports": { "#ui/*": [ diff --git a/packages/ui-components/src/Common/BaseCodeBox/index.tsx b/packages/ui-components/src/Common/BaseCodeBox/index.tsx index d6960aedc2d24..18086b554dad7 100644 --- a/packages/ui-components/src/Common/BaseCodeBox/index.tsx +++ b/packages/ui-components/src/Common/BaseCodeBox/index.tsx @@ -63,14 +63,14 @@ const transformCode = >( ); }; -interface CodeBoxProps { +type CodeBoxProps = { language: string; className?: string; onCopy: (text: string) => void; as?: LinkLike; buttonText: string; showCopyButton?: boolean; -} +}; const BaseCodeBox: FC> = ({ children, diff --git a/packages/ui-components/src/Common/BasePagination/useGetPageElements.tsx b/packages/ui-components/src/Common/BasePagination/useGetPageElements.tsx index b079239a8dbf4..2cb159c994531 100644 --- a/packages/ui-components/src/Common/BasePagination/useGetPageElements.tsx +++ b/packages/ui-components/src/Common/BasePagination/useGetPageElements.tsx @@ -14,12 +14,12 @@ const parsePages = ( getLabel: (pageNumber: number) => string ): Array => pages.map(({ url }, index) => ({ - url: url, + url, pageNumber: index + 1, - currentPage: currentPage, - totalPages: totalPages, + currentPage, + totalPages, label: getLabel(index + 1), - as: as, + as, })); const createPaginationListItems = ( diff --git a/packages/ui-components/src/Common/Breadcrumbs/index.tsx b/packages/ui-components/src/Common/Breadcrumbs/index.tsx index 708391341783a..9b86ef2bc8d14 100644 --- a/packages/ui-components/src/Common/Breadcrumbs/index.tsx +++ b/packages/ui-components/src/Common/Breadcrumbs/index.tsx @@ -62,7 +62,7 @@ const Breadcrumbs: FC = ({ ); }), - [hideHome, isOverflow, lengthOffset, links] + [as, hideHome, isOverflow, lengthOffset, links] ); return ( diff --git a/packages/ui-components/src/Common/Select/StatelessSelect/index.tsx b/packages/ui-components/src/Common/Select/StatelessSelect/index.tsx index e8dbca0c4f1b4..000a7db55be6f 100644 --- a/packages/ui-components/src/Common/Select/StatelessSelect/index.tsx +++ b/packages/ui-components/src/Common/Select/StatelessSelect/index.tsx @@ -34,7 +34,7 @@ const StatelessSelect = ({ if (isStringArray(mappedValues)) { mappedValues = mappedValues.map(value => ({ label: value, - value: value, + value, })); } diff --git a/packages/ui-components/src/Common/Select/index.tsx b/packages/ui-components/src/Common/Select/index.tsx index 9c9a510dcda73..43ca8062cb0ae 100644 --- a/packages/ui-components/src/Common/Select/index.tsx +++ b/packages/ui-components/src/Common/Select/index.tsx @@ -70,7 +70,7 @@ const Select = ({ if (isStringArray(mappedValues)) { mappedValues = mappedValues.map(value => ({ label: value, - value: value, + value, })); } @@ -119,6 +119,7 @@ const Select = ({ )); // We explicitly want to recalculate these values only when the values themselves changed // This is to prevent re-rendering and re-calcukating the values on every render + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(values)]); // Both change the internal state and emit the change event diff --git a/packages/ui-components/src/Containers/Sidebar/index.tsx b/packages/ui-components/src/Containers/Sidebar/index.tsx index 51f98f8714a45..3cebea8ec9105 100644 --- a/packages/ui-components/src/Containers/Sidebar/index.tsx +++ b/packages/ui-components/src/Containers/Sidebar/index.tsx @@ -30,7 +30,7 @@ const SideBar: FC> = ({ }) => { const selectItems = groups.map(({ items, groupName }) => ({ label: groupName, - items: items.map(({ label, link }) => ({ value: link, label: label })), + items: items.map(({ label, link }) => ({ value: link, label })), })); const currentItem = selectItems diff --git a/packages/ui-components/src/MDX/CodeTabs.tsx b/packages/ui-components/src/MDX/CodeTabs.tsx index 517bf13404969..11935b42023cc 100644 --- a/packages/ui-components/src/MDX/CodeTabs.tsx +++ b/packages/ui-components/src/MDX/CodeTabs.tsx @@ -42,7 +42,7 @@ const MDXCodeTabs: FC = ({ return { key: `${language}-${index}`, - label: label, + label, }; }); diff --git a/packages/ui-components/src/global.d.ts b/packages/ui-components/src/global.d.ts index d774364b20387..4d43a1dd0cfe8 100644 --- a/packages/ui-components/src/global.d.ts +++ b/packages/ui-components/src/global.d.ts @@ -1,4 +1,4 @@ declare module '*.module.css' { - const classes: { readonly [key: string]: string }; + const classes: Readonly>; export default classes; } diff --git a/packages/ui-components/src/stylelint/one-utility-class-per-line.mjs b/packages/ui-components/src/stylelint/one-utility-class-per-line.mjs index f68c875026f56..8af0d1831ab06 100644 --- a/packages/ui-components/src/stylelint/one-utility-class-per-line.mjs +++ b/packages/ui-components/src/stylelint/one-utility-class-per-line.mjs @@ -39,7 +39,7 @@ const rule = () => (root, result) => { if (classNames.includes('\n')) { return report({ ruleName: name, - result: result, + result, message: messages.spacing(JSON.stringify(rule.params)), node: rule, fix: indentClassNames(rule), @@ -48,7 +48,7 @@ const rule = () => (root, result) => { return report({ ruleName: name, - result: result, + result, message: messages.className(rule.params), node: rule, fix: indentClassNames(rule), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d22c7f7ece24..c83ff455c2ded 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ catalogs: specifier: ~4.0.17 version: 4.0.17 typescript: - specifier: ~5.8.2 + specifier: 5.8.3 version: 5.8.3 importers: @@ -57,15 +57,27 @@ importers: eslint: specifier: ~9.32.0 version: 9.32.0(jiti@2.4.2) + eslint-import-resolver-typescript: + specifier: ~4.4.4 + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-import-x: specifier: ~4.16.1 version: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) + globals: + specifier: ^16.3.0 + version: 16.3.0 prettier: specifier: 3.6.2 version: 3.6.2 prettier-plugin-tailwindcss: specifier: 0.6.14 version: 0.6.14(prettier@3.6.2) + typescript: + specifier: 'catalog:' + version: 5.8.3 + typescript-eslint: + specifier: ~8.38.0 + version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) apps/site: dependencies: @@ -158,7 +170,7 @@ importers: version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) postcss-calc: specifier: ~10.1.1 - version: 10.1.1(postcss@8.5.3) + version: 10.1.1(postcss@8.5.6) react: specifier: 'catalog:' version: 19.1.1 @@ -196,12 +208,6 @@ importers: specifier: ~5.0.1 version: 5.0.1 devDependencies: - '@eslint/compat': - specifier: ~1.3.1 - version: 1.3.1(eslint@9.32.0(jiti@2.4.2)) - '@eslint/eslintrc': - specifier: ~3.3.1 - version: 3.3.1 '@flarelabs-net/wrangler-build-time-fs-assets-polyfilling': specifier: ^0.0.1 version: 0.0.1 @@ -232,17 +238,14 @@ importers: eslint-config-next: specifier: 15.5.0 version: 15.5.0(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) - eslint-import-resolver-typescript: - specifier: ~4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-mdx: specifier: ~3.6.2 version: 3.6.2(eslint@9.32.0(jiti@2.4.2))(remark-lint-file-extension@3.0.1) eslint-plugin-react: - specifier: ~7.37.4 + specifier: ~7.37.5 version: 7.37.5(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-react-hooks: - specifier: 5.2.0 + specifier: ^5.2.0 version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) global-jsdom: specifier: ^26.0.0 @@ -295,15 +298,9 @@ importers: packages/i18n: devDependencies: - eslint-import-resolver-typescript: - specifier: ~4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)) typescript: specifier: 'catalog:' version: 5.8.3 - typescript-eslint: - specifier: ~8.38.0 - version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) packages/rehype-shiki: dependencies: @@ -441,9 +438,6 @@ importers: dedent: specifier: ^1.6.0 version: 1.6.0 - globals: - specifier: ^16.3.0 - version: 16.3.0 remark-parse: specifier: ^11.0.0 version: 11.0.0 @@ -530,8 +524,11 @@ importers: specifier: ~7.1.2 version: 7.1.2(webpack@5.100.2(@swc/core@1.11.24)(esbuild@0.25.8)) eslint-plugin-react: - specifier: ~7.37.4 + specifier: ~7.37.5 version: 7.37.5(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-storybook: specifier: ~9.0.3 version: 9.0.3(eslint@9.32.0(jiti@2.4.2))(storybook@9.0.18(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) @@ -571,9 +568,6 @@ importers: typescript: specifier: 'catalog:' version: 5.8.3 - typescript-eslint: - specifier: ~8.38.0 - version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) packages: @@ -1118,18 +1112,12 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} @@ -1602,15 +1590,6 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.3.1': - resolution: {integrity: sha512-k8MHony59I5EPic6EQTCNOuPoVBnoYXkP+20xvwFjN7t0qI3ImyvyBgg+hIVPwC8JaxVjjUZld+cLfBLFDLucg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.40 || 9 - peerDependenciesMeta: - eslint: - optional: true - '@eslint/config-array@0.21.0': resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1988,9 +1967,6 @@ packages: resolution: {integrity: sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==} engines: {node: '>=18'} - '@napi-rs/wasm-runtime@0.2.11': - resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -3419,9 +3395,6 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -3617,191 +3590,96 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-android-arm-eabi@1.10.1': - resolution: {integrity: sha512-zohDKXT1Ok0yhbVGff4YAg9HUs5ietG5GpvJBPFSApZnGe7uf2cd26DRhKZbn0Be6xHUZrSzP+RAgMmzyc71EA==} - cpu: [arm] - os: [android] - '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.10.1': - resolution: {integrity: sha512-tAN6k5UrTd4nicpA7s2PbjR/jagpDzAmvXFjbpTazUe5FRsFxVcBlS1F5Lzp5jtWU6bdiqRhSvd4X8rdpCffeA==} - cpu: [arm64] - os: [android] - '@unrs/resolver-binding-android-arm64@1.11.1': resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.10.1': - resolution: {integrity: sha512-+FCsag8WkauI4dQ50XumCXdfvDCZEpMUnvZDsKMxfOisnEklpDFXc6ThY0WqybBYZbiwR5tWcFaZmI0G6b4vrg==} - cpu: [arm64] - os: [darwin] - '@unrs/resolver-binding-darwin-arm64@1.11.1': resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.10.1': - resolution: {integrity: sha512-qYKGGm5wk71ONcXTMZ0+J11qQeOAPz3nw6VtqrBUUELRyXFyvK8cHhHsLBFR4GHnilc2pgY1HTB2TvdW9wO26Q==} - cpu: [x64] - os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.11.1': resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.10.1': - resolution: {integrity: sha512-hOHMAhbvIQ63gkpgeNsXcWPSyvXH7ZEyeg254hY0Lp/hX8NdW+FsUWq73g9946Pc/BrcVI/I3C1cmZ4RCX9bNw==} - cpu: [x64] - os: [freebsd] - '@unrs/resolver-binding-freebsd-x64@1.11.1': resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.10.1': - resolution: {integrity: sha512-6ds7+zzHJgTDmpe0gmFcOTvSUhG5oZukkt+cCsSb3k4Uiz2yEQB4iCRITX2hBwSW+p8gAieAfecITjgqCkswXw==} - cpu: [arm] - os: [linux] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.10.1': - resolution: {integrity: sha512-P7A0G2/jW00diNJyFeq4W9/nxovD62Ay8CMP4UK9OymC7qO7rG1a8Upad68/bdfpIOn7KSp7Aj/6lEW3yyznAA==} - cpu: [arm] - os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.10.1': - resolution: {integrity: sha512-Cg6xzdkrpltcTPO4At+A79zkC7gPDQIgosJmVV8M104ImB6KZi1MrNXgDYIAfkhUYjPzjNooEDFRAwwPadS7ZA==} - cpu: [arm64] - os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.10.1': - resolution: {integrity: sha512-aNeg99bVkXa4lt+oZbjNRPC8ZpjJTKxijg/wILrJdzNyAymO2UC/HUK1UfDjt6T7U5p/mK24T3CYOi3/+YEQSA==} - cpu: [arm64] - os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.10.1': - resolution: {integrity: sha512-ylz5ojeXrkPrtnzVhpCO+YegG63/aKhkoTlY8PfMfBfLaUG8v6m6iqrL7sBUKdVBgOB4kSTUPt9efQdA/Y3Z/w==} - cpu: [ppc64] - os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.10.1': - resolution: {integrity: sha512-xcWyhmJfXXOxK7lvE4+rLwBq+on83svlc0AIypfe6x4sMJR+S4oD7n9OynaQShfj2SufPw2KJAotnsNb+4nN2g==} - cpu: [riscv64] - os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.10.1': - resolution: {integrity: sha512-mW9JZAdOCyorgi1eLJr4gX7xS67WNG9XNPYj5P8VuttK72XNsmdw9yhOO4tDANMgiLXFiSFaiL1gEpoNtRPw/A==} - cpu: [riscv64] - os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.10.1': - resolution: {integrity: sha512-NZGKhBy6xkJ0k09cWNZz4DnhBcGlhDd3W+j7EYoNvf5TSwj2K6kbmfqTWITEgkvjsMUjm1wsrc4IJaH6VtjyHQ==} - cpu: [s390x] - os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.10.1': - resolution: {integrity: sha512-VsjgckJ0gNMw7p0d8In6uPYr+s0p16yrT2rvG4v2jUpEMYkpnfnCiALa9SWshbvlGjKQ98Q2x19agm3iFk8w8Q==} - cpu: [x64] - os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.10.1': - resolution: {integrity: sha512-idMnajMeejnaFi0Mx9UTLSYFDAOTfAEP7VjXNgxKApso3Eu2Njs0p2V95nNIyFi4oQVGFmIuCkoznAXtF/Zbmw==} - cpu: [x64] - os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.10.1': - resolution: {integrity: sha512-7jyhjIRNFjzlr8x5pth6Oi9hv3a7ubcVYm2GBFinkBQKcFhw4nIs5BtauSNtDW1dPIGrxF0ciynCZqzxMrYMsg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.10.1': - resolution: {integrity: sha512-TY79+N+Gkoo7E99K+zmsKNeiuNJYlclZJtKqsHSls8We2iGhgxtletVsiBYie93MSTDRDMI8pkBZJlIJSZPrdA==} - cpu: [arm64] - os: [win32] - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.10.1': - resolution: {integrity: sha512-BAJN5PEPlEV+1m8+PCtFoKm3LQ1P57B4Z+0+efU0NzmCaGk7pUaOxuPgl+m3eufVeeNBKiPDltG0sSB9qEfCxw==} - cpu: [ia32] - os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.10.1': - resolution: {integrity: sha512-2v3erKKmmCyIVvvhI2nF15qEbdBpISTq44m9pyd5gfIJB1PN94oePTLWEd82XUbIbvKhv76xTSeUQSCOGesLeg==} - cpu: [x64] - os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} cpu: [x64] @@ -4505,15 +4383,6 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -6375,11 +6244,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.0: - resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - napi-postinstall@0.3.2: resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -6696,10 +6560,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -8055,9 +7915,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unrs-resolver@1.10.1: - resolution: {integrity: sha512-EFrL7Hw4kmhZdwWO3dwwFJo6hO3FXuQ6Bg8BK/faHZ9m1YxqBS31BNSTxklIQkxK/4LlV8zTYnPsIRLBzTzjCA==} - unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -9645,12 +9502,6 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@emnapi/core@1.4.3': - dependencies: - '@emnapi/wasi-threads': 1.0.2 - tslib: 2.8.1 - optional: true - '@emnapi/core@1.4.5': dependencies: '@emnapi/wasi-threads': 1.0.4 @@ -9662,11 +9513,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.2': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 @@ -9909,10 +9755,6 @@ snapshots: '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.3.1(eslint@9.32.0(jiti@2.4.2))': - optionalDependencies: - eslint: 9.32.0(jiti@2.4.2) - '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 @@ -9930,7 +9772,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -10273,13 +10115,6 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@napi-rs/wasm-runtime@0.2.11': - dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.9.0 - optional: true - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.4.5 @@ -11986,11 +11821,6 @@ snapshots: tslib: 2.8.1 optional: true - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.8.1 - optional: true - '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -12237,121 +12067,62 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.10.1': - optional: true - '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true - '@unrs/resolver-binding-android-arm64@1.10.1': - optional: true - '@unrs/resolver-binding-android-arm64@1.11.1': optional: true - '@unrs/resolver-binding-darwin-arm64@1.10.1': - optional: true - '@unrs/resolver-binding-darwin-arm64@1.11.1': optional: true - '@unrs/resolver-binding-darwin-x64@1.10.1': - optional: true - '@unrs/resolver-binding-darwin-x64@1.11.1': optional: true - '@unrs/resolver-binding-freebsd-x64@1.10.1': - optional: true - '@unrs/resolver-binding-freebsd-x64@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.10.1': - optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.10.1': - optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.10.1': - optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.10.1': - optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.10.1': - optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.10.1': - optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.10.1': - optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.10.1': - optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.10.1': - optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.10.1': - optional: true - '@unrs/resolver-binding-linux-x64-musl@1.11.1': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.10.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.11 - optional: true - '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: '@napi-rs/wasm-runtime': 0.2.12 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.10.1': - optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.10.1': - optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.10.1': - optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true @@ -13052,10 +12823,6 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.1: dependencies: ms: 2.1.3 @@ -13472,7 +13239,7 @@ snapshots: eslint: 9.32.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-react-hooks: 5.2.0(eslint@9.32.0(jiti@2.4.2)) @@ -13483,12 +13250,12 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-import-context@0.1.9(unrs-resolver@1.10.1): + eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: get-tsconfig: 4.10.1 stable-hash-x: 0.2.0 optionalDependencies: - unrs-resolver: 1.10.1 + unrs-resolver: 1.11.1 eslint-import-resolver-node@0.3.9: dependencies: @@ -13509,7 +13276,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color @@ -13518,12 +13285,12 @@ snapshots: dependencies: debug: 4.4.1 eslint: 9.32.0(jiti@2.4.2) - eslint-import-context: 0.1.9(unrs-resolver@1.10.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 tinyglobby: 0.2.14 - unrs-resolver: 1.10.1 + unrs-resolver: 1.11.1 optionalDependencies: eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) @@ -13563,25 +13330,37 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.32.0(jiti@2.4.2)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.32.0(jiti@2.4.2) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)) + transitivePeerDependencies: + - supports-color + optional: true + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): dependencies: '@typescript-eslint/types': 8.38.0 comment-parser: 1.4.1 debug: 4.4.1 eslint: 9.32.0(jiti@2.4.2) - eslint-import-context: 0.1.9(unrs-resolver@1.10.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.0.3 semver: 7.7.2 stable-hash-x: 0.2.0 - unrs-resolver: 1.10.1 + unrs-resolver: 1.11.1 optionalDependencies: '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13610,6 +13389,36 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.32.0(jiti@2.4.2)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.32.0(jiti@2.4.2) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.32.0(jiti@2.4.2)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + optional: true + eslint-plugin-jsx-a11y@6.10.2(eslint@9.32.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 @@ -13916,10 +13725,6 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.4.6(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -15537,8 +15342,6 @@ snapshots: nanoid@3.3.11: {} - napi-postinstall@0.3.0: {} - napi-postinstall@0.3.2: {} natural-compare@1.4.0: {} @@ -15862,8 +15665,6 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -15898,6 +15699,12 @@ snapshots: postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 + postcss-calc@10.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + postcss-cli@11.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.20.3): dependencies: chokidar: 3.6.0 @@ -17405,8 +17212,8 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 tinyrainbow@2.0.0: {} @@ -17735,30 +17542,6 @@ snapshots: unpipe@1.0.0: {} - unrs-resolver@1.10.1: - dependencies: - napi-postinstall: 0.3.0 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.10.1 - '@unrs/resolver-binding-android-arm64': 1.10.1 - '@unrs/resolver-binding-darwin-arm64': 1.10.1 - '@unrs/resolver-binding-darwin-x64': 1.10.1 - '@unrs/resolver-binding-freebsd-x64': 1.10.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.10.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.10.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.10.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.10.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.10.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-x64-musl': 1.10.1 - '@unrs/resolver-binding-wasm32-wasi': 1.10.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.10.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.10.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.10.1 - unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1ecc754fcf8c7..371669b54d335 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,9 +2,15 @@ packages: - packages/* - apps/* -# https://pnpm.io/settings#onlybuiltdependencies -# These are the dependencies that we trust to safely -# run installation scripts. +catalog: + '@types/node': 22.17.0 + '@types/react': ^19.1.9 + classnames: ~2.5.1 + cross-env: ^10.0.0 + react: ^19.1.1 + tailwindcss: ~4.0.17 + typescript: 5.8.3 + onlyBuiltDependencies: - '@swc/core' - '@tailwindcss/oxide' @@ -13,16 +19,3 @@ onlyBuiltDependencies: - sharp - unrs-resolver - workerd - -# We use catalog for dependencies that are shared across -# multiple packages in the monorepo. -# This allows us to manage versions and updates in one place. -# https://pnpm.io/en/catalogs -catalog: - '@types/node': 22.17.0 - '@types/react': ^19.1.9 - classnames: ~2.5.1 - react: ^19.1.1 - tailwindcss: ~4.0.17 - typescript: ~5.8.2 - 'cross-env': ^10.0.0