From d1242c21f0ff258610dd3f9e81dcad881be8ed7b Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Sun, 9 Aug 2026 11:03:33 -0400 Subject: [PATCH 01/10] chore: remove unused file (#9092) Signed-off-by: Aviv Keller --- .../site/components/withSidebarCrossLinks.tsx | 48 ------------------- 1 file changed, 48 deletions(-) delete mode 100644 apps/site/components/withSidebarCrossLinks.tsx diff --git a/apps/site/components/withSidebarCrossLinks.tsx b/apps/site/components/withSidebarCrossLinks.tsx deleted file mode 100644 index 565b459524859..0000000000000 --- a/apps/site/components/withSidebarCrossLinks.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { getClientContext } from '#site/client-context'; -import CrossLink from '#site/components/Common/CrossLink'; -import useSiteNavigation from '#site/hooks/useSiteNavigation'; - -import type { NavigationKeys } from '#site/types'; -import type { FC } from 'react'; - -type WithCrossLinksProps = { navKey: NavigationKeys }; - -const WithSidebarCrossLinks: FC = ({ navKey }) => { - const { getSideNavigation } = useSiteNavigation(); - const { pathname } = getClientContext(); - - const [[, sidebarNavigation]] = getSideNavigation([navKey]); - - const crossLinkItems = sidebarNavigation.items - .map(([, { items }]) => items.map(([, item]) => item)) - .flat(); - - const currentItem = crossLinkItems.findIndex(({ link }) => link === pathname); - - const [previousCrossLink, nextCrossLink] = [ - crossLinkItems[currentItem - 1], - crossLinkItems[currentItem + 1], - ]; - - return ( -
- {(previousCrossLink && ( - - )) ||
} - - {nextCrossLink && ( - - )} -
- ); -}; - -export default WithSidebarCrossLinks; From 95f946f2b0c238ad893d4c06f0785008d2774625 Mon Sep 17 00:00:00 2001 From: "Node.js Crowdin Bot" <148437438+nodejs-crowdin@users.noreply.github.com> Date: Sun, 9 Aug 2026 19:49:16 +0100 Subject: [PATCH 02/10] chore(i18n): sync translations from crowdin (#9091) * chore(i18n): sync translations from crowdin * chore(i18n): format translated files Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> --- apps/site/pages/uk/about/eol.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/site/pages/uk/about/eol.mdx b/apps/site/pages/uk/about/eol.mdx index a37a35d26613c..f9a448d63a592 100644 --- a/apps/site/pages/uk/about/eol.mdx +++ b/apps/site/pages/uk/about/eol.mdx @@ -20,7 +20,7 @@ description: З'ясуйте, що таке кінець підтримки (End
-[Переглянути розклад релізів Node.js](/about/releases/). +[Переглянути розклад релізів Node.js](/about/previous-releases/). ## Що відбувається, коли реліз досягає кінця підтримки (EOL) From a2233c9d23294f4723cca8b07ebbad5153fb759d Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:59:23 +0200 Subject: [PATCH 03/10] chore(blog): redirect migrations to learn (#9094) * blog: migration remove not node version related * blog: remove author * blog: add redirect * fix: redirect --- apps/site/authors.json | 5 - .../en/blog/migrations/axios-to-fetch.mdx | 170 ------------------ .../en/blog/migrations/chalk-to-styletext.mdx | 69 ------- apps/site/redirects.json | 8 + 4 files changed, 8 insertions(+), 244 deletions(-) delete mode 100644 apps/site/pages/en/blog/migrations/axios-to-fetch.mdx delete mode 100644 apps/site/pages/en/blog/migrations/chalk-to-styletext.mdx diff --git a/apps/site/authors.json b/apps/site/authors.json index 9934f96eb6dad..20217976eec33 100644 --- a/apps/site/authors.json +++ b/apps/site/authors.json @@ -233,11 +233,6 @@ "name": "Richard Lau", "website": "https://github.com/richardlau" }, - "richiemccoll": { - "id": 12698531, - "name": "Richie McColl", - "website": "https://github.com/richiemccoll" - }, "Robin Bender Ginn": { "id": 4296937, "name": "Robin Bender Ginn", diff --git a/apps/site/pages/en/blog/migrations/axios-to-fetch.mdx b/apps/site/pages/en/blog/migrations/axios-to-fetch.mdx deleted file mode 100644 index 518d5a3d07c1b..0000000000000 --- a/apps/site/pages/en/blog/migrations/axios-to-fetch.mdx +++ /dev/null @@ -1,170 +0,0 @@ ---- -date: '2026-05-09T00:00:00.000Z' -category: migrations -title: Axios to WHATWG Fetch -layout: blog-post -author: AugustinMauroy ---- - -# Migrate from Axios to WHATWG Fetch - -This codemod transforms code using [Axios](https://github.com/axios/axios) to leverage the [WHATWG Fetch API](https://fetch.spec.whatwg.org/), which is now natively available in Node.js. - -## Why doing this? - -- **Native Support**: Fetch is built into Node.js, eliminating the need for external libraries and their associated maintenance overhead. -- **Improved Performance**: Fetch is optimized for modern JavaScript runtimes, often resulting in better performance compared to Axios. -- **Better Standards Compliance**: Fetch adheres closely to web standards, making it easier to write cross-platform code that works both in Node.js and browsers. -- **Reduced Security Risks**: Removing Axios eliminates potential vulnerabilities associated with third-party dependencies, enhancing the security of your application. - -## Node.js Version Requirements - -- Node.js v18.0.0 or later (Fetch API is available but marked experimental) -- Node.js v21.0.0 or later (Fetch API is stable) - -> If your package currently supports Node.js versions earlier than v18.0.0, you cannot migrate to the Fetch API without dropping support for those versions. -> This requires bumping the major version of your package AND updating the engines field in your package.json to require Node.js >= v18.0.0. - -## Supported Transformations - -The codemod supports the following Axios methods and converts them to their Fetch equivalents: - -- `axios.request(config)` -- `axios.get(url[, config])` -- `axios.delete(url[, config])` -- `axios.head(url[, config])` -- `axios.options(url[, config])` -- `axios.post(url[, data[, config]])` -- `axios.put(url[, data[, config]])` -- `axios.patch(url[, data[, config]])` -- `axios.postForm(url[, data[, config]])` -- `axios.putForm(url[, data[, config]])` -- `axios.patchForm(url[, data[, config]])` - -## Usage - -The source code for this codemod can be found in the [axios-to-whatwg-fetch directory](https://github.com/nodejs/userland-migrations/tree/main/recipes/axios-to-whatwg-fetch). - -You can find this codemod in the [Codemod Registry](https://app.codemod.com/registry/@nodejs/axios-to-whatwg-fetch). - -```bash -npx codemod @nodejs/axios-to-whatwg-fetch -``` - -## Examples - -### GET Request - -```diff -const base = 'https://dummyjson.com/todos'; - -- const all = await axios.get(base); -+ const all = await fetch(base).then(async (res) => Object.assign(res, { data: await res.json() })).catch(() => null); - console.log('\nGET /todos ->', all.status); - console.log(`Preview: ${all.data.todos.length} todos`); -``` - -### POST Request - -```diff -const base = 'https://dummyjson.com/todos'; - -- const created = await axios.post( -- `${base}/add`, { -- todo: 'Use DummyJSON in the project', -- completed: false, -- userId: 5, -- }, { -- headers: { 'Content-Type': 'application/json' } -- } -- ); -+ const created = await fetch(`${base}/add`, { -+ method: 'POST', -+ headers: { 'Content-Type': 'application/json' }, -+ body: JSON.stringify({ -+ todo: 'Use DummyJSON in the project', -+ completed: false, -+ userId: 5, -+ }), -+ }).then(async (res) => Object.assign(res, { data: await res.json() })); - console.log('\nPOST /todos/add ->', created.status); - console.log('Preview:', created.data?.id ? `created id ${created.data.id}` : JSON.stringify(created.data).slice(0,200)); -``` - -### POST Form Request - -```diff -const formEndpoint = '/submit'; - -- const created = await axios.postForm(formEndpoint, { -- title: 'Form Demo', -- completed: false, -- }); -+ const created = await fetch(formEndpoint, { -+ method: 'POST', -+ body: new URLSearchParams({ -+ title: 'Form Demo', -+ completed: false, -+ }), -+ }).then(async (res) => Object.assign(res, { data: await res.json() })); - console.log('Preview:', created.data); -``` - -### PUT Request - -```diff -const base = 'https://dummyjson.com/todos'; - -- const updatedPut = await axios.put( -- `${base}/1`, -- { completed: false }, -- { headers: { 'Content-Type': 'application/json' } } -- ); -+ const updatedPut = await fetch(`${base}/1`, { -+ method: 'PUT', -+ headers: { 'Content-Type': 'application/json' }, -+ body: JSON.stringify({ completed: false }), -+ }).then(async (res) => Object.assign(res, { data: await res.json() })); - console.log('\nPUT /todos/1 ->', updatedPut.status); - console.log('Preview:', updatedPut.data?.completed !== undefined ? `completed=${updatedPut.data.completed}` : JSON.stringify(updatedPut.data).slice(0,200)); -``` - -### DELETE Request - -```diff -const base = 'https://dummyjson.com/todos'; - -- const deleted = await axios.delete(`${base}/1`); -+ const deleted = await fetch(`${base}/1`, { method: 'DELETE' }) -+ .then(async (res) => Object.assign(res, { data: await res.json() })); - console.log('\nDELETE /todos/1 ->', deleted.status); - console.log('Preview:', deleted.data ? JSON.stringify(deleted.data).slice(0,200) : typeof deleted.data); -``` - -### `request` Axios Method - -```diff -const base = 'https://dummyjson.com/todos'; - -- const customRequest = await axios.request({ -- url: `${base}/1`, -- method: 'PATCH', -- headers: { 'Content-Type': 'application/json' }, -- data: { completed: true }, -- }); -+ const customRequest = await fetch(`${base}/1`, { -+ method: 'PATCH', -+ headers: { 'Content-Type': 'application/json' }, -+ body: JSON.stringify({ completed: true }), -+ }).then(async (res) => Object.assign(res, { data: await res.json() })); -console.log('\nPATCH /todos/1 ->', customRequest.status); -console.log('Preview:', customRequest.data?.completed !== undefined ? `completed=${customRequest.data.completed}` : JSON.stringify(customRequest.data).slice(0,200)); -``` - -## Unsupported APIs - -The codemod does not yet cover Axios features outside of direct request helpers, such as interceptors, cancel tokens, or instance configuration from `axios.create()`. - -## Recognition - -We would like to thank the maintainers of [Axios](https://github.com/axios/axios) for their support of the package over time and for its contributions to the ecosystem. diff --git a/apps/site/pages/en/blog/migrations/chalk-to-styletext.mdx b/apps/site/pages/en/blog/migrations/chalk-to-styletext.mdx deleted file mode 100644 index 05c4400410892..0000000000000 --- a/apps/site/pages/en/blog/migrations/chalk-to-styletext.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -date: '2026-01-23T00:00:00.000Z' -category: migrations -title: Chalk to Node.js util styleText -layout: blog-post -author: richiemccoll ---- - -# Migrate from Chalk to Node.js util styleText - -This codemod aims to help you reduce external dependencies by transforming chalk method calls to use the native Node.js styling functionality. It will also handle automatic removal of the [`chalk`](https://github.com/chalk/chalk) package from the package.json. - -## Compatible Features: - -- Basic colors (red, green, blue, yellow, etc.) -- Bright colors (redBright, greenBright, etc.) -- Background colors (bgRed, bgGreen, etc.) -- Text modifiers (bold, dim, italic, underline, strikethrough, etc.) -- Style chaining via array syntax -- Environment variable support (NO_COLOR, NODE_DISABLE_COLORS, FORCE_COLOR) - -## Incompatible Features: - -- Custom RGB colors (chalk.rgb(), chalk.hex()) -- 256-color palette (chalk.ansi256()) -- Template literal syntax (chalk...``) -- Advanced modifiers with limited terminal support (overline, blink, etc.) - -## Node.js Version Requirements - -- Node.js v20.12.0 or later (for util.styleText) -- `util.styleText` became stable in Node.js v22.13.0 (and v23.5.0) - -> If your package currently supports Node.js versions earlier than v20.12.0, you cannot migrate to util.styleText without dropping support for those versions. -> This requires bumping the major version of your package AND updating the engines field in your package.json to require Node.js >= v20.12.0. - -## Usage: - -The source code for this codemod can be found in the [chalk-to-util-styletext directory](https://github.com/nodejs/userland-migrations/tree/main/recipes/chalk-to-util-styletext). - -You can find this codemod in the [Codemod Registry](https://app.codemod.com/registry/@nodejs/chalk-to-util-styletext). - -```bash -npx codemod @nodejs/chalk-to-util-styletext -``` - -## Example: - -```diff -- import chalk from 'chalk'; -+ import { styleText } from 'node:util'; - -- console.log(chalk.red('Error message')); -+ console.log(styleText('red', 'Error message')); - -- console.log(chalk.green.underline('Success with emphasis')); -+ console.log(styleText(['green', 'underline'], 'Success with emphasis')); - -- const red = chalk.red; -+ const red = (text) => styleText('red', text); -- const boldBlue = chalk.blue.bold; -+ const boldBlue = (text) => styleText(['blue', 'bold'], text); -console.log(red('Error')); -console.log(boldBlue('Info')); -``` - -## Recognition - -We would like to thank the maintainers of [`chalk`](https://github.com/chalk/chalk) for their support of the package over time and for its contributions to the ecosystem. diff --git a/apps/site/redirects.json b/apps/site/redirects.json index f4c7aa77a1b52..ab7bbcc365150 100644 --- a/apps/site/redirects.json +++ b/apps/site/redirects.json @@ -251,6 +251,14 @@ { "source": "/:locale/download/package-manager/all", "destination": "/:locale/download/archive/current" + }, + { + "source": "/:locale/blog/migrations/axios-to-fetch", + "destination": "/learn/userland-migrations/axios-to-whatwg-fetch" + }, + { + "source": "/:locale/blog/migrations/chalk-to-styletext", + "destination": "/learn/userland-migrations/chalk-to-util-styletext" } ], "internal": [] From 96e49e7265d2bf73b9a0a632c322d6c146aa498e Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Sun, 9 Aug 2026 17:59:41 -0400 Subject: [PATCH 04/10] chore(qol): CSS changes (#9093) --- .changeset/large-pandas-refuse.md | 5 +++++ .../src/Common/ChangeHistory/index.module.css | 7 ++++--- .../src/Common/TableOfContents/index.module.css | 4 +--- .../ui-components/src/Containers/MetaBar/index.module.css | 4 +--- .../ui-components/src/Containers/Sidebar/index.module.css | 1 + packages/ui-components/src/styles/markdown.css | 4 +++- packages/ui-components/src/styles/theme.css | 2 +- 7 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 .changeset/large-pandas-refuse.md diff --git a/.changeset/large-pandas-refuse.md b/.changeset/large-pandas-refuse.md new file mode 100644 index 0000000000000..c4da82a01ab37 --- /dev/null +++ b/.changeset/large-pandas-refuse.md @@ -0,0 +1,5 @@ +--- +'@node-core/ui-components': patch +--- + +Quality-of-life style improvements diff --git a/packages/ui-components/src/Common/ChangeHistory/index.module.css b/packages/ui-components/src/Common/ChangeHistory/index.module.css index 91241657f5d18..0fbfc01add394 100644 --- a/packages/ui-components/src/Common/ChangeHistory/index.module.css +++ b/packages/ui-components/src/Common/ChangeHistory/index.module.css @@ -32,7 +32,8 @@ z-50 mt-1 max-h-80 - w-52 + w-[26rem] + max-w-[calc(100vw-2rem)] overflow-hidden rounded-sm border @@ -45,7 +46,7 @@ .dropdownContentInner { @apply max-h-80 - w-52 + w-full overflow-y-auto; } @@ -64,7 +65,7 @@ &:hover, &:focus-visible { @apply bg-brand-600 - text-white; + text-white!; } } diff --git a/packages/ui-components/src/Common/TableOfContents/index.module.css b/packages/ui-components/src/Common/TableOfContents/index.module.css index eac5bd455be23..5416aaff3f998 100644 --- a/packages/ui-components/src/Common/TableOfContents/index.module.css +++ b/packages/ui-components/src/Common/TableOfContents/index.module.css @@ -41,7 +41,6 @@ .link { @apply inline-block text-sm - font-semibold text-neutral-900 underline hover:text-neutral-700 @@ -50,8 +49,7 @@ } .codeLink { - @apply font-ibm-plex-mono - font-medium; + @apply font-ibm-plex-mono; } .depthThree { diff --git a/packages/ui-components/src/Containers/MetaBar/index.module.css b/packages/ui-components/src/Containers/MetaBar/index.module.css index f06fc547e2668..e04db496a7c64 100644 --- a/packages/ui-components/src/Containers/MetaBar/index.module.css +++ b/packages/ui-components/src/Containers/MetaBar/index.module.css @@ -48,7 +48,6 @@ a { @apply max-ml:inline-block max-ml:py-1 - font-semibold text-neutral-900 underline dark:text-white; @@ -60,8 +59,7 @@ } a.codeLink { - @apply font-ibm-plex-mono - font-medium; + @apply font-ibm-plex-mono; } ol { diff --git a/packages/ui-components/src/Containers/Sidebar/index.module.css b/packages/ui-components/src/Containers/Sidebar/index.module.css index b9a5c3595664d..4bb1f000882f3 100644 --- a/packages/ui-components/src/Containers/Sidebar/index.module.css +++ b/packages/ui-components/src/Containers/Sidebar/index.module.css @@ -4,6 +4,7 @@ @apply ml:max-w-xs ml:overflow-auto ml:border-r + ml:pb-10 scrollbar-thin z-0 flex diff --git a/packages/ui-components/src/styles/markdown.css b/packages/ui-components/src/styles/markdown.css index 2c706f9552113..c426cb0a4fc26 100644 --- a/packages/ui-components/src/styles/markdown.css +++ b/packages/ui-components/src/styles/markdown.css @@ -41,8 +41,10 @@ main { h4, h5, h6 { - @apply font-semibold + @apply mt-4 + font-semibold text-neutral-900 + first:mt-0 dark:text-white; &[id] a { diff --git a/packages/ui-components/src/styles/theme.css b/packages/ui-components/src/styles/theme.css index 1337537775226..15455b88e5f59 100644 --- a/packages/ui-components/src/styles/theme.css +++ b/packages/ui-components/src/styles/theme.css @@ -7,7 +7,7 @@ @theme { --container-8xl: 88rem; --container-9xl: 96rem; - --container-10xl: 104rem; + --container-10xl: 110rem; --container-11xl: 112rem; --container-12xl: 120rem; --breakpoint-ml: 896px; From 79dafaaa2ebb3c32be0e071ad527f1f934453be5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Aug 2026 19:25:38 -0400 Subject: [PATCH 05/10] chore: version packages (#9078) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/crowdin-translations.md | 5 ----- .changeset/large-pandas-refuse.md | 5 ----- .changeset/tasty-toes-smile.md | 6 ------ packages/i18n/CHANGELOG.md | 6 ++++++ packages/i18n/package.json | 2 +- packages/ui-components/CHANGELOG.md | 9 +++++++++ packages/ui-components/package.json | 2 +- 7 files changed, 17 insertions(+), 18 deletions(-) delete mode 100644 .changeset/crowdin-translations.md delete mode 100644 .changeset/large-pandas-refuse.md delete mode 100644 .changeset/tasty-toes-smile.md diff --git a/.changeset/crowdin-translations.md b/.changeset/crowdin-translations.md deleted file mode 100644 index 667f954b1cc82..0000000000000 --- a/.changeset/crowdin-translations.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@node-core/website-i18n': patch ---- - -Update translations from Crowdin. diff --git a/.changeset/large-pandas-refuse.md b/.changeset/large-pandas-refuse.md deleted file mode 100644 index c4da82a01ab37..0000000000000 --- a/.changeset/large-pandas-refuse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@node-core/ui-components': patch ---- - -Quality-of-life style improvements diff --git a/.changeset/tasty-toes-smile.md b/.changeset/tasty-toes-smile.md deleted file mode 100644 index f302bf97f8591..0000000000000 --- a/.changeset/tasty-toes-smile.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@node-core/ui-components': patch ---- - -Widen the article layout to 120rem on 3xl screens and give the extra space to the -metabar, so table of contents entries no longer wrap. diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index fd7976cc69f42..adebf4bc6538c 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,11 @@ # @node-core/website-i18n +## 1.1.34 + +### Patch Changes + +- [#9053](https://github.com/nodejs/nodejs.org/pull/9053) [`5bbc791`](https://github.com/nodejs/nodejs.org/commit/5bbc791b4ee5783e629b3c2da1a91d516f8b5871) Thanks [@nodejs-crowdin](https://github.com/nodejs-crowdin)! - Update translations from Crowdin. + ## 1.1.33 ### Patch Changes diff --git a/packages/i18n/package.json b/packages/i18n/package.json index bff521dc7d110..48ca01f1ebc39 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@node-core/website-i18n", - "version": "1.1.33", + "version": "1.1.34", "type": "module", "exports": { "./*": [ diff --git a/packages/ui-components/CHANGELOG.md b/packages/ui-components/CHANGELOG.md index 44f2e6a4c766d..013a2f3c67eb4 100644 --- a/packages/ui-components/CHANGELOG.md +++ b/packages/ui-components/CHANGELOG.md @@ -1,5 +1,14 @@ # @node-core/ui-components +## 1.7.5 + +### Patch Changes + +- [#9093](https://github.com/nodejs/nodejs.org/pull/9093) [`96e49e7`](https://github.com/nodejs/nodejs.org/commit/96e49e7265d2bf73b9a0a632c322d6c146aa498e) Thanks [@avivkeller](https://github.com/avivkeller)! - Quality-of-life style improvements + +- [#9062](https://github.com/nodejs/nodejs.org/pull/9062) [`58e004e`](https://github.com/nodejs/nodejs.org/commit/58e004e8e1177cf1a13162008444d982433b79c2) Thanks [@avivkeller](https://github.com/avivkeller)! - Widen the article layout to 120rem on 3xl screens and give the extra space to the + metabar, so table of contents entries no longer wrap. + ## 1.7.4 ### Patch Changes diff --git a/packages/ui-components/package.json b/packages/ui-components/package.json index 9056fde5a5f6b..328b62735bd31 100644 --- a/packages/ui-components/package.json +++ b/packages/ui-components/package.json @@ -1,6 +1,6 @@ { "name": "@node-core/ui-components", - "version": "1.7.4", + "version": "1.7.5", "type": "module", "exports": { "./*": { From 9e2eab05f5a63f84cfa7efb24b1fea176edad128 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Wed, 12 Aug 2026 08:16:38 -0400 Subject: [PATCH 06/10] chore(renderatl): code and learn short url (#9096) Signed-off-by: Aviv Keller --- apps/site/redirects.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/site/redirects.json b/apps/site/redirects.json index ab7bbcc365150..fed586a7f53eb 100644 --- a/apps/site/redirects.json +++ b/apps/site/redirects.json @@ -259,6 +259,10 @@ { "source": "/:locale/blog/migrations/chalk-to-styletext", "destination": "/learn/userland-migrations/chalk-to-util-styletext" + }, + { + "source": "/code-and-learn-2026", + "destination": "https://code-and-learn.nodejs.harperfabric.com/" } ], "internal": [] From 28d264ad44d347aa0b17cafaee0b7a03f8eaa7d1 Mon Sep 17 00:00:00 2001 From: Gavin Stuart <46635587+blue2cat@users.noreply.github.com> Date: Wed, 12 Aug 2026 07:23:54 -0700 Subject: [PATCH 07/10] fix(blog): correct codemod references in v22-to-v24 migration guide (#9095) --- .../pages/en/blog/migrations/v22-to-v24.mdx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/site/pages/en/blog/migrations/v22-to-v24.mdx b/apps/site/pages/en/blog/migrations/v22-to-v24.mdx index 9fd641b050825..8a0ebf78b1749 100644 --- a/apps/site/pages/en/blog/migrations/v22-to-v24.mdx +++ b/apps/site/pages/en/blog/migrations/v22-to-v24.mdx @@ -16,7 +16,7 @@ author: AugustinMauroy, Richard Lau Missing codemods will be added over time. If you have specific needs. - Read this issue to learn where we are in the process. And how to manually migrate your code. + Read this issue to learn where we are in the process and how to manually migrate your code. @@ -114,6 +114,8 @@ This codemod transforms the usage of `dirent.path` to use `dirent.parentPath`. See [DEP0178](https://nodejs.org/api/deprecations.html#DEP0178). +The source code for this codemod can be found in the [dirent-path-to-parent-path directory](https://github.com/nodejs/userland-migrations/tree/main/recipes/dirent-path-to-parent-path). + You can find this codemod in the [Codemod Registry](https://app.codemod.com/registry/@nodejs/dirent-path-to-parent-path). ```bash @@ -169,7 +171,7 @@ npx codemod run @nodejs/fs-access-mode-constants + fs.access('/path/to/file', fs.constants.R_OK | fs.constants.W_OK, callback); ``` -### `fs-truncate-to-ftruncate` +### `fs-truncate-fd-deprecation` The [`fs.truncate`](https://nodejs.org/api/fs.html#fs_fs_truncate_path_len_callback) function was deprecated ([DEP0081](https://nodejs.org/api/deprecations.html#DEP0081)) when used with a file descriptor. Use [`fs.ftruncate`](https://nodejs.org/api/fs.html#fs_fs_ftruncate_fd_len_callback) instead. @@ -197,18 +199,18 @@ npx codemod run @nodejs/fs-truncate-fd-deprecation }); ``` -### `http2-priority-removal` +### `http2-priority-signaling` This recipe removes HTTP/2 priority-related options and methods since priority signaling has been deprecated. See [DEP0194](https://nodejs.org/api/deprecations.html#DEP0194). -The source code for this codemod can be found in the [http2-priority-removal directory](https://github.com/nodejs/userland-migrations/tree/main/recipes/http2-priority-removal). +The source code for this codemod can be found in the [http2-priority-signaling directory](https://github.com/nodejs/userland-migrations/tree/main/recipes/http2-priority-signaling). -You can find this codemod in the [Codemod Registry](https://app.codemod.com/registry/@nodejs/http2-priority-removal). +You can find this codemod in the [Codemod Registry](https://app.codemod.com/registry/@nodejs/http2-priority-signaling). ```bash -npx codemod run @nodejs/http2-priority-removal +npx codemod run @nodejs/http2-priority-signaling ``` ## What this codemod does @@ -241,7 +243,7 @@ const client = http2.connect("https://example.com"); ### `process-assert-to-node-assert` -In Node.js v23 the [DEP0100](https://nodejs.org/api/deprecations.html#DEP0100) deprecation was grantted to End of Life, and `process.assert` was removed in favor of using the `assert` module directly. This codemod will help you replace any references to `process.assert` with the appropriate import of the `assert` module and usage of `assert()`. +In Node.js v23 the [DEP0100](https://nodejs.org/api/deprecations.html#DEP0100) deprecation reached End-of-Life, and `process.assert` was removed in favor of using the `assert` module directly. This codemod will help you replace any references to `process.assert` with the appropriate import of the `assert` module and usage of `assert()`. The source code for this codemod can be found in the [process-assert-to-node-assert directory](https://github.com/nodejs/userland-migrations/tree/main/recipes/process-assert-to-node-assert). @@ -261,7 +263,7 @@ npx codemod run @nodejs/process-assert-to-node-assert #### Additional Notes -This codemod use [`fs` capability](https://docs.codemod.com/jssg/security) to read the `package.json` file and determine if the project is using ES modules or CommonJS. Based on this information, it adds the appropriate import statement for the `assert` module. +This codemod uses the [`fs` capability](https://docs.codemod.com/jssg/security) to read the `package.json` file and determine if the project is using ES modules or CommonJS. Based on this information, it adds the appropriate import statement for the `assert` module. ### `tls-create-secure-pair-to-tls-socket` From 27ec25e2dcac8074e60443e6f8b2a73131e4b699 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Thu, 13 Aug 2026 14:47:01 +0000 Subject: [PATCH 08/10] fix(ui): import aliases should not require preconditions (#9097) * fix(ui): import aliases should not require preconditions Signed-off-by: Aviv Keller * fixup! --------- Signed-off-by: Aviv Keller Co-authored-by: Claudio Wunder --- .changeset/import-aliases-no-preconditions.md | 8 ++++++++ packages/ui-components/.storybook/main.ts | 8 ++++++++ packages/ui-components/.stylelintrc.mjs | 4 +++- packages/ui-components/package.json | 19 +++++++++++++------ 4 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 .changeset/import-aliases-no-preconditions.md diff --git a/.changeset/import-aliases-no-preconditions.md b/.changeset/import-aliases-no-preconditions.md new file mode 100644 index 0000000000000..252399d58c0f9 --- /dev/null +++ b/.changeset/import-aliases-no-preconditions.md @@ -0,0 +1,8 @@ +--- +'@node-core/ui-components': patch +--- + +Resolve the `#ui/*` import alias to the compiled output by default, so consumers +of the published package no longer need to opt into a bundler-specific +`rolldown` resolution condition. The uncompiled sources stay reachable through +the new `source` condition, which this repository's own tooling opts into. diff --git a/packages/ui-components/.storybook/main.ts b/packages/ui-components/.storybook/main.ts index 5580f40838c5b..87d435aae39eb 100644 --- a/packages/ui-components/.storybook/main.ts +++ b/packages/ui-components/.storybook/main.ts @@ -7,6 +7,14 @@ const config: StorybookConfig = { core: { disableTelemetry: true, disableWhatsNewNotifications: true }, framework: '@storybook/react-webpack5', swc: () => ({ jsc: { transform: { react: { runtime: 'automatic' } } } }), + // Storybook renders the components straight from `src`, so `#ui/*` must + // resolve to the uncompiled sources rather than to the published `dist` output + webpackFinal: async config => { + config.resolve ??= {}; + config.resolve.conditionNames = ['source', '...']; + + return config; + }, addons: [ '@storybook/addon-webpack5-compiler-swc', '@storybook/addon-themes', diff --git a/packages/ui-components/.stylelintrc.mjs b/packages/ui-components/.stylelintrc.mjs index eed4b8c01f612..e371180e8fe7c 100644 --- a/packages/ui-components/.stylelintrc.mjs +++ b/packages/ui-components/.stylelintrc.mjs @@ -26,7 +26,9 @@ export default { plugins: [ 'stylelint-order', 'stylelint-selector-bem-pattern', - '#ui/stylelint/one-utility-class-per-line.mjs', + // Stylelint resolves plugins with its own resolver, which cannot be told to + // prefer the `source` condition, so we point at the uncompiled source directly + './src/stylelint/one-utility-class-per-line.mjs', ], rules: { // Enforces Element Class Names to be camelCase diff --git a/packages/ui-components/package.json b/packages/ui-components/package.json index 328b62735bd31..d30ffc949d6b7 100644 --- a/packages/ui-components/package.json +++ b/packages/ui-components/package.json @@ -45,7 +45,7 @@ "storybook": "cross-env NODE_NO_WARNINGS=1 storybook dev -p 6006 --quiet", "storybook:build": "cross-env NODE_NO_WARNINGS=1 storybook build --quiet --webpack-stats-json", "test": "node --run test:unit", - "test:unit": "cross-env NODE_NO_WARNINGS=1 node --experimental-test-coverage --test-coverage-exclude=**/*.test.* --enable-source-maps --import=global-jsdom/register --import=tsx --import=../../tests/setup.mjs --test **/*.test.*", + "test:unit": "cross-env NODE_NO_WARNINGS=1 node --conditions=source --experimental-test-coverage --test-coverage-exclude=**/*.test.* --enable-source-maps --import=global-jsdom/register --import=tsx --import=../../tests/setup.mjs --test **/*.test.*", "test:unit:watch": "node --run test:unit -- --watch" }, "dependencies": { @@ -97,17 +97,24 @@ }, "imports": { "#ui/*": { - "rolldown": [ - "./dist/*", - "./dist/*.js", - "./dist/*/index.js" + "types": [ + "./src/*", + "./src/*.tsx", + "./src/*/index.tsx", + "./src/*.ts", + "./src/*/index.ts" ], - "default": [ + "source": [ "./src/*", "./src/*.tsx", "./src/*/index.tsx", "./src/*.ts", "./src/*/index.ts" + ], + "default": [ + "./dist/*", + "./dist/*.js", + "./dist/*/index.js" ] } }, From 828ad652615691ed9fb6a411052af506f5173e41 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Sat, 15 Aug 2026 12:15:58 +0000 Subject: [PATCH 09/10] chore(blog): Node.js Interactive 2026 (#9103) * chore(blog): Node.js Interactive 2026 Signed-off-by: Aviv Keller * fixup! Signed-off-by: Aviv Keller * Update apps/site/pages/en/blog/events/nodejs-interactive-2026.md Co-authored-by: Michael Esteban Signed-off-by: Brian Muenzenmeyer * Update apps/site/pages/en/blog/events/nodejs-interactive-2026.md Co-authored-by: Michael Esteban Signed-off-by: Brian Muenzenmeyer * Update apps/site/pages/en/blog/events/nodejs-interactive-2026.md Co-authored-by: Michael Esteban Signed-off-by: Brian Muenzenmeyer * Update nodejs-interactive-2026.md Co-authored-by: Michael Esteban Signed-off-by: Aviv Keller * Update nodejs-interactive-2026.md Signed-off-by: Aviv Keller --------- Signed-off-by: Aviv Keller Signed-off-by: Brian Muenzenmeyer Co-authored-by: Brian Muenzenmeyer Co-authored-by: Michael Esteban --- .../en/blog/events/nodejs-interactive-2026.md | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 apps/site/pages/en/blog/events/nodejs-interactive-2026.md diff --git a/apps/site/pages/en/blog/events/nodejs-interactive-2026.md b/apps/site/pages/en/blog/events/nodejs-interactive-2026.md new file mode 100644 index 0000000000000..135e61f080444 --- /dev/null +++ b/apps/site/pages/en/blog/events/nodejs-interactive-2026.md @@ -0,0 +1,127 @@ +--- +date: '2026-08-14T00:00:00Z' +category: events +title: 'Node.js Interactive 2026: A Recap' +layout: blog-post +author: Aviv Keller +--- + +# Node.js Interactive 2026: A Recap + +More than a decade after [the first Node.js Interactive was announced](https://nodejs.org/en/blog/announcements/interactive-2015), the conference returned on August 12 and 13, 2026, as a dedicated experience inside [RenderATL](https://www.renderatl.com/node) and alongside [Atlanta Tech Week](https://atl.tech/). + +Across the [two-day speaker program](https://openjsf.org/blog/node-interactive-speakers-2026), attendees learned that the future of Node.js is more than its extensive APIs. It also depends on the people who maintain critical infrastructure, the standards that keep runtimes interoperable, the platforms that make safe development easier, and the documentation and tests that turn new ideas into dependable software. + +Here are the themes that stood out and the takeaways we think every Node.js-er should know. + +## Open source infrastructure still runs on people + +[Robin Bender Ginn](https://github.com/rginn), Executive Director of the [OpenJS Foundation](https://openjsf.org/), opened the conference with her talk, **"Node.js Runs AI. Who Runs Node.js?"**: + +The JavaScript ecosystem powers an enormous share of the modern internet, including much of the infrastructure behind the current AI wave. But projects such as [Node.js](https://nodejs.org/), [Express](https://expressjs.com/), [Electron](https://www.electronjs.org/), and [webpack](https://webpack.js.org/) do not maintain themselves. They depend on people, often surprisingly small teams, doing the ongoing work of reviewing changes, responding to security reports, cutting releases, improving documentation, and keeping communities healthy. + +Robin described those maintainers as part of the "missing middle": essential to millions of developers and businesses, but too easily treated as an invisible resource. Her session focused on what sustainable maintainer support looks like and what developers and companies can do to strengthen the projects they rely on. + +Open source also depends on people agreeing about how independently developed systems should work together. In **"Code, Consensus, and Community: How the JS Ecosystem Continues To Move Forward Together,"** [Joe Sepi](https://github.com/joesepi), Workers Engineering Manager at [Cloudflare](https://www.cloudflare.com/), walked through the "alphabet soup" of JavaScript governance, including the [W3C](https://www.w3.org/), [Ecma International](https://ecma-international.org/), and the OpenJS Foundation. + +For instance, the [Web-interoperable Runtimes Community Group](https://wintercg.org/), or WinterCG, began as a grassroots effort to align APIs across Node.js, [Deno](https://deno.land), [Cloudflare Workers](https://www.cloudflare.com/products/workers/), and other server runtimes. Today, it has moved into a formal standardization track as [Ecma TC55](https://ecma-international.org/technical-committees/tc55/), or WinterTC. Its initial goal is to define a verifiable minimum common API for server-side JavaScript environments, letting runtimes become more interoperable without requiring them to become identical. + +## The supply chain is an identity problem + +In **"AI Slop and the Vulnerability Treadmill,"** [Kate Holterhoff](https://redmonk.com/kholterhoff/) traced our past year, in which package security repeatedly became equal to account security. + +In September 2025, the self-replicating [Shai-Hulud attack](https://github.blog/security/supply-chain-security/our-plan-for-a-more-secure-npm-supply-chain/) spread through compromised npm maintainer accounts. GitHub ultimately removed more than 500 compromised packages from the registry. A second wave in November [backdoored at least 796 packages](https://securitylabs.datadoghq.com/articles/shai-hulud-2.0-npm-worm/), representing more than 20 million weekly downloads, and exfiltrated stolen credentials through public GitHub repositories. + +Then, in March 2026, an attacker compromised an Axios maintainer account and [published malicious releases of a package with more than 100 million weekly downloads](https://securitylabs.datadoghq.com/articles/axios-npm-supply-chain-compromise/). The legitimate release had used OIDC-based trusted publishing through GitHub Actions. The attacker bypassed that path and published directly from the compromised account. + +While the incidents differed in execution, they generally followed a similar chain of attack: compromise a human identity, then use its legitimate publishing rights to move downstream. That is why defenses such as [npm trusted publishing](https://docs.npmjs.com/trusted-publishers), short-lived credentials, phishing-resistant authentication, protected recovery paths, dependency cooldowns, and tightly scoped automation all matter now more than ever. + +Additionally, AI now sits on both sides of that struggle. It makes convincing social engineering and high-volume, low-quality vulnerability reports cheaper to produce. In January, the curl project [ended its monetary bug bounty](https://daniel.haxx.se/blog/2026/01/26/the-end-of-the-curl-bug-bounty/) after its rate of confirmed reports fell below five percent. The project [later returned to HackerOne as an intake platform](https://daniel.haxx.se/blog/2026/02/25/curl-security-moves-again/), but without monetary rewards. + +The same broad class of technology can help defenders. Security researchers at AISLE used an AI-driven system to [identify all 12 vulnerabilities addressed in OpenSSL's January 2026 security release](https://aisle.com/newsroom/press-releases/aisle-finds-12-vulnerabilities-in-openssl). Human researchers validated the findings, worked through responsible disclosure, and collaborated with OpenSSL on remediation. [Some of the underlying bugs had remained in the codebase for more than 25 years](https://aisle.com/blog/aisle-discovers-20-openssl-zero-days-in-6-months). + +## Reproducibility needs more than version numbers + +Supply-chain reliability is also shaped by how package managers interpret metadata. In **"Beyond SemVer,"** [Darcy Clarke](https://x.com/darcy), founder and CEO of [vlt](https://vlt.sh/) discussed the future of versioning packages and the interpretation of package metadata. + +[Semantic Versioning 2.0.0](https://semver.org/) defines the structure and precedence of versions. It does not, however, define the complete range language people use in `package.json` files. Carets, tildes, and many advanced range expressions are conventions implemented by tools such as [`node-semver`](https://www.npmjs.com/package/semver). + +Darcy focused on another frequently overlooked part of the specification: build metadata. SemVer intentionally ignores build metadata when calculating version precedence. Rather than changing that rule, his talk explored using build metadata as a backwards-compatible extension point for richer package information. He proposed a brand new variant of the SemVer specification, open-source and available at [semver.xyz](https://semver.xyz). + +## More code needs stronger platforms + +While AI coding tools can increase how quickly a team produces code, they do not change what makes that code safe to ship. + +In **"Platform Thinking for the AI Era,"** [Bekah Suttner Cheek](https://bekah.io/), Staff Software Engineer at [Fastly](https://www.fastly.com/), argued that familiar platform fundamentals become more important as development speeds up: fast CI, meaningful tests, safe rollbacks, healthy codebase patterns, and clear paths from a local change to production. + +Despite the name, platform thinking is not exclusive to people with "platform" in their title. Everyone who designs a workflow, API, test suite, or deployment process can make the safe choice easier. Good guardrails prevent common mistakes, surface failures quickly, and make recovery routine instead of heroic. They also treat a near miss as useful evidence. Waiting for the same weakness to become a full incident is an expensive way to learn. + +This is ultimately a trust problem. Users and internal teams should not need to remember hidden rules or jump through unnecessary hoops to do the right thing. The platform should guide them there by default. + +## Node.js is becoming more capable out of the box + +Not long ago, starting a Node.js project often meant installing a collection of packages before writing application code. Environment variables, tests, HTTP clients, file watching, and TypeScript support all commonly began in userland. + +In **"The New Node.js: Built-in Batteries and the Road Ahead,"** [Matteo Collina](https://nodeland.dev/), Co-Founder and CTO of [Platformatic](https://platformatic.dev/), showed how much of that foundation now ships with the runtime. Modern Node.js includes built-in TypeScript type stripping, [`node:test`](https://nodejs.org/api/test.html) and [`node:assert`](https://nodejs.org/api/assert.html), native `.env` loading, [`fetch`](https://nodejs.org/api/globals.html#fetch) powered by [Undici](https://undici.nodejs.org/), watch mode, [`node:sqlite`](https://nodejs.org/api/sqlite.html), and the stable [Permission Model](https://nodejs.org/api/permissions.html) (among a great many other things). + +However, despite all this addition, adoption remains the harder part. Teams still run unsupported versions because upgrades require time, testing, and coordination. That's why, starting with the 27.x line, [Node.js will move from two major releases per year to one](https://nodejs.org/en/blog/announcements/evolving-the-nodejs-release-schedule). An Alpha phase begins in October 2026, Node.js 27.0.0 becomes Current in April 2027, and it enters LTS in October 2027. Version numbers will align with the calendar year of their initial Current release, and every release will eventually become LTS. This change reduces the number of concurrent release lines maintainers must support while preserving a predictable testing and migration window for users. + +## QUIC and HTTP/3 are taking shape in Node.js + +[James Snell](https://www.jasnell.me/), System Engineer at Cloudflare, has led much of Node.js's work on HTTP/2, QUIC, and HTTP/3. In **"QUIC in Node.js,"** he reviewed an implementation that has gone through several major iterations since the effort began in 2018. + +QUIC and HTTP/3 are related, but they are not interchangeable names. [QUIC](https://www.rfc-editor.org/rfc/rfc9000) is a secure, multiplexed transport protocol built on UDP. [HTTP/3](https://www.rfc-editor.org/rfc/rfc9114) maps HTTP semantics onto QUIC. + +Node.js's [`node:quic`](https://nodejs.org/api/quic.html) implementation is still in active development. Using it requires a Node.js binary built with experimental QUIC support and then starting that binary with [`--experimental-quic`](https://nodejs.org/api/cli.html#--experimental-quic). The runtime flag cannot add QUIC support to a binary that was compiled without it. + +James also discussed the work needed to move the implementation forward, including tests, documentation, and the use of AI to help make progress on a change set whose scale had previously stalled development. Completing the work would allow more of Node.js's networking stack, including `fetch`, to benefit from HTTP/3 over time. + +The session also previewed a proposed unified server API spanning HTTP/1.1, HTTP/2, and HTTP/3, with the intent to bring the design to WinterTC for broader discussion, something Node.js & James are both very excited about. + +## Documentation and testing are infrastructure + +New runtime features only matter when developers can understand and trust them. That makes documentation and testing infrastructure, not supporting material. + +In **"Replacing What Works: doc-kit and the Next 10 Years of Node.js Documentation,"** [Brian Muenzenmeyer](https://github.com/bmuenzenmeyer) and [Claudio Wunder](https://github.com/ovflowd) told the story of replacing a documentation pipeline that dates back to Node.js v0.6. + +The new [`doc-kit`](https://github.com/nodejs/doc-kit) CLI parses, lints, and transforms Markdown into an annotated representation that can produce redesigned web pages, legacy HTML, man pages, JSON schemas, search indexes, and `llms.txt` files. Keeping those outputs aligned is one of the major advantages of moving them onto a shared pipeline. + +The migration also brings a redesigned reader experience shaped by research from the Node.js website and infrastructure teams. You can [preview the new API documentation](https://beta.docs.nodejs.org/) today and read more about [the design and the tooling behind it](https://nodejs.org/en/blog/announcements/new-api-docs-beta). The beta remains usable without JavaScript and offline, while adding faster navigation, improved search, and clearer information architecture. + +Testing the systems described by that documentation can be just as difficult. Local-only failures, operating-system differences, port conflicts, and CI constraints all make integration tests harder to run reliably and in parallel. + +In **"Performant, Parallelizable, Framework Agnostic Node.js Integration Testing,"** [Ethan Arrowood](https://github.com/Ethan-Arrowood), Head of Open Source Engineering at [Harper](https://harper.fast/), presented [`@harperfast/integration-testing`](https://www.npmjs.com/package/@harperfast/integration-testing). The framework runs real processes, allocates ports dynamically, supports parallel execution, and integrates with both the Node.js test runner and external runners like Playwright. + +Integration tests, like the ones Ethan showed us, verify that the pieces of an application work together as a system. Good test tooling makes that level of confidence repeatable across local machines, operating systems, and CI rather than reserving it for the one environment where everything happens to line up. + +## AI may change the workflow, but not the responsibility + +Several sessions approached AI from different layers and views of the software stack, but ultimately, all asserted that developers still own the systems they ship. + +In **"Node.js After the AI Shift: Building Tools Developers Can Trust,"** [Andrea Griffiths](https://github.com/AndreaGriffiths11), Senior Developer Advocate at [GitHub](https://github.com/), broke AI-powered Node.js features into practical components: inputs, context, tool calls, guardrails, evaluation, and developer experience. + +[Aileen Villanueva Lecuona](https://aileenvl.com/), a Senior Software Engineer and Google Developer Expert, made those boundaries more concrete in **"Guiding AI Agents with MCP, Skills and Spec-Driven Development for Reliable Node.js Backends."** Her workflow combined the [Model Context Protocol](https://modelcontextprotocol.io/), specialized skills, and specifications that act as the source of truth. + +In **"Imagineering Future Interfaces,"** [Charlie Gerard](https://charliegerard.dev/), Senior Research Engineer at [CrowdStrike](https://www.crowdstrike.com/), shifted the focus from control to creativity. AI is often good at reproducing patterns that already exist. Humans remain responsible for imagining what has not been built yet. Her examples showed how agents can help product developers to prototype new interfaces based on previous human interaction in order to improve user experience. + +Finally, in **"Client Performance in the Age of AI,"** [Jenna Zeigen](https://jenna.is/), Senior Staff Engineer at [Notion](https://www.notion.so/), argued that generating more code does not guarantee generating better patterns. In fact, it creates more surface area for regressions and more opportunities for users to feel the accumulated cost. + +However, there is a solution to this: _specific_ metrics, flamegraphs, and representative benchmarks. For example, [Interaction to Next Paint](https://web.dev/articles/inp) measures whether an interface responds promptly when someone clicks, taps, or types. Another metric, Time to First Token measures how long an AI-backed experience takes to begin responding. No single metric tells the entire story, which is why choosing the right benchmarks is just as important as having one. + +## Code & Learn + +Finally, Node.js Interactive also ended the conference with a Code & Learn session in partnership with [Harper](https://harper.fast/). Attendees at every experience level sat down with core maintainers and worked through a curated set of ready-to-go contributions to Node.js core. + +The session began with the ethos of open source, the project's contribution guidelines, responsible use of AI-assisted development, and practical advice for finding an issue to work on. From there, participants moved into reproducing problems, changing code, adding tests, receiving review, and submitting patches. Plus, everyone who submitted a contribution also walked away with some cool new Node.js swag. + +The event may be over, but the [Node.js contribution guide](https://nodejs.org/en/contribute) is always open, and we'd love to have you contribute to the future of open source software. + +## Thank you, Atlanta + +Thank you to everyone who spoke, attended, volunteered, mentored, and sponsored, and to [RenderATL](https://www.renderatl.com/node), [Atlanta Tech Week](https://atl.tech/), and [Harper](https://harper.fast/) for helping make the week larger than any single conference or session. + +To keep the conversation going, join the community in the [OpenJS Slack](https://slack-invite.openjsf.org/), follow the [OpenJS community calendar](https://calendar.openjsf.org/), or make your first contribution to [Node.js](https://nodejs.org/en/contribute). + +See you at the next one! + +\- [Aviv Keller](https://aviv.sh), Node.js Core Collaborator From ddc4de58490a366c1c8baa78f5fc262d649dca4d Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Sat, 15 Aug 2026 13:50:22 +0000 Subject: [PATCH 10/10] feat(shiki): add support for all languages on the server (#9102) * feat(shiki): add support for all languages on the server Signed-off-by: Aviv Keller * Create shiki-more-more.md Signed-off-by: Aviv Keller --------- Signed-off-by: Aviv Keller --- .changeset/shiki-more-more.md | 5 ++++ packages/rehype-shiki/src/index.mjs | 44 ++++++++--------------------- 2 files changed, 16 insertions(+), 33 deletions(-) create mode 100644 .changeset/shiki-more-more.md diff --git a/.changeset/shiki-more-more.md b/.changeset/shiki-more-more.md new file mode 100644 index 0000000000000..9f206d3fe804a --- /dev/null +++ b/.changeset/shiki-more-more.md @@ -0,0 +1,5 @@ +--- +'@node-core/rehype-shiki': minor +--- + +Add support for all Shiki languages when the `minimal` preset is not selected. diff --git a/packages/rehype-shiki/src/index.mjs b/packages/rehype-shiki/src/index.mjs index 229f079bc084f..dffbde84d8b69 100644 --- a/packages/rehype-shiki/src/index.mjs +++ b/packages/rehype-shiki/src/index.mjs @@ -1,18 +1,4 @@ -// Keep all imports at the top -import cLanguage from 'shiki/langs/c.mjs'; -import coffeeScriptLanguage from 'shiki/langs/coffeescript.mjs'; -import cPlusPlusLanguage from 'shiki/langs/cpp.mjs'; -import diffLanguage from 'shiki/langs/diff.mjs'; -import dockerLanguage from 'shiki/langs/docker.mjs'; -import httpLanguage from 'shiki/langs/http.mjs'; -import iniLanguage from 'shiki/langs/ini.mjs'; -import javaScriptLanguage from 'shiki/langs/javascript.mjs'; -import jsonLanguage from 'shiki/langs/json.mjs'; -import powershellLanguage from 'shiki/langs/powershell.mjs'; -import shellScriptLanguage from 'shiki/langs/shellscript.mjs'; -import shellSessionLanguage from 'shiki/langs/shellsession.mjs'; -import typeScriptLanguage from 'shiki/langs/typescript.mjs'; -import yamlLanguage from 'shiki/langs/yaml.mjs'; +import { bundledLanguagesInfo } from 'shiki/langs'; import createHighlighter, { getLanguageByName } from '#rs/highlighter.mjs'; @@ -37,7 +23,10 @@ async function getEngine({ wasm = false }) { const { createJavaScriptRegexEngine } = await import('@shikijs/engine-javascript'); - return createJavaScriptRegexEngine(); + + // Not every bundled grammar compiles under the JavaScript engine, + // so skip the patterns it cannot handle instead of throwing. + return createJavaScriptRegexEngine({ forgiving: true }); } /** @@ -55,24 +44,13 @@ async function getTransformers({ twoslash = false, twoslashOptions }) { return transformers; } +// Every language, since this is meant for SSR-ed highlighting :-) export const LANGS = [ - ...cLanguage, - ...coffeeScriptLanguage, - ...cPlusPlusLanguage, - ...diffLanguage, - ...dockerLanguage, - ...httpLanguage, - ...iniLanguage, - { - ...javaScriptLanguage[0], - aliases: javaScriptLanguage[0].aliases.concat('cjs', 'mjs'), - }, - ...jsonLanguage, - ...powershellLanguage, - ...shellScriptLanguage, - ...shellSessionLanguage, - ...typeScriptLanguage, - ...yamlLanguage, + ...new Set( + ( + await Promise.all(bundledLanguagesInfo.map(language => language.import())) + ).flatMap(language => language.default) + ), ]; export const getLanguageDisplayName = language =>