diff --git a/.prettierignore b/.prettierignore index ae7d4df21b609..b0a2a81b9e2e2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,6 +10,7 @@ package-lock.json # Next.js Build Output .next build +next-env.d.ts # Test Runner junit.xml diff --git a/apps/site/app/[locale]/error.tsx b/apps/site/app/[locale]/error.tsx index e518c823debb1..0c4bf7f827ec8 100644 --- a/apps/site/app/[locale]/error.tsx +++ b/apps/site/app/[locale]/error.tsx @@ -1,6 +1,5 @@ 'use client'; -import { ArrowRightIcon } from '@heroicons/react/24/solid'; import { useTranslations } from 'next-intl'; import Button from '#site/components/Common/Button'; @@ -13,17 +12,17 @@ const ErrorPage: FC<{ error: Error }> = () => { return ( - 500 + 500 +

{t('layouts.error.internalServerError.title')}

+

{t('layouts.error.internalServerError.description')}

- + +
); }; diff --git a/apps/site/app/[locale]/not-found.tsx b/apps/site/app/[locale]/not-found.tsx index 058f213ececb6..c6dc76a682af8 100644 --- a/apps/site/app/[locale]/not-found.tsx +++ b/apps/site/app/[locale]/not-found.tsx @@ -1,6 +1,5 @@ 'use server'; -import { ArrowRightIcon } from '@heroicons/react/24/solid'; import { getTranslations } from 'next-intl/server'; import Button from '#site/components/Common/Button'; @@ -28,10 +27,7 @@ const NotFoundPage: FC = async () => { {t('layouts.error.notFound.description')}

- + ); }; diff --git a/apps/site/app/global-error.tsx b/apps/site/app/global-error.tsx deleted file mode 100644 index 8e5b08cf9714e..0000000000000 --- a/apps/site/app/global-error.tsx +++ /dev/null @@ -1,34 +0,0 @@ -'use client'; - -import { ArrowRightIcon } from '@heroicons/react/24/solid'; - -import Button from '#site/components/Common/Button'; -import BaseLayout from '#site/layouts/Base'; -import GlowingBackdropLayout from '#site/layouts/GlowingBackdrop'; - -import type { FC } from 'react'; - -const GlobalErrorPage: FC<{ error: Error }> = () => ( - - - - - 500 - -

Internal Server Error

- -

- This page has thrown a non-recoverable error. -

- - -
-
- - -); - -export default GlobalErrorPage; diff --git a/apps/site/components/withNodeRelease.tsx b/apps/site/components/withNodeRelease.tsx index 3f9af6df1f002..f161c8939caf0 100644 --- a/apps/site/components/withNodeRelease.tsx +++ b/apps/site/components/withNodeRelease.tsx @@ -14,20 +14,15 @@ type WithNodeReleaseProps = { // Note that Hooks cannot be used in a RSC async component // Async Components do not get re-rendered at all. const WithNodeRelease: FC = async ({ - status, + status: statuses, children: Component, }) => { - const releaseData = await provideReleaseData(); - - let matchingRelease: NodeRelease | undefined; - for (const statusItem of Array.isArray(status) ? status : [status]) { - matchingRelease = releaseData.find( - release => release.status === statusItem - ); - if (matchingRelease) { - break; - } - } + const releases = await provideReleaseData(); + + const matchingRelease = [statuses] + .flat() + .map(status => releases.find(release => release.status === status)) + .find(Boolean); if (matchingRelease) { return ; diff --git a/apps/site/eslint.config.js b/apps/site/eslint.config.js index 619b5eb4fa765..c36005ae95d2a 100644 --- a/apps/site/eslint.config.js +++ b/apps/site/eslint.config.js @@ -12,7 +12,7 @@ export default baseConfig.concat([ react.configs.flat['jsx-runtime'], hooks.configs['recommended-latest'], - next.flatConfig.coreWebVitals, + next.configs['core-web-vitals'], mdx.flatCodeBlocks, // Type-checking diff --git a/apps/site/next-env.d.ts b/apps/site/next-env.d.ts index 36a4fe488ad02..2d5420ebae639 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"; // 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.config.mjs b/apps/site/next.config.mjs index f2c99aece9cbf..c8f6bc2c4d290 100644 --- a/apps/site/next.config.mjs +++ b/apps/site/next.config.mjs @@ -20,7 +20,8 @@ const getDeploymentId = async () => { /** @type {import('next').NextConfig} */ const nextConfig = { - allowedDevOrigins: ['10.1.1.232'], + // Full Support of React 18 SSR and Streaming + reactCompiler: true, // We don't want to redirect with trailing slashes skipTrailingSlashRedirect: true, // We allow the BASE_PATH to be overridden in case that the Website @@ -52,10 +53,7 @@ const nextConfig = { // Enable statically typed links // @see https://nextjs.org/docs/app/api-reference/config/typescript#statically-typed-links typedRoutes: true, - // We don't want to run ESLint Checking on Production Builds - // as we already check it on the CI within each Pull Request - // we also configure ESLint to run its lint checking on all files - eslint: { ignoreDuringBuilds: true }, + // Experimental Flags experimental: { useCache: true, // Ensure that server-side code is also minified @@ -82,6 +80,8 @@ const nextConfig = { 'tailwindcss', 'shiki', ], + // Faster Development Servers with Turbopack + turbopackFileSystemCacheForDev: true, }, deploymentId: await getDeploymentId(), }; diff --git a/apps/site/open-next.config.ts b/apps/site/open-next.config.ts index a0080eca48b27..03f1c01730dc2 100644 --- a/apps/site/open-next.config.ts +++ b/apps/site/open-next.config.ts @@ -20,10 +20,9 @@ const cloudflareConfig = defineCloudflareConfig({ const openNextConfig: OpenNextConfig = { ...cloudflareConfig, + buildCommand: 'pnpm build --webpack', cloudflare: { - skewProtection: { - enabled: true, - }, + skewProtection: { enabled: true }, }, }; diff --git a/apps/site/package.json b/apps/site/package.json index e90d399cec9c2..3f34ccb6177ff 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -3,7 +3,7 @@ "type": "module", "scripts": { "prebuild": "node --run build:blog-data", - "build": "cross-env NODE_NO_WARNINGS=1 next build --turbo", + "build": "cross-env NODE_NO_WARNINGS=1 next build", "build:blog-data": "cross-env NODE_NO_WARNINGS=1 node ./scripts/blog-data/index.mjs", "build:blog-data:watch": "node --watch --watch-path=pages/en/blog ./scripts/blog-data/index.mjs", "cloudflare:build:worker": "OPEN_NEXT_CLOUDFLARE=true opennextjs-cloudflare build", @@ -12,7 +12,7 @@ "predeploy": "node --run build:blog-data", "deploy": "cross-env NEXT_PUBLIC_STATIC_EXPORT=true node --run build", "predev": "node --run build:blog-data", - "dev": "cross-env NODE_NO_WARNINGS=1 next dev --turbo", + "dev": "cross-env NODE_NO_WARNINGS=1 next dev", "lint": "node --run lint:js && node --run lint:css && node --run lint:md", "lint:fix": "node --run lint:js:fix && node --run lint:css:fix && node --run lint:md:fix", "lint:css": "stylelint \"**/*.css\" --allow-empty-input --cache --cache-strategy=content --cache-location=.stylelintcache", @@ -42,16 +42,16 @@ "@opentelemetry/instrumentation": "~0.206.0", "@opentelemetry/resources": "~1.30.1", "@orama/core": "^1.2.13", - "@orama/ui": "^1.3.2", + "@orama/ui": "^1.5.3", "@opentelemetry/sdk-logs": "~0.206.0", "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.8", - "@tailwindcss/postcss": "~4.1.16", + "@tailwindcss/postcss": "~4.1.17", "@types/node": "catalog:", "@types/react": "catalog:", "@vcarl/remark-headings": "~0.1.0", "@vercel/analytics": "~1.5.0", - "@vercel/otel": "~2.0.1", + "@vercel/otel": "~2.1.0", "@vercel/speed-insights": "~1.2.0", "classnames": "catalog:", "cross-env": "catalog:", @@ -59,8 +59,8 @@ "github-slugger": "~2.0.0", "gray-matter": "~4.0.3", "mdast-util-to-string": "^4.0.0", - "next": "15.5.7", - "next-intl": "~4.3.11", + "next": "16.0.7", + "next-intl": "~4.5.3", "next-themes": "~0.4.6", "postcss-calc": "~10.1.1", "react": "catalog:", @@ -80,22 +80,23 @@ }, "devDependencies": { "@flarelabs-net/wrangler-build-time-fs-assets-polyfilling": "^0.0.1", - "@next/eslint-plugin-next": "15.5.7", + "@next/eslint-plugin-next": "16.0.7", "@node-core/remark-lint": "workspace:*", - "@opennextjs/cloudflare": "^1.13.1", + "@opennextjs/cloudflare": "^1.14.4", "@playwright/test": "^1.56.1", "@testing-library/user-event": "~14.6.1", "@types/mdast": "^4.0.4", "@types/mdx": "^2.0.13", "@types/semver": "~7.7.1", + "babel-plugin-react-compiler": "^1.0.0", "dedent": "^1.7.0", - "eslint-config-next": "15.5.4", + "eslint-config-next": "16.0.7", "eslint-plugin-mdx": "~3.6.2", "eslint-plugin-react": "~7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "global-jsdom": "^27.0.0", "handlebars": "4.7.8", - "jsdom": "^27.1.0", + "jsdom": "^27.2.0", "mdast-util-from-markdown": "^2.0.2", "nock": "^14.0.10", "remark-frontmatter": "^5.0.0", @@ -103,11 +104,11 @@ "stylelint-config-standard": "39.0.0", "stylelint-order": "7.0.0", "stylelint-selector-bem-pattern": "4.0.1", - "tsx": "^4.20.6", + "tsx": "^4.21.0", "typescript": "catalog:", "typescript-eslint": "~8.45.0", "user-agent-data-types": "0.4.2", - "wrangler": "^4.45.3" + "wrangler": "^4.53.0" }, "imports": { "#site/*": [ diff --git a/apps/site/pages/pt-br/about/eol.mdx b/apps/site/pages/pt-br/about/eol.mdx index c5212a3161e37..71032925dde48 100644 --- a/apps/site/pages/pt-br/about/eol.mdx +++ b/apps/site/pages/pt-br/about/eol.mdx @@ -8,7 +8,7 @@ description: Entenda o Fim de Vida Útil (End-of-Life ou EOL) do Node.js, o que ## Por que e como as versões do Node.js chegam ao Fim de Vida Útil -As versões principais (major) do Node.js são lançadas, corrigidas e designadas como Fim de Vida Útil (EOL) em um cronograma previsível. Como não é viável manter todas as linhas de versão indefinidamente, após um período de manutenção planejado, uma linha de versão principal do Node.js deixa de ser mantida pelo projeto. +As versões principais (major) do Node.js são lançadas, corrigidas e designadas como Fim de Vida Útil (_End-Of-Life_ ou _EOL_) em um cronograma previsível. Como não é viável manter todas as linhas de versão indefinidamente, após um período de manutenção planejado, uma linha de versão principal do Node.js deixa de ser mantida pelo projeto.