From 94156e90742d79ca6aed31ff9d8c55d3f2acba96 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Fri, 19 Dec 2025 16:45:51 -0500 Subject: [PATCH 01/15] chore: server-side render partners --- .../index.module.css | 14 +- .../Common/Partners/PartnerButton/index.tsx | 26 +++ .../Partners/PartnerIcon/index.module.css | 13 -- .../Common/Partners/PartnerIcon/index.tsx | 37 ---- .../Common/Partners/PartnerLogo/index.tsx | 30 --- .../PartnersIconList/index.module.css | 9 - .../Partners/PartnersIconList/index.tsx | 41 ---- .../PartnersLogoList/index.module.css | 8 - .../Partners/PartnersLogoList/index.tsx | 44 ----- .../Common/Partners/index.module.css | 22 +++ .../site/components/Common/Partners/index.tsx | 63 ++++++ apps/site/components/Common/Partners/utils.ts | 24 --- .../components/Common/Supporters/index.tsx | 4 +- .../hooks/react-client/usePartnersList.ts | 62 ------ apps/site/mdx/components.mjs | 9 +- apps/site/next-data/generators/partners.mjs | 13 ++ apps/site/next-data/providers/partners.ts | 5 + apps/site/next-env.d.ts | 2 +- apps/site/next.partners.constants.tsx | 12 -- apps/site/package.json | 8 +- apps/site/pages/en/about/partners.mdx | 4 +- apps/site/pages/en/download/current.mdx | 2 +- apps/site/pages/en/download/index.mdx | 2 +- apps/site/pages/en/index.mdx | 2 +- apps/site/pages/fr/about/partners.mdx | 4 +- apps/site/pages/fr/download/current.mdx | 2 +- apps/site/pages/fr/download/index.mdx | 2 +- apps/site/pages/fr/index.mdx | 2 +- apps/site/pages/id/about/partners.mdx | 4 +- apps/site/pages/id/download/current.mdx | 2 +- apps/site/pages/id/download/index.mdx | 2 +- apps/site/pages/id/index.mdx | 2 +- apps/site/pages/ja/about/partners.mdx | 4 +- apps/site/pages/ja/download/current.mdx | 2 +- apps/site/pages/ja/download/index.mdx | 2 +- apps/site/pages/ja/index.mdx | 2 +- apps/site/pages/pt-br/about/partners.mdx | 4 +- apps/site/pages/pt-br/download/current.mdx | 2 +- apps/site/pages/pt-br/download/index.mdx | 2 +- apps/site/pages/pt-br/index.mdx | 2 +- apps/site/pages/ro/index.mdx | 2 +- apps/site/pages/uk/about/partners.mdx | 4 +- apps/site/pages/uk/download/current.mdx | 2 +- apps/site/pages/uk/download/index.mdx | 2 +- apps/site/pages/uk/index.mdx | 2 +- apps/site/pages/zh-cn/download/current.mdx | 2 +- apps/site/pages/zh-cn/download/index.mdx | 2 +- apps/site/pages/zh-cn/index.mdx | 2 +- apps/site/types/partners.ts | 26 +-- apps/site/util/array.ts | 8 +- apps/site/util/partners/index.tsx | 27 --- pnpm-lock.yaml | 181 +++++++++--------- 52 files changed, 282 insertions(+), 474 deletions(-) rename apps/site/components/Common/Partners/{PartnerLogo => PartnerButton}/index.module.css (67%) create mode 100644 apps/site/components/Common/Partners/PartnerButton/index.tsx delete mode 100644 apps/site/components/Common/Partners/PartnerIcon/index.module.css delete mode 100644 apps/site/components/Common/Partners/PartnerIcon/index.tsx delete mode 100644 apps/site/components/Common/Partners/PartnerLogo/index.tsx delete mode 100644 apps/site/components/Common/Partners/PartnersIconList/index.module.css delete mode 100644 apps/site/components/Common/Partners/PartnersIconList/index.tsx delete mode 100644 apps/site/components/Common/Partners/PartnersLogoList/index.module.css delete mode 100644 apps/site/components/Common/Partners/PartnersLogoList/index.tsx create mode 100644 apps/site/components/Common/Partners/index.module.css create mode 100644 apps/site/components/Common/Partners/index.tsx delete mode 100644 apps/site/components/Common/Partners/utils.ts delete mode 100644 apps/site/hooks/react-client/usePartnersList.ts create mode 100644 apps/site/next-data/generators/partners.mjs create mode 100644 apps/site/next-data/providers/partners.ts delete mode 100644 apps/site/next.partners.constants.tsx delete mode 100644 apps/site/util/partners/index.tsx diff --git a/apps/site/components/Common/Partners/PartnerLogo/index.module.css b/apps/site/components/Common/Partners/PartnerButton/index.module.css similarity index 67% rename from apps/site/components/Common/Partners/PartnerLogo/index.module.css rename to apps/site/components/Common/Partners/PartnerButton/index.module.css index 8f7b772426abe..6166b9c0614ca 100644 --- a/apps/site/components/Common/Partners/PartnerLogo/index.module.css +++ b/apps/site/components/Common/Partners/PartnerButton/index.module.css @@ -1,6 +1,6 @@ @reference "../../../../styles/index.css"; -.partnerIcon { +.big { @apply flex h-28 max-h-28 @@ -17,3 +17,15 @@ !w-auto; } } + +.small { + @apply h-9 + w-auto + min-w-9 + p-2; + + svg { + @apply !h-4 + !w-auto; + } +} diff --git a/apps/site/components/Common/Partners/PartnerButton/index.tsx b/apps/site/components/Common/Partners/PartnerButton/index.tsx new file mode 100644 index 0000000000000..104abc7d53f71 --- /dev/null +++ b/apps/site/components/Common/Partners/PartnerButton/index.tsx @@ -0,0 +1,26 @@ +import Button from '#site/components/Common/Button'; + +import type { AnchorHTMLAttributes, FC } from 'react'; + +import style from './index.module.css'; + +type PartnerProps = AnchorHTMLAttributes & { + size: 'big' | 'small'; +}; + +const PartnerButton: FC = ({ + href, + size = 'small', + ...props +}) => ( + - - -); - -export default PartnersIcon; diff --git a/apps/site/components/Common/Partners/PartnerLogo/index.tsx b/apps/site/components/Common/Partners/PartnerLogo/index.tsx deleted file mode 100644 index 206712775764c..0000000000000 --- a/apps/site/components/Common/Partners/PartnerLogo/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import Skeleton from '@node-core/ui-components/Common/Skeleton'; -import { cloneElement } from 'react'; - -import Button from '#site/components/Common/Button'; - -import type { Partners } from '#site/types'; -import type { ComponentProps, FC } from 'react'; - -import style from './index.module.css'; - -type PartnersLogoProps = Partners & ComponentProps; - -const PartnersLogo: FC = ({ href, logo, loading }) => ( - - - -); - -export default PartnersLogo; diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.module.css b/apps/site/components/Common/Partners/PartnersIconList/index.module.css deleted file mode 100644 index ebba90ad3787b..0000000000000 --- a/apps/site/components/Common/Partners/PartnersIconList/index.module.css +++ /dev/null @@ -1,9 +0,0 @@ -@reference "../../../../styles/index.css"; - -.partnersIconList { - @apply flex - flex-row - flex-wrap - items-center - gap-2; -} diff --git a/apps/site/components/Common/Partners/PartnersIconList/index.tsx b/apps/site/components/Common/Partners/PartnersIconList/index.tsx deleted file mode 100644 index 8022fe54b0df9..0000000000000 --- a/apps/site/components/Common/Partners/PartnersIconList/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -'use client'; - -import usePartnersList from '#site/hooks/react-client/usePartnersList'; -import { ICON_PARTNERS } from '#site/next.partners.constants'; - -import type { PartnerCategory } from '#site/types'; -import type { FC } from 'react'; - -import PartnerIcon from '../PartnerIcon'; - -import style from './index.module.css'; - -type PartnersIconListProps = { - maxLength?: number; - categories?: PartnerCategory; -}; - -const PartnersIconList: FC = ({ - maxLength = 6, - categories, -}) => { - const { seedList, initialRenderer } = usePartnersList({ - logos: ICON_PARTNERS, - maxLength, - categories, - }); - - return ( -
- {seedList.map((partner, index) => ( - - ))} -
- ); -}; - -export default PartnersIconList; diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.module.css b/apps/site/components/Common/Partners/PartnersLogoList/index.module.css deleted file mode 100644 index 52efa7168171c..0000000000000 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.module.css +++ /dev/null @@ -1,8 +0,0 @@ -@reference "../../../../styles/index.css"; - -.partnersLogoList { - @apply grid - w-full - grid-cols-[repeat(auto-fill,minmax(240px,1fr))] - gap-4; -} diff --git a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx b/apps/site/components/Common/Partners/PartnersLogoList/index.tsx deleted file mode 100644 index 042b891b26212..0000000000000 --- a/apps/site/components/Common/Partners/PartnersLogoList/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -'use client'; - -import usePartnersList from '#site/hooks/react-client/usePartnersList'; -import { LOGO_PARTNERS } from '#site/next.partners.constants'; - -import type { PartnerCategory } from '#site/types'; -import type { FC } from 'react'; - -import PartnerLogo from '../PartnerLogo'; - -import style from './index.module.css'; - -type PartnersLogoListProps = { - maxLength?: number; - categories?: PartnerCategory; - sort?: 'name' | 'weight'; -}; - -const PartnersLogoList: FC = ({ - maxLength = 3, - sort = 'weight', - categories, -}) => { - const { seedList, initialRenderer } = usePartnersList({ - logos: LOGO_PARTNERS, - maxLength, - sort, - categories, - }); - - return ( -
- {seedList.map((partner, index) => ( - - ))} -
- ); -}; - -export default PartnersLogoList; diff --git a/apps/site/components/Common/Partners/index.module.css b/apps/site/components/Common/Partners/index.module.css new file mode 100644 index 0000000000000..68faede61335c --- /dev/null +++ b/apps/site/components/Common/Partners/index.module.css @@ -0,0 +1,22 @@ +@reference "../../../styles/index.css"; + +.small { + @apply flex + flex-row + flex-wrap + items-center + gap-2; +} + +.big { + @apply grid + w-full + grid-cols-[repeat(auto-fill,minmax(240px,1fr))] + gap-4; +} + +.tooltip { + @apply p-2 + text-neutral-900 + dark:text-neutral-200; +} diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx new file mode 100644 index 0000000000000..de69de33cb724 --- /dev/null +++ b/apps/site/components/Common/Partners/index.tsx @@ -0,0 +1,63 @@ +'use server'; + +import Tooltip from '@node-core/ui-components/Common/Tooltip'; +import * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos'; + +import providePartners from '#site/next-data/providers/partners'; + +import type { PartnerCategory } from '#site/types'; +import type { FC } from 'react'; + +import PartnerButton from './PartnerButton'; + +import style from './index.module.css'; + +type PartnersListProps = { + size: 'big' | 'small'; + category?: PartnerCategory; +}; + +const PartnersList: FC = async ({ + size = 'small', + category, +}) => { + let partners = await providePartners(); + + if (category) { + partners = partners.filter(partner => + partner.categories.includes(category) + ); + } + + if (size === 'small') { + partners = partners.slice(0, 6); + } + + return ( +
+ {partners.map(partner => { + const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos]; + + if (size === 'small') { + return ( + {partner.name}
} + > + + + + + ); + } else { + return ( + + + + ); + } + })} + + ); +}; + +export default PartnersList; diff --git a/apps/site/components/Common/Partners/utils.ts b/apps/site/components/Common/Partners/utils.ts deleted file mode 100644 index 8ce9a6f4809ee..0000000000000 --- a/apps/site/components/Common/Partners/utils.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { shuffle } from '#site/util/array'; - -import type { RandomPartnerListConfig, Partners } from '#site/types'; - -async function randomPartnerList( - partners: Array, - config: RandomPartnerListConfig -): Promise> { - const { pick = 4, dateSeed = 5, category } = config; - - // Generate a deterministic seed based on current time that changes every X minutes - const seed = Math.floor(Date.now() / (dateSeed * 60 * 1000)); - - // Filter by category if provided - const filtered = category - ? partners.filter(p => p.categories.includes(category)) - : partners; - - const shuffled = await shuffle(filtered, seed); - - return shuffled.slice(0, pick ?? filtered.length); -} - -export { randomPartnerList }; diff --git a/apps/site/components/Common/Supporters/index.tsx b/apps/site/components/Common/Supporters/index.tsx index 15bf295dc8722..c6350c8e8bc31 100644 --- a/apps/site/components/Common/Supporters/index.tsx +++ b/apps/site/components/Common/Supporters/index.tsx @@ -1,10 +1,10 @@ import Avatar from '@node-core/ui-components/Common/AvatarGroup/Avatar'; -import type { Supporters } from '#site/types'; +import type { Supporter } from '#site/types'; import type { FC } from 'react'; type SupportersListProps = { - supporters: Array; + supporters: Array; }; const SupportersList: FC = ({ supporters }) => ( diff --git a/apps/site/hooks/react-client/usePartnersList.ts b/apps/site/hooks/react-client/usePartnersList.ts deleted file mode 100644 index f98301563080d..0000000000000 --- a/apps/site/hooks/react-client/usePartnersList.ts +++ /dev/null @@ -1,62 +0,0 @@ -'use client'; - -import { useEffect, useRef, useState } from 'react'; - -import { randomPartnerList } from '#site/components/Common/Partners/utils'; - -import type { PartnerCategory, Partners } from '#site/types/partners'; - -const usePartnersList = ({ - logos, - maxLength, - sort, - categories, -}: { - logos: Array; - maxLength: number; - sort?: 'name' | 'weight'; - categories?: PartnerCategory; -}) => { - const initialRenderer = useRef(true); - - const [seedList, setSeedList] = useState>(() => { - const filteredLogos = logos.filter( - partner => !categories || partner.categories.includes(categories) - ); - - return filteredLogos.slice(0, maxLength || filteredLogos.length); - }); - - useEffect(() => { - // We intentionally render the initial default "mock" list of sponsors - // to have the Skeletons loading, and then we render the actual list - // after an enough amount of time has passed to give a proper sense of Animation - // We do this client-side effect, to ensure that a random-amount of sponsors is renderered - // on every page load. Since our page is natively static, we need to ensure that - // on the client-side we have a random amount of sponsors rendered. - // Although whilst we are deployed on Vercel or other environment that supports ISR - // (Incremental Static Generation) whose would invalidate the cache every 5 minutes - // We want to ensure that this feature is compatible on a full-static environment - const renderSponsorsAnimation = setTimeout(async () => { - initialRenderer.current = false; - - setSeedList( - await randomPartnerList(logos, { - pick: maxLength, - dateSeed: 1, - category: categories, - sort, - }) - ); - }, 0); - - return () => clearTimeout(renderSponsorsAnimation); - // We only want this to run once on initial render - // We don't really care if the props change as realistically they shouldn't ever - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return { seedList, initialRenderer }; -}; - -export default usePartnersList; diff --git a/apps/site/mdx/components.mjs b/apps/site/mdx/components.mjs index 1f4a7e06e0a41..46db7dc2afe11 100644 --- a/apps/site/mdx/components.mjs +++ b/apps/site/mdx/components.mjs @@ -12,8 +12,7 @@ import { import Button from '#site/components/Common/Button'; import LinkWithArrow from '#site/components/Common/LinkWithArrow'; -import PartnersIconList from '#site/components/Common/Partners/PartnersIconList'; -import PartnersLogoList from '#site/components/Common/Partners/PartnersLogoList'; +import PartnersList from '#site/components/Common/Partners'; import DownloadButton from '#site/components/Downloads/DownloadButton'; import DownloadsTable from '#site/components/Downloads/DownloadsTable'; import BlogPostLink from '#site/components/Downloads/Release/BlogPostLink'; @@ -82,10 +81,8 @@ export default { ChangelogLink, DownloadLink: ReleaseDownloadLink, }, - // Shows a list of Node.js Partners with Icons - PartnersIconList, - // Shows a list of Node.js Partners with Logos - PartnersLogoList, + // Shows a list of Node.js Partners + PartnersList, // HOC for providing the Download Archive Page properties WithDownloadArchive, DownloadsTable, diff --git a/apps/site/next-data/generators/partners.mjs b/apps/site/next-data/generators/partners.mjs new file mode 100644 index 0000000000000..0876c10069036 --- /dev/null +++ b/apps/site/next-data/generators/partners.mjs @@ -0,0 +1,13 @@ +import partners from '#site/public/static/partners/constants.json'; +import { shuffle } from '#site/util/array'; + +/** + * Builds the final partner list used by the UI. + * + * @returns {Promise} + */ +export default async function getPartnersList() { + const seed = Math.floor(Date.now() / (60 * 1000)); + + return await shuffle(partners, seed); +} diff --git a/apps/site/next-data/providers/partners.ts b/apps/site/next-data/providers/partners.ts new file mode 100644 index 0000000000000..ab35d17c31a31 --- /dev/null +++ b/apps/site/next-data/providers/partners.ts @@ -0,0 +1,5 @@ +'use cache'; + +import providePartners from '#site/next-data/generators/partners.mjs'; + +export default providePartners; diff --git a/apps/site/next-env.d.ts b/apps/site/next-env.d.ts index 2d5420ebae639..cdb6b7b848c32 100644 --- a/apps/site/next-env.d.ts +++ b/apps/site/next-env.d.ts @@ -1,7 +1,7 @@ /// /// /// -import "./.next/types/routes.d.ts"; +import './.next/dev/types/routes.d.ts'; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/site/next.partners.constants.tsx b/apps/site/next.partners.constants.tsx deleted file mode 100644 index 88979aad3485a..0000000000000 --- a/apps/site/next.partners.constants.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import partners from '#site/public/static/partners/constants.json' with { type: 'json' }; -import { createPartnersList } from '#site/util/partners'; - -import type { Partners } from '#site/types'; - -const getPartnersByType = (type?: 'Logo' | 'Favicon') => - createPartnersList(partners as Array>, type); - -const ICON_PARTNERS = getPartnersByType('Favicon'); -const LOGO_PARTNERS = getPartnersByType('Logo'); - -export { ICON_PARTNERS, LOGO_PARTNERS }; diff --git a/apps/site/package.json b/apps/site/package.json index 1cdb7f0d45b8c..827f62a839b4d 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -50,16 +50,16 @@ "@types/node": "catalog:", "@types/react": "catalog:", "@vcarl/remark-headings": "~0.1.0", - "@vercel/analytics": "~1.5.0", + "@vercel/analytics": "~1.6.1", "@vercel/otel": "~2.1.0", - "@vercel/speed-insights": "~1.2.0", + "@vercel/speed-insights": "~1.3.1", "classnames": "catalog:", "cross-env": "catalog:", "feed": "~5.1.0", "github-slugger": "~2.0.0", "gray-matter": "~4.0.3", "mdast-util-to-string": "^4.0.0", - "next": "16.0.10", + "next": "16.1.0", "next-intl": "~4.5.3", "next-themes": "~0.4.6", "postcss-calc": "~10.1.1", @@ -80,7 +80,7 @@ }, "devDependencies": { "@flarelabs-net/wrangler-build-time-fs-assets-polyfilling": "^0.0.1", - "@next/eslint-plugin-next": "16.0.7", + "@next/eslint-plugin-next": "16.1.0", "@node-core/remark-lint": "workspace:*", "@opennextjs/cloudflare": "^1.14.4", "@playwright/test": "^1.56.1", diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index 1d524d8873ba9..b72a96db52a88 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -18,7 +18,7 @@ The infrastructure partners provide important support for the Node.js project, providing hardware and machines for our continuous integration and testing processes, without we can't test and release new versions of Node.js. - + ## Supporters @@ -38,7 +38,7 @@ End-Of-Life versions, please visit [End-Of-Life Node.js Releases](/about/eol) > Using EOL releases through commercial support should be viewed as a temporary solution, the goal should always > be to upgrade to actively supported versions. - + ## Become a Partner diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/pages/en/download/current.mdx index 551c4a9aed447..a8e957717ef48 100644 --- a/apps/site/pages/en/download/current.mdx +++ b/apps/site/pages/en/download/current.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index ffed0112321dd..06b3d715d1c09 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/en/index.mdx b/apps/site/pages/en/index.mdx index 14a15f91d0431..a44de0233137b 100644 --- a/apps/site/pages/en/index.mdx +++ b/apps/site/pages/en/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
Node.js is proudly supported by the partners above and more. diff --git a/apps/site/pages/fr/about/partners.mdx b/apps/site/pages/fr/about/partners.mdx index 6d73dd1f5c711..63c4844922398 100644 --- a/apps/site/pages/fr/about/partners.mdx +++ b/apps/site/pages/fr/about/partners.mdx @@ -18,7 +18,7 @@ Les partenaires infrastructurels apportent un soutien important au projet Node.j en fournissant le matériel et les machines nécessaires à nos processus d'intégration et de test continus, sans lesquels nous ne pourrions pas tester et publier de nouvelles versions de Node.js. - + ## Contributeurs @@ -37,7 +37,7 @@ versions en fin de vie, veuillez consulter [End-Of-Life Node.js Releases](/about > L'utilisation des versions EOL(fin de vie) via NES doit être considérée comme une solution temporaire. L'objectif doit toujours être de passer à des versions activement prises en charge. - + ## Devenir un partenaire diff --git a/apps/site/pages/fr/download/current.mdx b/apps/site/pages/fr/download/current.mdx index b1f688b00c1b5..8610b2bc4d4e0 100644 --- a/apps/site/pages/fr/download/current.mdx +++ b/apps/site/pages/fr/download/current.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/fr/download/index.mdx b/apps/site/pages/fr/download/index.mdx index 8a12ee096261a..60074c062b535 100644 --- a/apps/site/pages/fr/download/index.mdx +++ b/apps/site/pages/fr/download/index.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/fr/index.mdx b/apps/site/pages/fr/index.mdx index ed40c5c018b65..02037eda3b81e 100644 --- a/apps/site/pages/fr/index.mdx +++ b/apps/site/pages/fr/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
Node.js est fièrement soutenu par les partenaires ci-dessus et bien d'autres encore. diff --git a/apps/site/pages/id/about/partners.mdx b/apps/site/pages/id/about/partners.mdx index 4b3ab21af203e..abd4154bbcf33 100644 --- a/apps/site/pages/id/about/partners.mdx +++ b/apps/site/pages/id/about/partners.mdx @@ -16,7 +16,7 @@ dan pengembangan berkelanjutan dari Node.js. ... - + ## Pendukung @@ -36,7 +36,7 @@ untuk menjembatani kebutuhan sementara kamu merencanakan strategi peningkatan ve > Menggunakan rilis EOL melalui dukungan komersial harus dianggap sebagai solusi sementara. Tujuan utama tetap harus meningkatkan ke versi yang masih didukung secara aktif. - + ## Menjadi Mitra diff --git a/apps/site/pages/id/download/current.mdx b/apps/site/pages/id/download/current.mdx index 8f94265639400..fa6e33e6b00d2 100644 --- a/apps/site/pages/id/download/current.mdx +++ b/apps/site/pages/id/download/current.mdx @@ -43,6 +43,6 @@ atau biner
- +
diff --git a/apps/site/pages/id/download/index.mdx b/apps/site/pages/id/download/index.mdx index f086615bd4254..4932d9f3fc799 100644 --- a/apps/site/pages/id/download/index.mdx +++ b/apps/site/pages/id/download/index.mdx @@ -43,6 +43,6 @@ atau biner
- +
diff --git a/apps/site/pages/id/index.mdx b/apps/site/pages/id/index.mdx index 03bbd5303ac1e..0191f11f0293a 100644 --- a/apps/site/pages/id/index.mdx +++ b/apps/site/pages/id/index.mdx @@ -30,7 +30,7 @@ layout: home
- +
Node.js dengan bangga didukung oleh para mitra di atas dan lainnya. diff --git a/apps/site/pages/ja/about/partners.mdx b/apps/site/pages/ja/about/partners.mdx index 41f179a0a1162..8a7aa218d39ab 100644 --- a/apps/site/pages/ja/about/partners.mdx +++ b/apps/site/pages/ja/about/partners.mdx @@ -13,7 +13,7 @@ Node.jsの成功と継続的な発展に欠かせないパートナーのみな インフラストラクチャーのパートナーのみなさまにはNode.jsプロジェクトに多大なご支援をいただいております。継続的インテグレーションやテストに必要なハードウェアや機器をご提供いただいているおかげで新しいNode.jsのバージョンのテストやリリースを行うことができます。 - + ## サポーター @@ -27,7 +27,7 @@ Node.jsの成功と継続的な発展に欠かせないパートナーのみな > 商用サポートによるEOLバージョンの利用は一時的な解決策と捉えるべきであり、常に積極的にサポートされているバージョンへのアップグレードを目標とすべきです。 - + ## パートナーになる diff --git a/apps/site/pages/ja/download/current.mdx b/apps/site/pages/ja/download/current.mdx index 01810b027a8cc..8be1bba4a02a8 100644 --- a/apps/site/pages/ja/download/current.mdx +++ b/apps/site/pages/ja/download/current.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/ja/download/index.mdx b/apps/site/pages/ja/download/index.mdx index b298c94029a35..5d1383affe1b9 100644 --- a/apps/site/pages/ja/download/index.mdx +++ b/apps/site/pages/ja/download/index.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/ja/index.mdx b/apps/site/pages/ja/index.mdx index 28d8a87bfd63f..38232a1787038 100644 --- a/apps/site/pages/ja/index.mdx +++ b/apps/site/pages/ja/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
Node.jsは上記パートナー企業など数多くの企業からご支援いただいています。 diff --git a/apps/site/pages/pt-br/about/partners.mdx b/apps/site/pages/pt-br/about/partners.mdx index 1bfee1a7603db..7e8d1e510287b 100644 --- a/apps/site/pages/pt-br/about/partners.mdx +++ b/apps/site/pages/pt-br/about/partners.mdx @@ -13,7 +13,7 @@ Agradecemos o apoio de nossos parceiros, que desempenham um papel crucial no suc Os parceiros de infraestrutura fornecem um apoio fundamental para o projeto Node.js, disponibilizando hardware e máquinas para nossos processos de integração contínua e testes, sem os quais não conseguimos testar e lançar novas versões do Node.js. - + ## Apoiadores @@ -30,7 +30,7 @@ Fim de Vida Útil por favor visite os [Lançamentos em Fim de Vida Útil (_EOL_) > O uso de versões _EOL_ através de suporte comercial deve ser visto como uma solução temporária, o objetivo deve ser sempre atualizar para versões ativamente mantidas. - + ## Torne-se um Parceiro diff --git a/apps/site/pages/pt-br/download/current.mdx b/apps/site/pages/pt-br/download/current.mdx index eb8bf9e303352..43e2b3a77f398 100644 --- a/apps/site/pages/pt-br/download/current.mdx +++ b/apps/site/pages/pt-br/download/current.mdx @@ -41,6 +41,6 @@ Confira nossos binários - + diff --git a/apps/site/pages/pt-br/download/index.mdx b/apps/site/pages/pt-br/download/index.mdx index 5a5e7f812ca6d..fdf74fa37b92c 100644 --- a/apps/site/pages/pt-br/download/index.mdx +++ b/apps/site/pages/pt-br/download/index.mdx @@ -43,6 +43,6 @@ ou os binários - + diff --git a/apps/site/pages/pt-br/index.mdx b/apps/site/pages/pt-br/index.mdx index e47afb933c53e..b2d61187569d7 100644 --- a/apps/site/pages/pt-br/index.mdx +++ b/apps/site/pages/pt-br/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
O Node.js é apoiado orgulhosamente pelos parceiros acima e outros. diff --git a/apps/site/pages/ro/index.mdx b/apps/site/pages/ro/index.mdx index cc0b9270d488c..f676f4eca7d62 100644 --- a/apps/site/pages/ro/index.mdx +++ b/apps/site/pages/ro/index.mdx @@ -30,7 +30,7 @@ layout: home
- +
Node.js este susținut cu mândrie de partenerii de mai sus și mulți alții. diff --git a/apps/site/pages/uk/about/partners.mdx b/apps/site/pages/uk/about/partners.mdx index 6b26ad4ec4e3c..643c20f6cb14d 100644 --- a/apps/site/pages/uk/about/partners.mdx +++ b/apps/site/pages/uk/about/partners.mdx @@ -13,7 +13,7 @@ layout: about Партнери інфраструктури здійснюють важливу підтримку для проєкту Node.js, надаючи апаратне забезпечення та пристрої для постійної інтеграції та тестування. Без них ми не зможемо тестувати та випускати нові версії Node.js. - + ## Підтримувачі @@ -28,7 +28,7 @@ layout: about > Використання EOL-релізів із комерційною підтримкою повинне бути тимчасовим рішенням, і за можливості слід оновлюватися до підтримуваних версій. - + ## Як стати партнером? diff --git a/apps/site/pages/uk/download/current.mdx b/apps/site/pages/uk/download/current.mdx index 5ef68c7a26ecb..c527232d619bf 100644 --- a/apps/site/pages/uk/download/current.mdx +++ b/apps/site/pages/uk/download/current.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/uk/download/index.mdx b/apps/site/pages/uk/download/index.mdx index 985a71b4e768a..81d037979806c 100644 --- a/apps/site/pages/uk/download/index.mdx +++ b/apps/site/pages/uk/download/index.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/uk/index.mdx b/apps/site/pages/uk/index.mdx index 45e10b26519e5..c32e5800ae1af 100644 --- a/apps/site/pages/uk/index.mdx +++ b/apps/site/pages/uk/index.mdx @@ -29,7 +29,7 @@ layout: home
- +
Node.js підтримується партнерами вище і не тільки. diff --git a/apps/site/pages/zh-cn/download/current.mdx b/apps/site/pages/zh-cn/download/current.mdx index 01e480b37ed49..84681ddbf8e3f 100644 --- a/apps/site/pages/zh-cn/download/current.mdx +++ b/apps/site/pages/zh-cn/download/current.mdx @@ -43,6 +43,6 @@ title: 下载 Node.js®
- +
diff --git a/apps/site/pages/zh-cn/download/index.mdx b/apps/site/pages/zh-cn/download/index.mdx index 922bad7be93b9..b2fcd74ef7f50 100644 --- a/apps/site/pages/zh-cn/download/index.mdx +++ b/apps/site/pages/zh-cn/download/index.mdx @@ -41,6 +41,6 @@ title: 下载 Node.js®
- +
diff --git a/apps/site/pages/zh-cn/index.mdx b/apps/site/pages/zh-cn/index.mdx index abd55fe424b5a..eec67f636e0ff 100644 --- a/apps/site/pages/zh-cn/index.mdx +++ b/apps/site/pages/zh-cn/index.mdx @@ -29,7 +29,7 @@ layout: home
- +
Node.js 很荣幸得到上述及更多合作伙伴的支持。 diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index 705dada162e5a..8e22622a87078 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -1,6 +1,6 @@ import type { ReactElement, SVGProps } from 'react'; -export type Partners = { +export type Partner = { id: string; /** * The name of the partner @@ -30,32 +30,10 @@ export type Partners = { export type PartnerCategory = 'infrastructure' | 'esp'; -export type Supporters = { +export type Supporter = { name: string; image: string; url: string; profile: string; source: 'opencollective' | 'github'; }; - -export type RandomPartnerListConfig = { - /** - * Number of partners to pick from the list. - * If null, all partners will be returned. - */ - pick?: number | null; - /** - * Date seed to use for the randomization. - * This is used to ensure that the same partners are returned for the same date. - */ - dateSeed?: number; - /** - * Category of partners to filter by. - * If not provided, all partners will be returned. - */ - category?: PartnerCategory; - /** - * Whether to randomize the partners or not. - */ - sort?: 'name' | 'weight' | null; -}; diff --git a/apps/site/util/array.ts b/apps/site/util/array.ts index c9e1856495bc1..f6aec1ed9c97b 100644 --- a/apps/site/util/array.ts +++ b/apps/site/util/array.ts @@ -1,10 +1,8 @@ -import type { Partners } from '#site/types'; - // Fisher-Yates shuffle algorithm with a seed for deterministic results -export const shuffle = async ( - array: Array, +export const shuffle = async ( + array: Array, seed: number -): Promise> => { +): Promise> => { const shuffled = [...array]; const encoder = new TextEncoder(); const buffer = encoder.encode(String(seed)); diff --git a/apps/site/util/partners/index.tsx b/apps/site/util/partners/index.tsx deleted file mode 100644 index e2f1fbc5cdd9f..0000000000000 --- a/apps/site/util/partners/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as PartnersLogo from '@node-core/ui-components/Icons/PartnerLogos'; - -import type { Partners } from '#site/types'; -import type { ElementType } from 'react'; - -/** - * Creates an icon element for a component - */ -const createIcon = ( - IconModule: Record>, - iconName: string, - type: 'Logo' | 'Favicon' = 'Favicon' -) => { - const IconComponent = IconModule[iconName][type || 'Favicon']; - return ; -}; - -// Creates a list of partners with their respective icons -export const createPartnersList = ( - partnerLists: Array>, - type?: 'Logo' | 'Favicon' -) => - partnerLists.map(({ id, ...partner }) => ({ - id, - logo: createIcon(PartnersLogo, id, type), - ...partner, - })); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce0009bd68b13..3968d65b79a9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ catalogs: version: 2.5.1 cross-env: specifier: ^10.0.0 - version: 10.0.0 + version: 10.1.0 react: specifier: ^19.2.1 version: 19.2.1 @@ -136,20 +136,20 @@ importers: specifier: ~0.1.0 version: 0.1.0 '@vercel/analytics': - specifier: ~1.5.0 - version: 1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.6.1 + version: 1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@vercel/otel': specifier: ~2.1.0 version: 2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)) '@vercel/speed-insights': - specifier: ~1.2.0 - version: 1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.3.1 + version: 1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) classnames: specifier: 'catalog:' version: 2.5.1 cross-env: specifier: 'catalog:' - version: 10.0.0 + version: 10.1.0 feed: specifier: ~5.1.0 version: 5.1.0 @@ -163,11 +163,11 @@ importers: specifier: ^4.0.0 version: 4.0.0 next: - specifier: 16.0.10 - version: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 16.1.0 + version: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl: specifier: ~4.5.3 - version: 4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) + version: 4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) next-themes: specifier: ~0.4.6 version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -221,14 +221,14 @@ importers: specifier: ^0.0.1 version: 0.0.1 '@next/eslint-plugin-next': - specifier: 16.0.7 - version: 16.0.7 + specifier: 16.1.0 + version: 16.1.0 '@node-core/remark-lint': specifier: workspace:* version: link:../../packages/remark-lint '@opennextjs/cloudflare': specifier: ^1.14.4 - version: 1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) + version: 1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -252,7 +252,7 @@ importers: version: 1.7.0 eslint-config-next: specifier: 16.0.7 - version: 16.0.7(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) + version: 16.0.7(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) eslint-plugin-mdx: specifier: ~3.6.2 version: 3.6.2(eslint@9.36.0(jiti@2.6.1))(remark-lint-file-extension@3.0.1) @@ -343,7 +343,7 @@ importers: devDependencies: cross-env: specifier: 'catalog:' - version: 10.0.0 + version: 10.1.0 packages/remark-lint: dependencies: @@ -452,7 +452,7 @@ importers: devDependencies: cross-env: specifier: 'catalog:' - version: 10.0.0 + version: 10.1.0 dedent: specifier: ^1.7.0 version: 1.7.0 @@ -540,7 +540,7 @@ importers: version: 19.2.7 cross-env: specifier: 'catalog:' - version: 10.0.0 + version: 10.1.0 css-loader: specifier: ~7.1.2 version: 7.1.2(webpack@5.103.0(@swc/core@1.15.3)) @@ -2243,56 +2243,59 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@next/env@16.0.10': - resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} + '@next/env@16.1.0': + resolution: {integrity: sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==} '@next/eslint-plugin-next@16.0.7': resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==} - '@next/swc-darwin-arm64@16.0.10': - resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} + '@next/eslint-plugin-next@16.1.0': + resolution: {integrity: sha512-sooC/k0LCF4/jLXYHpgfzJot04lZQqsttn8XJpTguP8N3GhqXN3wSkh68no2OcZzS/qeGwKDFTqhZ8WofdXmmQ==} + + '@next/swc-darwin-arm64@16.1.0': + resolution: {integrity: sha512-onHq8dl8KjDb8taANQdzs3XmIqQWV3fYdslkGENuvVInFQzZnuBYYOG2HGHqqtvgmEU7xWzhgndXXxnhk4Z3fQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.10': - resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} + '@next/swc-darwin-x64@16.1.0': + resolution: {integrity: sha512-Am6VJTp8KhLuAH13tPrAoVIXzuComlZlMwGr++o2KDjWiKPe3VwpxYhgV6I4gKls2EnsIMggL4y7GdXyDdJcFA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.10': - resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} + '@next/swc-linux-arm64-gnu@16.1.0': + resolution: {integrity: sha512-fVicfaJT6QfghNyg8JErZ+EMNQ812IS0lmKfbmC01LF1nFBcKfcs4Q75Yy8IqnsCqH/hZwGhqzj3IGVfWV6vpA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.10': - resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} + '@next/swc-linux-arm64-musl@16.1.0': + resolution: {integrity: sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.10': - resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} + '@next/swc-linux-x64-gnu@16.1.0': + resolution: {integrity: sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.10': - resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} + '@next/swc-linux-x64-musl@16.1.0': + resolution: {integrity: sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.0.10': - resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} + '@next/swc-win32-arm64-msvc@16.1.0': + resolution: {integrity: sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.10': - resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} + '@next/swc-win32-x64-msvc@16.1.0': + resolution: {integrity: sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4233,8 +4236,8 @@ packages: '@vcarl/remark-headings@0.1.0': resolution: {integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==} - '@vercel/analytics@1.5.0': - resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==} + '@vercel/analytics@1.6.1': + resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} peerDependencies: '@remix-run/react': ^2 '@sveltejs/kit': ^1 || ^2 @@ -4271,8 +4274,8 @@ packages: '@opentelemetry/sdk-metrics': '>=2.0.0 <3.0.0' '@opentelemetry/sdk-trace-base': '>=2.0.0 <3.0.0' - '@vercel/speed-insights@1.2.0': - resolution: {integrity: sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==} + '@vercel/speed-insights@1.3.1': + resolution: {integrity: sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==} peerDependencies: '@sveltejs/kit': ^1 || ^2 next: '>= 13' @@ -4865,11 +4868,6 @@ packages: typescript: optional: true - cross-env@10.0.0: - resolution: {integrity: sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==} - engines: {node: '>=20'} - hasBin: true - cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} @@ -6918,8 +6916,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + next@16.1.0: + resolution: {integrity: sha512-Y+KbmDbefYtHDDQKLNrmzE/YYzG2msqo2VXhzh5yrJ54tx/6TmGdkR5+kP9ma7i7LwZpZMfoY3m/AoPPPKxtVw==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -11039,34 +11037,38 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.0.10': {} + '@next/env@16.1.0': {} '@next/eslint-plugin-next@16.0.7': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.0.10': + '@next/eslint-plugin-next@16.1.0': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@16.1.0': optional: true - '@next/swc-darwin-x64@16.0.10': + '@next/swc-darwin-x64@16.1.0': optional: true - '@next/swc-linux-arm64-gnu@16.0.10': + '@next/swc-linux-arm64-gnu@16.1.0': optional: true - '@next/swc-linux-arm64-musl@16.0.10': + '@next/swc-linux-arm64-musl@16.1.0': optional: true - '@next/swc-linux-x64-gnu@16.0.10': + '@next/swc-linux-x64-gnu@16.1.0': optional: true - '@next/swc-linux-x64-musl@16.0.10': + '@next/swc-linux-x64-musl@16.1.0': optional: true - '@next/swc-win32-arm64-msvc@16.0.10': + '@next/swc-win32-arm64-msvc@16.1.0': optional: true - '@next/swc-win32-x64-msvc@16.0.10': + '@next/swc-win32-x64-msvc@16.1.0': optional: true '@noble/ciphers@1.3.0': {} @@ -11273,7 +11275,7 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opennextjs/aws@3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@opennextjs/aws@3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@ast-grep/napi': 0.40.0 '@aws-sdk/client-cloudfront': 3.398.0 @@ -11289,7 +11291,7 @@ snapshots: cookie: 1.0.2 esbuild: 0.25.4 express: 5.1.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) path-to-regexp: 6.3.0 urlpattern-polyfill: 10.1.0 yaml: 2.8.1 @@ -11297,15 +11299,15 @@ snapshots: - aws-crt - supports-color - '@opennextjs/cloudflare@1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': + '@opennextjs/cloudflare@1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': dependencies: '@ast-grep/napi': 0.40.0 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@opennextjs/aws': 3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) cloudflare: 4.5.0 enquirer: 2.4.1 glob: 12.0.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-tqdm: 0.8.6 wrangler: 4.53.0 yargs: 18.0.0 @@ -13436,9 +13438,9 @@ snapshots: mdast-util-to-string: 3.2.0 unist-util-visit: 4.1.2 - '@vercel/analytics@1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/analytics@1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vercel/otel@2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))': @@ -13451,9 +13453,9 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@vercel/speed-insights@1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/speed-insights@1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vitest/expect@3.2.4': @@ -14055,11 +14057,6 @@ snapshots: optionalDependencies: typescript: 5.8.3 - cross-env@10.0.0: - dependencies: - '@epic-web/invariant': 1.0.0 - cross-spawn: 7.0.6 - cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 @@ -14583,13 +14580,13 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@16.0.7(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3): + eslint-config-next@16.0.7(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 16.0.7 eslint: 9.36.0(jiti@2.6.1) 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.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.36.0(jiti@2.6.1)) @@ -14629,7 +14626,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -14645,7 +14642,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -14682,17 +14679,18 @@ snapshots: eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color + optional: true - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: + '@typescript-eslint/parser': 8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) eslint: 9.36.0(jiti@2.6.1) 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.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - optional: true eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)): dependencies: @@ -14740,8 +14738,9 @@ snapshots: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + optional: true - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14752,7 +14751,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.36.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14763,11 +14762,12 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.48.1(eslint@9.36.0(jiti@2.6.1))(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.36.0(jiti@2.6.1)): dependencies: @@ -16812,12 +16812,12 @@ snapshots: next-intl-swc-plugin-extractor@4.5.8: {} - next-intl@4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): + next-intl@4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.3 negotiator: 1.0.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl-swc-plugin-extractor: 4.5.8 po-parser: 1.0.2 react: 19.2.1 @@ -16832,24 +16832,25 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.0.10 + '@next/env': 16.1.0 '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.4 caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.10 - '@next/swc-darwin-x64': 16.0.10 - '@next/swc-linux-arm64-gnu': 16.0.10 - '@next/swc-linux-arm64-musl': 16.0.10 - '@next/swc-linux-x64-gnu': 16.0.10 - '@next/swc-linux-x64-musl': 16.0.10 - '@next/swc-win32-arm64-msvc': 16.0.10 - '@next/swc-win32-x64-msvc': 16.0.10 + '@next/swc-darwin-arm64': 16.1.0 + '@next/swc-darwin-x64': 16.1.0 + '@next/swc-linux-arm64-gnu': 16.1.0 + '@next/swc-linux-arm64-musl': 16.1.0 + '@next/swc-linux-x64-gnu': 16.1.0 + '@next/swc-linux-x64-musl': 16.1.0 + '@next/swc-win32-arm64-msvc': 16.1.0 + '@next/swc-win32-x64-msvc': 16.1.0 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.56.1 babel-plugin-react-compiler: 1.0.0 From 13f1a25d942260c56fb5ca1c6b6f3546c81dbf08 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Fri, 19 Dec 2025 16:57:38 -0500 Subject: [PATCH 02/15] code review --- apps/site/components/Common/Partners/PartnerButton/index.tsx | 2 +- apps/site/components/Common/Partners/index.tsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerButton/index.tsx b/apps/site/components/Common/Partners/PartnerButton/index.tsx index 104abc7d53f71..bbfc70bfaa3ea 100644 --- a/apps/site/components/Common/Partners/PartnerButton/index.tsx +++ b/apps/site/components/Common/Partners/PartnerButton/index.tsx @@ -5,7 +5,7 @@ import type { AnchorHTMLAttributes, FC } from 'react'; import style from './index.module.css'; type PartnerProps = AnchorHTMLAttributes & { - size: 'big' | 'small'; + size?: 'big' | 'small'; }; const PartnerButton: FC = ({ diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index de69de33cb724..2b99264ecac8b 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -13,7 +13,7 @@ import PartnerButton from './PartnerButton'; import style from './index.module.css'; type PartnersListProps = { - size: 'big' | 'small'; + size?: 'big' | 'small'; category?: PartnerCategory; }; @@ -41,6 +41,7 @@ const PartnersList: FC = async ({ if (size === 'small') { return ( {partner.name}} > @@ -50,7 +51,7 @@ const PartnersList: FC = async ({ ); } else { return ( - + ); From 1013f040c0b137547a0f81698e570593a64a0d33 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Fri, 19 Dec 2025 17:00:47 -0500 Subject: [PATCH 03/15] code review --- apps/site/components/Common/Partners/index.tsx | 6 ++++-- apps/site/pages/en/download/current.mdx | 2 +- apps/site/pages/en/download/index.mdx | 2 +- apps/site/pages/fr/download/current.mdx | 2 +- apps/site/pages/fr/download/index.mdx | 2 +- apps/site/pages/id/download/index.mdx | 2 +- apps/site/pages/ja/download/current.mdx | 2 +- apps/site/pages/ja/download/index.mdx | 2 +- apps/site/pages/pt-br/download/current.mdx | 2 +- apps/site/pages/pt-br/download/index.mdx | 2 +- apps/site/pages/uk/download/current.mdx | 2 +- apps/site/pages/uk/download/index.mdx | 2 +- apps/site/pages/zh-cn/download/current.mdx | 2 +- apps/site/pages/zh-cn/download/index.mdx | 2 +- 14 files changed, 17 insertions(+), 15 deletions(-) diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index 2b99264ecac8b..20c8c1cda6afb 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -15,11 +15,13 @@ import style from './index.module.css'; type PartnersListProps = { size?: 'big' | 'small'; category?: PartnerCategory; + length: number; }; const PartnersList: FC = async ({ size = 'small', category, + length, }) => { let partners = await providePartners(); @@ -29,8 +31,8 @@ const PartnersList: FC = async ({ ); } - if (size === 'small') { - partners = partners.slice(0, 6); + if (size === 'small' || length) { + partners = partners.slice(0, length ?? 6); } return ( diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/pages/en/download/current.mdx index a8e957717ef48..8ace12fdb5ca9 100644 --- a/apps/site/pages/en/download/current.mdx +++ b/apps/site/pages/en/download/current.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index 06b3d715d1c09..a8f7506e3828e 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/fr/download/current.mdx b/apps/site/pages/fr/download/current.mdx index 8610b2bc4d4e0..22248b8e2dc4b 100644 --- a/apps/site/pages/fr/download/current.mdx +++ b/apps/site/pages/fr/download/current.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/fr/download/index.mdx b/apps/site/pages/fr/download/index.mdx index 60074c062b535..a27ab1666e9d1 100644 --- a/apps/site/pages/fr/download/index.mdx +++ b/apps/site/pages/fr/download/index.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/id/download/index.mdx b/apps/site/pages/id/download/index.mdx index 4932d9f3fc799..4c2e3fa7cd208 100644 --- a/apps/site/pages/id/download/index.mdx +++ b/apps/site/pages/id/download/index.mdx @@ -43,6 +43,6 @@ atau biner
- +
diff --git a/apps/site/pages/ja/download/current.mdx b/apps/site/pages/ja/download/current.mdx index 8be1bba4a02a8..74e809f8be447 100644 --- a/apps/site/pages/ja/download/current.mdx +++ b/apps/site/pages/ja/download/current.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/ja/download/index.mdx b/apps/site/pages/ja/download/index.mdx index 5d1383affe1b9..f6445c572db9d 100644 --- a/apps/site/pages/ja/download/index.mdx +++ b/apps/site/pages/ja/download/index.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/pt-br/download/current.mdx b/apps/site/pages/pt-br/download/current.mdx index 43e2b3a77f398..922bc4d98de1d 100644 --- a/apps/site/pages/pt-br/download/current.mdx +++ b/apps/site/pages/pt-br/download/current.mdx @@ -41,6 +41,6 @@ Confira nossos binários - + diff --git a/apps/site/pages/pt-br/download/index.mdx b/apps/site/pages/pt-br/download/index.mdx index fdf74fa37b92c..b7eae0482c785 100644 --- a/apps/site/pages/pt-br/download/index.mdx +++ b/apps/site/pages/pt-br/download/index.mdx @@ -43,6 +43,6 @@ ou os binários - + diff --git a/apps/site/pages/uk/download/current.mdx b/apps/site/pages/uk/download/current.mdx index c527232d619bf..d4f003a456a54 100644 --- a/apps/site/pages/uk/download/current.mdx +++ b/apps/site/pages/uk/download/current.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/uk/download/index.mdx b/apps/site/pages/uk/download/index.mdx index 81d037979806c..c0925fddf6704 100644 --- a/apps/site/pages/uk/download/index.mdx +++ b/apps/site/pages/uk/download/index.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/zh-cn/download/current.mdx b/apps/site/pages/zh-cn/download/current.mdx index 84681ddbf8e3f..3927e89d3ca88 100644 --- a/apps/site/pages/zh-cn/download/current.mdx +++ b/apps/site/pages/zh-cn/download/current.mdx @@ -43,6 +43,6 @@ title: 下载 Node.js®
- +
diff --git a/apps/site/pages/zh-cn/download/index.mdx b/apps/site/pages/zh-cn/download/index.mdx index b2fcd74ef7f50..8ba66598c6439 100644 --- a/apps/site/pages/zh-cn/download/index.mdx +++ b/apps/site/pages/zh-cn/download/index.mdx @@ -41,6 +41,6 @@ title: 下载 Node.js®
- +
From b6ad9907fa5445cddd469230fe0be38621748efa Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Sat, 20 Dec 2025 09:56:43 -0500 Subject: [PATCH 04/15] fixup! --- .../Partners/PartnerButton/index.module.css | 3 +- .../site/components/Common/Partners/index.tsx | 77 +++++----- apps/site/next-data/generators/partners.mjs | 13 -- apps/site/next-data/providers/partners.ts | 5 - apps/site/next.json.mjs | 4 + apps/site/package.json | 8 +- .../public/static/partners/constants.json | 38 ++--- apps/site/util/array.ts | 23 --- docs/partners.md | 14 +- pnpm-lock.yaml | 136 +++++++++--------- 10 files changed, 131 insertions(+), 190 deletions(-) delete mode 100644 apps/site/next-data/generators/partners.mjs delete mode 100644 apps/site/next-data/providers/partners.ts delete mode 100644 apps/site/util/array.ts diff --git a/apps/site/components/Common/Partners/PartnerButton/index.module.css b/apps/site/components/Common/Partners/PartnerButton/index.module.css index 6166b9c0614ca..451e4bcb2b9bb 100644 --- a/apps/site/components/Common/Partners/PartnerButton/index.module.css +++ b/apps/site/components/Common/Partners/PartnerButton/index.module.css @@ -21,8 +21,7 @@ .small { @apply h-9 w-auto - min-w-9 - p-2; + min-w-9; svg { @apply !h-4 diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index 20c8c1cda6afb..0f31383fbcdd4 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -3,9 +3,9 @@ import Tooltip from '@node-core/ui-components/Common/Tooltip'; import * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos'; -import providePartners from '#site/next-data/providers/partners'; +import { partners } from '#site/next.json.mjs'; -import type { PartnerCategory } from '#site/types'; +import type { Partner, PartnerCategory } from '#site/types'; import type { FC } from 'react'; import PartnerButton from './PartnerButton'; @@ -15,7 +15,40 @@ import style from './index.module.css'; type PartnersListProps = { size?: 'big' | 'small'; category?: PartnerCategory; - length: number; + length?: number; +}; + +const getPartners = async (length?: number, category?: PartnerCategory) => { + const filteredPartners = category + ? partners.filter(partner => partner.categories.includes(category)) + : partners; + + return length ? filteredPartners.slice(0, length) : filteredPartners; +}; + +const renderSmallPartner = (partner: Partner) => { + const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos]; + + return ( + {partner.name}} + > + + + + + ); +}; + +const renderBigPartner = (partner: Partner) => { + const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos]; + + return ( + + + + ); }; const PartnersList: FC = async ({ @@ -23,42 +56,16 @@ const PartnersList: FC = async ({ category, length, }) => { - let partners = await providePartners(); - - if (category) { - partners = partners.filter(partner => - partner.categories.includes(category) - ); - } + const isSmall = size === 'small'; - if (size === 'small' || length) { - partners = partners.slice(0, length ?? 6); - } + const partners = await getPartners( + length ?? (isSmall ? 6 : undefined), + category + ); return (
- {partners.map(partner => { - const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos]; - - if (size === 'small') { - return ( - {partner.name}
} - > - - - -
- ); - } else { - return ( - - - - ); - } - })} + {partners.map(isSmall ? renderSmallPartner : renderBigPartner)} ); }; diff --git a/apps/site/next-data/generators/partners.mjs b/apps/site/next-data/generators/partners.mjs deleted file mode 100644 index 0876c10069036..0000000000000 --- a/apps/site/next-data/generators/partners.mjs +++ /dev/null @@ -1,13 +0,0 @@ -import partners from '#site/public/static/partners/constants.json'; -import { shuffle } from '#site/util/array'; - -/** - * Builds the final partner list used by the UI. - * - * @returns {Promise} - */ -export default async function getPartnersList() { - const seed = Math.floor(Date.now() / (60 * 1000)); - - return await shuffle(partners, seed); -} diff --git a/apps/site/next-data/providers/partners.ts b/apps/site/next-data/providers/partners.ts deleted file mode 100644 index ab35d17c31a31..0000000000000 --- a/apps/site/next-data/providers/partners.ts +++ /dev/null @@ -1,5 +0,0 @@ -'use cache'; - -import providePartners from '#site/next-data/generators/partners.mjs'; - -export default providePartners; diff --git a/apps/site/next.json.mjs b/apps/site/next.json.mjs index 27fb92885f8a1..7749603d9140f 100644 --- a/apps/site/next.json.mjs +++ b/apps/site/next.json.mjs @@ -3,6 +3,7 @@ import _authors from './authors.json' with { type: 'json' }; import _siteNavigation from './navigation.json' with { type: 'json' }; import _blogData from './public/blog-data.json' with { type: 'json' }; +import _partners from './public/static/partners/constants.json' with { type: 'json' }; import _siteRedirects from './redirects.json' with { type: 'json' }; import _siteConfig from './site.json' with { type: 'json' }; @@ -20,3 +21,6 @@ export const siteConfig = _siteConfig; /** @type {import('./types').BlogData} */ export const blogData = _blogData; + +/** @type {Array} */ +export const partners = _partners; diff --git a/apps/site/package.json b/apps/site/package.json index 827f62a839b4d..1cdb7f0d45b8c 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -50,16 +50,16 @@ "@types/node": "catalog:", "@types/react": "catalog:", "@vcarl/remark-headings": "~0.1.0", - "@vercel/analytics": "~1.6.1", + "@vercel/analytics": "~1.5.0", "@vercel/otel": "~2.1.0", - "@vercel/speed-insights": "~1.3.1", + "@vercel/speed-insights": "~1.2.0", "classnames": "catalog:", "cross-env": "catalog:", "feed": "~5.1.0", "github-slugger": "~2.0.0", "gray-matter": "~4.0.3", "mdast-util-to-string": "^4.0.0", - "next": "16.1.0", + "next": "16.0.10", "next-intl": "~4.5.3", "next-themes": "~0.4.6", "postcss-calc": "~10.1.1", @@ -80,7 +80,7 @@ }, "devDependencies": { "@flarelabs-net/wrangler-build-time-fs-assets-polyfilling": "^0.0.1", - "@next/eslint-plugin-next": "16.1.0", + "@next/eslint-plugin-next": "16.0.7", "@node-core/remark-lint": "workspace:*", "@opennextjs/cloudflare": "^1.14.4", "@playwright/test": "^1.56.1", diff --git a/apps/site/public/static/partners/constants.json b/apps/site/public/static/partners/constants.json index 9aaf25866ca86..f170232f0d91b 100644 --- a/apps/site/public/static/partners/constants.json +++ b/apps/site/public/static/partners/constants.json @@ -3,56 +3,48 @@ "id": "CLOUDFLARE", "name": "Cloudflare", "href": "https://www.cloudflare.com", - "weight": 3, - "categories": ["infrastructure"] - }, - { - "id": "VERCEL", - "name": "Vercel", - "href": "https://vercel.com", - "weight": 2, "categories": ["infrastructure"] }, { "id": "HERODEVS", "name": "HeroDevs", "href": "https://herodevs.com", - "weight": 3, "categories": ["security", "esp", "release"] }, { "id": "DIGITALOCEAN", "name": "DigitalOcean", "href": "https://www.digitalocean.com", - "categories": ["infrastructure"], - "weight": 3 + "categories": ["infrastructure"] + }, + { + "id": "NODESOURCE", + "name": "NodeSource", + "href": "https://nodesource.com", + "categories": ["security", "esp", "release"] + }, + { + "id": "VERCEL", + "name": "Vercel", + "href": "https://vercel.com", + "categories": ["infrastructure"] }, { "id": "MICROSOFT", "name": "Microsoft Azure", "href": "https://microsoft.com", - "categories": ["infrastructure"], - "weight": 2 + "categories": ["infrastructure"] }, { "id": "MACSTADIUM", "name": "MacStadium", "href": "https://macstadium.com", - "categories": ["infrastructure"], - "weight": 2 - }, - { - "id": "NODESOURCE", - "name": "NodeSource", - "href": "https://nodesource.com", - "weight": 3, - "categories": ["security", "esp", "release"] + "categories": ["infrastructure"] }, { "id": "CODEMOD", "name": "Codemod", "href": "https://codemod.com", - "weight": 1, "categories": [] } ] diff --git a/apps/site/util/array.ts b/apps/site/util/array.ts deleted file mode 100644 index f6aec1ed9c97b..0000000000000 --- a/apps/site/util/array.ts +++ /dev/null @@ -1,23 +0,0 @@ -// Fisher-Yates shuffle algorithm with a seed for deterministic results -export const shuffle = async ( - array: Array, - seed: number -): Promise> => { - const shuffled = [...array]; - const encoder = new TextEncoder(); - const buffer = encoder.encode(String(seed)); - const hashBuffer = await crypto.subtle.digest('SHA-256', buffer); - const hash = new Uint8Array(hashBuffer); - - for (let i = shuffled.length - 1; i > 0; i--) { - // Use hash bytes to generate deterministic "random" index - const hashIndex = (i + seed) % 32; - // Normalize to 0-1 - const randomValue = hash[hashIndex] / 255; - - const j = Math.floor(randomValue * (i + 1)); - [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; - } - - return shuffled; -}; diff --git a/docs/partners.md b/docs/partners.md index 53effb4e624a3..2ed4c462b8726 100644 --- a/docs/partners.md +++ b/docs/partners.md @@ -15,7 +15,6 @@ To add or remove a partner: - `categories`: An array of categories the partner belongs to. These are used to filter partners on the Partners and Downloads pages. Valid categories include: - `infrastructure`: Partners providing infrastructure for the Node.js project. - `esp`: Partners offering support for EOL Node.js versions through the Ecosystem Sustainability Program (ESP). - - `weight`: A number representing the partner's visibility weight. This is used in the randomization algorithm — higher values increase the partner's likelihood of being shown. 2. Add the partner's logo to the `packages/ui-components/icons/PartnersLogos/` directory. The filename must match the partner's `id`, in lowercase. @@ -29,7 +28,7 @@ To add or remove a partner: ## Home Page -On the homepage, all partners are displayed regardless of category. The `weight` field is used by the randomization algorithm to determine how likely a partner is to appear e.g., a partner with a `weight` of 3 will be three times more likely to be shown than one with a `weight` of 1. +On the homepage, partners are displayed regardless of category. Partners are sorted according to their order in the `partners.json` file. ## Partners Page @@ -53,14 +52,3 @@ The same randomization algorithm used on the homepage is applied here as well. > Donations made through GitHub Sponsors are not displayed yet; they will be added soon. Supporters are individuals and organizations that provide financial support to the Node.js project through OpenCollective and GitHub Sponsors. They are displayed on the Partner page, but not on the homepage or Downloads section. - -## Partner Randomization Algorithm - -The randomization algorithm determines the order in which partners are displayed on both the homepage and the Downloads section. It takes into account: - -- The `weight` of each partner (higher weight = higher probability of being shown). -- A time-based seed: the order is refreshed every 5 minutes, not on every request. - This ensures that the display remains consistent for a short period, rather than changing constantly. E.g., if a user visits the homepage multiple times within 5 minutes, they will see the same order of partners. - -> [!NOTE] -> Partner randomization and rendering is performed on the client side, not during server-side rendering (SSR). diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3968d65b79a9a..a015f3ca3d7eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,14 +136,14 @@ importers: specifier: ~0.1.0 version: 0.1.0 '@vercel/analytics': - specifier: ~1.6.1 - version: 1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.5.0 + version: 1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@vercel/otel': specifier: ~2.1.0 version: 2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)) '@vercel/speed-insights': - specifier: ~1.3.1 - version: 1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.2.0 + version: 1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) classnames: specifier: 'catalog:' version: 2.5.1 @@ -163,11 +163,11 @@ importers: specifier: ^4.0.0 version: 4.0.0 next: - specifier: 16.1.0 - version: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 16.0.10 + version: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl: specifier: ~4.5.3 - version: 4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) + version: 4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) next-themes: specifier: ~0.4.6 version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -221,14 +221,14 @@ importers: specifier: ^0.0.1 version: 0.0.1 '@next/eslint-plugin-next': - specifier: 16.1.0 - version: 16.1.0 + specifier: 16.0.7 + version: 16.0.7 '@node-core/remark-lint': specifier: workspace:* version: link:../../packages/remark-lint '@opennextjs/cloudflare': specifier: ^1.14.4 - version: 1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) + version: 1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -2243,59 +2243,56 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@next/env@16.1.0': - resolution: {integrity: sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==} + '@next/env@16.0.10': + resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} '@next/eslint-plugin-next@16.0.7': resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==} - '@next/eslint-plugin-next@16.1.0': - resolution: {integrity: sha512-sooC/k0LCF4/jLXYHpgfzJot04lZQqsttn8XJpTguP8N3GhqXN3wSkh68no2OcZzS/qeGwKDFTqhZ8WofdXmmQ==} - - '@next/swc-darwin-arm64@16.1.0': - resolution: {integrity: sha512-onHq8dl8KjDb8taANQdzs3XmIqQWV3fYdslkGENuvVInFQzZnuBYYOG2HGHqqtvgmEU7xWzhgndXXxnhk4Z3fQ==} + '@next/swc-darwin-arm64@16.0.10': + resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.0': - resolution: {integrity: sha512-Am6VJTp8KhLuAH13tPrAoVIXzuComlZlMwGr++o2KDjWiKPe3VwpxYhgV6I4gKls2EnsIMggL4y7GdXyDdJcFA==} + '@next/swc-darwin-x64@16.0.10': + resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.0': - resolution: {integrity: sha512-fVicfaJT6QfghNyg8JErZ+EMNQ812IS0lmKfbmC01LF1nFBcKfcs4Q75Yy8IqnsCqH/hZwGhqzj3IGVfWV6vpA==} + '@next/swc-linux-arm64-gnu@16.0.10': + resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.1.0': - resolution: {integrity: sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==} + '@next/swc-linux-arm64-musl@16.0.10': + resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.1.0': - resolution: {integrity: sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==} + '@next/swc-linux-x64-gnu@16.0.10': + resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.1.0': - resolution: {integrity: sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==} + '@next/swc-linux-x64-musl@16.0.10': + resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.1.0': - resolution: {integrity: sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==} + '@next/swc-win32-arm64-msvc@16.0.10': + resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.0': - resolution: {integrity: sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==} + '@next/swc-win32-x64-msvc@16.0.10': + resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4236,8 +4233,8 @@ packages: '@vcarl/remark-headings@0.1.0': resolution: {integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==} - '@vercel/analytics@1.6.1': - resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} + '@vercel/analytics@1.5.0': + resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==} peerDependencies: '@remix-run/react': ^2 '@sveltejs/kit': ^1 || ^2 @@ -4274,8 +4271,8 @@ packages: '@opentelemetry/sdk-metrics': '>=2.0.0 <3.0.0' '@opentelemetry/sdk-trace-base': '>=2.0.0 <3.0.0' - '@vercel/speed-insights@1.3.1': - resolution: {integrity: sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==} + '@vercel/speed-insights@1.2.0': + resolution: {integrity: sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==} peerDependencies: '@sveltejs/kit': ^1 || ^2 next: '>= 13' @@ -6916,8 +6913,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.1.0: - resolution: {integrity: sha512-Y+KbmDbefYtHDDQKLNrmzE/YYzG2msqo2VXhzh5yrJ54tx/6TmGdkR5+kP9ma7i7LwZpZMfoY3m/AoPPPKxtVw==} + next@16.0.10: + resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -11037,38 +11034,34 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.1.0': {} + '@next/env@16.0.10': {} '@next/eslint-plugin-next@16.0.7': dependencies: fast-glob: 3.3.1 - '@next/eslint-plugin-next@16.1.0': - dependencies: - fast-glob: 3.3.1 - - '@next/swc-darwin-arm64@16.1.0': + '@next/swc-darwin-arm64@16.0.10': optional: true - '@next/swc-darwin-x64@16.1.0': + '@next/swc-darwin-x64@16.0.10': optional: true - '@next/swc-linux-arm64-gnu@16.1.0': + '@next/swc-linux-arm64-gnu@16.0.10': optional: true - '@next/swc-linux-arm64-musl@16.1.0': + '@next/swc-linux-arm64-musl@16.0.10': optional: true - '@next/swc-linux-x64-gnu@16.1.0': + '@next/swc-linux-x64-gnu@16.0.10': optional: true - '@next/swc-linux-x64-musl@16.1.0': + '@next/swc-linux-x64-musl@16.0.10': optional: true - '@next/swc-win32-arm64-msvc@16.1.0': + '@next/swc-win32-arm64-msvc@16.0.10': optional: true - '@next/swc-win32-x64-msvc@16.1.0': + '@next/swc-win32-x64-msvc@16.0.10': optional: true '@noble/ciphers@1.3.0': {} @@ -11275,7 +11268,7 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opennextjs/aws@3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@opennextjs/aws@3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@ast-grep/napi': 0.40.0 '@aws-sdk/client-cloudfront': 3.398.0 @@ -11291,7 +11284,7 @@ snapshots: cookie: 1.0.2 esbuild: 0.25.4 express: 5.1.0 - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) path-to-regexp: 6.3.0 urlpattern-polyfill: 10.1.0 yaml: 2.8.1 @@ -11299,15 +11292,15 @@ snapshots: - aws-crt - supports-color - '@opennextjs/cloudflare@1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': + '@opennextjs/cloudflare@1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': dependencies: '@ast-grep/napi': 0.40.0 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@opennextjs/aws': 3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) cloudflare: 4.5.0 enquirer: 2.4.1 glob: 12.0.0 - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-tqdm: 0.8.6 wrangler: 4.53.0 yargs: 18.0.0 @@ -13438,9 +13431,9 @@ snapshots: mdast-util-to-string: 3.2.0 unist-util-visit: 4.1.2 - '@vercel/analytics@1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/analytics@1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vercel/otel@2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))': @@ -13453,9 +13446,9 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@vercel/speed-insights@1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/speed-insights@1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vitest/expect@3.2.4': @@ -16812,12 +16805,12 @@ snapshots: next-intl-swc-plugin-extractor@4.5.8: {} - next-intl@4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): + next-intl@4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.3 negotiator: 1.0.0 - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl-swc-plugin-extractor: 4.5.8 po-parser: 1.0.2 react: 19.2.1 @@ -16832,25 +16825,24 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.1.0 + '@next/env': 16.0.10 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.9.4 caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.0 - '@next/swc-darwin-x64': 16.1.0 - '@next/swc-linux-arm64-gnu': 16.1.0 - '@next/swc-linux-arm64-musl': 16.1.0 - '@next/swc-linux-x64-gnu': 16.1.0 - '@next/swc-linux-x64-musl': 16.1.0 - '@next/swc-win32-arm64-msvc': 16.1.0 - '@next/swc-win32-x64-msvc': 16.1.0 + '@next/swc-darwin-arm64': 16.0.10 + '@next/swc-darwin-x64': 16.0.10 + '@next/swc-linux-arm64-gnu': 16.0.10 + '@next/swc-linux-arm64-musl': 16.0.10 + '@next/swc-linux-x64-gnu': 16.0.10 + '@next/swc-linux-x64-musl': 16.0.10 + '@next/swc-win32-arm64-msvc': 16.0.10 + '@next/swc-win32-x64-msvc': 16.0.10 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.56.1 babel-plugin-react-compiler: 1.0.0 From a223af81c462029728dd0f188e0b23a6e8eb064b Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Sat, 20 Dec 2025 09:59:57 -0500 Subject: [PATCH 05/15] fixup nextjs --- apps/site/next-env.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/site/next-env.d.ts b/apps/site/next-env.d.ts index cdb6b7b848c32..c05d9f7d66f17 100644 --- a/apps/site/next-env.d.ts +++ b/apps/site/next-env.d.ts @@ -1,7 +1,7 @@ /// /// /// -import './.next/dev/types/routes.d.ts'; +import './.next/types/routes.d.ts'; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. From 134b151c7679a9584e371cd4869c2839dce0f508 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 20 Dec 2025 19:53:34 +0000 Subject: [PATCH 06/15] Revert "fixup!" This reverts commit b6ad9907fa5445cddd469230fe0be38621748efa. --- .../Partners/PartnerButton/index.module.css | 3 +- apps/site/package.json | 8 +- .../public/static/partners/constants.json | 38 +++-- apps/site/util/array.ts | 23 +++ docs/partners.md | 14 +- pnpm-lock.yaml | 136 +++++++++--------- 6 files changed, 137 insertions(+), 85 deletions(-) create mode 100644 apps/site/util/array.ts diff --git a/apps/site/components/Common/Partners/PartnerButton/index.module.css b/apps/site/components/Common/Partners/PartnerButton/index.module.css index 451e4bcb2b9bb..6166b9c0614ca 100644 --- a/apps/site/components/Common/Partners/PartnerButton/index.module.css +++ b/apps/site/components/Common/Partners/PartnerButton/index.module.css @@ -21,7 +21,8 @@ .small { @apply h-9 w-auto - min-w-9; + min-w-9 + p-2; svg { @apply !h-4 diff --git a/apps/site/package.json b/apps/site/package.json index 1cdb7f0d45b8c..827f62a839b4d 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -50,16 +50,16 @@ "@types/node": "catalog:", "@types/react": "catalog:", "@vcarl/remark-headings": "~0.1.0", - "@vercel/analytics": "~1.5.0", + "@vercel/analytics": "~1.6.1", "@vercel/otel": "~2.1.0", - "@vercel/speed-insights": "~1.2.0", + "@vercel/speed-insights": "~1.3.1", "classnames": "catalog:", "cross-env": "catalog:", "feed": "~5.1.0", "github-slugger": "~2.0.0", "gray-matter": "~4.0.3", "mdast-util-to-string": "^4.0.0", - "next": "16.0.10", + "next": "16.1.0", "next-intl": "~4.5.3", "next-themes": "~0.4.6", "postcss-calc": "~10.1.1", @@ -80,7 +80,7 @@ }, "devDependencies": { "@flarelabs-net/wrangler-build-time-fs-assets-polyfilling": "^0.0.1", - "@next/eslint-plugin-next": "16.0.7", + "@next/eslint-plugin-next": "16.1.0", "@node-core/remark-lint": "workspace:*", "@opennextjs/cloudflare": "^1.14.4", "@playwright/test": "^1.56.1", diff --git a/apps/site/public/static/partners/constants.json b/apps/site/public/static/partners/constants.json index f170232f0d91b..9aaf25866ca86 100644 --- a/apps/site/public/static/partners/constants.json +++ b/apps/site/public/static/partners/constants.json @@ -3,48 +3,56 @@ "id": "CLOUDFLARE", "name": "Cloudflare", "href": "https://www.cloudflare.com", + "weight": 3, + "categories": ["infrastructure"] + }, + { + "id": "VERCEL", + "name": "Vercel", + "href": "https://vercel.com", + "weight": 2, "categories": ["infrastructure"] }, { "id": "HERODEVS", "name": "HeroDevs", "href": "https://herodevs.com", + "weight": 3, "categories": ["security", "esp", "release"] }, { "id": "DIGITALOCEAN", "name": "DigitalOcean", "href": "https://www.digitalocean.com", - "categories": ["infrastructure"] - }, - { - "id": "NODESOURCE", - "name": "NodeSource", - "href": "https://nodesource.com", - "categories": ["security", "esp", "release"] - }, - { - "id": "VERCEL", - "name": "Vercel", - "href": "https://vercel.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 3 }, { "id": "MICROSOFT", "name": "Microsoft Azure", "href": "https://microsoft.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 }, { "id": "MACSTADIUM", "name": "MacStadium", "href": "https://macstadium.com", - "categories": ["infrastructure"] + "categories": ["infrastructure"], + "weight": 2 + }, + { + "id": "NODESOURCE", + "name": "NodeSource", + "href": "https://nodesource.com", + "weight": 3, + "categories": ["security", "esp", "release"] }, { "id": "CODEMOD", "name": "Codemod", "href": "https://codemod.com", + "weight": 1, "categories": [] } ] diff --git a/apps/site/util/array.ts b/apps/site/util/array.ts new file mode 100644 index 0000000000000..f6aec1ed9c97b --- /dev/null +++ b/apps/site/util/array.ts @@ -0,0 +1,23 @@ +// Fisher-Yates shuffle algorithm with a seed for deterministic results +export const shuffle = async ( + array: Array, + seed: number +): Promise> => { + const shuffled = [...array]; + const encoder = new TextEncoder(); + const buffer = encoder.encode(String(seed)); + const hashBuffer = await crypto.subtle.digest('SHA-256', buffer); + const hash = new Uint8Array(hashBuffer); + + for (let i = shuffled.length - 1; i > 0; i--) { + // Use hash bytes to generate deterministic "random" index + const hashIndex = (i + seed) % 32; + // Normalize to 0-1 + const randomValue = hash[hashIndex] / 255; + + const j = Math.floor(randomValue * (i + 1)); + [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; + } + + return shuffled; +}; diff --git a/docs/partners.md b/docs/partners.md index 2ed4c462b8726..53effb4e624a3 100644 --- a/docs/partners.md +++ b/docs/partners.md @@ -15,6 +15,7 @@ To add or remove a partner: - `categories`: An array of categories the partner belongs to. These are used to filter partners on the Partners and Downloads pages. Valid categories include: - `infrastructure`: Partners providing infrastructure for the Node.js project. - `esp`: Partners offering support for EOL Node.js versions through the Ecosystem Sustainability Program (ESP). + - `weight`: A number representing the partner's visibility weight. This is used in the randomization algorithm — higher values increase the partner's likelihood of being shown. 2. Add the partner's logo to the `packages/ui-components/icons/PartnersLogos/` directory. The filename must match the partner's `id`, in lowercase. @@ -28,7 +29,7 @@ To add or remove a partner: ## Home Page -On the homepage, partners are displayed regardless of category. Partners are sorted according to their order in the `partners.json` file. +On the homepage, all partners are displayed regardless of category. The `weight` field is used by the randomization algorithm to determine how likely a partner is to appear e.g., a partner with a `weight` of 3 will be three times more likely to be shown than one with a `weight` of 1. ## Partners Page @@ -52,3 +53,14 @@ The same randomization algorithm used on the homepage is applied here as well. > Donations made through GitHub Sponsors are not displayed yet; they will be added soon. Supporters are individuals and organizations that provide financial support to the Node.js project through OpenCollective and GitHub Sponsors. They are displayed on the Partner page, but not on the homepage or Downloads section. + +## Partner Randomization Algorithm + +The randomization algorithm determines the order in which partners are displayed on both the homepage and the Downloads section. It takes into account: + +- The `weight` of each partner (higher weight = higher probability of being shown). +- A time-based seed: the order is refreshed every 5 minutes, not on every request. + This ensures that the display remains consistent for a short period, rather than changing constantly. E.g., if a user visits the homepage multiple times within 5 minutes, they will see the same order of partners. + +> [!NOTE] +> Partner randomization and rendering is performed on the client side, not during server-side rendering (SSR). diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a015f3ca3d7eb..3968d65b79a9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,14 +136,14 @@ importers: specifier: ~0.1.0 version: 0.1.0 '@vercel/analytics': - specifier: ~1.5.0 - version: 1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.6.1 + version: 1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@vercel/otel': specifier: ~2.1.0 version: 2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)) '@vercel/speed-insights': - specifier: ~1.2.0 - version: 1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.3.1 + version: 1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) classnames: specifier: 'catalog:' version: 2.5.1 @@ -163,11 +163,11 @@ importers: specifier: ^4.0.0 version: 4.0.0 next: - specifier: 16.0.10 - version: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 16.1.0 + version: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl: specifier: ~4.5.3 - version: 4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) + version: 4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) next-themes: specifier: ~0.4.6 version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -221,14 +221,14 @@ importers: specifier: ^0.0.1 version: 0.0.1 '@next/eslint-plugin-next': - specifier: 16.0.7 - version: 16.0.7 + specifier: 16.1.0 + version: 16.1.0 '@node-core/remark-lint': specifier: workspace:* version: link:../../packages/remark-lint '@opennextjs/cloudflare': specifier: ^1.14.4 - version: 1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) + version: 1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -2243,56 +2243,59 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@next/env@16.0.10': - resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} + '@next/env@16.1.0': + resolution: {integrity: sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==} '@next/eslint-plugin-next@16.0.7': resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==} - '@next/swc-darwin-arm64@16.0.10': - resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} + '@next/eslint-plugin-next@16.1.0': + resolution: {integrity: sha512-sooC/k0LCF4/jLXYHpgfzJot04lZQqsttn8XJpTguP8N3GhqXN3wSkh68no2OcZzS/qeGwKDFTqhZ8WofdXmmQ==} + + '@next/swc-darwin-arm64@16.1.0': + resolution: {integrity: sha512-onHq8dl8KjDb8taANQdzs3XmIqQWV3fYdslkGENuvVInFQzZnuBYYOG2HGHqqtvgmEU7xWzhgndXXxnhk4Z3fQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.10': - resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} + '@next/swc-darwin-x64@16.1.0': + resolution: {integrity: sha512-Am6VJTp8KhLuAH13tPrAoVIXzuComlZlMwGr++o2KDjWiKPe3VwpxYhgV6I4gKls2EnsIMggL4y7GdXyDdJcFA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.10': - resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} + '@next/swc-linux-arm64-gnu@16.1.0': + resolution: {integrity: sha512-fVicfaJT6QfghNyg8JErZ+EMNQ812IS0lmKfbmC01LF1nFBcKfcs4Q75Yy8IqnsCqH/hZwGhqzj3IGVfWV6vpA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.10': - resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} + '@next/swc-linux-arm64-musl@16.1.0': + resolution: {integrity: sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.10': - resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} + '@next/swc-linux-x64-gnu@16.1.0': + resolution: {integrity: sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.10': - resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} + '@next/swc-linux-x64-musl@16.1.0': + resolution: {integrity: sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.0.10': - resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} + '@next/swc-win32-arm64-msvc@16.1.0': + resolution: {integrity: sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.10': - resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} + '@next/swc-win32-x64-msvc@16.1.0': + resolution: {integrity: sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4233,8 +4236,8 @@ packages: '@vcarl/remark-headings@0.1.0': resolution: {integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==} - '@vercel/analytics@1.5.0': - resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==} + '@vercel/analytics@1.6.1': + resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} peerDependencies: '@remix-run/react': ^2 '@sveltejs/kit': ^1 || ^2 @@ -4271,8 +4274,8 @@ packages: '@opentelemetry/sdk-metrics': '>=2.0.0 <3.0.0' '@opentelemetry/sdk-trace-base': '>=2.0.0 <3.0.0' - '@vercel/speed-insights@1.2.0': - resolution: {integrity: sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==} + '@vercel/speed-insights@1.3.1': + resolution: {integrity: sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==} peerDependencies: '@sveltejs/kit': ^1 || ^2 next: '>= 13' @@ -6913,8 +6916,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + next@16.1.0: + resolution: {integrity: sha512-Y+KbmDbefYtHDDQKLNrmzE/YYzG2msqo2VXhzh5yrJ54tx/6TmGdkR5+kP9ma7i7LwZpZMfoY3m/AoPPPKxtVw==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -11034,34 +11037,38 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.0.10': {} + '@next/env@16.1.0': {} '@next/eslint-plugin-next@16.0.7': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.0.10': + '@next/eslint-plugin-next@16.1.0': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@16.1.0': optional: true - '@next/swc-darwin-x64@16.0.10': + '@next/swc-darwin-x64@16.1.0': optional: true - '@next/swc-linux-arm64-gnu@16.0.10': + '@next/swc-linux-arm64-gnu@16.1.0': optional: true - '@next/swc-linux-arm64-musl@16.0.10': + '@next/swc-linux-arm64-musl@16.1.0': optional: true - '@next/swc-linux-x64-gnu@16.0.10': + '@next/swc-linux-x64-gnu@16.1.0': optional: true - '@next/swc-linux-x64-musl@16.0.10': + '@next/swc-linux-x64-musl@16.1.0': optional: true - '@next/swc-win32-arm64-msvc@16.0.10': + '@next/swc-win32-arm64-msvc@16.1.0': optional: true - '@next/swc-win32-x64-msvc@16.0.10': + '@next/swc-win32-x64-msvc@16.1.0': optional: true '@noble/ciphers@1.3.0': {} @@ -11268,7 +11275,7 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opennextjs/aws@3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@opennextjs/aws@3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@ast-grep/napi': 0.40.0 '@aws-sdk/client-cloudfront': 3.398.0 @@ -11284,7 +11291,7 @@ snapshots: cookie: 1.0.2 esbuild: 0.25.4 express: 5.1.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) path-to-regexp: 6.3.0 urlpattern-polyfill: 10.1.0 yaml: 2.8.1 @@ -11292,15 +11299,15 @@ snapshots: - aws-crt - supports-color - '@opennextjs/cloudflare@1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': + '@opennextjs/cloudflare@1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': dependencies: '@ast-grep/napi': 0.40.0 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@opennextjs/aws': 3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) cloudflare: 4.5.0 enquirer: 2.4.1 glob: 12.0.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-tqdm: 0.8.6 wrangler: 4.53.0 yargs: 18.0.0 @@ -13431,9 +13438,9 @@ snapshots: mdast-util-to-string: 3.2.0 unist-util-visit: 4.1.2 - '@vercel/analytics@1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/analytics@1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vercel/otel@2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))': @@ -13446,9 +13453,9 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@vercel/speed-insights@1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/speed-insights@1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vitest/expect@3.2.4': @@ -16805,12 +16812,12 @@ snapshots: next-intl-swc-plugin-extractor@4.5.8: {} - next-intl@4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): + next-intl@4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.3 negotiator: 1.0.0 - next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl-swc-plugin-extractor: 4.5.8 po-parser: 1.0.2 react: 19.2.1 @@ -16825,24 +16832,25 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.0.10 + '@next/env': 16.1.0 '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.4 caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.10 - '@next/swc-darwin-x64': 16.0.10 - '@next/swc-linux-arm64-gnu': 16.0.10 - '@next/swc-linux-arm64-musl': 16.0.10 - '@next/swc-linux-x64-gnu': 16.0.10 - '@next/swc-linux-x64-musl': 16.0.10 - '@next/swc-win32-arm64-msvc': 16.0.10 - '@next/swc-win32-x64-msvc': 16.0.10 + '@next/swc-darwin-arm64': 16.1.0 + '@next/swc-darwin-x64': 16.1.0 + '@next/swc-linux-arm64-gnu': 16.1.0 + '@next/swc-linux-arm64-musl': 16.1.0 + '@next/swc-linux-x64-gnu': 16.1.0 + '@next/swc-linux-x64-musl': 16.1.0 + '@next/swc-win32-arm64-msvc': 16.1.0 + '@next/swc-win32-x64-msvc': 16.1.0 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.56.1 babel-plugin-react-compiler: 1.0.0 From 1d8c034a3147df16110eda2b54126cd43ac9d2aa Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 20 Dec 2025 20:36:15 +0000 Subject: [PATCH 07/15] feat: enhance PartnersList component to support sorting by name and weight --- .../site/components/Common/Partners/index.tsx | 39 +++++++++++++++++-- apps/site/pages/en/download/current.mdx | 2 +- apps/site/pages/en/download/index.mdx | 2 +- apps/site/pages/en/index.mdx | 2 +- apps/site/pages/fr/download/current.mdx | 2 +- apps/site/pages/fr/download/index.mdx | 2 +- apps/site/pages/fr/index.mdx | 2 +- apps/site/pages/id/download/current.mdx | 2 +- apps/site/pages/id/download/index.mdx | 2 +- apps/site/pages/id/index.mdx | 2 +- apps/site/pages/ja/download/current.mdx | 2 +- apps/site/pages/ja/download/index.mdx | 2 +- apps/site/pages/ja/index.mdx | 2 +- apps/site/pages/pt-br/download/current.mdx | 2 +- apps/site/pages/pt-br/download/index.mdx | 2 +- apps/site/pages/pt-br/index.mdx | 2 +- apps/site/pages/ro/index.mdx | 2 +- apps/site/pages/uk/download/current.mdx | 2 +- apps/site/pages/uk/download/index.mdx | 2 +- apps/site/pages/uk/index.mdx | 2 +- apps/site/pages/zh-cn/download/current.mdx | 2 +- apps/site/pages/zh-cn/download/index.mdx | 2 +- apps/site/pages/zh-cn/index.mdx | 2 +- 23 files changed, 58 insertions(+), 25 deletions(-) diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index 0f31383fbcdd4..5e74c29c807ef 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -4,6 +4,7 @@ import Tooltip from '@node-core/ui-components/Common/Tooltip'; import * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos'; import { partners } from '#site/next.json.mjs'; +import { shuffle } from '#site/util/array'; import type { Partner, PartnerCategory } from '#site/types'; import type { FC } from 'react'; @@ -15,15 +16,45 @@ import style from './index.module.css'; type PartnersListProps = { size?: 'big' | 'small'; category?: PartnerCategory; + sort?: 'name' | 'weight'; length?: number; }; -const getPartners = async (length?: number, category?: PartnerCategory) => { +const getPartners = async ( + length?: number, + category?: PartnerCategory, + sort?: 'name' | 'weight' +) => { + let result: Array = []; + const filteredPartners = category ? partners.filter(partner => partner.categories.includes(category)) : partners; - return length ? filteredPartners.slice(0, length) : filteredPartners; + if (sort === 'name') { + filteredPartners.sort((a, b) => a.name.localeCompare(b.name)); + result = [...filteredPartners]; + } + + if (sort === 'weight') { + const weightedPartners = filteredPartners.flatMap(partner => { + const weight = partner.weight ?? 0; + return Array(weight > 0 ? weight : 1).fill(partner); + }); + + const minutes = 300; // Change every 5 minutes + const seed = Math.floor(Date.now() / (minutes * 1000)); + + // Create a copy of the array to avoid modifying the original + const shuffled = await shuffle(weightedPartners, seed); + + // Remove duplicates while preserving order + const unique = Array.from(new Set(shuffled)); + + result = [...unique]; + } + + return length ? result.slice(0, length) : result; }; const renderSmallPartner = (partner: Partner) => { @@ -54,13 +85,15 @@ const renderBigPartner = (partner: Partner) => { const PartnersList: FC = async ({ size = 'small', category, + sort = 'name', length, }) => { const isSmall = size === 'small'; const partners = await getPartners( length ?? (isSmall ? 6 : undefined), - category + category, + sort ); return ( diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/pages/en/download/current.mdx index 8ace12fdb5ca9..f9593624f6ea3 100644 --- a/apps/site/pages/en/download/current.mdx +++ b/apps/site/pages/en/download/current.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index a8f7506e3828e..517388a57132b 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/en/index.mdx b/apps/site/pages/en/index.mdx index a44de0233137b..e5cd7a93f48c1 100644 --- a/apps/site/pages/en/index.mdx +++ b/apps/site/pages/en/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
Node.js is proudly supported by the partners above and more. diff --git a/apps/site/pages/fr/download/current.mdx b/apps/site/pages/fr/download/current.mdx index 22248b8e2dc4b..1faccc75b8a46 100644 --- a/apps/site/pages/fr/download/current.mdx +++ b/apps/site/pages/fr/download/current.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/fr/download/index.mdx b/apps/site/pages/fr/download/index.mdx index a27ab1666e9d1..33efd8c355093 100644 --- a/apps/site/pages/fr/download/index.mdx +++ b/apps/site/pages/fr/download/index.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/fr/index.mdx b/apps/site/pages/fr/index.mdx index 02037eda3b81e..363d6a6c5090f 100644 --- a/apps/site/pages/fr/index.mdx +++ b/apps/site/pages/fr/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
Node.js est fièrement soutenu par les partenaires ci-dessus et bien d'autres encore. diff --git a/apps/site/pages/id/download/current.mdx b/apps/site/pages/id/download/current.mdx index fa6e33e6b00d2..17b34b61db5df 100644 --- a/apps/site/pages/id/download/current.mdx +++ b/apps/site/pages/id/download/current.mdx @@ -43,6 +43,6 @@ atau biner
- +
diff --git a/apps/site/pages/id/download/index.mdx b/apps/site/pages/id/download/index.mdx index 4c2e3fa7cd208..d2e5c5604e21e 100644 --- a/apps/site/pages/id/download/index.mdx +++ b/apps/site/pages/id/download/index.mdx @@ -43,6 +43,6 @@ atau biner
- +
diff --git a/apps/site/pages/id/index.mdx b/apps/site/pages/id/index.mdx index 0191f11f0293a..8bd969571652d 100644 --- a/apps/site/pages/id/index.mdx +++ b/apps/site/pages/id/index.mdx @@ -30,7 +30,7 @@ layout: home
- +
Node.js dengan bangga didukung oleh para mitra di atas dan lainnya. diff --git a/apps/site/pages/ja/download/current.mdx b/apps/site/pages/ja/download/current.mdx index 74e809f8be447..2f407c8dba7bb 100644 --- a/apps/site/pages/ja/download/current.mdx +++ b/apps/site/pages/ja/download/current.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/ja/download/index.mdx b/apps/site/pages/ja/download/index.mdx index f6445c572db9d..35b681848962c 100644 --- a/apps/site/pages/ja/download/index.mdx +++ b/apps/site/pages/ja/download/index.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/ja/index.mdx b/apps/site/pages/ja/index.mdx index 38232a1787038..3c157ecffb485 100644 --- a/apps/site/pages/ja/index.mdx +++ b/apps/site/pages/ja/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
Node.jsは上記パートナー企業など数多くの企業からご支援いただいています。 diff --git a/apps/site/pages/pt-br/download/current.mdx b/apps/site/pages/pt-br/download/current.mdx index 922bc4d98de1d..c7fc661554208 100644 --- a/apps/site/pages/pt-br/download/current.mdx +++ b/apps/site/pages/pt-br/download/current.mdx @@ -41,6 +41,6 @@ Confira nossos binários - + diff --git a/apps/site/pages/pt-br/download/index.mdx b/apps/site/pages/pt-br/download/index.mdx index b7eae0482c785..669a05ec96447 100644 --- a/apps/site/pages/pt-br/download/index.mdx +++ b/apps/site/pages/pt-br/download/index.mdx @@ -43,6 +43,6 @@ ou os binários - + diff --git a/apps/site/pages/pt-br/index.mdx b/apps/site/pages/pt-br/index.mdx index b2d61187569d7..9c6f34ecd1278 100644 --- a/apps/site/pages/pt-br/index.mdx +++ b/apps/site/pages/pt-br/index.mdx @@ -28,7 +28,7 @@ layout: home
- +
O Node.js é apoiado orgulhosamente pelos parceiros acima e outros. diff --git a/apps/site/pages/ro/index.mdx b/apps/site/pages/ro/index.mdx index f676f4eca7d62..d22f3f8ee1619 100644 --- a/apps/site/pages/ro/index.mdx +++ b/apps/site/pages/ro/index.mdx @@ -30,7 +30,7 @@ layout: home
- +
Node.js este susținut cu mândrie de partenerii de mai sus și mulți alții. diff --git a/apps/site/pages/uk/download/current.mdx b/apps/site/pages/uk/download/current.mdx index d4f003a456a54..b33abc541bbae 100644 --- a/apps/site/pages/uk/download/current.mdx +++ b/apps/site/pages/uk/download/current.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/uk/download/index.mdx b/apps/site/pages/uk/download/index.mdx index c0925fddf6704..fb24212d15ff6 100644 --- a/apps/site/pages/uk/download/index.mdx +++ b/apps/site/pages/uk/download/index.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/uk/index.mdx b/apps/site/pages/uk/index.mdx index c32e5800ae1af..97f666524372e 100644 --- a/apps/site/pages/uk/index.mdx +++ b/apps/site/pages/uk/index.mdx @@ -29,7 +29,7 @@ layout: home
- +
Node.js підтримується партнерами вище і не тільки. diff --git a/apps/site/pages/zh-cn/download/current.mdx b/apps/site/pages/zh-cn/download/current.mdx index 3927e89d3ca88..0afadf7ea2a9f 100644 --- a/apps/site/pages/zh-cn/download/current.mdx +++ b/apps/site/pages/zh-cn/download/current.mdx @@ -43,6 +43,6 @@ title: 下载 Node.js®
- +
diff --git a/apps/site/pages/zh-cn/download/index.mdx b/apps/site/pages/zh-cn/download/index.mdx index 8ba66598c6439..430849bda8eaf 100644 --- a/apps/site/pages/zh-cn/download/index.mdx +++ b/apps/site/pages/zh-cn/download/index.mdx @@ -41,6 +41,6 @@ title: 下载 Node.js®
- +
diff --git a/apps/site/pages/zh-cn/index.mdx b/apps/site/pages/zh-cn/index.mdx index eec67f636e0ff..86c7518c78951 100644 --- a/apps/site/pages/zh-cn/index.mdx +++ b/apps/site/pages/zh-cn/index.mdx @@ -29,7 +29,7 @@ layout: home
- +
Node.js 很荣幸得到上述及更多合作伙伴的支持。 From 4e45d2fe63089ff87eaa43030b9b71e7f5546fab Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 20 Dec 2025 21:17:49 +0000 Subject: [PATCH 08/15] feat: refactor partner retrieval logic and add providePartners function for weighted shuffling --- .../site/components/Common/Partners/index.tsx | 36 ++++++------------- apps/site/next-data/providers/partners.ts | 31 ++++++++++++++++ 2 files changed, 42 insertions(+), 25 deletions(-) create mode 100644 apps/site/next-data/providers/partners.ts diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index 5e74c29c807ef..49ab5fdd89800 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -3,8 +3,8 @@ import Tooltip from '@node-core/ui-components/Common/Tooltip'; import * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos'; -import { partners } from '#site/next.json.mjs'; -import { shuffle } from '#site/util/array'; +import { providePartners } from '#site/next-data/providers/partners'; +import { partners as allPartners } from '#site/next.json.mjs'; import type { Partner, PartnerCategory } from '#site/types'; import type { FC } from 'react'; @@ -25,33 +25,19 @@ const getPartners = async ( category?: PartnerCategory, sort?: 'name' | 'weight' ) => { - let result: Array = []; - - const filteredPartners = category - ? partners.filter(partner => partner.categories.includes(category)) - : partners; + let result: Array; if (sort === 'name') { - filteredPartners.sort((a, b) => a.name.localeCompare(b.name)); - result = [...filteredPartners]; - } - - if (sort === 'weight') { - const weightedPartners = filteredPartners.flatMap(partner => { - const weight = partner.weight ?? 0; - return Array(weight > 0 ? weight : 1).fill(partner); - }); - + // For name sorting, just filter and sort directly - no need for weighted shuffling + const filtered = category + ? allPartners.filter(p => p.categories.includes(category)) + : allPartners; + result = filtered.toSorted((a, b) => a.name.localeCompare(b.name)); + } else { + // For weight sorting, use cached weighted partners const minutes = 300; // Change every 5 minutes const seed = Math.floor(Date.now() / (minutes * 1000)); - - // Create a copy of the array to avoid modifying the original - const shuffled = await shuffle(weightedPartners, seed); - - // Remove duplicates while preserving order - const unique = Array.from(new Set(shuffled)); - - result = [...unique]; + result = await providePartners(seed, category); } return length ? result.slice(0, length) : result; diff --git a/apps/site/next-data/providers/partners.ts b/apps/site/next-data/providers/partners.ts new file mode 100644 index 0000000000000..8d471b03b1d25 --- /dev/null +++ b/apps/site/next-data/providers/partners.ts @@ -0,0 +1,31 @@ +'use cache'; + +import { partners } from '#site/next.json.mjs'; +import { shuffle } from '#site/util/array'; + +import type { Partner, PartnerCategory } from '#site/types'; + +/** + * Provides the weighted and shuffled partners array. + * Results are cached using React's cache directive. + * @param seed - The seed for deterministic shuffling + * @param category - Optional category to filter partners + */ +export const providePartners = async ( + seed: number, + category?: PartnerCategory +): Promise> => { + // Create weighted array (duplicates based on weight) + const weightedPartners = partners.flatMap(partner => { + const weight = partner.weight ?? 0; + return Array(weight > 0 ? weight : 1).fill(partner); + }); + + // Shuffle and remove duplicates + const shuffled = await shuffle(weightedPartners, seed); + const unique = Array.from(new Set(shuffled)); + + return category + ? unique.filter(p => p.categories.includes(category)) + : unique; +}; From b7feb506379280befb959d7213ce8f465f008863 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sat, 20 Dec 2025 21:49:51 +0000 Subject: [PATCH 09/15] refactor: remove Supporter type definition from partners.ts --- apps/site/components/Common/Supporters/index.tsx | 2 +- apps/site/types/partners.ts | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/apps/site/components/Common/Supporters/index.tsx b/apps/site/components/Common/Supporters/index.tsx index c6350c8e8bc31..06dddf7f23b44 100644 --- a/apps/site/components/Common/Supporters/index.tsx +++ b/apps/site/components/Common/Supporters/index.tsx @@ -4,7 +4,7 @@ import type { Supporter } from '#site/types'; import type { FC } from 'react'; type SupportersListProps = { - supporters: Array; + supporters: Array>; }; const SupportersList: FC = ({ supporters }) => ( diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index 8e22622a87078..ab7d9979da87f 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -29,11 +29,3 @@ export type Partner = { }; export type PartnerCategory = 'infrastructure' | 'esp'; - -export type Supporter = { - name: string; - image: string; - url: string; - profile: string; - source: 'opencollective' | 'github'; -}; From c961ba6d78c91695edab39e1cd032803f1c33181 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 21 Dec 2025 17:34:00 +0000 Subject: [PATCH 10/15] remove update of next.js --- apps/site/package.json | 8 +- pnpm-lock.yaml | 181 ++++++++++++++++++++--------------------- 2 files changed, 94 insertions(+), 95 deletions(-) diff --git a/apps/site/package.json b/apps/site/package.json index 827f62a839b4d..1cdb7f0d45b8c 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -50,16 +50,16 @@ "@types/node": "catalog:", "@types/react": "catalog:", "@vcarl/remark-headings": "~0.1.0", - "@vercel/analytics": "~1.6.1", + "@vercel/analytics": "~1.5.0", "@vercel/otel": "~2.1.0", - "@vercel/speed-insights": "~1.3.1", + "@vercel/speed-insights": "~1.2.0", "classnames": "catalog:", "cross-env": "catalog:", "feed": "~5.1.0", "github-slugger": "~2.0.0", "gray-matter": "~4.0.3", "mdast-util-to-string": "^4.0.0", - "next": "16.1.0", + "next": "16.0.10", "next-intl": "~4.5.3", "next-themes": "~0.4.6", "postcss-calc": "~10.1.1", @@ -80,7 +80,7 @@ }, "devDependencies": { "@flarelabs-net/wrangler-build-time-fs-assets-polyfilling": "^0.0.1", - "@next/eslint-plugin-next": "16.1.0", + "@next/eslint-plugin-next": "16.0.7", "@node-core/remark-lint": "workspace:*", "@opennextjs/cloudflare": "^1.14.4", "@playwright/test": "^1.56.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3968d65b79a9a..ce0009bd68b13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ catalogs: version: 2.5.1 cross-env: specifier: ^10.0.0 - version: 10.1.0 + version: 10.0.0 react: specifier: ^19.2.1 version: 19.2.1 @@ -136,20 +136,20 @@ importers: specifier: ~0.1.0 version: 0.1.0 '@vercel/analytics': - specifier: ~1.6.1 - version: 1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.5.0 + version: 1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@vercel/otel': specifier: ~2.1.0 version: 2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)) '@vercel/speed-insights': - specifier: ~1.3.1 - version: 1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + specifier: ~1.2.0 + version: 1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) classnames: specifier: 'catalog:' version: 2.5.1 cross-env: specifier: 'catalog:' - version: 10.1.0 + version: 10.0.0 feed: specifier: ~5.1.0 version: 5.1.0 @@ -163,11 +163,11 @@ importers: specifier: ^4.0.0 version: 4.0.0 next: - specifier: 16.1.0 - version: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + specifier: 16.0.10 + version: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl: specifier: ~4.5.3 - version: 4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) + version: 4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3) next-themes: specifier: ~0.4.6 version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -221,14 +221,14 @@ importers: specifier: ^0.0.1 version: 0.0.1 '@next/eslint-plugin-next': - specifier: 16.1.0 - version: 16.1.0 + specifier: 16.0.7 + version: 16.0.7 '@node-core/remark-lint': specifier: workspace:* version: link:../../packages/remark-lint '@opennextjs/cloudflare': specifier: ^1.14.4 - version: 1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) + version: 1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0) '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -252,7 +252,7 @@ importers: version: 1.7.0 eslint-config-next: specifier: 16.0.7 - version: 16.0.7(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) + version: 16.0.7(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) eslint-plugin-mdx: specifier: ~3.6.2 version: 3.6.2(eslint@9.36.0(jiti@2.6.1))(remark-lint-file-extension@3.0.1) @@ -343,7 +343,7 @@ importers: devDependencies: cross-env: specifier: 'catalog:' - version: 10.1.0 + version: 10.0.0 packages/remark-lint: dependencies: @@ -452,7 +452,7 @@ importers: devDependencies: cross-env: specifier: 'catalog:' - version: 10.1.0 + version: 10.0.0 dedent: specifier: ^1.7.0 version: 1.7.0 @@ -540,7 +540,7 @@ importers: version: 19.2.7 cross-env: specifier: 'catalog:' - version: 10.1.0 + version: 10.0.0 css-loader: specifier: ~7.1.2 version: 7.1.2(webpack@5.103.0(@swc/core@1.15.3)) @@ -2243,59 +2243,56 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@next/env@16.1.0': - resolution: {integrity: sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==} + '@next/env@16.0.10': + resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} '@next/eslint-plugin-next@16.0.7': resolution: {integrity: sha512-hFrTNZcMEG+k7qxVxZJq3F32Kms130FAhG8lvw2zkKBgAcNOJIxlljNiCjGygvBshvaGBdf88q2CqWtnqezDHA==} - '@next/eslint-plugin-next@16.1.0': - resolution: {integrity: sha512-sooC/k0LCF4/jLXYHpgfzJot04lZQqsttn8XJpTguP8N3GhqXN3wSkh68no2OcZzS/qeGwKDFTqhZ8WofdXmmQ==} - - '@next/swc-darwin-arm64@16.1.0': - resolution: {integrity: sha512-onHq8dl8KjDb8taANQdzs3XmIqQWV3fYdslkGENuvVInFQzZnuBYYOG2HGHqqtvgmEU7xWzhgndXXxnhk4Z3fQ==} + '@next/swc-darwin-arm64@16.0.10': + resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.0': - resolution: {integrity: sha512-Am6VJTp8KhLuAH13tPrAoVIXzuComlZlMwGr++o2KDjWiKPe3VwpxYhgV6I4gKls2EnsIMggL4y7GdXyDdJcFA==} + '@next/swc-darwin-x64@16.0.10': + resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.0': - resolution: {integrity: sha512-fVicfaJT6QfghNyg8JErZ+EMNQ812IS0lmKfbmC01LF1nFBcKfcs4Q75Yy8IqnsCqH/hZwGhqzj3IGVfWV6vpA==} + '@next/swc-linux-arm64-gnu@16.0.10': + resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.1.0': - resolution: {integrity: sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==} + '@next/swc-linux-arm64-musl@16.0.10': + resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.1.0': - resolution: {integrity: sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==} + '@next/swc-linux-x64-gnu@16.0.10': + resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.1.0': - resolution: {integrity: sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==} + '@next/swc-linux-x64-musl@16.0.10': + resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.1.0': - resolution: {integrity: sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==} + '@next/swc-win32-arm64-msvc@16.0.10': + resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.0': - resolution: {integrity: sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==} + '@next/swc-win32-x64-msvc@16.0.10': + resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4236,8 +4233,8 @@ packages: '@vcarl/remark-headings@0.1.0': resolution: {integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==} - '@vercel/analytics@1.6.1': - resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} + '@vercel/analytics@1.5.0': + resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==} peerDependencies: '@remix-run/react': ^2 '@sveltejs/kit': ^1 || ^2 @@ -4274,8 +4271,8 @@ packages: '@opentelemetry/sdk-metrics': '>=2.0.0 <3.0.0' '@opentelemetry/sdk-trace-base': '>=2.0.0 <3.0.0' - '@vercel/speed-insights@1.3.1': - resolution: {integrity: sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==} + '@vercel/speed-insights@1.2.0': + resolution: {integrity: sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==} peerDependencies: '@sveltejs/kit': ^1 || ^2 next: '>= 13' @@ -4868,6 +4865,11 @@ packages: typescript: optional: true + cross-env@10.0.0: + resolution: {integrity: sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==} + engines: {node: '>=20'} + hasBin: true + cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} @@ -6916,8 +6918,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.1.0: - resolution: {integrity: sha512-Y+KbmDbefYtHDDQKLNrmzE/YYzG2msqo2VXhzh5yrJ54tx/6TmGdkR5+kP9ma7i7LwZpZMfoY3m/AoPPPKxtVw==} + next@16.0.10: + resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -11037,38 +11039,34 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.1.0': {} + '@next/env@16.0.10': {} '@next/eslint-plugin-next@16.0.7': dependencies: fast-glob: 3.3.1 - '@next/eslint-plugin-next@16.1.0': - dependencies: - fast-glob: 3.3.1 - - '@next/swc-darwin-arm64@16.1.0': + '@next/swc-darwin-arm64@16.0.10': optional: true - '@next/swc-darwin-x64@16.1.0': + '@next/swc-darwin-x64@16.0.10': optional: true - '@next/swc-linux-arm64-gnu@16.1.0': + '@next/swc-linux-arm64-gnu@16.0.10': optional: true - '@next/swc-linux-arm64-musl@16.1.0': + '@next/swc-linux-arm64-musl@16.0.10': optional: true - '@next/swc-linux-x64-gnu@16.1.0': + '@next/swc-linux-x64-gnu@16.0.10': optional: true - '@next/swc-linux-x64-musl@16.1.0': + '@next/swc-linux-x64-musl@16.0.10': optional: true - '@next/swc-win32-arm64-msvc@16.1.0': + '@next/swc-win32-arm64-msvc@16.0.10': optional: true - '@next/swc-win32-x64-msvc@16.1.0': + '@next/swc-win32-x64-msvc@16.0.10': optional: true '@noble/ciphers@1.3.0': {} @@ -11275,7 +11273,7 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opennextjs/aws@3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@opennextjs/aws@3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@ast-grep/napi': 0.40.0 '@aws-sdk/client-cloudfront': 3.398.0 @@ -11291,7 +11289,7 @@ snapshots: cookie: 1.0.2 esbuild: 0.25.4 express: 5.1.0 - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) path-to-regexp: 6.3.0 urlpattern-polyfill: 10.1.0 yaml: 2.8.1 @@ -11299,15 +11297,15 @@ snapshots: - aws-crt - supports-color - '@opennextjs/cloudflare@1.14.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': + '@opennextjs/cloudflare@1.14.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(wrangler@4.53.0)': dependencies: '@ast-grep/napi': 0.40.0 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 3.9.4(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@opennextjs/aws': 3.9.4(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) cloudflare: 4.5.0 enquirer: 2.4.1 glob: 12.0.0 - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-tqdm: 0.8.6 wrangler: 4.53.0 yargs: 18.0.0 @@ -13438,9 +13436,9 @@ snapshots: mdast-util-to-string: 3.2.0 unist-util-visit: 4.1.2 - '@vercel/analytics@1.6.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/analytics@1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vercel/otel@2.1.0(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))': @@ -13453,9 +13451,9 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@vercel/speed-insights@1.3.1(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/speed-insights@1.2.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vitest/expect@3.2.4': @@ -14057,6 +14055,11 @@ snapshots: optionalDependencies: typescript: 5.8.3 + cross-env@10.0.0: + dependencies: + '@epic-web/invariant': 1.0.0 + cross-spawn: 7.0.6 + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 @@ -14580,13 +14583,13 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@16.0.7(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3): + eslint-config-next@16.0.7(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 16.0.7 eslint: 9.36.0(jiti@2.6.1) 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.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.36.0(jiti@2.6.1)) @@ -14626,7 +14629,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -14642,7 +14645,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -14679,18 +14682,17 @@ snapshots: eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - optional: true - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3) eslint: 9.36.0(jiti@2.6.1) 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.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color + optional: true eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)): dependencies: @@ -14738,9 +14740,8 @@ snapshots: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - optional: true - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14751,7 +14752,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.36.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.36.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14762,12 +14763,11 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@9.36.0(jiti@2.6.1))(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.36.0(jiti@2.6.1)): dependencies: @@ -16812,12 +16812,12 @@ snapshots: next-intl-swc-plugin-extractor@4.5.8: {} - next-intl@4.5.8(next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): + next-intl@4.5.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.3 negotiator: 1.0.0 - next: 16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl-swc-plugin-extractor: 4.5.8 po-parser: 1.0.2 react: 19.2.1 @@ -16832,25 +16832,24 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - next@16.1.0(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.1.0 + '@next/env': 16.0.10 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.9.4 caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.0 - '@next/swc-darwin-x64': 16.1.0 - '@next/swc-linux-arm64-gnu': 16.1.0 - '@next/swc-linux-arm64-musl': 16.1.0 - '@next/swc-linux-x64-gnu': 16.1.0 - '@next/swc-linux-x64-musl': 16.1.0 - '@next/swc-win32-arm64-msvc': 16.1.0 - '@next/swc-win32-x64-msvc': 16.1.0 + '@next/swc-darwin-arm64': 16.0.10 + '@next/swc-darwin-x64': 16.0.10 + '@next/swc-linux-arm64-gnu': 16.0.10 + '@next/swc-linux-arm64-musl': 16.0.10 + '@next/swc-linux-x64-gnu': 16.0.10 + '@next/swc-linux-x64-musl': 16.0.10 + '@next/swc-win32-arm64-msvc': 16.0.10 + '@next/swc-win32-x64-msvc': 16.0.10 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.56.1 babel-plugin-react-compiler: 1.0.0 From bc52348f24143db9d1de7ff3b6267f16d5739588 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 21 Dec 2025 18:35:25 +0000 Subject: [PATCH 11/15] refactor: rename 'big' size to 'large' in PartnersList and related styles Signed-off-by: GitHub --- .../Partners/PartnerButton/index.module.css | 5 ++--- .../Common/Partners/PartnerButton/index.tsx | 2 +- .../Common/Partners/index.module.css | 2 +- apps/site/components/Common/Partners/index.tsx | 18 +++++++++--------- apps/site/pages/en/about/partners.mdx | 4 ++-- apps/site/pages/en/download/current.mdx | 2 +- apps/site/pages/en/download/index.mdx | 2 +- apps/site/pages/fr/about/partners.mdx | 4 ++-- apps/site/pages/fr/download/current.mdx | 2 +- apps/site/pages/fr/download/index.mdx | 2 +- apps/site/pages/id/about/partners.mdx | 4 ++-- apps/site/pages/id/download/current.mdx | 2 +- apps/site/pages/id/download/index.mdx | 2 +- apps/site/pages/ja/about/partners.mdx | 4 ++-- apps/site/pages/ja/download/current.mdx | 2 +- apps/site/pages/ja/download/index.mdx | 2 +- apps/site/pages/pt-br/about/partners.mdx | 4 ++-- apps/site/pages/pt-br/download/current.mdx | 2 +- apps/site/pages/pt-br/download/index.mdx | 2 +- apps/site/pages/uk/about/partners.mdx | 4 ++-- apps/site/pages/uk/download/current.mdx | 2 +- apps/site/pages/uk/download/index.mdx | 2 +- apps/site/pages/zh-cn/download/current.mdx | 2 +- apps/site/pages/zh-cn/download/index.mdx | 2 +- 24 files changed, 39 insertions(+), 40 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerButton/index.module.css b/apps/site/components/Common/Partners/PartnerButton/index.module.css index 6166b9c0614ca..80ee027b41a75 100644 --- a/apps/site/components/Common/Partners/PartnerButton/index.module.css +++ b/apps/site/components/Common/Partners/PartnerButton/index.module.css @@ -1,6 +1,6 @@ @reference "../../../../styles/index.css"; -.big { +.large { @apply flex h-28 max-h-28 @@ -21,8 +21,7 @@ .small { @apply h-9 w-auto - min-w-9 - p-2; + min-w-9; svg { @apply !h-4 diff --git a/apps/site/components/Common/Partners/PartnerButton/index.tsx b/apps/site/components/Common/Partners/PartnerButton/index.tsx index bbfc70bfaa3ea..760cb96cb0b4f 100644 --- a/apps/site/components/Common/Partners/PartnerButton/index.tsx +++ b/apps/site/components/Common/Partners/PartnerButton/index.tsx @@ -5,7 +5,7 @@ import type { AnchorHTMLAttributes, FC } from 'react'; import style from './index.module.css'; type PartnerProps = AnchorHTMLAttributes & { - size?: 'big' | 'small'; + size?: 'large' | 'small'; }; const PartnerButton: FC = ({ diff --git a/apps/site/components/Common/Partners/index.module.css b/apps/site/components/Common/Partners/index.module.css index 68faede61335c..f419d06f3c67d 100644 --- a/apps/site/components/Common/Partners/index.module.css +++ b/apps/site/components/Common/Partners/index.module.css @@ -8,7 +8,7 @@ gap-2; } -.big { +.large { @apply grid w-full grid-cols-[repeat(auto-fill,minmax(240px,1fr))] diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index 49ab5fdd89800..ba5f61fd1b837 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -4,7 +4,7 @@ import Tooltip from '@node-core/ui-components/Common/Tooltip'; import * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos'; import { providePartners } from '#site/next-data/providers/partners'; -import { partners as allPartners } from '#site/next.json.mjs'; +import { partners } from '#site/next.json.mjs'; import type { Partner, PartnerCategory } from '#site/types'; import type { FC } from 'react'; @@ -14,7 +14,7 @@ import PartnerButton from './PartnerButton'; import style from './index.module.css'; type PartnersListProps = { - size?: 'big' | 'small'; + size?: 'large' | 'small'; category?: PartnerCategory; sort?: 'name' | 'weight'; length?: number; @@ -30,13 +30,13 @@ const getPartners = async ( if (sort === 'name') { // For name sorting, just filter and sort directly - no need for weighted shuffling const filtered = category - ? allPartners.filter(p => p.categories.includes(category)) - : allPartners; + ? partners.filter(p => p.categories.includes(category)) + : partners; result = filtered.toSorted((a, b) => a.name.localeCompare(b.name)); } else { // For weight sorting, use cached weighted partners - const minutes = 300; // Change every 5 minutes - const seed = Math.floor(Date.now() / (minutes * 1000)); + const seconds = 300; // Change every 5 minutes + const seed = Math.floor(Date.now() / (seconds * 1000)); result = await providePartners(seed, category); } @@ -58,11 +58,11 @@ const renderSmallPartner = (partner: Partner) => { ); }; -const renderBigPartner = (partner: Partner) => { +const renderLargePartner = (partner: Partner) => { const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos]; return ( - + ); @@ -84,7 +84,7 @@ const PartnersList: FC = async ({ return (
- {partners.map(isSmall ? renderSmallPartner : renderBigPartner)} + {partners.map(isSmall ? renderSmallPartner : renderLargePartner)}
); }; diff --git a/apps/site/pages/en/about/partners.mdx b/apps/site/pages/en/about/partners.mdx index b72a96db52a88..7fd69d685fdfc 100644 --- a/apps/site/pages/en/about/partners.mdx +++ b/apps/site/pages/en/about/partners.mdx @@ -18,7 +18,7 @@ The infrastructure partners provide important support for the Node.js project, providing hardware and machines for our continuous integration and testing processes, without we can't test and release new versions of Node.js. - + ## Supporters @@ -38,7 +38,7 @@ End-Of-Life versions, please visit [End-Of-Life Node.js Releases](/about/eol) > Using EOL releases through commercial support should be viewed as a temporary solution, the goal should always > be to upgrade to actively supported versions. - + ## Become a Partner diff --git a/apps/site/pages/en/download/current.mdx b/apps/site/pages/en/download/current.mdx index f9593624f6ea3..cc435c8af1e41 100644 --- a/apps/site/pages/en/download/current.mdx +++ b/apps/site/pages/en/download/current.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/en/download/index.mdx b/apps/site/pages/en/download/index.mdx index 517388a57132b..9767b0d9bda2f 100644 --- a/apps/site/pages/en/download/index.mdx +++ b/apps/site/pages/en/download/index.mdx @@ -45,6 +45,6 @@ or the unof proudly due to the support of these partners, and more.
- +
diff --git a/apps/site/pages/fr/about/partners.mdx b/apps/site/pages/fr/about/partners.mdx index 63c4844922398..ce51a757cf766 100644 --- a/apps/site/pages/fr/about/partners.mdx +++ b/apps/site/pages/fr/about/partners.mdx @@ -18,7 +18,7 @@ Les partenaires infrastructurels apportent un soutien important au projet Node.j en fournissant le matériel et les machines nécessaires à nos processus d'intégration et de test continus, sans lesquels nous ne pourrions pas tester et publier de nouvelles versions de Node.js. - + ## Contributeurs @@ -37,7 +37,7 @@ versions en fin de vie, veuillez consulter [End-Of-Life Node.js Releases](/about > L'utilisation des versions EOL(fin de vie) via NES doit être considérée comme une solution temporaire. L'objectif doit toujours être de passer à des versions activement prises en charge. - + ## Devenir un partenaire diff --git a/apps/site/pages/fr/download/current.mdx b/apps/site/pages/fr/download/current.mdx index 1faccc75b8a46..390c4bfa90d4c 100644 --- a/apps/site/pages/fr/download/current.mdx +++ b/apps/site/pages/fr/download/current.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/fr/download/index.mdx b/apps/site/pages/fr/download/index.mdx index 33efd8c355093..212d6d204e99b 100644 --- a/apps/site/pages/fr/download/index.mdx +++ b/apps/site/pages/fr/download/index.mdx @@ -41,6 +41,6 @@ Consultez nos binaires - + diff --git a/apps/site/pages/id/about/partners.mdx b/apps/site/pages/id/about/partners.mdx index abd4154bbcf33..d483a92667d96 100644 --- a/apps/site/pages/id/about/partners.mdx +++ b/apps/site/pages/id/about/partners.mdx @@ -16,7 +16,7 @@ dan pengembangan berkelanjutan dari Node.js. ... - + ## Pendukung @@ -36,7 +36,7 @@ untuk menjembatani kebutuhan sementara kamu merencanakan strategi peningkatan ve > Menggunakan rilis EOL melalui dukungan komersial harus dianggap sebagai solusi sementara. Tujuan utama tetap harus meningkatkan ke versi yang masih didukung secara aktif. - + ## Menjadi Mitra diff --git a/apps/site/pages/id/download/current.mdx b/apps/site/pages/id/download/current.mdx index 17b34b61db5df..2b4804de5e040 100644 --- a/apps/site/pages/id/download/current.mdx +++ b/apps/site/pages/id/download/current.mdx @@ -43,6 +43,6 @@ atau biner
- +
diff --git a/apps/site/pages/id/download/index.mdx b/apps/site/pages/id/download/index.mdx index d2e5c5604e21e..7eb783d799834 100644 --- a/apps/site/pages/id/download/index.mdx +++ b/apps/site/pages/id/download/index.mdx @@ -43,6 +43,6 @@ atau biner
- +
diff --git a/apps/site/pages/ja/about/partners.mdx b/apps/site/pages/ja/about/partners.mdx index 8a7aa218d39ab..09a89b788a0fd 100644 --- a/apps/site/pages/ja/about/partners.mdx +++ b/apps/site/pages/ja/about/partners.mdx @@ -13,7 +13,7 @@ Node.jsの成功と継続的な発展に欠かせないパートナーのみな インフラストラクチャーのパートナーのみなさまにはNode.jsプロジェクトに多大なご支援をいただいております。継続的インテグレーションやテストに必要なハードウェアや機器をご提供いただいているおかげで新しいNode.jsのバージョンのテストやリリースを行うことができます。 - + ## サポーター @@ -27,7 +27,7 @@ Node.jsの成功と継続的な発展に欠かせないパートナーのみな > 商用サポートによるEOLバージョンの利用は一時的な解決策と捉えるべきであり、常に積極的にサポートされているバージョンへのアップグレードを目標とすべきです。 - + ## パートナーになる diff --git a/apps/site/pages/ja/download/current.mdx b/apps/site/pages/ja/download/current.mdx index 2f407c8dba7bb..1dffb99443dd8 100644 --- a/apps/site/pages/ja/download/current.mdx +++ b/apps/site/pages/ja/download/current.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/ja/download/index.mdx b/apps/site/pages/ja/download/index.mdx index 35b681848962c..047628c37f35c 100644 --- a/apps/site/pages/ja/download/index.mdx +++ b/apps/site/pages/ja/download/index.mdx @@ -41,6 +41,6 @@ title: Node.js®をダウンロードする
- +
diff --git a/apps/site/pages/pt-br/about/partners.mdx b/apps/site/pages/pt-br/about/partners.mdx index 7e8d1e510287b..498d9788a4c2b 100644 --- a/apps/site/pages/pt-br/about/partners.mdx +++ b/apps/site/pages/pt-br/about/partners.mdx @@ -13,7 +13,7 @@ Agradecemos o apoio de nossos parceiros, que desempenham um papel crucial no suc Os parceiros de infraestrutura fornecem um apoio fundamental para o projeto Node.js, disponibilizando hardware e máquinas para nossos processos de integração contínua e testes, sem os quais não conseguimos testar e lançar novas versões do Node.js. - + ## Apoiadores @@ -30,7 +30,7 @@ Fim de Vida Útil por favor visite os [Lançamentos em Fim de Vida Útil (_EOL_) > O uso de versões _EOL_ através de suporte comercial deve ser visto como uma solução temporária, o objetivo deve ser sempre atualizar para versões ativamente mantidas. - + ## Torne-se um Parceiro diff --git a/apps/site/pages/pt-br/download/current.mdx b/apps/site/pages/pt-br/download/current.mdx index c7fc661554208..73c14fd44258c 100644 --- a/apps/site/pages/pt-br/download/current.mdx +++ b/apps/site/pages/pt-br/download/current.mdx @@ -41,6 +41,6 @@ Confira nossos binários - + diff --git a/apps/site/pages/pt-br/download/index.mdx b/apps/site/pages/pt-br/download/index.mdx index 669a05ec96447..6854d0e9ceff6 100644 --- a/apps/site/pages/pt-br/download/index.mdx +++ b/apps/site/pages/pt-br/download/index.mdx @@ -43,6 +43,6 @@ ou os binários - + diff --git a/apps/site/pages/uk/about/partners.mdx b/apps/site/pages/uk/about/partners.mdx index 643c20f6cb14d..ba1a5b30e1e9c 100644 --- a/apps/site/pages/uk/about/partners.mdx +++ b/apps/site/pages/uk/about/partners.mdx @@ -13,7 +13,7 @@ layout: about Партнери інфраструктури здійснюють важливу підтримку для проєкту Node.js, надаючи апаратне забезпечення та пристрої для постійної інтеграції та тестування. Без них ми не зможемо тестувати та випускати нові версії Node.js. - + ## Підтримувачі @@ -28,7 +28,7 @@ layout: about > Використання EOL-релізів із комерційною підтримкою повинне бути тимчасовим рішенням, і за можливості слід оновлюватися до підтримуваних версій. - + ## Як стати партнером? diff --git a/apps/site/pages/uk/download/current.mdx b/apps/site/pages/uk/download/current.mdx index b33abc541bbae..8a47dc9b68f00 100644 --- a/apps/site/pages/uk/download/current.mdx +++ b/apps/site/pages/uk/download/current.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/uk/download/index.mdx b/apps/site/pages/uk/download/index.mdx index fb24212d15ff6..54482e06783ef 100644 --- a/apps/site/pages/uk/download/index.mdx +++ b/apps/site/pages/uk/download/index.mdx @@ -43,6 +43,6 @@ title: Завантажити Node.js®
- +
diff --git a/apps/site/pages/zh-cn/download/current.mdx b/apps/site/pages/zh-cn/download/current.mdx index 0afadf7ea2a9f..f770f4f9f86c8 100644 --- a/apps/site/pages/zh-cn/download/current.mdx +++ b/apps/site/pages/zh-cn/download/current.mdx @@ -43,6 +43,6 @@ title: 下载 Node.js®
- +
diff --git a/apps/site/pages/zh-cn/download/index.mdx b/apps/site/pages/zh-cn/download/index.mdx index 430849bda8eaf..b50954baa93fe 100644 --- a/apps/site/pages/zh-cn/download/index.mdx +++ b/apps/site/pages/zh-cn/download/index.mdx @@ -41,6 +41,6 @@ title: 下载 Node.js®
- +
From 19d1d36e45b246406121b5e7bf232a5c9474d102 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 21 Dec 2025 18:45:57 +0000 Subject: [PATCH 12/15] apply suggestions --- .../site/components/Common/Partners/index.tsx | 6 ++-- apps/site/next-data/generators/partners.mjs | 26 ++++++++++++++++ apps/site/next-data/providers/partners.ts | 30 ++----------------- 3 files changed, 32 insertions(+), 30 deletions(-) create mode 100644 apps/site/next-data/generators/partners.mjs diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index ba5f61fd1b837..1724877ba0e1d 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -3,7 +3,7 @@ import Tooltip from '@node-core/ui-components/Common/Tooltip'; import * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos'; -import { providePartners } from '#site/next-data/providers/partners'; +import providePartners from '#site/next-data/providers/partners'; import { partners } from '#site/next.json.mjs'; import type { Partner, PartnerCategory } from '#site/types'; @@ -76,8 +76,10 @@ const PartnersList: FC = async ({ }) => { const isSmall = size === 'small'; + const SMALL_PARTNER_LIMIT = 6; + const partners = await getPartners( - length ?? (isSmall ? 6 : undefined), + length ?? (isSmall ? SMALL_PARTNER_LIMIT : undefined), category, sort ); diff --git a/apps/site/next-data/generators/partners.mjs b/apps/site/next-data/generators/partners.mjs new file mode 100644 index 0000000000000..2bdf5e619e3f1 --- /dev/null +++ b/apps/site/next-data/generators/partners.mjs @@ -0,0 +1,26 @@ +import { partners } from '#site/next.json.mjs'; +import { shuffle } from '#site/util/array'; + +/** + * Provides the weighted and shuffled partners array. + * Results are cached using React's cache directive. + * @param seed - The seed for deterministic shuffling + * @param category - Optional category to filter partners + */ +const providePartners = async (seed, category) => { + // Create weighted array (duplicates based on weight) + const weightedPartners = partners.flatMap(partner => { + const weight = partner.weight ?? 0; + return Array(weight > 0 ? weight : 1).fill(partner); + }); + + // Shuffle and remove duplicates + const shuffled = await shuffle(weightedPartners, seed); + const unique = Array.from(new Set(shuffled)); + + return category + ? unique.filter(p => p.categories.includes(category)) + : unique; +}; + +export default providePartners; diff --git a/apps/site/next-data/providers/partners.ts b/apps/site/next-data/providers/partners.ts index 8d471b03b1d25..ab35d17c31a31 100644 --- a/apps/site/next-data/providers/partners.ts +++ b/apps/site/next-data/providers/partners.ts @@ -1,31 +1,5 @@ 'use cache'; -import { partners } from '#site/next.json.mjs'; -import { shuffle } from '#site/util/array'; +import providePartners from '#site/next-data/generators/partners.mjs'; -import type { Partner, PartnerCategory } from '#site/types'; - -/** - * Provides the weighted and shuffled partners array. - * Results are cached using React's cache directive. - * @param seed - The seed for deterministic shuffling - * @param category - Optional category to filter partners - */ -export const providePartners = async ( - seed: number, - category?: PartnerCategory -): Promise> => { - // Create weighted array (duplicates based on weight) - const weightedPartners = partners.flatMap(partner => { - const weight = partner.weight ?? 0; - return Array(weight > 0 ? weight : 1).fill(partner); - }); - - // Shuffle and remove duplicates - const shuffled = await shuffle(weightedPartners, seed); - const unique = Array.from(new Set(shuffled)); - - return category - ? unique.filter(p => p.categories.includes(category)) - : unique; -}; +export default providePartners; From 2fac65c548cfec93a702fcbb2fd7d55d9a33b5e2 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 21 Dec 2025 19:36:38 +0000 Subject: [PATCH 13/15] fix: remove unnecessary importants from svg size in PartnerButton styles Signed-off-by: GitHub --- .../components/Common/Partners/PartnerButton/index.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/site/components/Common/Partners/PartnerButton/index.module.css b/apps/site/components/Common/Partners/PartnerButton/index.module.css index 80ee027b41a75..12c4633d4994b 100644 --- a/apps/site/components/Common/Partners/PartnerButton/index.module.css +++ b/apps/site/components/Common/Partners/PartnerButton/index.module.css @@ -24,7 +24,7 @@ min-w-9; svg { - @apply !h-4 - !w-auto; + @apply h-4 + w-auto; } } From 113acc4d707bda5d16ff0f14c69fcfb9776e49ef Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 21 Dec 2025 19:58:46 +0000 Subject: [PATCH 14/15] refactor: update Partner type to use keyof for id and simplify logo access --- apps/site/components/Common/Partners/index.tsx | 4 ++-- apps/site/types/partners.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index 1724877ba0e1d..1ac0368c7c8a6 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -44,7 +44,7 @@ const getPartners = async ( }; const renderSmallPartner = (partner: Partner) => { - const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos]; + const Logo = PartnerLogos[partner.id]; return ( { }; const renderLargePartner = (partner: Partner) => { - const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos]; + const Logo = PartnerLogos[partner.id]; return ( diff --git a/apps/site/types/partners.ts b/apps/site/types/partners.ts index ab7d9979da87f..f0c4fc23acf77 100644 --- a/apps/site/types/partners.ts +++ b/apps/site/types/partners.ts @@ -1,7 +1,8 @@ +import type * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos'; import type { ReactElement, SVGProps } from 'react'; export type Partner = { - id: string; + id: keyof typeof PartnerLogos; /** * The name of the partner */ From 692e8a2a431b5672662978cdfdfc8ada657639f4 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 21 Dec 2025 20:31:05 +0000 Subject: [PATCH 15/15] Update apps/site/components/Common/Partners/index.tsx Co-authored-by: Aviv Keller Signed-off-by: Sebastian Beltran --- .../site/components/Common/Partners/index.tsx | 19 +++++-------------- apps/site/next-data/generators/partners.mjs | 13 ++++++------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/apps/site/components/Common/Partners/index.tsx b/apps/site/components/Common/Partners/index.tsx index 1ac0368c7c8a6..d1a774e000a8a 100644 --- a/apps/site/components/Common/Partners/index.tsx +++ b/apps/site/components/Common/Partners/index.tsx @@ -25,20 +25,11 @@ const getPartners = async ( category?: PartnerCategory, sort?: 'name' | 'weight' ) => { - let result: Array; - - if (sort === 'name') { - // For name sorting, just filter and sort directly - no need for weighted shuffling - const filtered = category - ? partners.filter(p => p.categories.includes(category)) - : partners; - result = filtered.toSorted((a, b) => a.name.localeCompare(b.name)); - } else { - // For weight sorting, use cached weighted partners - const seconds = 300; // Change every 5 minutes - const seed = Math.floor(Date.now() / (seconds * 1000)); - result = await providePartners(seed, category); - } + let result = sort === 'name' ? partners : await providePartners(); + + result = category + ? result.filter(p => p.categories.includes(category)) + : result; return length ? result.slice(0, length) : result; }; diff --git a/apps/site/next-data/generators/partners.mjs b/apps/site/next-data/generators/partners.mjs index 2bdf5e619e3f1..0e9539c210044 100644 --- a/apps/site/next-data/generators/partners.mjs +++ b/apps/site/next-data/generators/partners.mjs @@ -4,10 +4,12 @@ import { shuffle } from '#site/util/array'; /** * Provides the weighted and shuffled partners array. * Results are cached using React's cache directive. - * @param seed - The seed for deterministic shuffling - * @param category - Optional category to filter partners */ -const providePartners = async (seed, category) => { +const providePartners = async () => { + // For weight sorting, use cached weighted partners + const seconds = 300; // Change every 5 minutes + const seed = Math.floor(Date.now() / (seconds * 1000)); + // Create weighted array (duplicates based on weight) const weightedPartners = partners.flatMap(partner => { const weight = partner.weight ?? 0; @@ -16,11 +18,8 @@ const providePartners = async (seed, category) => { // Shuffle and remove duplicates const shuffled = await shuffle(weightedPartners, seed); - const unique = Array.from(new Set(shuffled)); - return category - ? unique.filter(p => p.categories.includes(category)) - : unique; + return Array.from(new Set(shuffled)); }; export default providePartners;