From c19772656bdb959f2e0cc862b6f5bb80e7632976 Mon Sep 17 00:00:00 2001 From: Rounak Shrestha <66557682+Rounak-stha@users.noreply.github.com> Date: Tue, 17 Oct 2023 09:11:51 +0545 Subject: [PATCH 1/9] Component/language drop down (#5982) * feat: Added LanguageDropDown Component * chore: Removed Leftover Files * Resolve Issues - Proper Component Name - Use Predefined Tailwind Class - Pass Handler as Prop * Resolve Issues - Replace Tabs with Spaces - Use Tailwind Default Class for Dropdown Content --- .../Common/LanguageDropDown/index.module.css | 39 +++++++++++ .../Common/LanguageDropDown/index.stories.tsx | 10 +++ components/Common/LanguageDropDown/index.tsx | 56 +++++++++++++++ hooks/__tests__/useClickOutside.test.mjs | 39 ----------- hooks/useClickOutside.ts | 21 ------ i18n/locales/en.json | 3 +- package-lock.json | 70 +++++++++++++++++++ package.json | 1 + 8 files changed, 178 insertions(+), 61 deletions(-) create mode 100644 components/Common/LanguageDropDown/index.module.css create mode 100644 components/Common/LanguageDropDown/index.stories.tsx create mode 100644 components/Common/LanguageDropDown/index.tsx delete mode 100644 hooks/__tests__/useClickOutside.test.mjs delete mode 100644 hooks/useClickOutside.ts diff --git a/components/Common/LanguageDropDown/index.module.css b/components/Common/LanguageDropDown/index.module.css new file mode 100644 index 0000000000000..9f8f4b3800be9 --- /dev/null +++ b/components/Common/LanguageDropDown/index.module.css @@ -0,0 +1,39 @@ +.iconWrapper { + @apply h-9 + w-9 + rounded-md + bg-neutral-100 + p-2 + text-neutral-700 + dark:bg-neutral-900 + dark:text-neutral-300; +} + +.dropDownContent { + @apply max-h-80 + w-48 + overflow-y-scroll + rounded + border + border-neutral-200 + py-[1px] + shadow-lg + dark:border-neutral-900; +} + +.dropDownItem { + @apply cursor-default + px-2.5 + py-1.5 + text-sm + font-medium + text-neutral-800 + outline-none + data-[highlighted]:bg-green-600 + data-[highlighted]:text-white + dark:text-white; +} + +.currentDropDown { + @apply bg-green-600 text-white; +} diff --git a/components/Common/LanguageDropDown/index.stories.tsx b/components/Common/LanguageDropDown/index.stories.tsx new file mode 100644 index 0000000000000..49ca0c78c5510 --- /dev/null +++ b/components/Common/LanguageDropDown/index.stories.tsx @@ -0,0 +1,10 @@ +import type { Meta as MetaObj, StoryObj } from '@storybook/react'; + +import LanguageDropDown from './index'; + +type Story = StoryObj; +type Meta = MetaObj; + +export const Default: Story = {}; + +export default { component: LanguageDropDown } as Meta; diff --git a/components/Common/LanguageDropDown/index.tsx b/components/Common/LanguageDropDown/index.tsx new file mode 100644 index 0000000000000..69964dad7b094 --- /dev/null +++ b/components/Common/LanguageDropDown/index.tsx @@ -0,0 +1,56 @@ +import { LanguageIcon } from '@heroicons/react/24/outline'; +import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; +import classNames from 'classnames'; +import type { FC } from 'react'; +import { useIntl } from 'react-intl'; + +import { useLocale } from '@/hooks/useLocale'; + +import styles from './index.module.css'; + +export type LanguageDropDownProps = { + onClick?: () => void; +}; + +const LanguageDropdown: FC = ({ + onClick = () => {}, +}) => { + const { availableLocales, currentLocale } = useLocale(); + const intl = useIntl(); + + const ariaLabel = intl.formatMessage({ + id: 'components.common.languageDropdown.label', + }); + + return ( + + + + + + + + {availableLocales.map(({ name, code }) => ( + + {name} + + ))} + + + + ); +}; + +export default LanguageDropdown; diff --git a/hooks/__tests__/useClickOutside.test.mjs b/hooks/__tests__/useClickOutside.test.mjs deleted file mode 100644 index ba62438042b2d..0000000000000 --- a/hooks/__tests__/useClickOutside.test.mjs +++ /dev/null @@ -1,39 +0,0 @@ -import { render, fireEvent, screen } from '@testing-library/react'; -import { useState } from 'react'; - -import { useClickOutside } from '../useClickOutside'; - -describe('useClickOutside', () => { - const Component = () => { - const [state, setState] = useState(false); - const ref = useClickOutside(() => setState(false)); - - return ( -
-

Page

-
- - {state && ( -
-

Modal

-
- )} -
-
- ); - }; - - it('should call handler when click outside', () => { - render(); - fireEvent.click(screen.getByText('Open')); - fireEvent.click(screen.getByText('Page')); - expect(screen.queryByText('Modal')).not.toBeInTheDocument(); - }); - - it('should not call handler when click inside', () => { - render(); - fireEvent.click(screen.getByText('Open')); - fireEvent.click(screen.getByText('Modal')); - expect(screen.getByText('Modal')).toBeInTheDocument(); - }); -}); diff --git a/hooks/useClickOutside.ts b/hooks/useClickOutside.ts deleted file mode 100644 index 1268c3a31c3b3..0000000000000 --- a/hooks/useClickOutside.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useEffect, useRef } from 'react'; - -type Handler = (_event: MouseEvent | TouchEvent) => void; - -export const useClickOutside = (handler: Handler) => { - const ref = useRef(null); - - useEffect(() => { - const listener = (event: MouseEvent | TouchEvent) => { - if (ref.current && !ref.current.contains(event.target as Node)) { - handler(event); - } - }; - - document.addEventListener('click', listener); - - return () => document.removeEventListener('click', listener); - }, [ref, handler]); - - return ref; -}; diff --git a/i18n/locales/en.json b/i18n/locales/en.json index b6136e52ddbbc..53860db66301e 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -54,5 +54,6 @@ "components.common.pagination.next": "Next", "components.common.pagination.nextAriaLabel": "Next page", "components.common.pagination.defaultLabel": "Pagination", - "components.common.pagination.pageLabel": "Go to page {pageNumber}" + "components.common.pagination.pageLabel": "Go to page {pageNumber}", + "components.common.languageDropdown.label": "Choose Language" } diff --git a/package-lock.json b/package-lock.json index 46b61d91ec38e..048992cbf9ad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@mdx-js/react": "^2.3.0", "@nodevu/core": "~0.1.0", "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.5", @@ -4632,6 +4633,35 @@ } } }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", + "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-menu": "2.0.6", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-focus-guards": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", @@ -4692,6 +4722,46 @@ } } }, + "node_modules/@radix-ui/react-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", + "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", diff --git a/package.json b/package.json index a1ea77af72787..52e29279a2b44 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@mdx-js/react": "^2.3.0", "@nodevu/core": "~0.1.0", "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.5", From 75aa21b41630d84ed127160de298b779329cadbf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 11:06:07 +0200 Subject: [PATCH 2/9] meta: bump undici from 5.22.1 to 5.26.3 (#6016) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 048992cbf9ad0..dd0fee1bda048 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3006,6 +3006,14 @@ "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", "dev": true }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "engines": { + "node": ">=14" + } + }, "node_modules/@floating-ui/core": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", @@ -31323,11 +31331,11 @@ } }, "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.26.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", + "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" From 930344d2bb1ec1594de10f0b0de4b9f1ced8223e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 11:06:27 +0200 Subject: [PATCH 3/9] meta: bump @babel/traverse from 7.22.10 to 7.23.2 (#6018) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 84 +++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd0fee1bda048..b814111f95b79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -144,12 +144,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -276,12 +276,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -396,22 +396,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -619,12 +619,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -704,9 +704,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2391,33 +2391,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2426,13 +2426,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { From 3c59de3144f73ccd760ae967178635c901fb8e42 Mon Sep 17 00:00:00 2001 From: canerakdas Date: Tue, 17 Oct 2023 12:37:00 +0300 Subject: [PATCH 4/9] feat: MetaBar Component (#6010) * feat: MetaBar component * fix: AvatarGroup layout shift * refactor: Unordered list to ordered list * refactor: Unnecessary condition removed * refactor: Heading depth control * refactor: Metabar type imports * refactor: More generic prop types for MetaBar component * chore: Constant naming * refactor: Link hover state styling * refactor: Heading default depth * refactor: Unnecessary constant --- .../Common/AvatarGroup/index.module.css | 1 + components/Common/MetaBar/index.module.css | 67 +++++++++++++ components/Common/MetaBar/index.stories.tsx | 99 +++++++++++++++++++ components/Common/MetaBar/index.tsx | 61 ++++++++++++ i18n/locales/en.json | 9 ++ 5 files changed, 237 insertions(+) create mode 100644 components/Common/MetaBar/index.module.css create mode 100644 components/Common/MetaBar/index.stories.tsx create mode 100644 components/Common/MetaBar/index.tsx diff --git a/components/Common/AvatarGroup/index.module.css b/components/Common/AvatarGroup/index.module.css index b0934bf25cb30..38efcc06d07db 100644 --- a/components/Common/AvatarGroup/index.module.css +++ b/components/Common/AvatarGroup/index.module.css @@ -1,4 +1,5 @@ .avatarGroup { @apply flex + h-8 items-center; } diff --git a/components/Common/MetaBar/index.module.css b/components/Common/MetaBar/index.module.css new file mode 100644 index 0000000000000..e0b794ba604cb --- /dev/null +++ b/components/Common/MetaBar/index.module.css @@ -0,0 +1,67 @@ +.wrapper { + @apply flex + w-80 + flex-col + items-start + gap-8 + border-l + border-neutral-200 + p-6 + dark:border-neutral-900; + + dt { + @apply mb-2 + text-sm + font-medium + text-neutral-800 + dark:text-neutral-200; + } + + dd { + @apply mb-8 + flex + items-center + gap-2 + text-sm + text-neutral-900 + dark:text-white; + + a { + @apply font-semibold + text-neutral-900 + underline + hover:text-neutral-800 + dark:text-white + dark:hover:text-neutral-200; + } + + ol { + @apply flex + list-none + flex-col + gap-1.5 + p-0; + } + + svg { + @apply h-4 + w-4 + text-neutral-600 + dark:text-neutral-400; + } + + &:last-child { + @apply mb-0; + } + } + + [data-on-dark] { + @apply hidden + dark:block; + } + + [data-on-light] { + @apply block + dark:hidden; + } +} diff --git a/components/Common/MetaBar/index.stories.tsx b/components/Common/MetaBar/index.stories.tsx new file mode 100644 index 0000000000000..81a8569cf21e3 --- /dev/null +++ b/components/Common/MetaBar/index.stories.tsx @@ -0,0 +1,99 @@ +import { CodeBracketIcon } from '@heroicons/react/24/outline'; +import type { Meta as MetaObj, StoryObj } from '@storybook/react'; +import Image from 'next/image'; +import { FormattedMessage } from 'react-intl'; + +import AvatarGroup from '@/components/Common/AvatarGroup'; +import LocalizedLink from '@/components/LocalizedLink'; + +import MetaBar from './index'; + +type Story = StoryObj; +type Meta = MetaObj; + +export const Default: Story = { + args: { + items: { + 'components.metabar.lastUpdated': new Date().toLocaleDateString(), + 'components.metabar.readingTime': '15 minutes', + 'components.metabar.addedIn': 'v1.0.0', + 'components.metabar.author': 'The Node.js Project', + 'components.metabar.authors': ( + + ), + 'components.metabar.contribute': ( + <> + GitHub Logo + GitHub Logo + + + + + ), + 'components.metabar.viewAs': ( + <> + + JSON + + ), + }, + headings: { + items: [ + { + value: 'OpenSSL update assessment, and Node.js project plans', + depth: 1, + data: { id: 'heading-1' }, + }, + { + value: 'Summary', + depth: 2, + data: { id: 'summary' }, + }, + { + value: 'Analysis', + depth: 2, + data: { id: 'analysis' }, + }, + { + value: 'The c_rehash script allows command injection (CVE-2022-2068)', + depth: 3, + data: { id: 'the_c_rehash' }, + }, + { + value: 'Contact and future updates', + depth: 3, + data: { id: 'contact_and_future_updates' }, + }, + ], + }, + }, +}; + +export default { component: MetaBar } as Meta; diff --git a/components/Common/MetaBar/index.tsx b/components/Common/MetaBar/index.tsx new file mode 100644 index 0000000000000..3d8422e9c6cc9 --- /dev/null +++ b/components/Common/MetaBar/index.tsx @@ -0,0 +1,61 @@ +import type { Heading } from '@vcarl/remark-headings'; +import { Fragment, useMemo } from 'react'; +import type { FC } from 'react'; +import { FormattedMessage } from 'react-intl'; + +import LocalizedLink from '@/components/LocalizedLink'; + +import styles from './index.module.css'; + +type MetaBarProps = { + items: Record; + headings?: { + items: Heading[]; + depth?: number; + }; +}; + +const MetaBar: FC = ({ items, headings }) => { + // The default depth of headings to display in the table of contents. + const { depth = 2, items: headingItems = [] } = headings || {}; + + const heading = useMemo( + () => headingItems.filter(head => head.depth === depth), + [depth, headingItems] + ); + + return ( +
+
+ {Object.entries(items).map(([key, value]) => ( + +
+ +
+
{value}
+
+ ))} + {heading.length > 0 && ( + +
+ +
+
+
    + {heading.map(head => ( +
  1. + + {head.value} + +
  2. + ))} +
+
+
+ )} +
+
+ ); +}; + +export default MetaBar; diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 53860db66301e..e47aba26f1252 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -43,6 +43,15 @@ "components.common.crossLink.previous": "Prev", "components.common.crossLink.next": "Next", "components.common.codebox.copied": "Copied to clipboard!", + "components.metabar.lastUpdated": "Last Updated", + "components.metabar.readingTime": "Reading Time", + "components.metabar.addedIn": "Added In", + "components.metabar.author": "Author", + "components.metabar.authors": "Authors", + "components.metabar.contribute": "Contribute", + "components.metabar.contributeText": "Edit this page", + "components.metabar.viewAs": "View as", + "components.metabar.tableOfContents": "Table of Contents", "layouts.blogPost.author.byLine": "{author, select, null {} other {By {author}, }}", "layouts.blogIndex.currentYear": "News from {year}", "components.api.jsonLink.title": "View as JSON", From 2c7efa2abfff189e54d598d199ddcb4fa90c670b Mon Sep 17 00:00:00 2001 From: Claudio Wunder Date: Tue, 17 Oct 2023 18:16:41 +0200 Subject: [PATCH 5/9] hotfix: fix release script --- scripts/release-post/index.mjs | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/scripts/release-post/index.mjs b/scripts/release-post/index.mjs index 2b6fb831e8edd..e9e0dcb06de21 100644 --- a/scripts/release-post/index.mjs +++ b/scripts/release-post/index.mjs @@ -46,8 +46,6 @@ const ERRORS = { new Error(`Couldn't find @author of ${version} release :(`), NO_VERSION_POLICY: version => new Error(`Could not find version policy of ${version} in its changelog`), - NO_CHANGELOG_BODY: version => - new Error(`Could not find changelog body of ${version} release`), NO_CHANGELOG_FOUND: version => new Error(`Couldn't find matching changelog for ${version}`), INVALID_STATUS_CODE: (url, status) => @@ -128,7 +126,7 @@ const fetchChangelog = version => { const matches = rxSection.exec(data); return new Promise((resolve, reject) => - matches.length && matches[1] + matches && matches.length && matches[1] ? resolve(matches[1].trim()) : reject(ERRORS.NO_CHANGELOG_FOUND(version)) ); @@ -137,22 +135,11 @@ const fetchChangelog = version => { const fetchChangelogBody = version => { return fetchChangelog(version).then(section => { - const rxSectionBody = /(### Notable [\s\S]*)/; - const rxFallbackSectionBody = /(### Commit[\s\S]*)/; - - // In case there's not a notable changes section for that release, nothing - // will have matched so we fallback to reading the commits section instead - const matches = rxSectionBody.test(section) - ? rxSectionBody.exec(section) - : rxFallbackSectionBody.exec(section); - const replaceAsteriskLists = str => str.replace(/^([ ]{0,4})(\* )/gm, '$1- '); - return new Promise((resolve, reject) => - matches.length && matches[1] - ? resolve(replaceAsteriskLists(matches[1].trim())) - : reject(ERRORS.NO_CHANGELOG_BODY(version)) + return new Promise(resolve => + resolve(replaceAsteriskLists(section.trim())) ); }); }; @@ -166,7 +153,7 @@ const fetchVersionPolicy = version => { const matches = rxPolicy.exec(section); return new Promise((resolve, reject) => - matches.length && matches[1] + matches && matches.length && matches[1] ? resolve(matches[1]) : reject(ERRORS.NO_VERSION_POLICY(version)) ); @@ -191,7 +178,7 @@ const findAuthorLogin = (version, section) => { const matches = rxReleaseAuthor.exec(section); return new Promise((resolve, reject) => - matches.length && matches[1] + matches && matches.length && matches[1] ? resolve(matches[1]) : reject(ERRORS.RELEASE_EXISTS(version)) ); From aed5386621aeefded3fb7cec7ca2253014c3a1c2 Mon Sep 17 00:00:00 2001 From: Rafael Gonzaga Date: Tue, 17 Oct 2023 13:33:29 -0300 Subject: [PATCH 6/9] v21.0.0 Release (#6022) * Blog: v21.0.0 release post Refs: https://github.com/nodejs/node/pull/49870 * blog: add v21 release announcement blog post * blog: update site.json to include 21 banner * fix: macos 64 bit installer * fix release script * Revert "blog: update site.json to include 21 banner" This reverts commit c3eca4e76dcebd7c705a4b3b35dd3b6f9b099157. --- .../announcements/v21-release-announce.md | 190 ++++++++++ pages/en/blog/release/v21.0.0.md | 336 ++++++++++++++++++ 2 files changed, 526 insertions(+) create mode 100644 pages/en/blog/announcements/v21-release-announce.md create mode 100644 pages/en/blog/release/v21.0.0.md diff --git a/pages/en/blog/announcements/v21-release-announce.md b/pages/en/blog/announcements/v21-release-announce.md new file mode 100644 index 0000000000000..828cf0c3e34c0 --- /dev/null +++ b/pages/en/blog/announcements/v21-release-announce.md @@ -0,0 +1,190 @@ +--- +title: Node.js 21 is now available! +date: 2023-10-17T15:45:00.000Z +status: publish +category: announcements +slug: nodejs-21-release-announcement +layout: blog-post.hbs +author: The Node.js Project +--- + +We're excited to announce the release of Node.js 21! Highlights include updates of the V8 JavaScript engine to 11.8, +stable `fetch` and `WebStreams`, a new experimental flag to flip module defaults (`--experimental-default-type`), +a built-in WebSocket client, many updates to our test runner, and more! + +Node.js 21 will replace Node.js 20 as our ‘Current’ release line when Node.js 20 enters long-term support (LTS) later this month. +As per the release schedule, Node.js 21 will be ‘Current' release for the next 6 months, until April 2024. + +The project continues to make progress across a number of areas, with many new features and fixes flowing into existing LTS releases. +For that reason, the changes outlined in the [changelog][CHANGELOG] for Node.js 21 only represent a small subset of the features and +work since the last major release. This blog post will add some additional context on the larger body of work in relation to those changes. + +You can read more about our release policy at . + +To download Node.js 21.0.0, visit: . You can find the release post at , +which contains the full list of commits included in this release. + +## Notable Changes + +### Stable fetch/WebStreams + +The recent update to Node.js, version 21, includes an important change to the fetch module as well as `WebStreams`. +Both modules were marked as stable after a recent update. + +This impacts `WebStreams`, `FormData`, `Headers`, `Request`, `Response`, and `fetch`. + +Contributed by Steven in [#45684](https://github.com/nodejs/node/pull/45684). + +### Built-in WebSocket client + +A experimental browser-compatible `WebSocket` implementation arises with this release. This is enabled +through the flag: `--experimental-websocket`. As any experimental feature, +that's subject to change. + +Contributed by Khafra in [#49830](https://github.com/nodejs/node/pull/49830). + +### V8 11.8 + +As per usual a new version of the V8 engine is included in Node.js (updated to version 11.8, which is part of Chromium 118) bringing improved performance and new language features including: + +- [Array grouping](https://github.com/tc39/proposal-array-grouping) +- [`ArrayBuffer.prototype.transfer`](https://github.com/tc39/proposal-arraybuffer-transfer) +- [WebAssembly extended-const expressions](https://github.com/WebAssembly/extended-const) + +The V8 update was a contribution by Michaël Zasso in [#47251](https://github.com/nodejs/node/pull/47251). + +### Support for globs in the Node.js test runner + +With the latest Node.js update, the test runner introduces support for glob expressions when +specifying the `--test` parameter. +This means you can now use powerful glob patterns to run tests more efficiently and flexibly. +For example, you can execute tests for all files with the `.test.js` extension across multiple directories using +a command like `node --test **/*.test.js`. + +Contributed by Moshe Atlow in [#47653](https://github.com/nodejs/node/pull/47653). + +### ESM: `--experimental-default-type` flag to flip module defaults + +The new flag `--experimental-default-type` can be used to flip the default module system used by Node.js. +Input that is already explicitly defined as ES modules or CommonJS, such as by a `package.json` +`"type"` field or `.mjs`/`.cjs` file extension or the `--input-type` flag, is unaffected. +What is currently implicitly CommonJS would instead be interpreted as ES modules under `--experimental-default-type=module`: + +- String input provided via `--eval` or STDIN, if `--input-type` is unspecified. +- Files ending in `.js` or with no extension, if there is no `package.json` file present in the same folder or any parent folder. +- Files ending in `.js` or with no extension, if the nearest parent `package.json` field lacks a `type` field; + unless the folder is inside a `node_modules` folder. + +In addition, extensionless files are interpreted as WebAssembly if `--experimental-wasm-modules` is passed and the file begins with the WebAssembly preamble `\0asm`. + +We are also exploring using detection of ES module syntax as a way of Node.js knowing when to interpret files as ES modules. +Our goal is to eventually find a way to support ES module syntax by default with minimal breaking changes. + +Contributed by Geoffrey Booth in [#49869](https://github.com/nodejs/node/pull/49869). + +### Module customization hook `globalPreload` removed; use `register` and `initialize` instead + +The module customization hook `globalPreload` has been removed. +Instead, use [`register`](https://nodejs.org/api/module.html#moduleregister) to send data from the application thread to the customization hooks, +and the [`initialize`](https://nodejs.org/api/module.html#initialize) hook to establish a communications channel between the threads. + +Contributed by Jacob Smith in [#49144](https://github.com/nodejs/node/pull/49144). + +### Add flush option to fs.writeFile function + +When writing to files, it is possible that data is not immediately flushed to permanent storage. +This allows subsequent read operations to see stale data. +This PR adds a `'flush'` option to the `fs.writeFile` family of functions which forces the data to be +flushed at the end of a successful write operation. + +Contributed by Colin Ihrig in [#50009](https://github.com/nodejs/node/pull/50009). + +### Performance + +Performance is an important attribute of a runtime and our [`@nodejs/performance`](https://github.com/nodejs/performance) team +has been working hard over the last year to make improvements in URL, fetch, streams, node:fs and HTTP. + +#### Streams + +The Node.js streams team keeps on optimizing Writable and Readable streams. +In this version, streams maintainer Robert Nagy led an effort to further optimize streams by removing redundant checks, +utilizing bitmaps, and scheduling callbacks in a more efficient way. + +Contributed in [#50012](https://github.com/nodejs/node/pull/50012). + +#### HTTP + +Previously, when writing to a chunked response, Node.js would create a separate chunk for each call to `.write(...)` +regardless of whether the response was corked or not. This leads to unnecessary overhead both on the client and server side. + +This change fixes this by creating a single chunk for all calls to `write(...)` when uncorking the response. + +Consider the following example based on the [Transfer-Encoding docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding#chunked_encoding): + +```js +res.cork(); +res.write('Mozilla'); +res.write(' Developer Network'); +res.uncork(); +``` + +> At the beginning of each chunk you need to add the length of the current chunk in hexadecimal format, followed by '\r\n' and then the chunk itself, followed by another '\r\n'. The terminating chunk is a regular chunk, with the exception that its length is zero. + +Resulting in a response stream: + + HTTP/1.1 200 OK + Content-Type: text/plain + Transfer-Encoding: chunked + + 7\r\n + Mozilla\r\n + 18\r\n + Developer Network\r\n + 0\r\n + \r\n + +After this PR everything is combined into a single chunk when uncorking the response bypassing a +lot of unnecessary overhead. + + HTTP/1.1 200 OK + Content-Type: text/plain + Transfer-Encoding: chunked + + 25\r\n + Mozilla Developer Network\r\n + 0\r\n + \r\n + +Contributed by Robert Nagy in [#50167](https://github.com/nodejs/node/pull/50167). + +### llhttp 9.1.2 strict mode enforcement + +- In previous versions of Node.js, strict mode was not enabled by default. With the latest update, all settings that were previously included in strict mode are enabled by default, enhancing code reliability and security. +- The presence of `\r\n` after headers is now mandatory (previously, `\r` alone was allowed). Additionally, `\r\n` after a chunk is now a requirement, ensuring consistent data processing. +- Data transmission after a message with the `Connection: close` header has been parsed is no longer allowed. This change enhances protocol adherence and improves connection handling. + +To accommodate specific use cases, the `--insecure-http-parser` flag exists. +This option allows users to disable the aforementioned changes and maintain backward compatibility with previous parsing behavior. + +These updates are designed to enhance overall system stability and improve the consistency of data processing in Node.js applications. +Developers are encouraged to review their codebase and adjust their implementations accordingly to ensure seamless integration with the latest version. + +### `navigator` Object integration + +In Node.js 21, we've introduced the global navigator object, enhancing web interoperability. +Now, developers can access hardware concurrency information through navigator.hardwareConcurrency + +Contributed by Yagiz Nizipli in [#47769](https://github.com/nodejs/node/pull/47769). + +### Deprecations + +- \[[`4b08c4c047`](https://github.com/nodejs/node/commit/4b08c4c047)] - **(SEMVER-MAJOR)** **lib**: runtime deprecate punycode (Yagiz Nizipli) [#47202](https://github.com/nodejs/node/pull/47202) +- \[[`ccca547e28`](https://github.com/nodejs/node/commit/ccca547e28)] - **(SEMVER-MAJOR)** **util**: runtime deprecate `promisify`-ing a function returning a `Promise` (Antoine du Hamel) [#49609](https://github.com/nodejs/node/pull/49609) + +## Call to action! + +Try out the new Node.js 21 release! We’re always happy to hear your feedback. Testing your applications and modules with Node.js 21 helps to ensure the future compatibility of your project with the latest Node.js changes and features. + +Also of note is that Node.js 16 (LTS) is End-of-Life, so we strongly advise you to start planning to upgrade to Node.js 18 (LTS) or Node.js 20 (LTS). + +[CHANGELOG]: https://github.com/nodejs/node/releases/tag/v21.0.0 diff --git a/pages/en/blog/release/v21.0.0.md b/pages/en/blog/release/v21.0.0.md new file mode 100644 index 0000000000000..32c0ec491ef0f --- /dev/null +++ b/pages/en/blog/release/v21.0.0.md @@ -0,0 +1,336 @@ +--- +date: 2023-10-17T16:17:55.063Z +category: release +title: Node v21.0.0 (Current) +layout: blog-post.hbs +author: Rafael Gonzaga +--- + +## 2023-10-17, Version 21.0.0 (Current), @RafaelGSS and @targos + +We're excited to announce the release of Node.js 21! Highlights include updates of the V8 JavaScript engine to 11.8, +stable `fetch` and `WebStreams`, a new experimental flag to change the interpretation of ambiguous code +from CommonJS to ES modules (`--experimental-default-type`), many updates to our test runner, and more! + +Node.js 21 will replace Node.js 20 as our ‘Current’ release line when Node.js 20 enters long-term support (LTS) later this month. +As per the release schedule, Node.js 21 will be ‘Current' release for the next 6 months, until April 2024. + +### Other Notable Changes + +- \[[`740ca5423a`](https://github.com/nodejs/node/commit/740ca5423a)] - **doc**: promote fetch/webstreams from experimental to stable (Steven) [#45684](https://github.com/nodejs/node/pull/45684) +- \[[`85301803e1`](https://github.com/nodejs/node/commit/85301803e1)] - **esm**: --experimental-default-type flag to flip module defaults (Geoffrey Booth) [#49869](https://github.com/nodejs/node/pull/49869) +- \[[`705e623ac4`](https://github.com/nodejs/node/commit/705e623ac4)] - **esm**: remove `globalPreload` hook (superseded by `initialize`) (Jacob Smith) [#49144](https://github.com/nodejs/node/pull/49144) +- \[[`e01c1d700d`](https://github.com/nodejs/node/commit/e01c1d700d)] - **fs**: add flush option to writeFile() functions (Colin Ihrig) [#50009](https://github.com/nodejs/node/pull/50009) +- \[[`1948dce707`](https://github.com/nodejs/node/commit/1948dce707)] - **(SEMVER-MAJOR)** **fs**: add globSync implementation (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +- \[[`e28dbe1c2b`](https://github.com/nodejs/node/commit/e28dbe1c2b)] - **(SEMVER-MINOR)** **lib**: add WebSocket client (Matthew Aitken) [#49830](https://github.com/nodejs/node/pull/49830) +- \[[`95b8f5dcab`](https://github.com/nodejs/node/commit/95b8f5dcab)] - **stream**: optimize Writable (Robert Nagy) [#50012](https://github.com/nodejs/node/pull/50012) +- \[[`7cd4e70948`](https://github.com/nodejs/node/commit/7cd4e70948)] - **(SEMVER-MAJOR)** **test_runner**: support passing globs (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +- \[[`1d220b55ac`](https://github.com/nodejs/node/commit/1d220b55ac)] - **vm**: use default HDO when importModuleDynamically is not set (Joyee Cheung) [#49950](https://github.com/nodejs/node/pull/49950) + +### Semver-Major Commits + +- \[[`ac2a68c76b`](https://github.com/nodejs/node/commit/ac2a68c76b)] - **(SEMVER-MAJOR)** **build**: drop support for Visual Studio 2019 (Michaël Zasso) [#49051](https://github.com/nodejs/node/pull/49051) +- \[[`4e3983031a`](https://github.com/nodejs/node/commit/4e3983031a)] - **(SEMVER-MAJOR)** **build**: bump supported macOS and Xcode versions (Michaël Zasso) [#49164](https://github.com/nodejs/node/pull/49164) +- \[[`5a0777776d`](https://github.com/nodejs/node/commit/5a0777776d)] - **(SEMVER-MAJOR)** **crypto**: do not overwrite \_writableState.defaultEncoding (Tobias Nießen) [#49140](https://github.com/nodejs/node/pull/49140) +- \[[`162a0652ab`](https://github.com/nodejs/node/commit/162a0652ab)] - **(SEMVER-MAJOR)** **deps**: bump minimum ICU version to 73 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`17a74ddd3d`](https://github.com/nodejs/node/commit/17a74ddd3d)] - **(SEMVER-MAJOR)** **deps**: update V8 to 11.8.172.13 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`e9ff81016d`](https://github.com/nodejs/node/commit/e9ff81016d)] - **(SEMVER-MAJOR)** **deps**: update llhttp to 9.1.2 (Paolo Insogna) [#48981](https://github.com/nodejs/node/pull/48981) +- \[[`7ace5aba75`](https://github.com/nodejs/node/commit/7ace5aba75)] - **(SEMVER-MAJOR)** **events**: validate options of `on` and `once` (Deokjin Kim) [#46018](https://github.com/nodejs/node/pull/46018) +- \[[`b3ec13d449`](https://github.com/nodejs/node/commit/b3ec13d449)] - **(SEMVER-MAJOR)** **fs**: adjust `position` validation in reading methods (Livia Medeiros) [#42835](https://github.com/nodejs/node/pull/42835) +- \[[`1948dce707`](https://github.com/nodejs/node/commit/1948dce707)] - **(SEMVER-MAJOR)** **fs**: add globSync implementation (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +- \[[`d68d0eacaa`](https://github.com/nodejs/node/commit/d68d0eacaa)] - **(SEMVER-MAJOR)** **http**: reduce parts in chunked response when corking (Robert Nagy) [#50167](https://github.com/nodejs/node/pull/50167) +- \[[`c5b0b894ed`](https://github.com/nodejs/node/commit/c5b0b894ed)] - **(SEMVER-MAJOR)** **lib**: mark URL/URLSearchParams as uncloneable and untransferable (Chengzhong Wu) [#47497](https://github.com/nodejs/node/pull/47497) +- \[[`3205b1936a`](https://github.com/nodejs/node/commit/3205b1936a)] - **(SEMVER-MAJOR)** **lib**: remove aix directory case for package reader (Yagiz Nizipli) [#48605](https://github.com/nodejs/node/pull/48605) +- \[[`b40f0c3074`](https://github.com/nodejs/node/commit/b40f0c3074)] - **(SEMVER-MAJOR)** **lib**: add `navigator.hardwareConcurrency` (Yagiz Nizipli) [#47769](https://github.com/nodejs/node/pull/47769) +- \[[`4b08c4c047`](https://github.com/nodejs/node/commit/4b08c4c047)] - **(SEMVER-MAJOR)** **lib**: runtime deprecate punycode (Yagiz Nizipli) [#47202](https://github.com/nodejs/node/pull/47202) +- \[[`3ce51ae9c0`](https://github.com/nodejs/node/commit/3ce51ae9c0)] - **(SEMVER-MAJOR)** **module**: harmonize error code between ESM and CJS (Antoine du Hamel) [#48606](https://github.com/nodejs/node/pull/48606) +- \[[`7202859402`](https://github.com/nodejs/node/commit/7202859402)] - **(SEMVER-MAJOR)** **net**: do not treat `server.maxConnections=0` as `Infinity` (ignoramous) [#48276](https://github.com/nodejs/node/pull/48276) +- \[[`c15bafdaf4`](https://github.com/nodejs/node/commit/c15bafdaf4)] - **(SEMVER-MAJOR)** **net**: only defer \_final call when connecting (Jason Zhang) [#47385](https://github.com/nodejs/node/pull/47385) +- \[[`6ffacbf0f9`](https://github.com/nodejs/node/commit/6ffacbf0f9)] - **(SEMVER-MAJOR)** **node-api**: rename internal NAPI_VERSION definition (Chengzhong Wu) [#48501](https://github.com/nodejs/node/pull/48501) +- \[[`11af089b14`](https://github.com/nodejs/node/commit/11af089b14)] - **(SEMVER-MAJOR)** **src**: update NODE_MODULE_VERSION to 120 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`d920b7c94b`](https://github.com/nodejs/node/commit/d920b7c94b)] - **(SEMVER-MAJOR)** **src**: throw DOMException on cloning non-serializable objects (Chengzhong Wu) [#47839](https://github.com/nodejs/node/pull/47839) +- \[[`64549731b6`](https://github.com/nodejs/node/commit/64549731b6)] - **(SEMVER-MAJOR)** **src**: throw DataCloneError on transfering untransferable objects (Chengzhong Wu) [#47604](https://github.com/nodejs/node/pull/47604) +- \[[`dac8de689b`](https://github.com/nodejs/node/commit/dac8de689b)] - **(SEMVER-MAJOR)** **stream**: use private properties for strategies (Yagiz Nizipli) [#47218](https://github.com/nodejs/node/pull/47218) +- \[[`1fa084ecdf`](https://github.com/nodejs/node/commit/1fa084ecdf)] - **(SEMVER-MAJOR)** **stream**: use private properties for encoding (Yagiz Nizipli) [#47218](https://github.com/nodejs/node/pull/47218) +- \[[`4e93247079`](https://github.com/nodejs/node/commit/4e93247079)] - **(SEMVER-MAJOR)** **stream**: use private properties for compression (Yagiz Nizipli) [#47218](https://github.com/nodejs/node/pull/47218) +- \[[`527589b755`](https://github.com/nodejs/node/commit/527589b755)] - **(SEMVER-MAJOR)** **test_runner**: disallow array in `run` options (Raz Luvaton) [#49935](https://github.com/nodejs/node/pull/49935) +- \[[`7cd4e70948`](https://github.com/nodejs/node/commit/7cd4e70948)] - **(SEMVER-MAJOR)** **test_runner**: support passing globs (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +- \[[`2ef170254b`](https://github.com/nodejs/node/commit/2ef170254b)] - **(SEMVER-MAJOR)** **tls**: use `validateNumber` for `options.minDHSize` (Deokjin Kim) [#49973](https://github.com/nodejs/node/pull/49973) +- \[[`092fb9f541`](https://github.com/nodejs/node/commit/092fb9f541)] - **(SEMVER-MAJOR)** **tls**: use validateFunction for `options.checkServerIdentity` (Deokjin Kim) [#49896](https://github.com/nodejs/node/pull/49896) +- \[[`ccca547e28`](https://github.com/nodejs/node/commit/ccca547e28)] - **(SEMVER-MAJOR)** **util**: runtime deprecate `promisify`-ing a function returning a `Promise` (Antoine du Hamel) [#49609](https://github.com/nodejs/node/pull/49609) +- \[[`4038cf0513`](https://github.com/nodejs/node/commit/4038cf0513)] - **(SEMVER-MAJOR)** **vm**: freeze `dependencySpecifiers` array (Antoine du Hamel) [#49720](https://github.com/nodejs/node/pull/49720) + +### Semver-Minor Commits + +- \[[`3227d7327c`](https://github.com/nodejs/node/commit/3227d7327c)] - **(SEMVER-MINOR)** **deps**: update uvwasi to 0.0.19 (Node.js GitHub Bot) [#49908](https://github.com/nodejs/node/pull/49908) +- \[[`e28dbe1c2b`](https://github.com/nodejs/node/commit/e28dbe1c2b)] - **(SEMVER-MINOR)** **lib**: add WebSocket client (Matthew Aitken) [#49830](https://github.com/nodejs/node/pull/49830) +- \[[`9f9c58212e`](https://github.com/nodejs/node/commit/9f9c58212e)] - **(SEMVER-MINOR)** **test_runner, cli**: add --test-concurrency flag (Colin Ihrig) [#49996](https://github.com/nodejs/node/pull/49996) +- \[[`d37b0d267f`](https://github.com/nodejs/node/commit/d37b0d267f)] - **(SEMVER-MINOR)** **wasi**: updates required for latest uvwasi version (Michael Dawson) [#49908](https://github.com/nodejs/node/pull/49908) + +### Semver-Patch Commits + +- \[[`33c87ec096`](https://github.com/nodejs/node/commit/33c87ec096)] - **benchmark**: fix race condition on fs benchs (Vinicius Lourenço) [#50035](https://github.com/nodejs/node/pull/50035) +- \[[`3c0ec61c4b`](https://github.com/nodejs/node/commit/3c0ec61c4b)] - **benchmark**: add warmup to accessSync bench (Rafael Gonzaga) [#50073](https://github.com/nodejs/node/pull/50073) +- \[[`1a839f388e`](https://github.com/nodejs/node/commit/1a839f388e)] - **benchmark**: improved config for blob,file benchmark (Vinícius Lourenço) [#49730](https://github.com/nodejs/node/pull/49730) +- \[[`86fe5a80f3`](https://github.com/nodejs/node/commit/86fe5a80f3)] - **benchmark**: added new benchmarks for blob (Vinícius Lourenço) [#49730](https://github.com/nodejs/node/pull/49730) +- \[[`6322d4f587`](https://github.com/nodejs/node/commit/6322d4f587)] - **build**: fix IBM i build with Python 3.9 (Richard Lau) [#48056](https://github.com/nodejs/node/pull/48056) +- \[[`17c55d176b`](https://github.com/nodejs/node/commit/17c55d176b)] - **build**: reset embedder string to "-node.0" (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`f10928f926`](https://github.com/nodejs/node/commit/f10928f926)] - **crypto**: use X509_ALGOR accessors instead of reaching into X509_ALGOR (David Benjamin) [#50057](https://github.com/nodejs/node/pull/50057) +- \[[`136a96722a`](https://github.com/nodejs/node/commit/136a96722a)] - **crypto**: account for disabled SharedArrayBuffer (Shelley Vohr) [#50034](https://github.com/nodejs/node/pull/50034) +- \[[`17b9925393`](https://github.com/nodejs/node/commit/17b9925393)] - **crypto**: return clear errors when loading invalid PFX data (Tim Perry) [#49566](https://github.com/nodejs/node/pull/49566) +- \[[`ca25d564c6`](https://github.com/nodejs/node/commit/ca25d564c6)] - **deps**: upgrade npm to 10.2.0 (npm team) [#50027](https://github.com/nodejs/node/pull/50027) +- \[[`f23a9353ae`](https://github.com/nodejs/node/commit/f23a9353ae)] - **deps**: update corepack to 0.21.0 (Node.js GitHub Bot) [#50088](https://github.com/nodejs/node/pull/50088) +- \[[`ceedb3a509`](https://github.com/nodejs/node/commit/ceedb3a509)] - **deps**: update simdutf to 3.2.18 (Node.js GitHub Bot) [#50091](https://github.com/nodejs/node/pull/50091) +- \[[`0522ac086c`](https://github.com/nodejs/node/commit/0522ac086c)] - **deps**: update zlib to 1.2.13.1-motley-fef5869 (Node.js GitHub Bot) [#50085](https://github.com/nodejs/node/pull/50085) +- \[[`4f8c5829da`](https://github.com/nodejs/node/commit/4f8c5829da)] - **deps**: update googletest to 2dd1c13 (Node.js GitHub Bot) [#50081](https://github.com/nodejs/node/pull/50081) +- \[[`588784ea30`](https://github.com/nodejs/node/commit/588784ea30)] - **deps**: update undici to 5.25.4 (Node.js GitHub Bot) [#50025](https://github.com/nodejs/node/pull/50025) +- \[[`c9eef0c3c4`](https://github.com/nodejs/node/commit/c9eef0c3c4)] - **deps**: update googletest to e47544a (Node.js GitHub Bot) [#49982](https://github.com/nodejs/node/pull/49982) +- \[[`23cb478398`](https://github.com/nodejs/node/commit/23cb478398)] - **deps**: update ada to 2.6.10 (Node.js GitHub Bot) [#49984](https://github.com/nodejs/node/pull/49984) +- \[[`61411bb323`](https://github.com/nodejs/node/commit/61411bb323)] - **deps**: fix call to undeclared functions 'ntohl' and 'htons' (MatteoBax) [#49979](https://github.com/nodejs/node/pull/49979) +- \[[`49cf182e30`](https://github.com/nodejs/node/commit/49cf182e30)] - **deps**: update ada to 2.6.9 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +- \[[`ceb6df0f22`](https://github.com/nodejs/node/commit/ceb6df0f22)] - **deps**: update ada to 2.6.8 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +- \[[`b73e18b5dc`](https://github.com/nodejs/node/commit/b73e18b5dc)] - **deps**: update ada to 2.6.7 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +- \[[`baf2256617`](https://github.com/nodejs/node/commit/baf2256617)] - **deps**: update ada to 2.6.5 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +- \[[`a20a328a9b`](https://github.com/nodejs/node/commit/a20a328a9b)] - **deps**: update ada to 2.6.3 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +- \[[`3838b579e4`](https://github.com/nodejs/node/commit/3838b579e4)] - **deps**: V8: cherry-pick 8ec2651fbdd8 (Abdirahim Musse) [#49862](https://github.com/nodejs/node/pull/49862) +- \[[`668437ccad`](https://github.com/nodejs/node/commit/668437ccad)] - **deps**: V8: cherry-pick b60a03df4ceb (Joyee Cheung) [#49491](https://github.com/nodejs/node/pull/49491) +- \[[`f970087147`](https://github.com/nodejs/node/commit/f970087147)] - **deps**: V8: backport 93b1a74cbc9b (Joyee Cheung) [#49419](https://github.com/nodejs/node/pull/49419) +- \[[`4531c154e5`](https://github.com/nodejs/node/commit/4531c154e5)] - **deps**: V8: cherry-pick 8ec2651fbdd8 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`9ad0e2cacc`](https://github.com/nodejs/node/commit/9ad0e2cacc)] - **deps**: V8: cherry-pick 89b3702c92b0 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`dfc9c86868`](https://github.com/nodejs/node/commit/dfc9c86868)] - **deps**: V8: cherry-pick de9a5de2274f (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`186b36efba`](https://github.com/nodejs/node/commit/186b36efba)] - **deps**: V8: cherry-pick b5b5d6c31bb0 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`867586ce95`](https://github.com/nodejs/node/commit/867586ce95)] - **deps**: V8: cherry-pick 93b1a74cbc9b (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`4ad3479ba7`](https://github.com/nodejs/node/commit/4ad3479ba7)] - **deps**: V8: cherry-pick 1a3ecc2483b2 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`660f902f16`](https://github.com/nodejs/node/commit/660f902f16)] - **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`f7c1d410ad`](https://github.com/nodejs/node/commit/f7c1d410ad)] - **deps**: remove usage of a C++20 feature from V8 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`9c4030bfb9`](https://github.com/nodejs/node/commit/9c4030bfb9)] - **deps**: avoid compilation error with ASan (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`5f05cc15e6`](https://github.com/nodejs/node/commit/5f05cc15e6)] - **deps**: disable V8 concurrent sparkplug compilation (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`42cd952dbd`](https://github.com/nodejs/node/commit/42cd952dbd)] - **deps**: silence irrelevant V8 warning (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`88cf90f9c4`](https://github.com/nodejs/node/commit/88cf90f9c4)] - **deps**: always define V8_EXPORT_PRIVATE as no-op (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`8609915951`](https://github.com/nodejs/node/commit/8609915951)] - **doc**: improve ccache explanation (Chengzhong Wu) [#50133](https://github.com/nodejs/node/pull/50133) +- \[[`91d21324a9`](https://github.com/nodejs/node/commit/91d21324a9)] - **doc**: move danielleadams to TSC non-voting member (Danielle Adams) [#50142](https://github.com/nodejs/node/pull/50142) +- \[[`34fa7043a2`](https://github.com/nodejs/node/commit/34fa7043a2)] - **doc**: fix description of `fs.readdir` `recursive` option (RamdohokarAngha) [#48902](https://github.com/nodejs/node/pull/48902) +- \[[`81e4d2ec2f`](https://github.com/nodejs/node/commit/81e4d2ec2f)] - **doc**: mention files read before env setup (Rafael Gonzaga) [#50072](https://github.com/nodejs/node/pull/50072) +- \[[`0ce37ed8e9`](https://github.com/nodejs/node/commit/0ce37ed8e9)] - **doc**: move permission model to Active Development (Rafael Gonzaga) [#50068](https://github.com/nodejs/node/pull/50068) +- \[[`3c430212c3`](https://github.com/nodejs/node/commit/3c430212c3)] - **doc**: add command to get patch minors and majors (Rafael Gonzaga) [#50067](https://github.com/nodejs/node/pull/50067) +- \[[`e43bf4c31d`](https://github.com/nodejs/node/commit/e43bf4c31d)] - **doc**: use precise promise terminology in fs (Benjamin Gruenbaum) [#50029](https://github.com/nodejs/node/pull/50029) +- \[[`d3a5f1fb5f`](https://github.com/nodejs/node/commit/d3a5f1fb5f)] - **doc**: use precise terminology in test runner (Benjamin Gruenbaum) [#50028](https://github.com/nodejs/node/pull/50028) +- \[[`24dea2348d`](https://github.com/nodejs/node/commit/24dea2348d)] - **doc**: clarify explaination text on how to run the example (Anshul Sinha) [#39020](https://github.com/nodejs/node/pull/39020) +- \[[`f3ed57bd8b`](https://github.com/nodejs/node/commit/f3ed57bd8b)] - **doc**: reserve 119 for Electron 28 (David Sanders) [#50020](https://github.com/nodejs/node/pull/50020) +- \[[`85c09f178c`](https://github.com/nodejs/node/commit/85c09f178c)] - **doc**: update Collaborator pronouns (Tierney Cyren) [#50005](https://github.com/nodejs/node/pull/50005) +- \[[`099e2f7bce`](https://github.com/nodejs/node/commit/099e2f7bce)] - **doc**: update link to Abstract Modules Records spec (Rich Trott) [#49961](https://github.com/nodejs/node/pull/49961) +- \[[`47b2883673`](https://github.com/nodejs/node/commit/47b2883673)] - **doc**: updated building docs for windows (Claudio W) [#49767](https://github.com/nodejs/node/pull/49767) +- \[[`7b624c30b2`](https://github.com/nodejs/node/commit/7b624c30b2)] - **doc**: update CHANGELOG_V20 about vm fixes (Joyee Cheung) [#49951](https://github.com/nodejs/node/pull/49951) +- \[[`1dc0667aa6`](https://github.com/nodejs/node/commit/1dc0667aa6)] - **doc**: document dangerous symlink behavior (Tobias Nießen) [#49154](https://github.com/nodejs/node/pull/49154) +- \[[`bc056c2426`](https://github.com/nodejs/node/commit/bc056c2426)] - **doc**: add main ARIA landmark to API docs (Rich Trott) [#49882](https://github.com/nodejs/node/pull/49882) +- \[[`f416a0f555`](https://github.com/nodejs/node/commit/f416a0f555)] - **doc**: add navigation ARIA landmark to doc ToC (Rich Trott) [#49882](https://github.com/nodejs/node/pull/49882) +- \[[`740ca5423a`](https://github.com/nodejs/node/commit/740ca5423a)] - **doc**: promote fetch/webstreams from experimental to stable (Steven) [#45684](https://github.com/nodejs/node/pull/45684) +- \[[`f802aa0645`](https://github.com/nodejs/node/commit/f802aa0645)] - **doc**: fix 'partial' typo (Colin Ihrig) [#48657](https://github.com/nodejs/node/pull/48657) +- \[[`6fda81d4f5`](https://github.com/nodejs/node/commit/6fda81d4f5)] - **doc**: mention `Navigator` is a partial implementation (Moshe Atlow) [#48656](https://github.com/nodejs/node/pull/48656) +- \[[`6aa2aeedcb`](https://github.com/nodejs/node/commit/6aa2aeedcb)] - **doc**: mark Node.js 19 as End-of-Life (Richard Lau) [#48283](https://github.com/nodejs/node/pull/48283) +- \[[`0ee9c83ffc`](https://github.com/nodejs/node/commit/0ee9c83ffc)] - **errors**: improve performance of determine-specific-type (Aras Abbasi) [#49696](https://github.com/nodejs/node/pull/49696) +- \[[`4f84a3d200`](https://github.com/nodejs/node/commit/4f84a3d200)] - **errors**: improve formatList in errors.js (Aras Abbasi) [#49642](https://github.com/nodejs/node/pull/49642) +- \[[`cc725a653a`](https://github.com/nodejs/node/commit/cc725a653a)] - **errors**: improve performance of instantiation (Aras Abbasi) [#49654](https://github.com/nodejs/node/pull/49654) +- \[[`d1ef6aa2db`](https://github.com/nodejs/node/commit/d1ef6aa2db)] - **esm**: use import attributes instead of import assertions (Antoine du Hamel) [#50140](https://github.com/nodejs/node/pull/50140) +- \[[`19b470f866`](https://github.com/nodejs/node/commit/19b470f866)] - **esm**: bypass CommonJS loader under --default-type (Geoffrey Booth) [#49986](https://github.com/nodejs/node/pull/49986) +- \[[`9c683204db`](https://github.com/nodejs/node/commit/9c683204db)] - **esm**: unflag extensionless javascript and wasm in module scope (Geoffrey Booth) [#49974](https://github.com/nodejs/node/pull/49974) +- \[[`05be31d5de`](https://github.com/nodejs/node/commit/05be31d5de)] - **esm**: improve `getFormatOfExtensionlessFile` speed (Yagiz Nizipli) [#49965](https://github.com/nodejs/node/pull/49965) +- \[[`aadfea4979`](https://github.com/nodejs/node/commit/aadfea4979)] - **esm**: improve JSDoc annotation of internal functions (Antoine du Hamel) [#49959](https://github.com/nodejs/node/pull/49959) +- \[[`7f0e36af52`](https://github.com/nodejs/node/commit/7f0e36af52)] - **esm**: fix cache collision on JSON files using file: URL (Antoine du Hamel) [#49887](https://github.com/nodejs/node/pull/49887) +- \[[`85301803e1`](https://github.com/nodejs/node/commit/85301803e1)] - **esm**: --experimental-default-type flag to flip module defaults (Geoffrey Booth) [#49869](https://github.com/nodejs/node/pull/49869) +- \[[`f42a103991`](https://github.com/nodejs/node/commit/f42a103991)] - **esm**: require braces for modules code (Geoffrey Booth) [#49657](https://github.com/nodejs/node/pull/49657) +- \[[`705e623ac4`](https://github.com/nodejs/node/commit/705e623ac4)] - **esm**: remove `globalPreload` hook (superseded by `initialize`) (Jacob Smith) [#49144](https://github.com/nodejs/node/pull/49144) +- \[[`18a818744f`](https://github.com/nodejs/node/commit/18a818744f)] - **fs**: improve error performance of `readdirSync` (Yagiz Nizipli) [#50131](https://github.com/nodejs/node/pull/50131) +- \[[`d3985296a9`](https://github.com/nodejs/node/commit/d3985296a9)] - **fs**: fix `unlinkSync` typings (Yagiz Nizipli) [#49859](https://github.com/nodejs/node/pull/49859) +- \[[`6bc7fa7906`](https://github.com/nodejs/node/commit/6bc7fa7906)] - **fs**: improve error perf of sync `chmod`+`fchmod` (CanadaHonk) [#49859](https://github.com/nodejs/node/pull/49859) +- \[[`6bd77db41f`](https://github.com/nodejs/node/commit/6bd77db41f)] - **fs**: improve error perf of sync `*times` (CanadaHonk) [#49864](https://github.com/nodejs/node/pull/49864) +- \[[`bf0f0789da`](https://github.com/nodejs/node/commit/bf0f0789da)] - **fs**: improve error performance of writevSync (IlyasShabi) [#50038](https://github.com/nodejs/node/pull/50038) +- \[[`8a49735bae`](https://github.com/nodejs/node/commit/8a49735bae)] - **fs**: add flush option to createWriteStream() (Colin Ihrig) [#50093](https://github.com/nodejs/node/pull/50093) +- \[[`ed49722a8a`](https://github.com/nodejs/node/commit/ed49722a8a)] - **fs**: improve error performance for `ftruncateSync` (André Alves) [#50032](https://github.com/nodejs/node/pull/50032) +- \[[`e01c1d700d`](https://github.com/nodejs/node/commit/e01c1d700d)] - **fs**: add flush option to writeFile() functions (Colin Ihrig) [#50009](https://github.com/nodejs/node/pull/50009) +- \[[`f7a160d5b4`](https://github.com/nodejs/node/commit/f7a160d5b4)] - **fs**: improve error performance for `fdatasyncSync` (Jungku Lee) [#49898](https://github.com/nodejs/node/pull/49898) +- \[[`813713f211`](https://github.com/nodejs/node/commit/813713f211)] - **fs**: throw errors from sync branches instead of separate implementations (Joyee Cheung) [#49913](https://github.com/nodejs/node/pull/49913) +- \[[`b866e38192`](https://github.com/nodejs/node/commit/b866e38192)] - **http**: refactor to make servername option normalization testable (Rongjian Zhang) [#38733](https://github.com/nodejs/node/pull/38733) +- \[[`2990390359`](https://github.com/nodejs/node/commit/2990390359)] - **inspector**: simplify dispatchProtocolMessage (Daniel Lemire) [#49780](https://github.com/nodejs/node/pull/49780) +- \[[`d4c5fe488e`](https://github.com/nodejs/node/commit/d4c5fe488e)] - **lib**: fix compileFunction throws range error for negative numbers (Jithil P Ponnan) [#49855](https://github.com/nodejs/node/pull/49855) +- \[[`589ac5004c`](https://github.com/nodejs/node/commit/589ac5004c)] - **lib**: faster internal createBlob (Vinícius Lourenço) [#49730](https://github.com/nodejs/node/pull/49730) +- \[[`952cf0d17a`](https://github.com/nodejs/node/commit/952cf0d17a)] - **lib**: reduce overhead of validateObject (Vinicius Lourenço) [#49928](https://github.com/nodejs/node/pull/49928) +- \[[`fa250fdec1`](https://github.com/nodejs/node/commit/fa250fdec1)] - **lib**: make fetch sync and return a Promise (Matthew Aitken) [#49936](https://github.com/nodejs/node/pull/49936) +- \[[`1b96975f27`](https://github.com/nodejs/node/commit/1b96975f27)] - **lib**: fix `primordials` typings (Sam Verschueren) [#49895](https://github.com/nodejs/node/pull/49895) +- \[[`6aa7101960`](https://github.com/nodejs/node/commit/6aa7101960)] - **lib**: update params in jsdoc for `HTTPRequestOptions` (Jungku Lee) [#49872](https://github.com/nodejs/node/pull/49872) +- \[[`a4fdb1abe0`](https://github.com/nodejs/node/commit/a4fdb1abe0)] - **lib,test**: do not hardcode Buffer.kMaxLength (Michaël Zasso) [#49876](https://github.com/nodejs/node/pull/49876) +- \[[`fd21429ef5`](https://github.com/nodejs/node/commit/fd21429ef5)] - **lib**: update usage of always on Atomics API (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`bac85be22d`](https://github.com/nodejs/node/commit/bac85be22d)] - **meta**: ping TSC for offboarding (Tobias Nießen) [#50147](https://github.com/nodejs/node/pull/50147) +- \[[`609b13e6c2`](https://github.com/nodejs/node/commit/609b13e6c2)] - **meta**: bump actions/upload-artifact from 3.1.2 to 3.1.3 (dependabot\[bot]) [#50000](https://github.com/nodejs/node/pull/50000) +- \[[`3825464ef4`](https://github.com/nodejs/node/commit/3825464ef4)] - **meta**: bump actions/cache from 3.3.1 to 3.3.2 (dependabot\[bot]) [#50003](https://github.com/nodejs/node/pull/50003) +- \[[`49f0f9ca11`](https://github.com/nodejs/node/commit/49f0f9ca11)] - **meta**: bump github/codeql-action from 2.21.5 to 2.21.9 (dependabot\[bot]) [#50002](https://github.com/nodejs/node/pull/50002) +- \[[`f156427244`](https://github.com/nodejs/node/commit/f156427244)] - **meta**: bump actions/checkout from 3.6.0 to 4.1.0 (dependabot\[bot]) [#50001](https://github.com/nodejs/node/pull/50001) +- \[[`0fe673c7e6`](https://github.com/nodejs/node/commit/0fe673c7e6)] - **meta**: update website team with new name (Rich Trott) [#49883](https://github.com/nodejs/node/pull/49883) +- \[[`51f4ff2450`](https://github.com/nodejs/node/commit/51f4ff2450)] - **module**: move helpers out of cjs loader (Geoffrey Booth) [#49912](https://github.com/nodejs/node/pull/49912) +- \[[`7517c9f95b`](https://github.com/nodejs/node/commit/7517c9f95b)] - **module, esm**: jsdoc for modules files (Geoffrey Booth) [#49523](https://github.com/nodejs/node/pull/49523) +- \[[`b55adfb4f1`](https://github.com/nodejs/node/commit/b55adfb4f1)] - **node-api**: update headers for better wasm support (Toyo Li) [#49037](https://github.com/nodejs/node/pull/49037) +- \[[`b38e312486`](https://github.com/nodejs/node/commit/b38e312486)] - **node-api**: run finalizers directly from GC (Vladimir Morozov) [#42651](https://github.com/nodejs/node/pull/42651) +- \[[`0f0dd1a493`](https://github.com/nodejs/node/commit/0f0dd1a493)] - **os**: cache homedir, remove getCheckedFunction (Aras Abbasi) [#50037](https://github.com/nodejs/node/pull/50037) +- \[[`0e507d30ac`](https://github.com/nodejs/node/commit/0e507d30ac)] - **perf_hooks**: reduce overhead of new user timings (Vinicius Lourenço) [#49914](https://github.com/nodejs/node/pull/49914) +- \[[`328bdac7f0`](https://github.com/nodejs/node/commit/328bdac7f0)] - **perf_hooks**: reducing overhead of performance observer entry list (Vinicius Lourenço) [#50008](https://github.com/nodejs/node/pull/50008) +- \[[`e6e320ecc7`](https://github.com/nodejs/node/commit/e6e320ecc7)] - **perf_hooks**: reduce overhead of new resource timings (Vinicius Lourenço) [#49837](https://github.com/nodejs/node/pull/49837) +- \[[`971af4b211`](https://github.com/nodejs/node/commit/971af4b211)] - **quic**: fix up coverity warning in quic/session.cc (Michael Dawson) [#49865](https://github.com/nodejs/node/pull/49865) +- \[[`546797f2b1`](https://github.com/nodejs/node/commit/546797f2b1)] - **quic**: prevent copying ngtcp2_cid (Tobias Nießen) [#48561](https://github.com/nodejs/node/pull/48561) +- \[[`ac6f594c97`](https://github.com/nodejs/node/commit/ac6f594c97)] - **quic**: address new coverity warning (Michael Dawson) [#48384](https://github.com/nodejs/node/pull/48384) +- \[[`4ee8ef269b`](https://github.com/nodejs/node/commit/4ee8ef269b)] - **quic**: prevent copying ngtcp2_cid_token (Tobias Nießen) [#48370](https://github.com/nodejs/node/pull/48370) +- \[[`6d2811fbf2`](https://github.com/nodejs/node/commit/6d2811fbf2)] - **quic**: add additional implementation (James M Snell) [#47927](https://github.com/nodejs/node/pull/47927) +- \[[`0b3fcfcf35`](https://github.com/nodejs/node/commit/0b3fcfcf35)] - **quic**: fix typo in endpoint.h (Tobias Nießen) [#47911](https://github.com/nodejs/node/pull/47911) +- \[[`76044c4e2b`](https://github.com/nodejs/node/commit/76044c4e2b)] - **quic**: add additional QUIC implementation (James M Snell) [#47603](https://github.com/nodejs/node/pull/47603) +- \[[`78a15702dd`](https://github.com/nodejs/node/commit/78a15702dd)] - **src**: avoid making JSTransferable wrapper object weak (Chengzhong Wu) [#50026](https://github.com/nodejs/node/pull/50026) +- \[[`387e2929fe`](https://github.com/nodejs/node/commit/387e2929fe)] - **src**: generate default snapshot with --predictable (Joyee Cheung) [#48749](https://github.com/nodejs/node/pull/48749) +- \[[`1643adf771`](https://github.com/nodejs/node/commit/1643adf771)] - **src**: fix TLSWrap lifetime bug in ALPN callback (Ben Noordhuis) [#49635](https://github.com/nodejs/node/pull/49635) +- \[[`66776d8665`](https://github.com/nodejs/node/commit/66776d8665)] - **src**: set port in node_options to uint16_t (Yagiz Nizipli) [#49151](https://github.com/nodejs/node/pull/49151) +- \[[`55ff64001a`](https://github.com/nodejs/node/commit/55ff64001a)] - **src**: name scoped lock (Mohammed Keyvanzadeh) [#50010](https://github.com/nodejs/node/pull/50010) +- \[[`b903a710f4`](https://github.com/nodejs/node/commit/b903a710f4)] - **src**: use exact return value for `uv_os_getenv` (Yagiz Nizipli) [#49149](https://github.com/nodejs/node/pull/49149) +- \[[`43500fa646`](https://github.com/nodejs/node/commit/43500fa646)] - **src**: move const variable in `node_file.h` to `node_file.cc` (Jungku Lee) [#49688](https://github.com/nodejs/node/pull/49688) +- \[[`36ab510da7`](https://github.com/nodejs/node/commit/36ab510da7)] - **src**: remove unused variable (Michaël Zasso) [#49665](https://github.com/nodejs/node/pull/49665) +- \[[`23d65e7281`](https://github.com/nodejs/node/commit/23d65e7281)] - **src**: revert `IS_RELEASE` to 0 (Rafael Gonzaga) [#49084](https://github.com/nodejs/node/pull/49084) +- \[[`38dee8a1c0`](https://github.com/nodejs/node/commit/38dee8a1c0)] - **src**: distinguish HTML transferable and cloneable (Chengzhong Wu) [#47956](https://github.com/nodejs/node/pull/47956) +- \[[`586fcff061`](https://github.com/nodejs/node/commit/586fcff061)] - **src**: fix logically dead code reported by Coverity (Mohammed Keyvanzadeh) [#48589](https://github.com/nodejs/node/pull/48589) +- \[[`7f2c810814`](https://github.com/nodejs/node/commit/7f2c810814)] - **src,tools**: initialize cppgc (Daryl Haresign) [#45704](https://github.com/nodejs/node/pull/45704) +- \[[`aad8002b88`](https://github.com/nodejs/node/commit/aad8002b88)] - **stream**: use private symbol for bitmap state (Robert Nagy) [#49993](https://github.com/nodejs/node/pull/49993) +- \[[`a85e4186e5`](https://github.com/nodejs/node/commit/a85e4186e5)] - **stream**: reduce overhead of transfer (Vinicius Lourenço) [#50107](https://github.com/nodejs/node/pull/50107) +- \[[`e9bda11761`](https://github.com/nodejs/node/commit/e9bda11761)] - **stream**: lazy allocate back pressure buffer (Robert Nagy) [#50013](https://github.com/nodejs/node/pull/50013) +- \[[`557044af40`](https://github.com/nodejs/node/commit/557044af40)] - **stream**: avoid unnecessary drain for sync stream (Robert Nagy) [#50014](https://github.com/nodejs/node/pull/50014) +- \[[`95b8f5dcab`](https://github.com/nodejs/node/commit/95b8f5dcab)] - **stream**: optimize Writable (Robert Nagy) [#50012](https://github.com/nodejs/node/pull/50012) +- \[[`5de25deeb9`](https://github.com/nodejs/node/commit/5de25deeb9)] - **stream**: avoid tick in writable hot path (Robert Nagy) [#49966](https://github.com/nodejs/node/pull/49966) +- \[[`53b5545672`](https://github.com/nodejs/node/commit/53b5545672)] - **stream**: writable state bitmap (Robert Nagy) [#49899](https://github.com/nodejs/node/pull/49899) +- \[[`d4e99b1a66`](https://github.com/nodejs/node/commit/d4e99b1a66)] - **stream**: remove asIndexedPairs (Chemi Atlow) [#48150](https://github.com/nodejs/node/pull/48150) +- \[[`41e4174945`](https://github.com/nodejs/node/commit/41e4174945)] - **test**: replace forEach with for..of in test-net-isipv6.js (Niya Shiyas) [#49823](https://github.com/nodejs/node/pull/49823) +- \[[`f0e720a7fa`](https://github.com/nodejs/node/commit/f0e720a7fa)] - **test**: add EOVERFLOW as an allowed error (Abdirahim Musse) [#50128](https://github.com/nodejs/node/pull/50128) +- \[[`224f3ae974`](https://github.com/nodejs/node/commit/224f3ae974)] - **test**: reduce number of repetition in test-heapdump-shadowrealm.js (Chengzhong Wu) [#50104](https://github.com/nodejs/node/pull/50104) +- \[[`76004f3e56`](https://github.com/nodejs/node/commit/76004f3e56)] - **test**: replace forEach with for..of in test-parse-args.mjs (Niya Shiyas) [#49824](https://github.com/nodejs/node/pull/49824) +- \[[`fce8fbadcd`](https://github.com/nodejs/node/commit/fce8fbadcd)] - **test**: replace forEach with for..of in test-process-env (Niya Shiyas) [#49825](https://github.com/nodejs/node/pull/49825) +- \[[`24492476a7`](https://github.com/nodejs/node/commit/24492476a7)] - **test**: replace forEach with for..of in test-http-url (Niya Shiyas) [#49840](https://github.com/nodejs/node/pull/49840) +- \[[`2fe511ba23`](https://github.com/nodejs/node/commit/2fe511ba23)] - **test**: replace forEach() in test-net-perf_hooks with for of (Narcisa Codreanu) [#49831](https://github.com/nodejs/node/pull/49831) +- \[[`42c37f28e6`](https://github.com/nodejs/node/commit/42c37f28e6)] - **test**: change forEach to for...of (Tiffany Lastimosa) [#49799](https://github.com/nodejs/node/pull/49799) +- \[[`6c9625dca4`](https://github.com/nodejs/node/commit/6c9625dca4)] - **test**: update skip for moved `test-wasm-web-api` (Richard Lau) [#49958](https://github.com/nodejs/node/pull/49958) +- \[[`f05d6d090c`](https://github.com/nodejs/node/commit/f05d6d090c)] - _**Revert**_ "**test**: mark test-runner-output as flaky" (Luigi Pinca) [#49905](https://github.com/nodejs/node/pull/49905) +- \[[`035e06317a`](https://github.com/nodejs/node/commit/035e06317a)] - **test**: disambiguate AIX and IBM i (Richard Lau) [#48056](https://github.com/nodejs/node/pull/48056) +- \[[`4d0aeed4a6`](https://github.com/nodejs/node/commit/4d0aeed4a6)] - **test**: deflake test-perf-hooks.js (Joyee Cheung) [#49892](https://github.com/nodejs/node/pull/49892) +- \[[`853f57239c`](https://github.com/nodejs/node/commit/853f57239c)] - **test**: migrate message error tests from Python to JS (Yiyun Lei) [#49721](https://github.com/nodejs/node/pull/49721) +- \[[`a71e3a65bb`](https://github.com/nodejs/node/commit/a71e3a65bb)] - **test**: fix edge snapshot stack traces (Geoffrey Booth) [#49659](https://github.com/nodejs/node/pull/49659) +- \[[`6b76b7782c`](https://github.com/nodejs/node/commit/6b76b7782c)] - **test**: skip v8-updates/test-linux-perf (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`c13c98dd38`](https://github.com/nodejs/node/commit/c13c98dd38)] - **test**: skip test-tick-processor-arguments on SmartOS (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`738aa304b3`](https://github.com/nodejs/node/commit/738aa304b3)] - **test**: adapt REPL test to V8 changes (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`de5c009252`](https://github.com/nodejs/node/commit/de5c009252)] - **test**: adapt test-fs-write to V8 internal changes (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`8c36168b42`](https://github.com/nodejs/node/commit/8c36168b42)] - **test**: update flag to disable SharedArrayBuffer (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`6ccb15f7ef`](https://github.com/nodejs/node/commit/6ccb15f7ef)] - **test**: adapt debugger tests to V8 11.4 (Philip Pfaffe) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`c5de3b49e8`](https://github.com/nodejs/node/commit/c5de3b49e8)] - **test,crypto**: update WebCryptoAPI WPT (Filip Skokan) [#50039](https://github.com/nodejs/node/pull/50039) +- \[[`4b35a9cfda`](https://github.com/nodejs/node/commit/4b35a9cfda)] - **test_runner**: add test location for FileTests (Colin Ihrig) [#49999](https://github.com/nodejs/node/pull/49999) +- \[[`c935d4c8fa`](https://github.com/nodejs/node/commit/c935d4c8fa)] - **test_runner**: replace spurious if with else (Colin Ihrig) [#49943](https://github.com/nodejs/node/pull/49943) +- \[[`a4c7f81241`](https://github.com/nodejs/node/commit/a4c7f81241)] - **test_runner**: catch reporter errors (Moshe Atlow) [#49646](https://github.com/nodejs/node/pull/49646) +- \[[`bb52656fc6`](https://github.com/nodejs/node/commit/bb52656fc6)] - _**Revert**_ "**test_runner**: run global after() hook earlier" (Joyee Cheung) [#49110](https://github.com/nodejs/node/pull/49110) +- \[[`6346bdc526`](https://github.com/nodejs/node/commit/6346bdc526)] - **test_runner**: run global after() hook earlier (Colin Ihrig) [#49059](https://github.com/nodejs/node/pull/49059) +- \[[`0d8faf2952`](https://github.com/nodejs/node/commit/0d8faf2952)] - **test_runner,test**: fix flaky test-runner-cli-concurrency.js (Colin Ihrig) [#50108](https://github.com/nodejs/node/pull/50108) +- \[[`b1ada0ad55`](https://github.com/nodejs/node/commit/b1ada0ad55)] - **tls**: handle cases where the raw socket is destroyed (Luigi Pinca) [#49980](https://github.com/nodejs/node/pull/49980) +- \[[`fae1af0a75`](https://github.com/nodejs/node/commit/fae1af0a75)] - **tls**: ciphers allow bang syntax (Chemi Atlow) [#49712](https://github.com/nodejs/node/pull/49712) +- \[[`766198b9e1`](https://github.com/nodejs/node/commit/766198b9e1)] - **tools**: fix comments referencing dep_updaters scripts (Keksonoid) [#50165](https://github.com/nodejs/node/pull/50165) +- \[[`760b5dd259`](https://github.com/nodejs/node/commit/760b5dd259)] - **tools**: remove no-return-await lint rule (翠 / green) [#50118](https://github.com/nodejs/node/pull/50118) +- \[[`a0a5b751fb`](https://github.com/nodejs/node/commit/a0a5b751fb)] - **tools**: update lint-md-dependencies (Node.js GitHub Bot) [#50083](https://github.com/nodejs/node/pull/50083) +- \[[`69fb55e6b9`](https://github.com/nodejs/node/commit/69fb55e6b9)] - **tools**: update eslint to 8.51.0 (Node.js GitHub Bot) [#50084](https://github.com/nodejs/node/pull/50084) +- \[[`f73650ea52`](https://github.com/nodejs/node/commit/f73650ea52)] - **tools**: remove genv8constants.py (Ben Noordhuis) [#50023](https://github.com/nodejs/node/pull/50023) +- \[[`581434e54f`](https://github.com/nodejs/node/commit/581434e54f)] - **tools**: update eslint to 8.50.0 (Node.js GitHub Bot) [#49989](https://github.com/nodejs/node/pull/49989) +- \[[`344d3c4b7c`](https://github.com/nodejs/node/commit/344d3c4b7c)] - **tools**: update lint-md-dependencies (Node.js GitHub Bot) [#49983](https://github.com/nodejs/node/pull/49983) +- \[[`7f06c270c6`](https://github.com/nodejs/node/commit/7f06c270c6)] - **tools**: add navigation ARIA landmark to generated API ToC (Rich Trott) [#49882](https://github.com/nodejs/node/pull/49882) +- \[[`e97d25687b`](https://github.com/nodejs/node/commit/e97d25687b)] - **tools**: use osx notarytool for future releases (Ulises Gascon) [#48701](https://github.com/nodejs/node/pull/48701) +- \[[`3f1936f698`](https://github.com/nodejs/node/commit/3f1936f698)] - **tools**: update github_reporter to 1.5.3 (Node.js GitHub Bot) [#49877](https://github.com/nodejs/node/pull/49877) +- \[[`8568de3da6`](https://github.com/nodejs/node/commit/8568de3da6)] - **tools**: add new V8 headers to distribution (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`86cb23d09f`](https://github.com/nodejs/node/commit/86cb23d09f)] - **tools**: update V8 gypfiles for 11.8 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`9c6219c7e2`](https://github.com/nodejs/node/commit/9c6219c7e2)] - **tools**: update V8 gypfiles for 11.7 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`73ddf50163`](https://github.com/nodejs/node/commit/73ddf50163)] - **tools**: update V8 gypfiles for 11.6 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`817ef255ea`](https://github.com/nodejs/node/commit/817ef255ea)] - **tools**: update V8 gypfiles for 11.5 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`f34a3a9861`](https://github.com/nodejs/node/commit/f34a3a9861)] - **tools**: update V8 gypfiles for 11.4 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +- \[[`9df864ddeb`](https://github.com/nodejs/node/commit/9df864ddeb)] - **typings**: use `Symbol.dispose` and `Symbol.asyncDispose` in types (Niklas Mollenhauer) [#50123](https://github.com/nodejs/node/pull/50123) +- \[[`54bb691c0b`](https://github.com/nodejs/node/commit/54bb691c0b)] - **util**: lazy parse mime parameters (Aras Abbasi) [#49889](https://github.com/nodejs/node/pull/49889) +- \[[`1d220b55ac`](https://github.com/nodejs/node/commit/1d220b55ac)] - **vm**: use default HDO when importModuleDynamically is not set (Joyee Cheung) [#49950](https://github.com/nodejs/node/pull/49950) +- \[[`c1a3a98560`](https://github.com/nodejs/node/commit/c1a3a98560)] - **wasi**: address coverity warning (Michael Dawson) [#49866](https://github.com/nodejs/node/pull/49866) +- \[[`9cb8eb7177`](https://github.com/nodejs/node/commit/9cb8eb7177)] - **wasi**: fix up wasi tests for ibmi (Michael Dawson) [#49953](https://github.com/nodejs/node/pull/49953) +- \[[`16ac5e1ca8`](https://github.com/nodejs/node/commit/16ac5e1ca8)] - **zlib**: fix discovery of cpu-features.h for android (MatteoBax) [#49828](https://github.com/nodejs/node/pull/49828) + +Windows 32-bit Installer: https://nodejs.org/dist/v21.0.0/node-v21.0.0-x86.msi \ +Windows 64-bit Installer: https://nodejs.org/dist/v21.0.0/node-v21.0.0-x64.msi \ +Windows ARM 64-bit Installer: https://nodejs.org/dist/v21.0.0/node-v21.0.0-arm64.msi \ +Windows 32-bit Binary: https://nodejs.org/dist/v21.0.0/win-x86/node.exe \ +Windows 64-bit Binary: https://nodejs.org/dist/v21.0.0/win-x64/node.exe \ +Windows ARM 64-bit Binary: https://nodejs.org/dist/v21.0.0/win-arm64/node.exe \ +macOS 64-bit Installer: https://nodejs.org/dist/v21.0.0/node-v21.0.0.pkg \ +macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-darwin-arm64.tar.gz \ +macOS Intel 64-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-darwin-x64.tar.gz \ +Linux 64-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-linux-x64.tar.xz \ +Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-linux-ppc64le.tar.xz \ +Linux s390x 64-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-linux-s390x.tar.xz \ +AIX 64-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-aix-ppc64.tar.gz \ +ARMv7 32-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-linux-armv7l.tar.xz \ +ARMv8 64-bit Binary: https://nodejs.org/dist/v21.0.0/node-v21.0.0-linux-arm64.tar.xz \ +Source Code: https://nodejs.org/dist/v21.0.0/node-v21.0.0.tar.gz \ +Other release files: https://nodejs.org/dist/v21.0.0/ \ +Documentation: https://nodejs.org/docs/v21.0.0/api/ + +### SHASUMS + +```text +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +15f8e2fe78be11fd59ba730af57fe5ba95ec1f24555effcf3570f80744622448 node-v21.0.0-aix-ppc64.tar.gz +821a41454ecfb43525763859f772e9fe7c5e0f2d4c8b57bee93e7c0779f59414 node-v21.0.0-arm64.msi +d49aae353ab9e264a1d8c75f80eb26dcc4006f50b35ba05bda3a9c33f5554609 node-v21.0.0-darwin-arm64.tar.gz +f24b1274e89226e2d88995339ada4d959d857dfa976f460004fef49e21bf464a node-v21.0.0-darwin-arm64.tar.xz +2ec98307e388407cfa62d1fb8abc4d6dc1e54c11bc70329d6675ed0595326763 node-v21.0.0-darwin-x64.tar.gz +0496dff3a85aff04358b9bb488d2f0088318d9a649fb82bcaefbb2a8d0f5def7 node-v21.0.0-darwin-x64.tar.xz +073b19a54a8692b4d2e7264ffde51d048fefd7d4b9f60cb896078aea5be1e95a node-v21.0.0-headers.tar.gz +fc686401c2362d37752ed637e5a9b9737c5f86b9683a5a4266a095ed682b1384 node-v21.0.0-headers.tar.xz +d30396893a9acbdd2a879ac92072932919c8d6dac41177fee86a0336bf9a909d node-v21.0.0-linux-arm64.tar.gz +953b301b632476a115b38c107bd79b2ccb335ef59ac8b1a6b2e9c8e4616080c6 node-v21.0.0-linux-arm64.tar.xz +565c343c472a910adc126f12ac2e1103f6da8595c11244e19d4025075eb69488 node-v21.0.0-linux-armv7l.tar.gz +ce03bc34058a9ac96ddffaf6d1684eef3f13a71cddd3e439f203dced20b29564 node-v21.0.0-linux-armv7l.tar.xz +4a3b6098f57f7a8522261a2cabad1163f3e90a17e5d5b78f871c124074d4ad9d node-v21.0.0-linux-ppc64le.tar.gz +77014f10cd66c828e23b5a259f4b3a9f49b87fd494c355d93ec8e1fef16c23af node-v21.0.0-linux-ppc64le.tar.xz +a616684521d4c2094063cabb7c4242d2bad94381acc23d0d25bc1921b8da189c node-v21.0.0-linux-s390x.tar.gz +4eca9737f26d631d637fb650d0776ee5112476055a7111a78fdda494abbabf65 node-v21.0.0-linux-s390x.tar.xz +013f370f1772197cb4e22f22f2185ee26d2e5f3acdb2f252d11cd214e9a8cdb9 node-v21.0.0-linux-x64.tar.gz +06e748d61c5760fc7fd95f22227ed71d61b57bed6ad84e6d63e905d64170a8fc node-v21.0.0-linux-x64.tar.xz +69eef05d88f5c8db6df15cf61e97c244877c7e7e80bc86dca39ad1abb4137fc6 node-v21.0.0-win-arm64.7z +68c344ab4ab82abfcb415f32b1eab57b90bd2db268e9b27b3174e5d8175e98a4 node-v21.0.0-win-arm64.zip +a67654997f5e1eb8fe75b012e50037451971797c28e3f928ae0b056b187252c0 node-v21.0.0-win-x64.7z +35483b14c3bd7d014a263b1a117ba8e2d8c740d033550c8a04f80241d5720f99 node-v21.0.0-win-x64.zip +f8763ea63edfd91510409c21e8a7eb6bc1e5cf2d3ab15a2b8e169da1e4af58a4 node-v21.0.0-win-x86.7z +1b0baab7beabf6d7f62f6b089a5363c9621ec45bfb5906696c20ab3524fc8fc9 node-v21.0.0-win-x86.zip +95647952cf37ab1e5559a2138c56345b4f6ff91408707190885e7ef133bbbe7b node-v21.0.0-x64.msi +e129e0f0a1ba567e1759e3056367c69630c18570823d54468966b09bea319e5b node-v21.0.0-x86.msi +572478aa3b8ba6c72dc93eb8dee5460494c12e47243460021f37feb05c65ff4c node-v21.0.0.pkg +d2c94fe597eef41188e0b30fd194ea86a26daa2c4694a75c5dea35d2c042f0ae node-v21.0.0.tar.gz +bc56192b951ad183506dca9acf7a4d0c02591140b7fc8f25661375199266f3f2 node-v21.0.0.tar.xz +6209a1da65481545533de59bc74fba826b46dcf37d7706b85b2b74396c1a0eb8 win-arm64/node.exe +f77387d7ea575263e5e9f9ef920f701dbc6d4f71d9b4dfd792c1b025ee6b9a1d win-arm64/node.lib +d17f7c085669400ed40258e421274dbfc521fd3444ee44d6a89867d1ea2c413c win-arm64/node_pdb.7z +6baacfa8f5c3a7f8dabe6a87eaf711523076ef256c5cb3783c3a759cefd73978 win-arm64/node_pdb.zip +3aeea08ace2b232f7ae2d05198f8a1dd9d2d9fbe5688f93c0deec53ad37b6bef win-x64/node.exe +2f88106acb54a105e7beda077ab9eda04d98c202db9c1477ea48d7dd9e58151a win-x64/node.lib +c1be7b7a1cea27d6bf8a3ae3cf42a746ea90556d8c92ee20c20d6a76e89ec027 win-x64/node_pdb.7z +b5e3f5fc3d38f31bad1969a5caa82a9ae670402b6873652b6cf6fe10e9b7b285 win-x64/node_pdb.zip +99cbb23e417b18ab61bafeb06634c7ec079248e4a0daba24946952cdaf844108 win-x86/node.exe +a96b189216df0d91b6fda46da9265fa4ff9c8482b1dc376e6198c225c2b2cc5d win-x86/node.lib +a66a38d9bef503535d26210c7500c4d9801fb2bb9023679398c618af40ffacdc win-x86/node_pdb.7z +c5bfcc9125c9aa1833646fe55d397d115334a157b8dd07afc3edde1ac18fe252 win-x86/node_pdb.zip +-----BEGIN PGP SIGNATURE----- + +iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmUurksACgkQi+q0389V +XvRfJQv7B40OewFfpi5bMMbXzs9Wr6bjago7QqkFT2fpcq2fRbUC8+gKddZHf+/i +Wdj0tjBkCvbgpjFF4F3G2jQPW5iepllb23VwIJbTd7N7P+/cOADHUSB9hsIxorTZ +PXXN/d6EEKACYqrA0nn79s0baWv2heW9ZiCwpFC8d11i+oJ2IleHeD5aDTUtI9Nr +JVncYo/ZkL7kOLIgWMGsllXScFA0bO+3A70RSPoIZFx4XrDCvEE5raoIkXlDHOOr +N9LXRNKCLj4BwgFgeEhyLfVaHglawR9AnTKsMzPVQD7PuHucQNr11ZBjxiVq4QOG +EaJHOUH00lMfzcYadwrFCeOncTC4JePTOI59OCquqLcYXfRpJ8CeoD/1CjlHYOqZ +vM8Ymk83QhYlxFkZOLo5lfyAMNJzIH1lHJq4Kgw1jXN/YYd4M/fLVySxyHaAKkvm +r4dD5AjulAjY4I+/mh0bFqLI+DG46zwZHRfZx7KVUKvxcQ0rMMtAPuICbONYZRu6 +ljRuMa+v +=eAIZ +-----END PGP SIGNATURE----- +``` From 7a99b73131fb8cae980fffa48b44a541b3906e95 Mon Sep 17 00:00:00 2001 From: Kwan Jun Wen <40173716+junwen-k@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:38:52 +0800 Subject: [PATCH 7/9] feat(Preview): add Preview component (#6014) * feat(Preview): add Preview component * feat(Preview): use radial gradient * feat(Preview): add width and height props * feat(Preview): update storybook * fix(Preview): update css --- components/Common/Preview/index.module.css | 46 ++ components/Common/Preview/index.stories.tsx | 46 ++ components/Common/Preview/index.tsx | 46 ++ .../static/images/patterns/hexagon-grid.svg | 426 ++++++++++++++++++ tailwind.config.ts | 3 + 5 files changed, 567 insertions(+) create mode 100644 components/Common/Preview/index.module.css create mode 100644 components/Common/Preview/index.stories.tsx create mode 100644 components/Common/Preview/index.tsx create mode 100644 public/static/images/patterns/hexagon-grid.svg diff --git a/components/Common/Preview/index.module.css b/components/Common/Preview/index.module.css new file mode 100644 index 0000000000000..150402437a0c1 --- /dev/null +++ b/components/Common/Preview/index.module.css @@ -0,0 +1,46 @@ +.root { + @apply relative + flex + items-center + bg-neutral-950 + bg-[url('/static/images/patterns/hexagon-grid.svg')] + bg-contain + bg-center + after:absolute + after:inset-0 + after:m-auto + after:aspect-square + after:w-1/3 + after:rounded-full + after:bg-gradient-radial + after:blur-3xl; + + &.announcement { + @apply after:from-green-700/90; + } + + &.release { + @apply after:from-info-600/90; + } + + &.vulnerability { + @apply after:from-warning-600/90; + } + + & > .container { + @apply z-10 + mx-auto + flex + max-w-xl + flex-col + gap-12 + text-center + text-3xl + font-semibold + text-white; + + & > .logo { + @apply mx-auto; + } + } +} diff --git a/components/Common/Preview/index.stories.tsx b/components/Common/Preview/index.stories.tsx new file mode 100644 index 0000000000000..acdcb578cab99 --- /dev/null +++ b/components/Common/Preview/index.stories.tsx @@ -0,0 +1,46 @@ +import type { Meta as MetaObj, StoryObj } from '@storybook/react'; + +import Preview from './'; + +type Story = StoryObj; +type Meta = MetaObj; + +export const Default: Story = { + args: { + title: + 'Changing the End-of-Life Date for Node.js 16 to September 11th, 2023', + }, +}; + +export const Announcement: Story = { + args: { + type: 'announcement', + title: + 'Changing the End-of-Life Date for Node.js 16 to September 11th, 2023', + }, +}; + +export const Release: Story = { + args: { + type: 'release', + title: 'Node v20.5.0 (Current)', + }, +}; + +export const Vulnerability: Story = { + args: { + type: 'vulnerability', + title: 'OpenSSL update assessment, and Node.js project plans', + }, +}; + +export const CustomSize: Story = { + args: { + title: + 'Changing the End-of-Life Date for Node.js 16 to September 11th, 2023', + width: 600, + height: 315, + }, +}; + +export default { component: Preview } as Meta; diff --git a/components/Common/Preview/index.tsx b/components/Common/Preview/index.tsx new file mode 100644 index 0000000000000..8d98fa4fc6365 --- /dev/null +++ b/components/Common/Preview/index.tsx @@ -0,0 +1,46 @@ +import classNames from 'classnames'; +import Image from 'next/image'; +import type { CSSProperties, ComponentProps, FC, ReactNode } from 'react'; + +import { useRouter } from '@/hooks/useRouter'; + +import styles from './index.module.css'; + +type PreviewProps = { + type?: 'announcement' | 'release' | 'vulnerability'; + title: ReactNode; + height?: CSSProperties['height']; + width?: CSSProperties['width']; +} & Omit, 'children'>; + +const Preview: FC = ({ + type = 'announcement', + title, + height = 630, + width = 1200, + ...props +}) => { + const { basePath } = useRouter(); + + return ( +
+
+ Node.js +

{title}

+
+
+ ); +}; + +export default Preview; diff --git a/public/static/images/patterns/hexagon-grid.svg b/public/static/images/patterns/hexagon-grid.svg new file mode 100644 index 0000000000000..51cfa3c3845d0 --- /dev/null +++ b/public/static/images/patterns/hexagon-grid.svg @@ -0,0 +1,426 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tailwind.config.ts b/tailwind.config.ts index bc160c2e55e79..36d2976784cc4 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -116,6 +116,9 @@ export default { 'ibm-plex-mono': ['var(--font-ibm-plex-mono)'], }, extend: { + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + }, boxShadow: { xs: '0px 1px 2px 0px rgba(16, 24, 40, 0.05)', lg: '0px 4px 6px -2px rgba(16, 24, 40, 0.03), 0px 12px 16px -4px rgba(16, 24, 40, 0.08)', From db831829c1c35f64b976233ac26a10410bd8cce2 Mon Sep 17 00:00:00 2001 From: Claudio Wunder Date: Wed, 18 Oct 2023 10:52:48 +0200 Subject: [PATCH 8/9] fix: use fixed date on storybook --- components/Common/MetaBar/index.stories.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/Common/MetaBar/index.stories.tsx b/components/Common/MetaBar/index.stories.tsx index 81a8569cf21e3..acce0aa8effd5 100644 --- a/components/Common/MetaBar/index.stories.tsx +++ b/components/Common/MetaBar/index.stories.tsx @@ -14,7 +14,9 @@ type Meta = MetaObj; export const Default: Story = { args: { items: { - 'components.metabar.lastUpdated': new Date().toLocaleDateString(), + 'components.metabar.lastUpdated': new Date( + '17 October 2023' + ).toLocaleDateString(), 'components.metabar.readingTime': '15 minutes', 'components.metabar.addedIn': 'v1.0.0', 'components.metabar.author': 'The Node.js Project', From fecdbb4f79f5bfba4c1f12d77b7ecb901683dc3d Mon Sep 17 00:00:00 2001 From: Claudio W Date: Wed, 18 Oct 2023 10:56:27 +0200 Subject: [PATCH 9/9] fix: maintenance lts in the lack of active lts (#6025) --- hooks/useNodeReleases.ts | 7 ++++++- layouts/DocsLayout.tsx | 6 +++--- layouts/DownloadLayout.tsx | 2 +- layouts/IndexLayout.tsx | 2 +- next.json.mjs | 10 +++++++++- providers/nodeReleasesProvider.tsx | 4 ++-- providers/withNodeRelease.tsx | 10 +++++++--- 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/hooks/useNodeReleases.ts b/hooks/useNodeReleases.ts index 26a170c112a04..b4fb137fa70b3 100644 --- a/hooks/useNodeReleases.ts +++ b/hooks/useNodeReleases.ts @@ -12,5 +12,10 @@ export const useNodeReleases = () => { [releases] ); - return { releases, getReleaseByStatus }; + const getLatestIsLtsRelease = useCallback( + () => releases.find(release => release.isLts), + [releases] + ); + + return { releases, getReleaseByStatus, getLatestIsLtsRelease }; }; diff --git a/layouts/DocsLayout.tsx b/layouts/DocsLayout.tsx index 1b2a470c93fe4..7d865cb627adb 100644 --- a/layouts/DocsLayout.tsx +++ b/layouts/DocsLayout.tsx @@ -7,11 +7,11 @@ import { useNodeReleases } from '@/hooks/useNodeReleases'; import BaseLayout from './BaseLayout'; const DocsLayout: FC = ({ children }) => { - const { getReleaseByStatus } = useNodeReleases(); + const { getReleaseByStatus, getLatestIsLtsRelease } = useNodeReleases(); const [lts, current] = useMemo( - () => [getReleaseByStatus('Active LTS'), getReleaseByStatus('Current')], - [getReleaseByStatus] + () => [getLatestIsLtsRelease(), getReleaseByStatus('Current')], + [getLatestIsLtsRelease, getReleaseByStatus] ); const translationContext = { diff --git a/layouts/DownloadLayout.tsx b/layouts/DownloadLayout.tsx index 91926f87697e9..57b5cf1293f50 100644 --- a/layouts/DownloadLayout.tsx +++ b/layouts/DownloadLayout.tsx @@ -23,7 +23,7 @@ const DownloadLayout: FC = ({ children }) => { {children} - + {({ release }) => ( <> diff --git a/layouts/IndexLayout.tsx b/layouts/IndexLayout.tsx index 062610f322808..5fa28e93b3e40 100644 --- a/layouts/IndexLayout.tsx +++ b/layouts/IndexLayout.tsx @@ -47,7 +47,7 @@ const IndexLayout: FC = ({ children }) => {

{downloadHeadText}

- + {({ release }) => } diff --git a/next.json.mjs b/next.json.mjs index c57999bad576d..62551f2e99758 100644 --- a/next.json.mjs +++ b/next.json.mjs @@ -3,7 +3,15 @@ import localeConfig from './i18n/config.json' assert { type: 'json' }; import siteNavigation from './navigation.json' assert { type: 'json' }; import blogData from './public/blog-posts-data.json' assert { type: 'json' }; +import releaseData from './public/node-releases-data.json' assert { type: 'json' }; import siteRedirects from './redirects.json' assert { type: 'json' }; import siteConfig from './site.json' assert { type: 'json' }; -export { siteConfig, siteNavigation, siteRedirects, localeConfig, blogData }; +export { + siteConfig, + siteNavigation, + siteRedirects, + localeConfig, + blogData, + releaseData, +}; diff --git a/providers/nodeReleasesProvider.tsx b/providers/nodeReleasesProvider.tsx index cc539f64c1f43..c8dbafb3514c8 100644 --- a/providers/nodeReleasesProvider.tsx +++ b/providers/nodeReleasesProvider.tsx @@ -1,7 +1,7 @@ import { createContext, useMemo } from 'react'; import type { FC, PropsWithChildren } from 'react'; -import nodeReleasesData from '@/public/node-releases-data.json'; +import { releaseData } from '@/next.json.mjs'; import type { NodeReleaseSource, NodeRelease } from '@/types'; import { getNodeReleaseStatus } from '@/util/nodeRelease'; @@ -11,7 +11,7 @@ export const NodeReleasesProvider: FC = ({ children }) => { const releases = useMemo(() => { const now = new Date(); - return nodeReleasesData.map((raw: NodeReleaseSource) => { + return releaseData.map((raw: NodeReleaseSource) => { const support = { currentStart: raw.currentStart, ltsStart: raw.ltsStart, diff --git a/providers/withNodeRelease.tsx b/providers/withNodeRelease.tsx index 276eea04a31ed..4f9296bf009c0 100644 --- a/providers/withNodeRelease.tsx +++ b/providers/withNodeRelease.tsx @@ -6,7 +6,7 @@ import type { NodeRelease, NodeReleaseStatus } from '@/types'; import { isNodeRelease } from '@/util/nodeRelease'; type WithNodeReleaseProps = { - status: NodeReleaseStatus; + status: NodeReleaseStatus[] | NodeReleaseStatus; children: FC<{ release: NodeRelease }>; }; @@ -16,8 +16,12 @@ export const WithNodeRelease: FC = ({ }) => { const { getReleaseByStatus } = useNodeReleases(); - const release = useMemo( - () => getReleaseByStatus(status), + const [release] = useMemo( + () => + [status] + .flat() + .map(s => getReleaseByStatus(s)) + .filter(s => !!s), [status, getReleaseByStatus] );